]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blobdiff - vendor/oojs/oojs-ui/php/Theme.php
MediaWiki 1.30.2
[autoinstallsdev/mediawiki.git] / vendor / oojs / oojs-ui / php / Theme.php
diff --git a/vendor/oojs/oojs-ui/php/Theme.php b/vendor/oojs/oojs-ui/php/Theme.php
new file mode 100644 (file)
index 0000000..8e8c823
--- /dev/null
@@ -0,0 +1,73 @@
+<?php
+
+namespace OOUI;
+
+/**
+ * Theme logic.
+ *
+ * @abstract
+ */
+abstract class Theme {
+
+       /* Properties */
+
+       private static $singleton;
+
+       /* Static Methods */
+
+       /**
+        * @param Theme|null $theme Theme to use throughout the application
+        */
+       public static function setSingleton( Theme $theme = null ) {
+               self::$singleton = $theme;
+       }
+
+       /**
+        * @return Theme
+        * @throws Exception
+        */
+       public static function singleton() {
+               if ( !self::$singleton ) {
+                       throw new Exception( __METHOD__ . ' was called with no singleton theme set.' );
+               }
+
+               return self::$singleton;
+       }
+
+       /**
+        * Get a list of classes to be applied to a widget.
+        *
+        * The 'on' and 'off' lists combined MUST contain keys for all classes the theme adds or removes,
+        * otherwise state transitions will not work properly.
+        *
+        * @param Element $element Element for which to get classes
+        * @return array Categorized class names with `on` and `off` lists
+        */
+       public function getElementClasses( Element $element ) {
+               return [ 'on' => [], 'off' => [] ];
+       }
+
+       /**
+        * Update CSS classes provided by the theme.
+        *
+        * For elements with theme logic hooks, this should be called any time there's a state change.
+        *
+        * @param Element $element Element for which to update classes
+        * @return array Categorized class names with `on` and `off` lists
+        */
+       public function updateElementClasses( Element $element ) {
+               $classes = $this->getElementClasses( $element );
+               $traits = class_uses( $element );
+
+               if ( in_array( IconElement::class, $traits ) ) {
+                       $element->getIconElement()
+                               ->removeClasses( $classes['off'] )
+                               ->addClasses( $classes['on'] );
+               }
+               if ( in_array( IndicatorElement::class, $traits ) ) {
+                       $element->getIndicatorElement()
+                               ->removeClasses( $classes['off'] )
+                               ->addClasses( $classes['on'] );
+               }
+       }
+}