From 3962de8e43913e3e669e5eb2e44330b47f6e5eb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Sun, 30 Dec 2018 03:28:31 -0300 Subject: [PATCH] More CSS work. --HG-- branch : dev-css --- bin/assets/ui/css/style.css | 12 --- bin/assets/ui/uitheme.css | 56 +++++++++++++ include/eepp/scene/nodeattribute.hpp | 2 + include/eepp/ui/css/stylesheet.hpp | 13 +++- include/eepp/ui/css/stylesheetnode.hpp | 12 ++- .../ui/css/stylesheetpropertiesparser.hpp | 5 +- include/eepp/ui/css/stylesheetproperty.hpp | 12 ++- include/eepp/ui/css/stylesheetselector.hpp | 33 ++++---- include/eepp/ui/uimenu.hpp | 4 +- include/eepp/ui/uimenuitem.hpp | 4 +- include/eepp/ui/uiscenenode.hpp | 6 +- include/eepp/ui/uitheme.hpp | 20 ++--- include/eepp/ui/uithemedefault.hpp | 10 --- include/eepp/ui/uiwidget.hpp | 2 +- include/eepp/ui/uiwinmenu.hpp | 16 ++++ projects/linux/ee.files | 1 + src/eepp/scene/nodeattribute.cpp | 6 ++ src/eepp/ui/css/stylesheet.cpp | 55 ++++++++++--- src/eepp/ui/css/stylesheetnode.cpp | 25 ++++-- src/eepp/ui/css/stylesheetparser.cpp | 8 +- .../ui/css/stylesheetpropertiesparser.cpp | 8 +- src/eepp/ui/css/stylesheetproperty.cpp | 16 +++- src/eepp/ui/css/stylesheetselector.cpp | 78 +++++++++++++------ src/eepp/ui/css/stylesheetselectorparser.cpp | 4 +- src/eepp/ui/uicombobox.cpp | 2 + src/eepp/ui/uicommondialog.cpp | 2 + src/eepp/ui/uilistbox.cpp | 8 +- src/eepp/ui/uilistboxitem.cpp | 12 +-- src/eepp/ui/uimenu.cpp | 50 +++++++----- src/eepp/ui/uimenuitem.cpp | 17 ---- src/eepp/ui/uimenuseparator.cpp | 2 + src/eepp/ui/uimenusubmenu.cpp | 6 +- src/eepp/ui/uimessagebox.cpp | 2 + src/eepp/ui/uiprogressbar.cpp | 10 +-- src/eepp/ui/uipushbutton.cpp | 6 -- src/eepp/ui/uiscenenode.cpp | 28 ++++--- src/eepp/ui/uiscrollbar.cpp | 11 ++- src/eepp/ui/uiselectbutton.cpp | 20 ----- src/eepp/ui/uislider.cpp | 26 ++++--- src/eepp/ui/uispinbox.cpp | 1 + src/eepp/ui/uistyle.cpp | 4 +- src/eepp/ui/uitab.cpp | 4 +- src/eepp/ui/uitable.cpp | 4 +- src/eepp/ui/uitablecell.cpp | 2 + src/eepp/ui/uitabwidget.cpp | 13 ++-- src/eepp/ui/uitextedit.cpp | 1 + src/eepp/ui/uitextview.cpp | 2 + src/eepp/ui/uitheme.cpp | 30 +++---- src/eepp/ui/uithemedefault.cpp | 41 ---------- src/eepp/ui/uitooltip.cpp | 1 + src/eepp/ui/uiwidget.cpp | 10 ++- src/eepp/ui/uiwindow.cpp | 12 ++- src/eepp/ui/uiwinmenu.cpp | 75 +++++++++++++++--- src/test/eetest.cpp | 14 ++-- 54 files changed, 510 insertions(+), 314 deletions(-) delete mode 100644 bin/assets/ui/css/style.css create mode 100644 bin/assets/ui/uitheme.css diff --git a/bin/assets/ui/css/style.css b/bin/assets/ui/css/style.css deleted file mode 100644 index 44cec7968..000000000 --- a/bin/assets/ui/css/style.css +++ /dev/null @@ -1,12 +0,0 @@ - -PushButton { - foregroundColor: #66666666; -} - -PushButton:hover { - foregroundColor: #66FF6666; -} - -PushButton:pressed { - foregroundColor: #FF666666; -} diff --git a/bin/assets/ui/uitheme.css b/bin/assets/ui/uitheme.css new file mode 100644 index 000000000..6de56ac90 --- /dev/null +++ b/bin/assets/ui/uitheme.css @@ -0,0 +1,56 @@ +/* Global rules */ +* { + textSize: 12dp; + textColor: #E6E6E6FF; + textShadowColor: #32323296; + textSelectedColor: #000; + textSelectionBackColor: #969696FF; +} + +TabWidget { + tabSeparation: -1dp; + drawLineBelowTabs: true; + lineBelowTabsColor: #2f3030; + lineBelowTabsYOffset: -1dp; +} + +Tab:selected, +Tab:hover, +Tab:pressed { + textColor: #FFF; +} + +ProgressBar { + displayPercent: true; + verticalExpand: true; + fillerPadding: 2dp; + movementSpeed: 32, 0; +} + +WinMenu { + buttonMargin: 12dp; +} + +Menu, +PopUpMenu { + textColor: #E6E6E6FF; + minWidth: 100dp; + minSpaceForIcons: 24dp; + minRightMargin: 8dp; +} + +Menu:hover, +PopUpMenu:hover, +MenuItem:hover, +MenuCheckBox:hover, +MenuSubMenu:hover { + textColor: #FFF; +} + +Slider { + halfSlider: true; +} + +ScrollBar { + expandBackground: true; +} diff --git a/include/eepp/scene/nodeattribute.hpp b/include/eepp/scene/nodeattribute.hpp index 455c4cefc..b883bf45c 100644 --- a/include/eepp/scene/nodeattribute.hpp +++ b/include/eepp/scene/nodeattribute.hpp @@ -95,6 +95,8 @@ class NodeAttribute { int asDpDimensionI( const std::string& defaultValue = "" ) const; + Uint32 asDpDimensionUint( const std::string& defaultValue = "" ) const; + OriginPoint asOriginPoint() const; BlendMode asBlendMode() const; diff --git a/include/eepp/ui/css/stylesheet.hpp b/include/eepp/ui/css/stylesheet.hpp index 67c610eeb..084b6ee1d 100644 --- a/include/eepp/ui/css/stylesheet.hpp +++ b/include/eepp/ui/css/stylesheet.hpp @@ -9,15 +9,24 @@ class StyleSheetElement; class EE_API StyleSheet { public: + typedef std::map StyleSheetNodeList; StyleSheet(); - void addNode( StyleSheetNode node ); + void addNode( const StyleSheetNode& node ); + + void combineNode( const StyleSheetNode& node ); bool isEmpty() const; + void print(); + + void combineStyleSheet( const StyleSheet& styleSheet ); + StyleSheetProperties getElementProperties( StyleSheetElement * element, const std::string& pseudoClass = "" ); - std::vector nodes; + const StyleSheetNodeList& getNodes() const; + protected: + StyleSheetNodeList mNodes; }; }}} diff --git a/include/eepp/ui/css/stylesheetnode.hpp b/include/eepp/ui/css/stylesheetnode.hpp index df7aa0e4b..fbbdc42ff 100644 --- a/include/eepp/ui/css/stylesheetnode.hpp +++ b/include/eepp/ui/css/stylesheetnode.hpp @@ -8,12 +8,20 @@ namespace EE { namespace UI { namespace CSS { class EE_API StyleSheetNode { public: + StyleSheetNode(); + explicit StyleSheetNode( const std::string& selector, const StyleSheetProperties& properties ); void print(); - StyleSheetSelector selector; - StyleSheetProperties properties; + const StyleSheetSelector& getSelector() const; + + const StyleSheetProperties& getProperties() const; + + void setProperty( const StyleSheetProperty& property ); + protected: + StyleSheetSelector mSelector; + StyleSheetProperties mProperties; }; }}} diff --git a/include/eepp/ui/css/stylesheetpropertiesparser.hpp b/include/eepp/ui/css/stylesheetpropertiesparser.hpp index 11f39f7c5..b85cf438b 100644 --- a/include/eepp/ui/css/stylesheetpropertiesparser.hpp +++ b/include/eepp/ui/css/stylesheetpropertiesparser.hpp @@ -16,7 +16,8 @@ class EE_API StyleSheetPropertiesParser { void print(); - StyleSheetProperties properties; + const StyleSheetProperties& getProperties() const; + protected: enum ReadState { ReadingPropertyName, @@ -27,6 +28,8 @@ class EE_API StyleSheetPropertiesParser { ReadState prevRs; + StyleSheetProperties mProperties; + void parse( std::string propsstr ); int readPropertyName( ReadState& rs, std::size_t pos, std::string& buffer, const std::string& str ); diff --git a/include/eepp/ui/css/stylesheetproperty.hpp b/include/eepp/ui/css/stylesheetproperty.hpp index 10d52a028..4264b64e8 100644 --- a/include/eepp/ui/css/stylesheetproperty.hpp +++ b/include/eepp/ui/css/stylesheetproperty.hpp @@ -13,9 +13,15 @@ class EE_API StyleSheetProperty { explicit StyleSheetProperty( const std::string& name, const std::string& value ); - std::string name; - std::string value; - Uint32 specificity; + const std::string& getName() const; + + const std::string& getValue() const; + + const Uint32& getSpecificity() const; + protected: + std::string mName; + std::string mValue; + Uint32 mSpecificity; }; typedef std::map StyleSheetProperties; diff --git a/include/eepp/ui/css/stylesheetselector.hpp b/include/eepp/ui/css/stylesheetselector.hpp index 184d93e80..b1f26d047 100644 --- a/include/eepp/ui/css/stylesheetselector.hpp +++ b/include/eepp/ui/css/stylesheetselector.hpp @@ -22,9 +22,11 @@ class EE_API StyleSheetSelector { SpecificityGlobal = 1 }; + StyleSheetSelector(); + explicit StyleSheetSelector( const std::string& selectorName ); - Uint32 getRequiredFlags(); + Uint32 getRequiredFlags() const; const std::string& getName() const; @@ -32,28 +34,31 @@ class EE_API StyleSheetSelector { const std::string getId() const; - const std::vector getClasses() const; + const std::vector& getClasses() const; const std::string& getPseudoClass() const; - bool hasTagName(); + bool hasTagName() const; - bool hasId(); + bool hasId() const; - bool hasClasses(); + bool hasClasses() const; - bool hasClass( std::string cls ); + bool hasClass( std::string cls ) const; - bool hasPseudoClass(); + bool hasPseudoClass() const; - Uint32 getSpecificity(); + bool isGlobal() const; + + const Uint32& getSpecificity() const; protected: - std::string name; - std::string tagName; - std::string id; - std::vector classes; - std::string pseudoClass; - Uint32 specificity; + std::string mName; + std::string mTagName; + std::string mId; + std::vector mClasses; + std::string mPseudoClass; + Uint32 mSpecificity; + bool mGlobal; void parseSelector( const std::string& selector ); }; diff --git a/include/eepp/ui/uimenu.hpp b/include/eepp/ui/uimenu.hpp index e5044442e..12f63ff3d 100644 --- a/include/eepp/ui/uimenu.hpp +++ b/include/eepp/ui/uimenu.hpp @@ -58,8 +58,6 @@ class EE_API UIMenu : public UIWidget { virtual bool hide(); - const Rectf& getPadding() const; - Uint32 getMinRightMargin() const; void setMinRightMargin(const Uint32 & minRightMargin); @@ -69,6 +67,8 @@ class EE_API UIMenu : public UIWidget { void setFontStyleConfig(const UITooltipStyleConfig & fontStyleConfig); virtual void loadFromXmlNode( const pugi::xml_node& node ); + + virtual bool setAttribute( const NodeAttribute& attribute, const Uint32& state = UIState::StateFlagNormal ); protected: friend class UIMenuItem; friend class UIMenuCheckBox; diff --git a/include/eepp/ui/uimenuitem.hpp b/include/eepp/ui/uimenuitem.hpp index e0c68eae4..c2514b37f 100644 --- a/include/eepp/ui/uimenuitem.hpp +++ b/include/eepp/ui/uimenuitem.hpp @@ -19,11 +19,9 @@ class EE_API UIMenuItem : public UIPushButton { virtual void setTheme( UITheme * Theme ); protected: - UIMenuItem( const std::string& tag ); + explicit UIMenuItem( const std::string& tag ); virtual Uint32 onMouseEnter( const Vector2i &position, const Uint32 flags ); - - virtual void onStateChange(); }; }} diff --git a/include/eepp/ui/uiscenenode.hpp b/include/eepp/ui/uiscenenode.hpp index 81ce660f0..ac83fc047 100644 --- a/include/eepp/ui/uiscenenode.hpp +++ b/include/eepp/ui/uiscenenode.hpp @@ -42,7 +42,9 @@ class EE_API UISceneNode : public SceneNode { UIWidget * loadLayoutNodes( pugi::xml_node node, Node * parent ); - void setStyleSheet( CSS::StyleSheet styleSheet ); + void setStyleSheet( const CSS::StyleSheet& styleSheet ); + + void combineStyleSheet( const CSS::StyleSheet& styleSheet ); CSS::StyleSheet& getStyleSheet(); @@ -68,6 +70,8 @@ class EE_API UISceneNode : public SceneNode { bool windowExists( UIWindow * win ); virtual void setInternalSize(const Sizef& size ); + + void reloadStyle(); }; }} diff --git a/include/eepp/ui/uitheme.hpp b/include/eepp/ui/uitheme.hpp index 74b3598d0..354506e91 100644 --- a/include/eepp/ui/uitheme.hpp +++ b/include/eepp/ui/uitheme.hpp @@ -5,6 +5,7 @@ #include #include #include +#include #include namespace EE { namespace Graphics { @@ -27,9 +28,9 @@ class EE_API UITheme : protected ResourceManager { static UITheme * loadFromTextureAtlas( UITheme * tTheme, Graphics::TextureAtlas * getTextureAtlas ); - static UITheme * loadFromDirectroy( UITheme * tTheme, const std::string& Path, const Float& pixelDensity = 1 ); + static UITheme * loadFromTextureAtlas( Graphics::TextureAtlas * getTextureAtlas, const std::string& Name, const std::string& NameAbbr ); - static UITheme * loadFromTextureAtlas( Graphics::TextureAtlas * getTextureAtlas, const std::string& Name, const std::string NameAbbr ); + static UITheme * loadFromDirectroy( UITheme * tTheme, const std::string& Path, const Float& pixelDensity = 1 ); static UITheme * loadFromDirectroy( const std::string& Path, const std::string& Name, const std::string& NameAbbr, const Float& pixelDensity = 1 ); @@ -59,29 +60,24 @@ class EE_API UITheme : protected ResourceManager { void setFontStyleConfig(UIFontStyleConfig fontConfig); - virtual UITabWidgetStyleConfig getTabWidgetStyleConfig(); - - virtual UIProgressBarStyleConfig getProgressBarStyleConfig(); - - virtual UIWinMenuStyleConfig getWinMenuStyleConfig(); - virtual UIDropDownListStyleConfig getDropDownListStyleConfig(); virtual UIWindowStyleConfig getWindowStyleConfig(); - virtual UIMenuStyleConfig getMenuStyleConfig(); - virtual UIPushButtonStyleConfig getPushButtonStyleConfig(); - virtual UISliderStyleConfig getSliderStyleConfig(); - virtual UITooltipStyleConfig getTooltipStyleConfig(); + + const CSS::StyleSheet& getStyleSheet() const; + + void setStyleSheet(const CSS::StyleSheet & styleSheet); protected: std::string mName; Uint32 mNameHash; std::string mAbbr; Graphics::TextureAtlas *mTextureAtlas; UIFontStyleConfig mFontStyleConfig; + CSS::StyleSheet mStyleSheet; void setTextureAtlas( Graphics::TextureAtlas * SG ); }; diff --git a/include/eepp/ui/uithemedefault.hpp b/include/eepp/ui/uithemedefault.hpp index e8cb56891..9bb2cb562 100644 --- a/include/eepp/ui/uithemedefault.hpp +++ b/include/eepp/ui/uithemedefault.hpp @@ -11,18 +11,8 @@ class EE_API UIThemeDefault : public UITheme { UIThemeDefault( const std::string& name, const std::string& abbr, Graphics::Font * defaultFont = NULL ); - UITabWidgetStyleConfig getTabWidgetStyleConfig(); - - UIProgressBarStyleConfig getProgressBarStyleConfig(); - - UIWinMenuStyleConfig getWinMenuStyleConfig(); - UIWindowStyleConfig getWindowStyleConfig(); - UIMenuStyleConfig getMenuStyleConfig(); - - UISliderStyleConfig getSliderStyleConfig(); - UITooltipStyleConfig getTooltipStyleConfig(); }; diff --git a/include/eepp/ui/uiwidget.hpp b/include/eepp/ui/uiwidget.hpp index 034de70e0..353c389c0 100644 --- a/include/eepp/ui/uiwidget.hpp +++ b/include/eepp/ui/uiwidget.hpp @@ -118,7 +118,7 @@ class EE_API UIWidget : public UINode, public CSS::StyleSheetElement { virtual void popState( const Uint32& State, bool emitEvent = true ); - void reloadStyle(); + void reloadStyle( const bool& reloadChilds = true ); protected: friend class UIManager; friend class UISceneNode; diff --git a/include/eepp/ui/uiwinmenu.hpp b/include/eepp/ui/uiwinmenu.hpp index f7c3d1b22..77a2de5e5 100644 --- a/include/eepp/ui/uiwinmenu.hpp +++ b/include/eepp/ui/uiwinmenu.hpp @@ -34,10 +34,24 @@ class EE_API UIWinMenu : public UIWidget { void setMarginBetweenButtons(const Uint32 & marginBetweenButtons); + Uint32 getButtonMargin() const; + + void setButtonMargin( const Uint32& buttonMargin ); + + Uint32 getMenuHeight() const; + + void setMenuHeight( const Uint32& menuHeight ); + + Uint32 getFirstButtonMargin() const; + + void setFirstButtonMargin( const Uint32& buttonMargin ); + UIWinMenuStyleConfig getStyleConfig() const; void setStyleConfig(const UIWinMenuStyleConfig & styleConfig); + virtual bool setAttribute( const NodeAttribute& attribute, const Uint32& state = UIState::StateFlagNormal ); + virtual void loadFromXmlNode( const pugi::xml_node& node ); protected: typedef std::list< std::pair< UISelectButton *, UIPopUpMenu * > > WinMenuList; @@ -63,6 +77,8 @@ class EE_API UIWinMenu : public UIWidget { void unselectButtons(); void destroyMenues(); + + void autoHeight(); }; }} diff --git a/projects/linux/ee.files b/projects/linux/ee.files index 6212629b4..b7d0d0c15 100644 --- a/projects/linux/ee.files +++ b/projects/linux/ee.files @@ -1,5 +1,6 @@ ../../bin/assets/ee.ini ../../bin/assets/layouts/test.xml +../../bin/assets/ui/uitheme.css ../../external_projects.lua ../../include/eepp/audio/alresource.hpp ../../include/eepp/audio/AlResource.hpp diff --git a/src/eepp/scene/nodeattribute.cpp b/src/eepp/scene/nodeattribute.cpp index d4aae8f97..207b9f12b 100644 --- a/src/eepp/scene/nodeattribute.cpp +++ b/src/eepp/scene/nodeattribute.cpp @@ -107,6 +107,12 @@ int NodeAttribute::asDpDimensionI( const std::string& defaultValue ) const { return PixelDensity::toDpFromStringI( asString( defaultValue ) ); } +Uint32 NodeAttribute::asDpDimensionUint( const std::string& defaultValue ) const { + int attrInt = asDpDimensionI( defaultValue ); + + return attrInt >= 0 ? attrInt : 0; +} + static OriginPoint toOriginPoint( std::string val ) { String::toLowerInPlace( val ); diff --git a/src/eepp/ui/css/stylesheet.cpp b/src/eepp/ui/css/stylesheet.cpp index 7e1287ab9..22c795c26 100644 --- a/src/eepp/ui/css/stylesheet.cpp +++ b/src/eepp/ui/css/stylesheet.cpp @@ -7,21 +7,50 @@ namespace EE { namespace UI { namespace CSS { StyleSheet::StyleSheet() {} -void StyleSheet::addNode( StyleSheetNode node ) { - nodes.push_back( node ); +void StyleSheet::addNode( const StyleSheetNode& node ) { + mNodes[ node.getSelector().getName() ] = node; +} + +void StyleSheet::combineNode( const StyleSheetNode& node ) { + auto nodeIt = mNodes.find( node.getSelector().getName() ); + + if ( nodeIt == mNodes.end() ) { + addNode( node ); + } else { + auto currentNode = nodeIt->second; + + if ( node.getSelector().getSpecificity() > currentNode.getSelector().getSpecificity() ) { + for ( auto pit = node.getProperties().begin(); pit != node.getProperties().end(); ++pit ) + currentNode.setProperty( pit->second ); + } + } } bool StyleSheet::isEmpty() const { - return nodes.empty(); + return mNodes.empty(); +} + +void StyleSheet::print() { + for ( auto it = mNodes.begin(); it != mNodes.end(); ++it ) { + StyleSheetNode& style = it->second; + + style.print(); + } +} + +void StyleSheet::combineStyleSheet( const StyleSheet& styleSheet ) { + for ( auto it = styleSheet.getNodes().begin(); it != styleSheet.getNodes().end(); ++it ) { + addNode( it->second ); + } } StyleSheetProperties StyleSheet::getElementProperties( StyleSheetElement * element, const std::string& pseudoClass ) { StyleSheetProperties propertiesSelected; Uint32 lastSpecificity = 0; - for ( auto it = nodes.begin(); it != nodes.end(); ++it ) { - StyleSheetNode& node = *it; - StyleSheetSelector& selector = node.selector; + for ( auto it = mNodes.begin(); it != mNodes.end(); ++it ) { + StyleSheetNode& node = it->second; + const StyleSheetSelector& selector = node.getSelector(); Uint32 flags = 0; @@ -47,13 +76,17 @@ StyleSheetProperties StyleSheet::getElementProperties( StyleSheetElement * eleme } } - if ( selector.hasPseudoClass() && !pseudoClass.empty() && selector.getPseudoClass() == pseudoClass ) { + if ( selector.isGlobal() ) { + if ( !pseudoClass.empty() ) { + flags |= StyleSheetSelector::PseudoClass; + } + } else if ( selector.hasPseudoClass() && !pseudoClass.empty() && selector.getPseudoClass() == pseudoClass ) { flags |= StyleSheetSelector::PseudoClass; } if ( flags == selector.getRequiredFlags() && selector.getSpecificity() > lastSpecificity ) { - for ( auto pit = node.properties.begin(); pit != node.properties.end(); ++pit ) - propertiesSelected[ pit->second.name ] = pit->second; + for ( auto pit = node.getProperties().begin(); pit != node.getProperties().end(); ++pit ) + propertiesSelected[ pit->second.getName() ] = pit->second; lastSpecificity = selector.getSpecificity(); } @@ -62,4 +95,8 @@ StyleSheetProperties StyleSheet::getElementProperties( StyleSheetElement * eleme return propertiesSelected; } +const StyleSheet::StyleSheetNodeList& StyleSheet::getNodes() const { + return mNodes; +} + }}} diff --git a/src/eepp/ui/css/stylesheetnode.cpp b/src/eepp/ui/css/stylesheetnode.cpp index c78ffa4e8..85315cfc3 100644 --- a/src/eepp/ui/css/stylesheetnode.cpp +++ b/src/eepp/ui/css/stylesheetnode.cpp @@ -3,21 +3,36 @@ namespace EE { namespace UI { namespace CSS { +StyleSheetNode::StyleSheetNode() +{} + StyleSheetNode::StyleSheetNode( const std::string& selector, const StyleSheetProperties& properties ) : - selector( selector ), - properties( properties ) + mSelector( selector ), + mProperties( properties ) {} void StyleSheetNode::print() { - std::cout << selector.getName() << " {" << std::endl; + std::cout << mSelector.getName() << " {" << std::endl; - for ( StyleSheetProperties::iterator it = properties.begin(); it != properties.end(); ++it ) { + for ( StyleSheetProperties::iterator it = mProperties.begin(); it != mProperties.end(); ++it ) { StyleSheetProperty& prop = it->second; - std::cout << "\t" << prop.name << ": " << prop.value << ";" << std::endl; + std::cout << "\t" << prop.getName() << ": " << prop.getValue() << ";" << std::endl; } std::cout << "}" << std::endl; } +const StyleSheetSelector &StyleSheetNode::getSelector() const { + return mSelector; +} + +const StyleSheetProperties &StyleSheetNode::getProperties() const { + return mProperties; +} + +void StyleSheetNode::setProperty( const StyleSheetProperty & property ) { + mProperties[ property.getName() ] = property; +} + }}} diff --git a/src/eepp/ui/css/stylesheetparser.cpp b/src/eepp/ui/css/stylesheetparser.cpp index 558b350bd..86de9a36f 100644 --- a/src/eepp/ui/css/stylesheetparser.cpp +++ b/src/eepp/ui/css/stylesheetparser.cpp @@ -57,11 +57,7 @@ bool StyleSheetParser::loadFromMemory( const Uint8* RAWData, const Uint32& size } void StyleSheetParser::print() { - for ( auto it = mStyleSheet.nodes.begin(); it != mStyleSheet.nodes.end(); ++it ) { - StyleSheetNode& style = *it; - - style.print(); - } + mStyleSheet.print(); std::cout << "Comments: " << std::endl; @@ -167,7 +163,7 @@ int StyleSheetParser::readProperty( ReadState& rs, std::size_t pos, std::string& if ( !selectorParse.selectors.empty() ) { for ( auto it = selectorParse.selectors.begin(); it != selectorParse.selectors.end(); ++it ) { - StyleSheetNode node( selectorName, propertiesParse.properties ); + StyleSheetNode node( it->getName(), propertiesParse.getProperties() ); mStyleSheet.addNode( node ); } diff --git a/src/eepp/ui/css/stylesheetpropertiesparser.cpp b/src/eepp/ui/css/stylesheetpropertiesparser.cpp index 1e007cb0b..cceb7b0cd 100644 --- a/src/eepp/ui/css/stylesheetpropertiesparser.cpp +++ b/src/eepp/ui/css/stylesheetpropertiesparser.cpp @@ -10,6 +10,10 @@ StyleSheetPropertiesParser::StyleSheetPropertiesParser( const std::string& props if ( !props.empty() ) { parse( propsstr ); } +} + +const StyleSheetProperties & StyleSheetPropertiesParser::getProperties() const { + return mProperties; }; void StyleSheetPropertiesParser::parse( std::string propsstr ) { @@ -85,7 +89,7 @@ int StyleSheetPropertiesParser::readPropertyValue(StyleSheetPropertiesParser::Re if ( str[pos] == ';' ) { rs = ReadingPropertyName; - properties[ propName ] = StyleSheetProperty( propName, buffer ); + mProperties[ propName ] = StyleSheetProperty( propName, buffer ); return pos + 1; } @@ -98,7 +102,7 @@ int StyleSheetPropertiesParser::readPropertyValue(StyleSheetPropertiesParser::Re if ( pos == str.size() ) { rs = ReadingPropertyName; - properties[ propName ] = StyleSheetProperty( propName, buffer ); + mProperties[ propName ] = StyleSheetProperty( propName, buffer ); return pos + 1; } diff --git a/src/eepp/ui/css/stylesheetproperty.cpp b/src/eepp/ui/css/stylesheetproperty.cpp index 35b11fff7..8ed288c81 100644 --- a/src/eepp/ui/css/stylesheetproperty.cpp +++ b/src/eepp/ui/css/stylesheetproperty.cpp @@ -7,8 +7,20 @@ StyleSheetProperty::StyleSheetProperty() {} StyleSheetProperty::StyleSheetProperty( const std::string& name, const std::string& value ) : - name( String::toLower( String::trim( name ) ) ), - value( String::trim( value ) ) + mName( String::toLower( String::trim( name ) ) ), + mValue( String::trim( value ) ) {} +const std::string &StyleSheetProperty::getName() const { + return mName; +} + +const std::string &StyleSheetProperty::getValue() const { + return mValue; +} + +const Uint32 &StyleSheetProperty::getSpecificity() const { + return mSpecificity; +} + }}} diff --git a/src/eepp/ui/css/stylesheetselector.cpp b/src/eepp/ui/css/stylesheetselector.cpp index acdec9a1a..81da70dea 100644 --- a/src/eepp/ui/css/stylesheetselector.cpp +++ b/src/eepp/ui/css/stylesheetselector.cpp @@ -3,19 +3,24 @@ namespace EE { namespace UI { namespace CSS { +StyleSheetSelector::StyleSheetSelector() : + mSpecificity(0), + mGlobal(false) +{} StyleSheetSelector::StyleSheetSelector( const std::string& selectorName ) : - name( String::toLower( selectorName ) ), - specificity(0) + mName( String::toLower( selectorName ) ), + mSpecificity(0), + mGlobal(false) { - auto parts = String::split( name, ' ' ); + auto parts = String::split( mName, ' ' ); for ( auto it = parts.begin(); it != parts.end(); ++it ) { parseSelector( *it ); } } -Uint32 StyleSheetSelector::getRequiredFlags() { +Uint32 StyleSheetSelector::getRequiredFlags() const { Uint32 flags = 0; if ( hasTagName() ) @@ -33,27 +38,51 @@ Uint32 StyleSheetSelector::getRequiredFlags() { return flags; } -const std::string& StyleSheetSelector::getName() const { return name; }; +const std::string& StyleSheetSelector::getName() const { + return mName; +}; -const std::string& StyleSheetSelector::getTagName() const { return tagName; } +const std::string& StyleSheetSelector::getTagName() const { + return mTagName; +} -const std::string StyleSheetSelector::getId() const { return id; } +const std::string StyleSheetSelector::getId() const { + return mId; +} -const std::vector StyleSheetSelector::getClasses() const { return classes; } +const std::vector & StyleSheetSelector::getClasses() const { + return mClasses; +} -const std::string& StyleSheetSelector::getPseudoClass() const { return pseudoClass; }; +const std::string& StyleSheetSelector::getPseudoClass() const { + return mPseudoClass; +}; -bool StyleSheetSelector::hasTagName() { return !tagName.empty(); } +bool StyleSheetSelector::hasTagName() const { + return !mTagName.empty(); +} -bool StyleSheetSelector::hasId() { return !id.empty(); } +bool StyleSheetSelector::hasId() const { + return !mId.empty(); +} -bool StyleSheetSelector::hasClasses() { return !classes.empty(); } +bool StyleSheetSelector::hasClasses() const { + return !mClasses.empty(); +} -bool StyleSheetSelector::hasClass( std::string cls ) { return std::find(classes.begin(), classes.end(), cls) != classes.end(); } +bool StyleSheetSelector::hasClass( std::string cls ) const { + return std::find(mClasses.begin(), mClasses.end(), cls) != mClasses.end(); +} -bool StyleSheetSelector::hasPseudoClass() { return !pseudoClass.empty(); } +bool StyleSheetSelector::hasPseudoClass() const { + return !mPseudoClass.empty(); +} -Uint32 StyleSheetSelector::getSpecificity() { return specificity; } +bool StyleSheetSelector::isGlobal() const { + return mGlobal; +} + +const Uint32& StyleSheetSelector::getSpecificity() const { return mSpecificity; } void StyleSheetSelector::parseSelector( const std::string& selector ) { auto selPseudo = String::split( selector, ':' ); @@ -63,22 +92,23 @@ void StyleSheetSelector::parseSelector( const std::string& selector ) { if ( !rselector.empty() ) { if ( rselector[0] == '.' ) { - classes.push_back( rselector.substr(1) ); - specificity += SpecificityClass; + mClasses.push_back( rselector.substr(1) ); + mSpecificity += SpecificityClass; } else if ( selector[0] == '#' ) { - id = rselector.substr(1); - specificity += SpecificityId; + mId = rselector.substr(1); + mSpecificity += SpecificityId; } else if ( selector[0] == '*' ) { - specificity += SpecificityGlobal; + mSpecificity += SpecificityGlobal; + mGlobal = true; } else { - tagName = rselector; - specificity += SpecificityTag; + mTagName = rselector; + mSpecificity += SpecificityTag; } } if ( selPseudo.size() > 1 ) { - pseudoClass = selPseudo[1]; - specificity += SpecificityPseudoClass; + mPseudoClass = selPseudo[1]; + mSpecificity += SpecificityPseudoClass; } } } diff --git a/src/eepp/ui/css/stylesheetselectorparser.cpp b/src/eepp/ui/css/stylesheetselectorparser.cpp index 9128ba9e0..5b222d53e 100644 --- a/src/eepp/ui/css/stylesheetselectorparser.cpp +++ b/src/eepp/ui/css/stylesheetselectorparser.cpp @@ -8,9 +8,11 @@ StyleSheetSelectorParser::StyleSheetSelectorParser( std::string name ) { std::vector sels = String::split( name, ',' ); - for ( std::vector::iterator it = sels.begin(); it != sels.end(); ++it ) + for ( auto it = sels.begin(); it != sels.end(); ++it ) { std::string cur = String::trim( *it ); + String::replaceAll( cur, "\n", "" ); + String::replaceAll( cur, "\t", "" ); selectors.push_back( StyleSheetSelector( cur ) ); } diff --git a/src/eepp/ui/uicombobox.cpp b/src/eepp/ui/uicombobox.cpp index fd0f773ef..f005e3446 100644 --- a/src/eepp/ui/uicombobox.cpp +++ b/src/eepp/ui/uicombobox.cpp @@ -59,6 +59,8 @@ void UIComboBox::setTheme( UITheme * Theme ) { } updateControls(); + + onThemeLoaded(); } UIListBox * UIComboBox::getListBox() { diff --git a/src/eepp/ui/uicommondialog.cpp b/src/eepp/ui/uicommondialog.cpp index f45542e7c..c60411ce1 100644 --- a/src/eepp/ui/uicommondialog.cpp +++ b/src/eepp/ui/uicommondialog.cpp @@ -124,6 +124,8 @@ void UICommonDialog::setTheme( UITheme * Theme ) { mButtonUp->setText( "" ); mButtonUp->setIcon( Icon ); } + + onThemeLoaded(); } void UICommonDialog::refreshFolder() { diff --git a/src/eepp/ui/uilistbox.cpp b/src/eepp/ui/uilistbox.cpp index 99efaf6cb..cc477e48a 100644 --- a/src/eepp/ui/uilistbox.cpp +++ b/src/eepp/ui/uilistbox.cpp @@ -94,6 +94,8 @@ void UIListBox::setTheme( UITheme * Theme ) { autoPadding(); onSizeChange(); + + onThemeLoaded(); } void UIListBox::autoPadding() { @@ -715,8 +717,10 @@ Uint32 UIListBox::getItemIndex( const String& Text ) { void UIListBox::setFontColor( const Color& Color ) { mFontStyleConfig.FontColor = Color; - for ( Uint32 i = 0; i < mItems.size(); i++ ) - mItems[i]->setFontColor( mFontStyleConfig.FontColor ); + for ( Uint32 i = 0; i < mItems.size(); i++ ) { + if ( NULL != mItems[i] ) + mItems[i]->setFontColor( mFontStyleConfig.FontColor ); + } } const Color& UIListBox::getFontColor() const { diff --git a/src/eepp/ui/uilistboxitem.cpp b/src/eepp/ui/uilistboxitem.cpp index 947b8c625..227c1ac7f 100644 --- a/src/eepp/ui/uilistboxitem.cpp +++ b/src/eepp/ui/uilistboxitem.cpp @@ -38,6 +38,8 @@ void UIListBoxItem::setTheme( UITheme * Theme ) { UIWidget::setTheme( Theme ); setThemeSkin( Theme, "listboxitem" ); + + onThemeLoaded(); } Uint32 UIListBoxItem::onMouseUp( const Vector2i& Pos, const Uint32 Flags ) { @@ -116,20 +118,10 @@ bool UIListBoxItem::isSelected() const { } void UIListBoxItem::onStateChange() { - UIListBox * LBParent = reinterpret_cast ( getParent()->getParent() ); - if ( isSelected() && mSkinState->getState() != UIState::StateSelected ) { pushState( UIState::StateSelected, false ); } - if ( mSkinState->getState() & UIState::StateFlagSelected ) { - setFontColor( LBParent->getFontSelectedColor() ); - } else if ( mSkinState->getState() & UIState::StateFlagHover ) { - setFontColor( LBParent->getFontOverColor() ); - } else { - setFontColor( LBParent->getFontColor() ); - } - UITextView::onStateChange(); } diff --git a/src/eepp/ui/uimenu.cpp b/src/eepp/ui/uimenu.cpp index 714fbbeaa..18da6a4de 100644 --- a/src/eepp/ui/uimenu.cpp +++ b/src/eepp/ui/uimenu.cpp @@ -26,13 +26,6 @@ UIMenu::UIMenu() : mStyleConfig = UIThemeManager::instance()->getDefaultFontStyleConfig(); - UITheme * Theme = UIThemeManager::instance()->getDefaultTheme(); - - if ( NULL != Theme ) { - mStyleConfig = Theme->getMenuStyleConfig(); - mBiggestIcon = mStyleConfig.MinSpaceForIcons; - } - onSizeChange(); applyDefaultTheme(); @@ -136,7 +129,7 @@ bool UIMenu::checkControlSize( UINode * Control, const bool& Resize ) { UIMenuSubMenu * tMenu = reinterpret_cast ( tItem ); if ( textWidth + PixelDensity::dpToPxI( mBiggestIcon ) + tMenu->getArrow()->getRealSize().getWidth() + PixelDensity::dpToPxI( mStyleConfig.MinRightMargin ) > (Int32)mMaxWidth ) { - mMaxWidth = textWidth + PixelDensity::dpToPxI( mBiggestIcon + mStyleConfig.Padding.Left + mStyleConfig.Padding.Right + mStyleConfig.MinRightMargin ) + tMenu->getArrow()->getRealSize().getWidth(); + mMaxWidth = textWidth + mRealPadding.Left + mRealPadding.Right + PixelDensity::dpToPxI( mBiggestIcon + mStyleConfig.MinRightMargin ) + tMenu->getArrow()->getRealSize().getWidth(); if ( Resize ) { resizeControls(); @@ -169,7 +162,7 @@ Uint32 UIMenu::add( UINode * Control ) { setControlSize( Control, getCount() ); - Control->setPixelsPosition( PixelDensity::dpToPx( mStyleConfig.Padding.Left ), PixelDensity::dpToPx( mStyleConfig.Padding.Top ) + mNextPosY ); + Control->setPixelsPosition( mRealPadding.Left, mRealPadding.Top + mNextPosY ); mNextPosY += Control->getRealSize().getHeight(); @@ -180,15 +173,15 @@ Uint32 UIMenu::add( UINode * Control ) { return mItems.size() - 1; } -void UIMenu::setControlSize( UINode * Control, const Uint32& Pos ) { +void UIMenu::setControlSize( UINode * Control, const Uint32& ) { Control->setPixelsSize( mSize.getWidth(), Control->getRealSize().getHeight() ); } Uint32 UIMenu::addSeparator() { UIMenuSeparator * Control = UIMenuSeparator::New(); Control->setParent( this ); - Control->setPixelsPosition( PixelDensity::dpToPx( mStyleConfig.Padding.Left ), PixelDensity::dpToPx( mStyleConfig.Padding.Top ) + mNextPosY ); - Control->setPixelsSize( mSize.getWidth() - PixelDensity::dpToPxI( mStyleConfig.Padding.Left - mStyleConfig.Padding.Right ), PixelDensity::dpToPxI( Control->getSkinSize().getHeight() ) ); + Control->setPixelsPosition( mRealPadding.Left, mRealPadding.Top + mNextPosY ); + Control->setPixelsSize( mSize.getWidth() - mRealPadding.Left - mRealPadding.Right, PixelDensity::dpToPxI( Control->getSkinSize().getHeight() ) ); mNextPosY += Control->getRealSize().getHeight(); @@ -318,7 +311,7 @@ Uint32 UIMenu::onMessage( const NodeMessage * Msg ) { void UIMenu::onSizeChange() { if ( 0 != mStyleConfig.MinWidth && mDpSize.getWidth() < (Int32)mStyleConfig.MinWidth ) { - setSize( mStyleConfig.MinWidth, PixelDensity::pxToDpI( mNextPosY ) + mStyleConfig.Padding.Top + mStyleConfig.Padding.Bottom ); + setSize( mStyleConfig.MinWidth, PixelDensity::pxToDpI( mNextPosY ) + mPadding.Top + mPadding.Bottom ); } UIWidget::onSizeChange(); @@ -326,7 +319,7 @@ void UIMenu::onSizeChange() { void UIMenu::autoPadding() { if ( mFlags & UI_AUTO_PADDING ) { - mStyleConfig.Padding = makePadding(); + mPadding = makePadding(); } } @@ -354,7 +347,7 @@ void UIMenu::rePosControls() { for ( i = 0; i < mItems.size(); i++ ) { UINode * ctrl = mItems[i]; - ctrl->setPixelsPosition( PixelDensity::dpToPx( mStyleConfig.Padding.Left ), PixelDensity::dpToPx( mStyleConfig.Padding.Top ) + mNextPosY ); + ctrl->setPixelsPosition( mRealPadding.Left, mRealPadding.Top + mNextPosY ); mNextPosY += ctrl->getRealSize().getHeight(); } @@ -365,9 +358,9 @@ void UIMenu::rePosControls() { void UIMenu::resizeMe() { if ( mFlags & UI_AUTO_SIZE ) { - setPixelsSize( mMaxWidth, mNextPosY + PixelDensity::dpToPxI( mStyleConfig.Padding.Top + mStyleConfig.Padding.Bottom ) ); + setPixelsSize( mMaxWidth, mNextPosY + mRealPadding.Top + mRealPadding.Bottom ); } else { - setPixelsSize( mSize.getWidth(), mNextPosY + PixelDensity::dpToPxI( mStyleConfig.Padding.Top + mStyleConfig.Padding.Bottom ) ); + setPixelsSize( mSize.getWidth(), mNextPosY + mRealPadding.Top + mRealPadding.Bottom ); } } @@ -517,10 +510,6 @@ Uint32 UIMenu::onKeyDown( const KeyEvent& Event ) { return UIWidget::onKeyDown( Event ); } -const Rectf& UIMenu::getPadding() const { - return mStyleConfig.Padding; -} - Uint32 UIMenu::getMinRightMargin() const { return mStyleConfig.MinRightMargin; } @@ -593,6 +582,25 @@ void UIMenu::loadFromXmlNode( const pugi::xml_node& node ) { endAttributesTransaction(); } +bool UIMenu::setAttribute(const NodeAttribute & attribute, const Uint32 & state) { + const std::string& name = attribute.getName(); + + if ( "minwidth" == name ) { + mStyleConfig.MinWidth = attribute.asInt(); + onSizeChange(); + } else if ( "minrightmargin" == name ) { + setMinRightMargin( attribute.asDpDimensionUint() ); + } else if ( "minspaceforicons" == name ) { + mStyleConfig.MinSpaceForIcons = attribute.asDpDimensionUint(); + mBiggestIcon = eemax( mBiggestIcon, mStyleConfig.MinSpaceForIcons ); + rePosControls(); + } else { + return UIWidget::setAttribute( attribute, state ); + } + + return true; +} + void UIMenu::fixMenuPos( Vector2f& Pos, UIMenu * Menu, UIMenu * Parent, UIMenuSubMenu * SubMenu ) { SceneNode * sceneNode = Menu->getSceneNode(); diff --git a/src/eepp/ui/uimenuitem.cpp b/src/eepp/ui/uimenuitem.cpp index bd7744343..caaf0e5cd 100644 --- a/src/eepp/ui/uimenuitem.cpp +++ b/src/eepp/ui/uimenuitem.cpp @@ -42,21 +42,4 @@ Uint32 UIMenuItem::onMouseEnter( const Vector2i &Pos, const Uint32 Flags ) { return 1; } -void UIMenuItem::onStateChange() { - UIMenu * tMenu = reinterpret_cast ( getParent() ); - - if ( NULL == mSkinState ) - return; - - if ( mSkinState->getState() & UIState::StateFlagSelected ) { - mTextBox->setFontColor( tMenu->getFontStyleConfig().getFontSelectedColor() ); - } else if ( mSkinState->getState() & UIState::StateFlagHover ) { - mTextBox->setFontColor( tMenu->getFontStyleConfig().getFontOverColor() ); - } else { - mTextBox->setFontColor( tMenu->getFontStyleConfig().getFontColor() ); - } - - UIPushButton::onStateChange(); -} - }} diff --git a/src/eepp/ui/uimenuseparator.cpp b/src/eepp/ui/uimenuseparator.cpp index e591bede6..ece495a38 100644 --- a/src/eepp/ui/uimenuseparator.cpp +++ b/src/eepp/ui/uimenuseparator.cpp @@ -31,6 +31,8 @@ void UIMenuSeparator::setTheme( UITheme * Theme ) { if ( NULL != getSkin() ) { setSize( Sizef( mDpSize.getWidth(), getSkinSize().getHeight() ) ); } + + onThemeLoaded(); } }} diff --git a/src/eepp/ui/uimenusubmenu.cpp b/src/eepp/ui/uimenusubmenu.cpp index 6471e8bfc..36e12fdfb 100644 --- a/src/eepp/ui/uimenusubmenu.cpp +++ b/src/eepp/ui/uimenusubmenu.cpp @@ -44,6 +44,8 @@ void UIMenuSubMenu::setTheme( UITheme * Theme ) { mArrow->setSize( mArrow->getSkinSize() ); onStateChange(); + + onThemeLoaded(); } void UIMenuSubMenu::onSizeChange() { @@ -126,7 +128,7 @@ UINode * UIMenuSubMenu::getArrow() const { return mArrow; } -void UIMenuSubMenu::onSubMenuFocusLoss( const Event * Event ) { +void UIMenuSubMenu::onSubMenuFocusLoss( const Event * ) { if ( NULL != getEventDispatcher() ) { Node * FocusCtrl = getEventDispatcher()->getFocusControl(); @@ -142,7 +144,7 @@ void UIMenuSubMenu::onSubMenuFocusLoss( const Event * Event ) { } } -void UIMenuSubMenu::onHideByClick( const Event * Event ) { +void UIMenuSubMenu::onHideByClick( const Event * ) { UIMenu * tMenu = reinterpret_cast( getParent() ); tMenu->mClickHide = true; diff --git a/src/eepp/ui/uimessagebox.cpp b/src/eepp/ui/uimessagebox.cpp index 230ca5f96..02e405e96 100644 --- a/src/eepp/ui/uimessagebox.cpp +++ b/src/eepp/ui/uimessagebox.cpp @@ -96,6 +96,8 @@ void UIMessageBox::setTheme( UITheme * Theme ) { mButtonCancel->setIcon( CancelIcon ); } } + + onThemeLoaded(); } Uint32 UIMessageBox::onMessage( const NodeMessage * Msg ) { diff --git a/src/eepp/ui/uiprogressbar.cpp b/src/eepp/ui/uiprogressbar.cpp index b12f7a144..f37e27df8 100644 --- a/src/eepp/ui/uiprogressbar.cpp +++ b/src/eepp/ui/uiprogressbar.cpp @@ -17,18 +17,12 @@ UIProgressBar::UIProgressBar() : { setFlags( UI_AUTO_PADDING | UI_AUTO_SIZE ); - UITheme * Theme = UIThemeManager::instance()->getDefaultTheme(); - mTextBox = UITextView::New(); + mTextBox->setElementTag( "progressbartext" ); mTextBox->setHorizontalAlign( UI_HALIGN_CENTER ); mTextBox->setParent( this ); mTextBox->setEnabled( false ); - if ( NULL != Theme ) { - mStyleConfig = Theme->getProgressBarStyleConfig(); - mTextBox->setFontStyleConfig( mStyleConfig ); - } - updateTextBox(); applyDefaultTheme(); @@ -235,6 +229,8 @@ bool UIProgressBar::setAttribute( const NodeAttribute& attribute, const Uint32& setFillerPadding( Rectf( mStyleConfig.FillerPadding.Left, attribute.asDpDimension(), mStyleConfig.FillerPadding.Right, mStyleConfig.FillerPadding.Bottom ) ); } else if ( "fillerpaddingbottom" == name ) { setFillerPadding( Rectf( mStyleConfig.FillerPadding.Left, mStyleConfig.FillerPadding.Top, mStyleConfig.FillerPadding.Right, attribute.asDpDimension() ) ); + } else if ( "movementspeed" == name ) { + setMovementSpeed( attribute.asVector2f() ); } else { return UIWidget::setAttribute( attribute, state ); } diff --git a/src/eepp/ui/uipushbutton.cpp b/src/eepp/ui/uipushbutton.cpp index d7f883361..7a19f1e2a 100644 --- a/src/eepp/ui/uipushbutton.cpp +++ b/src/eepp/ui/uipushbutton.cpp @@ -240,12 +240,6 @@ void UIPushButton::onAlphaChange() { } void UIPushButton::onStateChange() { - if ( mSkinState->getState() & UIState::StateFlagHover ) { - mTextBox->setFontColor( mStyleConfig.FontOverColor ); - } else { - mTextBox->setFontColor( mStyleConfig.FontColor ); - } - mTextBox->setAlpha( mAlpha ); UIWidget::onStateChange(); diff --git a/src/eepp/ui/uiscenenode.cpp b/src/eepp/ui/uiscenenode.cpp index 773f1eee3..71676c342 100644 --- a/src/eepp/ui/uiscenenode.cpp +++ b/src/eepp/ui/uiscenenode.cpp @@ -98,9 +98,27 @@ UIWidget * UISceneNode::loadLayoutNodes( pugi::xml_node node, Node * parent ) { return firstWidget; } -void UISceneNode::setStyleSheet(CSS::StyleSheet styleSheet) { +void UISceneNode::setStyleSheet( const CSS::StyleSheet& styleSheet ) { mStyleSheet = styleSheet; + reloadStyle(); +} + +void UISceneNode::combineStyleSheet(const CSS::StyleSheet & styleSheet) { + mStyleSheet.combineStyleSheet( styleSheet ); + + reloadStyle(); +} + +CSS::StyleSheet& UISceneNode::getStyleSheet() { + return mStyleSheet; +} + +bool UISceneNode::hasStyleSheet() { + return !mStyleSheet.isEmpty(); +} + +void UISceneNode::reloadStyle() { if ( NULL != mChild ) { Node * ChildLoop = mChild; @@ -113,14 +131,6 @@ void UISceneNode::setStyleSheet(CSS::StyleSheet styleSheet) { } } -CSS::StyleSheet& UISceneNode::getStyleSheet() { - return mStyleSheet; -} - -bool UISceneNode::hasStyleSheet() { - return !mStyleSheet.isEmpty(); -} - UIWidget * UISceneNode::loadLayoutFromFile( const std::string& layoutPath, Node * parent ) { if ( FileSystem::fileExists( layoutPath ) ) { pugi::xml_document doc; diff --git a/src/eepp/ui/uiscrollbar.cpp b/src/eepp/ui/uiscrollbar.cpp index 632ccd7dc..61f84d300 100644 --- a/src/eepp/ui/uiscrollbar.cpp +++ b/src/eepp/ui/uiscrollbar.cpp @@ -35,6 +35,7 @@ UIScrollBar::UIScrollBar( const UI_ORIENTATION& orientation ) : mBtnDown->setSize( 16, 16 ); mSlider = UISlider::New(); + mSlider->setElementTag( "scrollbarslider" ); mSlider->setOrientation( orientation ); mSlider->setParent( this ); mSlider->setAllowHalfSliderOut( false ); @@ -92,6 +93,8 @@ void UIScrollBar::setTheme( UITheme * Theme ) { adjustChilds(); mSlider->adjustChilds(); + + onThemeLoaded(); } void UIScrollBar::onAutoSize() { @@ -113,7 +116,7 @@ void UIScrollBar::onAutoSize() { } } } else if ( NULL != mSlider->getSliderButton() ) { - UISkin * tSkin = mSlider->getSliderButton()->getSkin(); + tSkin = mSlider->getSliderButton()->getSkin(); if ( NULL != tSkin ) { size = tSkin->getSize(); @@ -129,7 +132,7 @@ void UIScrollBar::onAutoSize() { } if ( mLayoutWidthRules == WRAP_CONTENT || mLayoutHeightRules == WRAP_CONTENT ) { - Sizef size = PixelDensity::dpToPx( mSlider->getMinimumSize() ) + mRealPadding; + size = PixelDensity::dpToPx( mSlider->getMinimumSize() ) + mRealPadding; if ( mScrollBarType == TwoButtons ) { if ( mSlider->isVertical() ) { @@ -270,7 +273,7 @@ bool UIScrollBar::isVertical() const { return mSlider->isVertical(); } -void UIScrollBar::onValueChangeCb( const Event * Event ) { +void UIScrollBar::onValueChangeCb( const Event * ) { onValueChange(); } @@ -326,6 +329,8 @@ bool UIScrollBar::setAttribute( const NodeAttribute& attribute, const Uint32& st } else if ( "twobuttons" == val ) { setScrollBarType( TwoButtons ); } + } else if ( "expandbackground" == name ) { + setExpandBackground( attribute.asBool() ); } else { return UIWidget::setAttribute( attribute, state ); } diff --git a/src/eepp/ui/uiselectbutton.cpp b/src/eepp/ui/uiselectbutton.cpp index 6deb8d29b..1701bcafa 100644 --- a/src/eepp/ui/uiselectbutton.cpp +++ b/src/eepp/ui/uiselectbutton.cpp @@ -61,26 +61,6 @@ void UISelectButton::onStateChange() { pushState( UIState::StateSelected, false ); } - if ( getParent()->isType( UI_TYPE_WINMENU ) ) { - UIWinMenu * Menu = reinterpret_cast ( getParent() ); - - if ( mSkinState->getState() & UIState::StateFlagSelected ) { - getTextBox()->setFontColor( Menu->getStyleConfig().getFontSelectedColor() ); - } else if ( mSkinState->getState() & UIState::StateFlagHover ) { - getTextBox()->setFontColor( Menu->getStyleConfig().getFontOverColor() ); - } else { - getTextBox()->setFontColor( Menu->getStyleConfig().getFontColor() ); - } - } else { - if ( mSkinState->getState() & UIState::StateFlagSelected ) { - getTextBox()->setFontColor( mStyleConfig.FontSelectedColor ); - } else if ( mSkinState->getState() & UIState::StateFlagHover ) { - getTextBox()->setFontColor( mStyleConfig.FontOverColor ); - } else { - getTextBox()->setFontColor( mStyleConfig.FontColor ); - } - } - mTextBox->setAlpha( mAlpha ); } diff --git a/src/eepp/ui/uislider.cpp b/src/eepp/ui/uislider.cpp index 93cbb935c..7254fe709 100644 --- a/src/eepp/ui/uislider.cpp +++ b/src/eepp/ui/uislider.cpp @@ -29,12 +29,6 @@ UISlider::UISlider( const UI_ORIENTATION& orientation ) : mPageStep( 0 ), mOnPosChange( false ) { - UITheme * theme = UIThemeManager::instance()->getDefaultTheme(); - - if ( NULL != theme ) { - mStyleConfig = theme->getSliderStyleConfig(); - } - Sizef bgSize; if ( UI_HORIZONTAL == mOrientation ) @@ -94,6 +88,8 @@ void UISlider::setTheme( UITheme * Theme ) { adjustChilds(); setValue( mValue ); + + onThemeLoaded(); } void UISlider::onSizeChange() { @@ -361,11 +357,13 @@ bool UISlider::getAllowHalfSliderOut() const { } void UISlider::setAllowHalfSliderOut( bool allowHalfSliderOut ) { - mStyleConfig.AllowHalfSliderOut = allowHalfSliderOut; + if ( mStyleConfig.AllowHalfSliderOut != allowHalfSliderOut ) { + mStyleConfig.AllowHalfSliderOut = allowHalfSliderOut; - adjustChilds(); + adjustChilds(); - setValue( mValue ); + setValue( mValue ); + } } bool UISlider::getExpandBackground() const { @@ -373,11 +371,13 @@ bool UISlider::getExpandBackground() const { } void UISlider::setExpandBackground( bool expandBackground ) { - mStyleConfig.ExpandBackground = expandBackground; + if ( mStyleConfig.ExpandBackground != expandBackground ) { + mStyleConfig.ExpandBackground = expandBackground; - adjustChilds(); + adjustChilds(); - setValue( mValue ); + setValue( mValue ); + } } Float UISlider::getPageStep() const { @@ -442,6 +442,8 @@ bool UISlider::setAttribute( const NodeAttribute& attribute, const Uint32& state setPageStep( attribute.asFloat() ); } else if ( "halfslider" == name ) { setAllowHalfSliderOut( attribute.asBool() ); + } else if ( "expandbackground" == name ) { + setExpandBackground( attribute.asBool() ); } else { return UIWidget::setAttribute( attribute, state ); } diff --git a/src/eepp/ui/uispinbox.cpp b/src/eepp/ui/uispinbox.cpp index 2bd59b038..56ac86994 100644 --- a/src/eepp/ui/uispinbox.cpp +++ b/src/eepp/ui/uispinbox.cpp @@ -76,6 +76,7 @@ void UISpinBox::setTheme( UITheme * Theme ) { } adjustChilds(); + onThemeLoaded(); } void UISpinBox::adjustChilds() { diff --git a/src/eepp/ui/uistyle.cpp b/src/eepp/ui/uistyle.cpp index a169d12bc..78bec6ab7 100644 --- a/src/eepp/ui/uistyle.cpp +++ b/src/eepp/ui/uistyle.cpp @@ -26,6 +26,8 @@ void UIStyle::addAttribute( int state, NodeAttribute attribute ) { } void UIStyle::load() { + mStates.clear(); + UISceneNode * uiSceneNode = mWidget->getSceneNode()->isUISceneNode() ? static_cast( mWidget->getSceneNode() ) : NULL; if ( NULL != uiSceneNode ) { @@ -49,7 +51,7 @@ void UIStyle::addStyleSheetProperties( int state, const CSS::StyleSheetPropertie for ( auto it = properties.begin(); it != properties.end(); ++it ) { CSS::StyleSheetProperty property = it->second; - addAttribute( state, NodeAttribute( property.name, property.value ) ); + addAttribute( state, NodeAttribute( property.getName(), property.getValue() ) ); } } } diff --git a/src/eepp/ui/uitab.cpp b/src/eepp/ui/uitab.cpp index 29fa4dfa5..114c117c5 100644 --- a/src/eepp/ui/uitab.cpp +++ b/src/eepp/ui/uitab.cpp @@ -89,14 +89,14 @@ void UITab::onStateChange() { } setSize( mDpSize.getWidth(), skinSize ); - +/* if ( mSkinState->getState() & UIState::StateFlagSelected ) { mTextBox->setFontColor( tTabW->getFontSelectedColor() ); } else if ( mSkinState->getState() & UIState::StateFlagHover ) { mTextBox->setFontColor( tTabW->getFontOverColor() ); } else { mTextBox->setFontColor( tTabW->getFontColor() ); - } + }*/ } } diff --git a/src/eepp/ui/uitable.cpp b/src/eepp/ui/uitable.cpp index 4b6883adc..e54992db5 100644 --- a/src/eepp/ui/uitable.cpp +++ b/src/eepp/ui/uitable.cpp @@ -98,7 +98,7 @@ void UITable::setDefaultCollumnsWidth() { updateCells(); } -void UITable::onScrollValueChange( const Event * Event ) { +void UITable::onScrollValueChange( const Event * ) { updateScroll( true ); } @@ -110,6 +110,8 @@ void UITable::setTheme( UITheme * Theme ) { autoPadding(); onSizeChange(); + + onThemeLoaded(); } void UITable::autoPadding() { diff --git a/src/eepp/ui/uitablecell.cpp b/src/eepp/ui/uitablecell.cpp index 18058297d..ac3c65533 100644 --- a/src/eepp/ui/uitablecell.cpp +++ b/src/eepp/ui/uitablecell.cpp @@ -27,6 +27,8 @@ void UITableCell::setTheme( UITheme * Theme ) { UIWidget::setTheme( Theme ); setThemeSkin( Theme, "gridcell" ); + + onThemeLoaded(); } UITable * UITableCell::gridParent() const { diff --git a/src/eepp/ui/uitabwidget.cpp b/src/eepp/ui/uitabwidget.cpp index b15b0f0a9..963edbc5e 100644 --- a/src/eepp/ui/uitabwidget.cpp +++ b/src/eepp/ui/uitabwidget.cpp @@ -4,6 +4,7 @@ #include #include #include +#include namespace EE { namespace UI { @@ -21,7 +22,7 @@ UITabWidget::UITabWidget() : UITheme * Theme = UIThemeManager::instance()->getDefaultTheme(); if ( NULL != Theme ) { - mStyleConfig = Theme->getTabWidgetStyleConfig(); + mStyleConfig.Font = Theme->getDefaultFont(); } mTabContainer = UIWidget::New(); @@ -248,7 +249,9 @@ bool UITabWidget::setAttribute( const NodeAttribute& attribute, const Uint32& st } else if ( "linebelowtabscolor" == name ) { setLineBelowTabsColor( attribute.asColor() ); } else if ( "linebelowtabsyoffset" == name ) { - setLineBelowTabsYOffset( attribute.asInt() ); + setLineBelowTabsYOffset( attribute.asDpDimensionI() ); + } else if ( "tabseparation" == name ) { + setTabSeparation( attribute.asDpDimensionI() ); } else { return UIWidget::setAttribute( attribute, state ); } @@ -655,11 +658,7 @@ void UITabWidget::setTabSelected( UITab * Tab ) { } } - if ( NULL != Tab ) { - Tab->select(); - } else { - return; - } + Tab->select(); Uint32 TabIndex = getTabIndex( Tab ); diff --git a/src/eepp/ui/uitextedit.cpp b/src/eepp/ui/uitextedit.cpp index ac13ec03d..169deabb7 100644 --- a/src/eepp/ui/uitextedit.cpp +++ b/src/eepp/ui/uitextedit.cpp @@ -81,6 +81,7 @@ void UITextEdit::setTheme( UITheme * Theme ) { autoPadding(); onSizeChange(); + onThemeLoaded(); } void UITextEdit::onSizeChange() { diff --git a/src/eepp/ui/uitextview.cpp b/src/eepp/ui/uitextview.cpp index a87230191..f1bb3a648 100644 --- a/src/eepp/ui/uitextview.cpp +++ b/src/eepp/ui/uitextview.cpp @@ -324,6 +324,8 @@ void UITextView::setTheme( UITheme * Theme ) { if ( NULL == mTextCache->getFont() && NULL != Theme->getFontStyleConfig().getFont() ) { mTextCache->setFont( Theme->getFontStyleConfig().getFont() ); } + + onThemeLoaded(); } Float UITextView::getTextWidth() { diff --git a/src/eepp/ui/uitheme.cpp b/src/eepp/ui/uitheme.cpp index 12fe86afc..ac808ee29 100644 --- a/src/eepp/ui/uitheme.cpp +++ b/src/eepp/ui/uitheme.cpp @@ -220,7 +220,7 @@ UITheme * UITheme::loadFromDirectroy( const std::string& Path, const std::string return loadFromDirectroy( UITheme::New( Name, NameAbbr ), Path, pixelDensity ); } -UITheme * UITheme::loadFromTextureAtlas( Graphics::TextureAtlas * TextureAtlas, const std::string& Name, const std::string NameAbbr ) { +UITheme * UITheme::loadFromTextureAtlas( Graphics::TextureAtlas * TextureAtlas, const std::string& Name, const std::string & NameAbbr ) { return loadFromTextureAtlas( UITheme::New( Name, NameAbbr ), TextureAtlas ); } @@ -289,18 +289,6 @@ void UITheme::setFontStyleConfig(UIFontStyleConfig fontConfig) { mFontStyleConfig = fontConfig; } -UITabWidgetStyleConfig UITheme::getTabWidgetStyleConfig() { - return UITabWidgetStyleConfig( getFontStyleConfig() ); -} - -UIProgressBarStyleConfig UITheme::getProgressBarStyleConfig() { - return UIProgressBarStyleConfig( getFontStyleConfig() );; -} - -UIWinMenuStyleConfig UITheme::getWinMenuStyleConfig() { - return UIWinMenuStyleConfig( getFontStyleConfig() ); -} - UIDropDownListStyleConfig UITheme::getDropDownListStyleConfig() { return UIDropDownListStyleConfig( getFontStyleConfig() ); } @@ -309,22 +297,22 @@ UIWindowStyleConfig UITheme::getWindowStyleConfig() { return UIWindowStyleConfig( getFontStyleConfig() ); } -UIMenuStyleConfig UITheme::getMenuStyleConfig() { - return UIMenuStyleConfig( getFontStyleConfig() ); -} - UIPushButtonStyleConfig UITheme::getPushButtonStyleConfig() { return UIPushButtonStyleConfig( getFontStyleConfig() ); } -UISliderStyleConfig UITheme::getSliderStyleConfig() { - return UISliderStyleConfig(); -} - UITooltipStyleConfig UITheme::getTooltipStyleConfig() { return UITooltipStyleConfig( getFontStyleConfig() ); } +const CSS::StyleSheet& UITheme::getStyleSheet() const { + return mStyleSheet; +} + +void UITheme::setStyleSheet(const CSS::StyleSheet & styleSheet) { + mStyleSheet = styleSheet; +} + UIFontStyleConfig UITheme::getFontStyleConfig() const { return mFontStyleConfig; } diff --git a/src/eepp/ui/uithemedefault.cpp b/src/eepp/ui/uithemedefault.cpp index 1334af666..1f4db5579 100644 --- a/src/eepp/ui/uithemedefault.cpp +++ b/src/eepp/ui/uithemedefault.cpp @@ -23,31 +23,6 @@ UIThemeDefault::UIThemeDefault( const std::string& name, const std::string& Abbr mFontStyleConfig.FontSelectionBackColor = Color( 150, 150, 150, 255 ); } -UITabWidgetStyleConfig UIThemeDefault::getTabWidgetStyleConfig() { - UITabWidgetStyleConfig tabWidgetStyleConfig = UITheme::getTabWidgetStyleConfig(); - tabWidgetStyleConfig.TabSeparation = -1; - tabWidgetStyleConfig.FontSelectedColor = Color( 255, 255, 255, 255 ); - tabWidgetStyleConfig.DrawLineBelowTabs = true; - tabWidgetStyleConfig.LineBelowTabsColor = Color( "#2f3030" ); - tabWidgetStyleConfig.LineBelowTabsYOffset = -1; - return tabWidgetStyleConfig; -} - -UIProgressBarStyleConfig UIThemeDefault::getProgressBarStyleConfig() { - UIProgressBarStyleConfig progressBarStyleConfig = UITheme::getProgressBarStyleConfig(); - progressBarStyleConfig.DisplayPercent = true; - progressBarStyleConfig.VerticalExpand = true; - progressBarStyleConfig.FillerPadding = Rectf( 2, 2, 2, 2 ); - progressBarStyleConfig.MovementSpeed = Vector2f( 32, 0 ); - return progressBarStyleConfig; -} - -UIWinMenuStyleConfig UIThemeDefault::getWinMenuStyleConfig() { - UIWinMenuStyleConfig winMenuStyleConfig = UITheme::getWinMenuStyleConfig(); - winMenuStyleConfig.ButtonMargin = 12; - return winMenuStyleConfig; -} - UIWindowStyleConfig UIThemeDefault::getWindowStyleConfig() { UIWindowStyleConfig windowStyleConfig = UITheme::getWindowStyleConfig(); windowStyleConfig.WinFlags |= UI_WIN_SHADOW; @@ -56,22 +31,6 @@ UIWindowStyleConfig UIThemeDefault::getWindowStyleConfig() { return windowStyleConfig; } -UIMenuStyleConfig UIThemeDefault::getMenuStyleConfig() { - UIMenuStyleConfig menuStyleConfig = UITheme::getMenuStyleConfig(); - menuStyleConfig.MinWidth = 100; - menuStyleConfig.MinSpaceForIcons = 24; - menuStyleConfig.MinRightMargin = 8; - menuStyleConfig.FontColor = Color( 230, 230, 230, 255 ); - menuStyleConfig.FontOverColor = Color( 255, 255, 255, 255 ); - return menuStyleConfig; -} - -UISliderStyleConfig UIThemeDefault::getSliderStyleConfig() { - UISliderStyleConfig sliderStyleConfig; - sliderStyleConfig.AllowHalfSliderOut = true; - return sliderStyleConfig; -} - UITooltipStyleConfig UIThemeDefault::getTooltipStyleConfig() { UITooltipStyleConfig tooltipStyleConfig = UITheme::getTooltipStyleConfig(); tooltipStyleConfig.FontColor = Color( 0, 0, 0, 255 ); diff --git a/src/eepp/ui/uitooltip.cpp b/src/eepp/ui/uitooltip.cpp index 37d422f09..4be50d14c 100644 --- a/src/eepp/ui/uitooltip.cpp +++ b/src/eepp/ui/uitooltip.cpp @@ -58,6 +58,7 @@ void UITooltip::setTheme( UITheme * Theme ) { setThemeSkin( Theme, "tooltip" ); autoPadding(); + onThemeLoaded(); } void UITooltip::autoPadding() { diff --git a/src/eepp/ui/uiwidget.cpp b/src/eepp/ui/uiwidget.cpp index 7990777a9..d355c21a1 100644 --- a/src/eepp/ui/uiwidget.cpp +++ b/src/eepp/ui/uiwidget.cpp @@ -460,7 +460,11 @@ bool UIWidget::containsClass( const std::string& cls ) { } void UIWidget::setElementTag( const std::string& tag ) { - mTag = tag; + if ( mTag != tag ) { + mTag = tag; + + reloadStyle( false ); + } } const std::string& UIWidget::getElementTag() const { @@ -481,14 +485,14 @@ void UIWidget::popState( const Uint32& State, bool emitEvent ) { UINode::popState( State, emitEvent ); } -void UIWidget::reloadStyle() { +void UIWidget::reloadStyle( const bool& reloadChilds ) { if ( NULL == mStyle && getSceneNode()->isUISceneNode() && static_cast( getSceneNode() )->hasStyleSheet() ) mStyle = UIStyle::New( this ); if ( NULL != mStyle ) { mStyle->load(); - if ( NULL != mChild ) { + if ( NULL != mChild && reloadChilds ) { Node * ChildLoop = mChild; while ( NULL != ChildLoop ) { diff --git a/src/eepp/ui/uiwindow.cpp b/src/eepp/ui/uiwindow.cpp index 2d4a4406c..5790346d7 100644 --- a/src/eepp/ui/uiwindow.cpp +++ b/src/eepp/ui/uiwindow.cpp @@ -93,7 +93,7 @@ UIWindow::~UIWindow() { eeSAFE_DELETE( mFrameBuffer ); } -void UIWindow::onContainerPositionChange( const Event * Event ) { +void UIWindow::onContainerPositionChange( const Event * ) { if ( NULL == mContainer ) return; @@ -490,6 +490,7 @@ void UIWindow::setTheme( UITheme * Theme ) { } fixChildsSize(); + onThemeLoaded(); } void UIWindow::calcMinWinSize() { @@ -1131,7 +1132,7 @@ void UIWindow::maximize() { } } -Uint32 UIWindow::onMouseDoubleClick( const Vector2i &Pos, const Uint32 Flags ) { +Uint32 UIWindow::onMouseDoubleClick( const Vector2i &, const Uint32 Flags ) { if ( isResizeable() && ( NULL != mButtonMaximize ) && ( Flags & EE_BUTTON_LMASK ) ) { maximize(); @@ -1425,6 +1426,13 @@ bool UIWindow::setAttribute( const NodeAttribute& attribute, const Uint32& state unsigned int val = attribute.asUint(); if ( val <= 255 ) setBaseAlpha( (Uint8)val ); + } else if ( "titlefontcolor" == name ) { + mStyleConfig.TitleFontColor = attribute.asColor(); + if ( NULL != mTitle ) + setTitle( mTitle->getText() ); + } else if ( "buttonpositionfixer" == name ) { + mStyleConfig.ButtonsPositionFixer = attribute.asVector2i(); + fixChildsSize(); } else if ( "winflags" == name ) { std::string flagsStr = attribute.asString(); String::toLowerInPlace( flagsStr ); diff --git a/src/eepp/ui/uiwinmenu.cpp b/src/eepp/ui/uiwinmenu.cpp index e2053e4c5..cc1c9737c 100644 --- a/src/eepp/ui/uiwinmenu.cpp +++ b/src/eepp/ui/uiwinmenu.cpp @@ -21,7 +21,7 @@ UIWinMenu::UIWinMenu() : UITheme * theme = UIThemeManager::instance()->getDefaultTheme(); if ( NULL != theme ) - mStyleConfig = theme->getWinMenuStyleConfig(); + mStyleConfig.Font = theme->getDefaultFont(); onParentChange(); @@ -73,13 +73,8 @@ void UIWinMenu::setTheme( UITheme * Theme ) { it->first->setThemeSkin( Theme, "winmenubutton" ); } - if ( 0 == mStyleConfig.MenuHeight && NULL != getSkin() ) { - mStyleConfig.MenuHeight = getSkinSize().getHeight(); - - setSize( getParent()->getSize().getWidth(), mStyleConfig.MenuHeight ); - - updateAnchorsDistances(); - } + autoHeight(); + onThemeLoaded(); } void UIWinMenu::removeMenuButton( const String& ButtonText ) { @@ -126,6 +121,15 @@ void UIWinMenu::setMarginBetweenButtons(const Uint32 & marginBetweenButtons) { refreshButtons(); } +Uint32 UIWinMenu::getButtonMargin() const { + return mStyleConfig.ButtonMargin; +} + +void UIWinMenu::setButtonMargin( const Uint32& buttonMargin ) { + mStyleConfig.ButtonMargin = buttonMargin; + refreshButtons(); +} + UIWinMenuStyleConfig UIWinMenu::getStyleConfig() const { return mStyleConfig; } @@ -135,6 +139,49 @@ void UIWinMenu::setStyleConfig(const UIWinMenuStyleConfig & styleConfig) { refreshButtons(); } +Uint32 UIWinMenu::getMenuHeight() const { + return mStyleConfig.MenuHeight; +} + +void UIWinMenu::setMenuHeight( const Uint32& menuHeight ) { + mStyleConfig.MenuHeight = menuHeight; + + if ( 0 != mStyleConfig.MenuHeight ) { + setSize( getParent()->getSize().getWidth(), mStyleConfig.MenuHeight ); + } else { + autoHeight(); + } + + refreshButtons(); +} + +Uint32 UIWinMenu::getFirstButtonMargin() const { + return mStyleConfig.FirstButtonMargin; +} + +void UIWinMenu::setFirstButtonMargin( const Uint32& buttonMargin ) { + mStyleConfig.FirstButtonMargin = buttonMargin; + refreshButtons(); +} + +bool UIWinMenu::setAttribute( const NodeAttribute& attribute, const Uint32 & state ) { + const std::string& name = attribute.getName(); + + if ( "marginbetweenbuttons" == name ) { + setMarginBetweenButtons( attribute.asDpDimensionUint() ); + } else if ( "buttonmargin" == name ) { + setButtonMargin( attribute.asDpDimensionUint() ); + } else if ( "menuheight" == name ) { + setMenuHeight( attribute.asDpDimensionUint() ); + } else if ( "firstbuttonmargin" == name ) { + setFirstButtonMargin( attribute.asDpDimensionUint() ); + } else { + return UIWidget::setAttribute( attribute, state ); + } + + return true; +} + void UIWinMenu::refreshButtons() { Uint32 xpos = mStyleConfig.FirstButtonMargin; Int32 h = 0, th = 0, ycenter = 0; @@ -274,7 +321,7 @@ bool UIWinMenu::isPopUpMenuChild( Node * Ctrl ) { return false; } -void UIWinMenu::onMenuFocusLoss( const Event * Event ) { +void UIWinMenu::onMenuFocusLoss( const Event * ) { Node * FocusCtrl = getEventDispatcher()->getFocusControl(); if ( !isParentOf( FocusCtrl ) && !isPopUpMenuChild( FocusCtrl ) ) { @@ -302,6 +349,16 @@ void UIWinMenu::destroyMenues() { } } +void UIWinMenu::autoHeight() { + if ( 0 == mStyleConfig.MenuHeight && NULL != getSkin() ) { + mStyleConfig.MenuHeight = getSkinSize().getHeight(); + + setSize( getParent()->getSize().getWidth(), mStyleConfig.MenuHeight ); + + updateAnchorsDistances(); + } +} + void UIWinMenu::loadFromXmlNode( const pugi::xml_node& node ) { beginAttributesTransaction(); diff --git a/src/test/eetest.cpp b/src/test/eetest.cpp index 39ec24e33..39d08ccc5 100644 --- a/src/test/eetest.cpp +++ b/src/test/eetest.cpp @@ -599,12 +599,6 @@ void EETest::createUI() { sceneNode->setTranslator( mTranslator ); - CSS::StyleSheetParser styleSheetParser; - - if ( styleSheetParser.loadFromFile( MyPath + "ui/css/style.css" ) ) { - sceneNode->setStyleSheet( styleSheetParser.getStyleSheet() ); - } - SceneManager::instance()->add( sceneNode ); eePRINTL("Node size: %d", sizeof(Node)); @@ -614,6 +608,14 @@ void EETest::createUI() { TextureAtlasLoader tgl( MyPath + "ui/" + mThemeName + EE_TEXTURE_ATLAS_EXTENSION ); mTheme = UITheme::loadFromTextureAtlas( UIThemeDefault::New( mThemeName, mThemeName ), TextureAtlasManager::instance()->getByName( mThemeName ) ); + CSS::StyleSheetParser styleSheetParser; + + if ( styleSheetParser.loadFromFile( MyPath + "ui/uitheme.css" ) ) { + mTheme->setStyleSheet( styleSheetParser.getStyleSheet() ); + + sceneNode->combineStyleSheet( mTheme->getStyleSheet() ); + } + UIThemeManager::instance()->add( mTheme ); UIThemeManager::instance()->setDefaultEffectsEnabled( true ); UIThemeManager::instance()->setDefaultFont( TTF );