@@ -538,20 +538,53 @@ function ThemingProvider($mdColorPalette, $$mdMetaProvider) {
538
538
* @param {el= } element to apply theming to
539
539
*/
540
540
/* @ngInject */
541
- function ThemingService ( $rootScope , $log ) {
541
+ function ThemingService ( $rootScope , $mdUtil , $q , $ log) {
542
542
// Allow us to be invoked via a linking function signature.
543
543
var applyTheme = function ( scope , el ) {
544
544
if ( el === undefined ) { el = scope ; scope = undefined ; }
545
545
if ( scope === undefined ) { scope = $rootScope ; }
546
546
applyTheme . inherit ( el , el ) ;
547
547
} ;
548
548
549
- applyTheme . THEMES = angular . extend ( { } , THEMES ) ;
550
- applyTheme . PALETTES = angular . extend ( { } , PALETTES ) ;
549
+ Object . defineProperty ( applyTheme , 'THEMES' , {
550
+ get : function ( ) {
551
+ return angular . extend ( { } , THEMES ) ;
552
+ }
553
+ } ) ;
554
+ Object . defineProperty ( applyTheme , 'PALETTES' , {
555
+ get : function ( ) {
556
+ return angular . extend ( { } , PALETTES ) ;
557
+ }
558
+ } ) ;
551
559
applyTheme . inherit = inheritTheme ;
552
560
applyTheme . registered = registered ;
553
561
applyTheme . defaultTheme = function ( ) { return defaultTheme ; } ;
554
562
applyTheme . generateTheme = function ( name ) { generateTheme ( THEMES [ name ] , name , themeConfig . nonce ) ; } ;
563
+ applyTheme . defineTheme = function ( name , options ) {
564
+ options = options || { } ;
565
+
566
+ var theme = registerTheme ( name ) ;
567
+
568
+ if ( options . primary ) {
569
+ theme . primaryPalette ( options . primary ) ;
570
+ }
571
+ if ( options . accent ) {
572
+ theme . accentPalette ( options . accent ) ;
573
+ }
574
+ if ( options . warn ) {
575
+ theme . warnPalette ( options . warn ) ;
576
+ }
577
+ if ( options . background ) {
578
+ theme . backgroundPalette ( options . background ) ;
579
+ }
580
+ if ( options . dark ) {
581
+ theme . dark ( ) ;
582
+ }
583
+
584
+ this . generateTheme ( name ) ;
585
+
586
+ return $q . resolve ( name ) ;
587
+ } ;
555
588
applyTheme . setBrowserColor = enableBrowserColor ;
556
589
557
590
return applyTheme ;
@@ -568,22 +601,31 @@ function ThemingProvider($mdColorPalette, $$mdMetaProvider) {
568
601
* Get theme name for the element, then update with Theme CSS class
569
602
*/
570
603
function inheritTheme ( el , parent ) {
571
- var ctrl = parent . controller ( 'mdTheme' ) ;
572
- var attrThemeValue = el . attr ( 'md-theme-watch' ) ;
573
- var watchTheme = ( alwaysWatchTheme || angular . isDefined ( attrThemeValue ) ) && attrThemeValue != 'false' ;
604
+ var ctrl = parent . controller ( 'mdTheme' ) || el . data ( '$mdThemeController' ) ;
574
605
575
606
updateThemeClass ( lookupThemeName ( ) ) ;
576
607
577
- if ( ( alwaysWatchTheme && ! registerChangeCallback ( ) ) || ( ! alwaysWatchTheme && watchTheme ) ) {
578
- el . on ( '$destroy' , $rootScope . $watch ( lookupThemeName , updateThemeClass ) ) ;
608
+ if ( ctrl ) {
609
+ var watchTheme =
610
+ alwaysWatchTheme || ctrl . $shouldWatch || $mdUtil . parseAttributeBoolean ( el . attr ( 'md-theme-watch' ) ) ;
611
+
612
+ var unwatch = ctrl . registerChanges ( function ( name ) {
613
+ updateThemeClass ( name ) ;
614
+
615
+ if ( ! watchTheme ) {
616
+ unwatch ( ) ;
617
+ }
618
+ else {
619
+ el . on ( '$destroy' , unwatch ) ;
620
+ }
621
+ } ) ;
579
622
}
580
623
581
624
/**
582
625
* Find the theme name from the parent controller or element data
583
626
*/
584
627
function lookupThemeName ( ) {
585
628
// As a few components (dialog) add their controllers later, we should also watch for a controller init.
586
- ctrl = parent . controller ( 'mdTheme' ) || el . data ( '$mdThemeController' ) ;
587
629
return ctrl && ctrl . $mdTheme || ( defaultTheme == 'default' ? '' : defaultTheme ) ;
588
630
}
589
631
@@ -606,24 +648,12 @@ function ThemingProvider($mdColorPalette, $$mdMetaProvider) {
606
648
el . data ( '$mdThemeController' , ctrl ) ;
607
649
}
608
650
}
609
-
610
- /**
611
- * Register change callback with parent mdTheme controller
612
- */
613
- function registerChangeCallback ( ) {
614
- var parentController = parent . controller ( 'mdTheme' ) ;
615
- if ( ! parentController ) return false ;
616
- el . on ( '$destroy' , parentController . registerChanges ( function ( ) {
617
- updateThemeClass ( lookupThemeName ( ) ) ;
618
- } ) ) ;
619
- return true ;
620
- }
621
651
}
622
652
623
653
}
624
654
}
625
655
626
- function ThemingDirective ( $mdTheming , $interpolate , $log ) {
656
+ function ThemingDirective ( $mdTheming , $interpolate , $parse , $mdUtil , $q , $ log) {
627
657
return {
628
658
priority : 100 ,
629
659
link : {
@@ -649,16 +679,39 @@ function ThemingDirective($mdTheming, $interpolate, $log) {
649
679
if ( ! $mdTheming . registered ( theme ) ) {
650
680
$log . warn ( 'attempted to use unregistered theme \'' + theme + '\'' ) ;
651
681
}
682
+
683
+
652
684
ctrl . $mdTheme = theme ;
653
685
654
- registeredCallbacks . forEach ( function ( cb ) {
655
- cb ( ) ;
686
+ // Iterating backwards to support unregistering during iteration
687
+ // http://stackoverflow.com/a/9882349/890293
688
+ registeredCallbacks . reverse ( ) . forEach ( function ( cb ) {
689
+ cb ( theme ) ;
656
690
} ) ;
657
- }
691
+ } ,
692
+ $shouldWatch : $mdUtil . parseAttributeBoolean ( el . attr ( 'md-theme-watch' ) )
658
693
} ;
694
+
659
695
el . data ( '$mdThemeController' , ctrl ) ;
660
- ctrl . $setTheme ( $interpolate ( attrs . mdTheme ) ( scope ) ) ;
661
- attrs . $observe ( 'mdTheme' , ctrl . $setTheme ) ;
696
+
697
+ var getThemeInterpolation = function ( ) { return $interpolate ( attrs . mdTheme ) ( scope ) ; } ;
698
+
699
+ var setParsedTheme = function ( interpolation ) {
700
+ var theme = $parse ( interpolation ) ( scope ) || interpolation ;
701
+
702
+ if ( typeof theme === 'string' ) {
703
+ return ctrl . $setTheme ( theme ) ;
704
+ }
705
+
706
+ $q . when ( ( typeof theme === 'function' ) ? theme ( ) : theme )
707
+ . then ( function ( name ) {
708
+ ctrl . $setTheme ( name )
709
+ } ) ;
710
+ } ;
711
+
712
+ setParsedTheme ( getThemeInterpolation ( ) ) ;
713
+
714
+ scope . $watch ( getThemeInterpolation , setParsedTheme ) ;
662
715
}
663
716
}
664
717
} ;
0 commit comments