From 6e746afa983f0ae70a03e051f1867a6cd3ad5be0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Tue, 22 Jan 2019 01:49:38 -0300 Subject: [PATCH] Some minor CSS refactor. --HG-- branch : dev --- include/eepp/ui.hpp | 2 +- include/eepp/ui/css/stylesheet.hpp | 17 +++++---- include/eepp/ui/css/stylesheetselector.hpp | 2 +- .../eepp/ui/css/stylesheetselectorrule.hpp | 2 +- ...stylesheetnode.hpp => stylesheetstyle.hpp} | 10 ++--- projects/linux/ee.files | 4 +- src/eepp/ui/css/stylesheet.cpp | 35 +++++++++++++----- src/eepp/ui/css/stylesheetparser.cpp | 4 +- src/eepp/ui/css/stylesheetselector.cpp | 14 +++---- src/eepp/ui/css/stylesheetselectorrule.cpp | 37 ++++++++++--------- ...stylesheetnode.cpp => stylesheetstyle.cpp} | 14 +++---- src/eepp/ui/uistyle.cpp | 2 +- 12 files changed, 82 insertions(+), 61 deletions(-) rename include/eepp/ui/css/{stylesheetnode.hpp => stylesheetstyle.hpp} (65%) rename src/eepp/ui/css/{stylesheetnode.cpp => stylesheetstyle.cpp} (61%) diff --git a/include/eepp/ui.hpp b/include/eepp/ui.hpp index 007d999ac..fd4cea410 100644 --- a/include/eepp/ui.hpp +++ b/include/eepp/ui.hpp @@ -50,7 +50,7 @@ #include #include -#include +#include #include #include #include diff --git a/include/eepp/ui/css/stylesheet.hpp b/include/eepp/ui/css/stylesheet.hpp index 254d52678..27ad33221 100644 --- a/include/eepp/ui/css/stylesheet.hpp +++ b/include/eepp/ui/css/stylesheet.hpp @@ -1,7 +1,7 @@ #ifndef EE_UI_CSS_STYLESHEET_HPP #define EE_UI_CSS_STYLESHEET_HPP -#include +#include namespace EE { namespace UI { namespace CSS { @@ -9,14 +9,15 @@ class StyleSheetElement; class EE_API StyleSheet { public: - typedef std::map StyleSheetNodeList; + typedef std::map StyleSheetStyleList; + typedef std::vector StyleSheetStyleVector; typedef std::map StyleSheetPseudoClassProperties; StyleSheet(); - void addNode( const StyleSheetNode& node ); + void addStyle( const StyleSheetStyle& node ); - void combineNode( const StyleSheetNode& node ); + void combineStyle( const StyleSheetStyle& node ); bool isEmpty() const; @@ -24,11 +25,13 @@ class EE_API StyleSheet { void combineStyleSheet( const StyleSheet& styleSheet ); - StyleSheetPseudoClassProperties getElementProperties( StyleSheetElement * element ); + StyleSheetPseudoClassProperties getElementPropertiesByState( StyleSheetElement * element ); - const StyleSheetNodeList& getNodes() const; + StyleSheetStyleVector getElementStyles( StyleSheetElement * element ); + + const StyleSheetStyleList& getStyles() const; protected: - StyleSheetNodeList mNodes; + StyleSheetStyleList mNodes; }; }}} diff --git a/include/eepp/ui/css/stylesheetselector.hpp b/include/eepp/ui/css/stylesheetselector.hpp index 4ea1c0a00..7d1b367fd 100644 --- a/include/eepp/ui/css/stylesheetselector.hpp +++ b/include/eepp/ui/css/stylesheetselector.hpp @@ -20,7 +20,7 @@ class EE_API StyleSheetSelector { const Uint32& getSpecificity() const; - bool matches( StyleSheetElement * element ) const; + bool select( StyleSheetElement * element, const bool& applyPseudo = true ) const; const bool& isCacheable() const; protected: diff --git a/include/eepp/ui/css/stylesheetselectorrule.hpp b/include/eepp/ui/css/stylesheetselectorrule.hpp index b67ae5afa..3c081b1a0 100644 --- a/include/eepp/ui/css/stylesheetselectorrule.hpp +++ b/include/eepp/ui/css/stylesheetselectorrule.hpp @@ -51,7 +51,7 @@ class StyleSheetSelectorRule { const int& getSpecificity() const { return mSpecificity; } - bool matches( StyleSheetElement * element ) const; + bool matches( StyleSheetElement * element , const bool& applyPseudo = true ) const; bool hasClass( const std::string& cls ) const; diff --git a/include/eepp/ui/css/stylesheetnode.hpp b/include/eepp/ui/css/stylesheetstyle.hpp similarity index 65% rename from include/eepp/ui/css/stylesheetnode.hpp rename to include/eepp/ui/css/stylesheetstyle.hpp index fbbdc42ff..6590b243a 100644 --- a/include/eepp/ui/css/stylesheetnode.hpp +++ b/include/eepp/ui/css/stylesheetstyle.hpp @@ -1,16 +1,16 @@ -#ifndef EE_UI_CSS_STYLESHEETNODE_HPP -#define EE_UI_CSS_STYLESHEETNODE_HPP +#ifndef EE_UI_CSS_STYLESHEETSTYLE_HPP +#define EE_UI_CSS_STYLESHEETSTYLE_HPP #include #include namespace EE { namespace UI { namespace CSS { -class EE_API StyleSheetNode { +class EE_API StyleSheetStyle { public: - StyleSheetNode(); + StyleSheetStyle(); - explicit StyleSheetNode( const std::string& selector, const StyleSheetProperties& properties ); + explicit StyleSheetStyle( const std::string& selector, const StyleSheetProperties& properties ); void print(); diff --git a/projects/linux/ee.files b/projects/linux/ee.files index c6b4d52ba..1880d817f 100644 --- a/projects/linux/ee.files +++ b/projects/linux/ee.files @@ -304,13 +304,13 @@ ../../include/eepp/ui.hpp ../../include/eepp/ui/css/stylesheet.hpp ../../include/eepp/ui/css/stylesheetelement.hpp -../../include/eepp/ui/css/stylesheetnode.hpp ../../include/eepp/ui/css/stylesheetparser.hpp ../../include/eepp/ui/css/stylesheetpropertiesparser.hpp ../../include/eepp/ui/css/stylesheetproperty.hpp ../../include/eepp/ui/css/stylesheetselector.hpp ../../include/eepp/ui/css/stylesheetselectorparser.hpp ../../include/eepp/ui/css/stylesheetselectorrule.hpp +../../include/eepp/ui/css/stylesheetstyle.hpp ../../include/eepp/ui/marginmove/scale.hpp ../../include/eepp/ui/tools/textureatlaseditor.hpp ../../include/eepp/ui/uicheckbox.hpp @@ -714,13 +714,13 @@ ../../src/eepp/system/virtualfilesystem.cpp ../../src/eepp/system/zip.cpp ../../src/eepp/ui/css/stylesheet.cpp -../../src/eepp/ui/css/stylesheetnode.cpp ../../src/eepp/ui/css/stylesheetparser.cpp ../../src/eepp/ui/css/stylesheetpropertiesparser.cpp ../../src/eepp/ui/css/stylesheetproperty.cpp ../../src/eepp/ui/css/stylesheetselector.cpp ../../src/eepp/ui/css/stylesheetselectorparser.cpp ../../src/eepp/ui/css/stylesheetselectorrule.cpp +../../src/eepp/ui/css/stylesheetstyle.cpp ../../src/eepp/ui/tools/textureatlaseditor.cpp ../../src/eepp/ui/tools/textureatlasnew.cpp ../../src/eepp/ui/tools/textureatlasnew.hpp diff --git a/src/eepp/ui/css/stylesheet.cpp b/src/eepp/ui/css/stylesheet.cpp index d39d07834..61dab75bd 100644 --- a/src/eepp/ui/css/stylesheet.cpp +++ b/src/eepp/ui/css/stylesheet.cpp @@ -7,15 +7,15 @@ namespace EE { namespace UI { namespace CSS { StyleSheet::StyleSheet() {} -void StyleSheet::addNode( const StyleSheetNode& node ) { +void StyleSheet::addStyle( const StyleSheetStyle& node ) { mNodes[ node.getSelector().getName() ] = node; } -void StyleSheet::combineNode( const StyleSheetNode& node ) { +void StyleSheet::combineStyle( const StyleSheetStyle& node ) { auto nodeIt = mNodes.find( node.getSelector().getName() ); if ( nodeIt == mNodes.end() ) { - addNode( node ); + addStyle( node ); } else { auto currentNode = nodeIt->second; @@ -32,26 +32,26 @@ bool StyleSheet::isEmpty() const { void StyleSheet::print() { for ( auto it = mNodes.begin(); it != mNodes.end(); ++it ) { - StyleSheetNode& style = it->second; + StyleSheetStyle& style = it->second; style.print(); } } void StyleSheet::combineStyleSheet( const StyleSheet& styleSheet ) { - for ( auto it = styleSheet.getNodes().begin(); it != styleSheet.getNodes().end(); ++it ) { - combineNode( it->second ); + for ( auto it = styleSheet.getStyles().begin(); it != styleSheet.getStyles().end(); ++it ) { + combineStyle( it->second ); } } -StyleSheet::StyleSheetPseudoClassProperties StyleSheet::getElementProperties( StyleSheetElement * element ) { +StyleSheet::StyleSheetPseudoClassProperties StyleSheet::getElementPropertiesByState( StyleSheetElement * element ) { StyleSheetPseudoClassProperties propertiesSelectedByPseudoClass; for ( auto it = mNodes.begin(); it != mNodes.end(); ++it ) { - StyleSheetNode& node = it->second; + StyleSheetStyle& node = it->second; const StyleSheetSelector& selector = node.getSelector(); - if ( selector.matches( element ) ) { + if ( selector.isCacheable() && selector.select( element, false ) ) { for ( auto pit = node.getProperties().begin(); pit != node.getProperties().end(); ++pit ) { StyleSheetProperties& pseudoClassProperties = propertiesSelectedByPseudoClass[selector.getPseudoClass()]; auto pcit = pseudoClassProperties.find( pit->second.getName() ); @@ -66,7 +66,22 @@ StyleSheet::StyleSheetPseudoClassProperties StyleSheet::getElementProperties( St return propertiesSelectedByPseudoClass; } -const StyleSheet::StyleSheetNodeList& StyleSheet::getNodes() const { +StyleSheet::StyleSheetStyleVector StyleSheet::getElementStyles( StyleSheetElement * element ) { + StyleSheetStyleVector styles; + + for ( auto it = mNodes.begin(); it != mNodes.end(); ++it ) { + StyleSheetStyle& node = it->second; + const StyleSheetSelector& selector = node.getSelector(); + + if ( selector.select( element, false ) ) { + styles.push_back( node ); + } + } + + return styles; +} + +const StyleSheet::StyleSheetStyleList& StyleSheet::getStyles() const { return mNodes; } diff --git a/src/eepp/ui/css/stylesheetparser.cpp b/src/eepp/ui/css/stylesheetparser.cpp index eefce7de8..529b6a448 100644 --- a/src/eepp/ui/css/stylesheetparser.cpp +++ b/src/eepp/ui/css/stylesheetparser.cpp @@ -170,9 +170,9 @@ 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( it->getName(), propertiesParse.getProperties() ); + StyleSheetStyle node( it->getName(), propertiesParse.getProperties() ); - mStyleSheet.addNode( node ); + mStyleSheet.addStyle( node ); } } diff --git a/src/eepp/ui/css/stylesheetselector.cpp b/src/eepp/ui/css/stylesheetselector.cpp index 9ad56b580..3b87f1603 100644 --- a/src/eepp/ui/css/stylesheetselector.cpp +++ b/src/eepp/ui/css/stylesheetselector.cpp @@ -105,7 +105,7 @@ const bool &StyleSheetSelector::isCacheable() const { return mCacheable; } -bool StyleSheetSelector::matches( StyleSheetElement * element ) const { +bool StyleSheetSelector::select( StyleSheetElement * element , const bool& applyPseudo ) const { if ( mSelectorRules.empty() ) return false; @@ -117,7 +117,7 @@ bool StyleSheetSelector::matches( StyleSheetElement * element ) const { switch ( selectorRule.getPatternMatch() ) { case StyleSheetSelectorRule::ANY: { - if ( !selectorRule.matches( curElement ) ) + if ( !selectorRule.matches( curElement, applyPseudo ) ) return false; break; // continue evaluating @@ -129,7 +129,7 @@ bool StyleSheetSelector::matches( StyleSheetElement * element ) const { curElement = curElement->getStyleSheetParentElement(); while ( NULL != curElement && !foundDescendant ) { - if ( selectorRule.matches( curElement ) ) { + if ( selectorRule.matches( curElement, applyPseudo ) ) { foundDescendant = true; } else { curElement = curElement->getStyleSheetParentElement(); @@ -145,7 +145,7 @@ bool StyleSheetSelector::matches( StyleSheetElement * element ) const { { curElement = curElement->getStyleSheetParentElement(); - if ( NULL == curElement || !selectorRule.matches( curElement ) ) + if ( NULL == curElement || !selectorRule.matches( curElement, applyPseudo ) ) return false; break; // continue evaluating @@ -154,7 +154,7 @@ bool StyleSheetSelector::matches( StyleSheetElement * element ) const { { curElement = curElement->getStyleSheetPreviousSiblingElement(); - if ( NULL == curElement || !selectorRule.matches( curElement ) ) + if ( NULL == curElement || !selectorRule.matches( curElement, applyPseudo ) ) return false; break; // continue evaluating @@ -166,7 +166,7 @@ bool StyleSheetSelector::matches( StyleSheetElement * element ) const { StyleSheetElement * nextSibling = curElement->getStyleSheetNextSiblingElement(); while ( NULL != prevSibling && !foundSibling ) { - if ( selectorRule.matches( prevSibling ) ) { + if ( selectorRule.matches( prevSibling, applyPseudo ) ) { foundSibling = true; } else { prevSibling = prevSibling->getStyleSheetPreviousSiblingElement(); @@ -175,7 +175,7 @@ bool StyleSheetSelector::matches( StyleSheetElement * element ) const { if ( !foundSibling ) { while ( NULL != nextSibling && !foundSibling ) { - if ( selectorRule.matches( nextSibling ) ) { + if ( selectorRule.matches( nextSibling, applyPseudo ) ) { foundSibling = true; } else { nextSibling = nextSibling->getStyleSheetNextSiblingElement(); diff --git a/src/eepp/ui/css/stylesheetselectorrule.cpp b/src/eepp/ui/css/stylesheetselectorrule.cpp index 4d243863a..a5baf5330 100644 --- a/src/eepp/ui/css/stylesheetselectorrule.cpp +++ b/src/eepp/ui/css/stylesheetselectorrule.cpp @@ -190,7 +190,7 @@ void StyleSheetSelectorRule::parseFragment( const std::string& selectorFragment mRequirementFlags |= Class; if ( !mPseudoClasses.empty() ) { - //requirementFlags |= PseudoClass; + mRequirementFlags |= PseudoClass; for ( auto it = mPseudoClasses.begin(); it != mPseudoClasses.end(); ++it ) { mSpecificity += SpecificityPseudoClass; @@ -226,7 +226,7 @@ bool StyleSheetSelectorRule::hasStructuralPseudoClass( const std::string& cls ) return std::find(mStructuralPseudoClasses.begin(), mStructuralPseudoClasses.end(), cls) != mStructuralPseudoClasses.end(); } -bool StyleSheetSelectorRule::matches( StyleSheetElement * element ) const { +bool StyleSheetSelectorRule::matches( StyleSheetElement * element, const bool& applyPseudo ) const { Uint32 flags = 0; if ( mTagName == "*" ) @@ -254,26 +254,29 @@ bool StyleSheetSelectorRule::matches( StyleSheetElement * element ) const { } } - /*if ( pseudoClasses.empty() && !element->getStyleSheetPseudoClasses().empty() ) { - flags |= PseudoClass; - } else if ( !pseudoClasses.empty() && !element->getStyleSheetPseudoClasses().empty() ) { - bool hasPseudoClasses = false; - const std::vector& elPseudoClasses = element->getStyleSheetPseudoClasses(); + if ( applyPseudo ) { + if ( mPseudoClasses.empty() && !element->getStyleSheetPseudoClasses().empty() ) { + flags |= PseudoClass; + } else if ( !mPseudoClasses.empty() && !element->getStyleSheetPseudoClasses().empty() ) { + bool hasPseudoClasses = false; + const std::vector& elPseudoClasses = element->getStyleSheetPseudoClasses(); - for ( auto cit = elPseudoClasses.begin(); cit != elPseudoClasses.end(); ++cit ) { - if ( hasPseudoClass( *cit ) ) { - hasPseudoClasses = true; - break; + for ( auto cit = elPseudoClasses.begin(); cit != elPseudoClasses.end(); ++cit ) { + if ( hasPseudoClass( *cit ) ) { + hasPseudoClasses = true; + break; + } + } + + if ( hasPseudoClasses ) { + flags |= PseudoClass; } } - if ( hasPseudoClasses ) { - flags |= PseudoClass; - } - }*/ + return mRequirementFlags == flags; + } - return mRequirementFlags == flags; + return ( mRequirementFlags & ~PseudoClass ) == flags; } - }}} diff --git a/src/eepp/ui/css/stylesheetnode.cpp b/src/eepp/ui/css/stylesheetstyle.cpp similarity index 61% rename from src/eepp/ui/css/stylesheetnode.cpp rename to src/eepp/ui/css/stylesheetstyle.cpp index 1dd4dbe83..ddf070c78 100644 --- a/src/eepp/ui/css/stylesheetnode.cpp +++ b/src/eepp/ui/css/stylesheetstyle.cpp @@ -1,12 +1,12 @@ -#include +#include #include namespace EE { namespace UI { namespace CSS { -StyleSheetNode::StyleSheetNode() +StyleSheetStyle::StyleSheetStyle() {} -StyleSheetNode::StyleSheetNode( const std::string& selector, const StyleSheetProperties& properties ) : +StyleSheetStyle::StyleSheetStyle( const std::string& selector, const StyleSheetProperties& properties ) : mSelector( selector ), mProperties( properties ) { @@ -14,7 +14,7 @@ StyleSheetNode::StyleSheetNode( const std::string& selector, const StyleSheetPro it->second.setSpecificity( mSelector.getSpecificity() ); } -void StyleSheetNode::print() { +void StyleSheetStyle::print() { std::cout << mSelector.getName() << " {" << std::endl; for ( StyleSheetProperties::iterator it = mProperties.begin(); it != mProperties.end(); ++it ) { @@ -26,15 +26,15 @@ void StyleSheetNode::print() { std::cout << "}" << std::endl; } -const StyleSheetSelector &StyleSheetNode::getSelector() const { +const StyleSheetSelector &StyleSheetStyle::getSelector() const { return mSelector; } -const StyleSheetProperties &StyleSheetNode::getProperties() const { +const StyleSheetProperties &StyleSheetStyle::getProperties() const { return mProperties; } -void StyleSheetNode::setProperty( const StyleSheetProperty & property ) { +void StyleSheetStyle::setProperty( const StyleSheetProperty & property ) { mProperties[ property.getName() ] = property; } diff --git a/src/eepp/ui/uistyle.cpp b/src/eepp/ui/uistyle.cpp index d35f62ffd..934f0a8a3 100644 --- a/src/eepp/ui/uistyle.cpp +++ b/src/eepp/ui/uistyle.cpp @@ -60,7 +60,7 @@ void UIStyle::load() { CSS::StyleSheet& styleSheet = uiSceneNode->getStyleSheet(); if ( !styleSheet.isEmpty() ) { - CSS::StyleSheet::StyleSheetPseudoClassProperties propertiesByPseudoClass = styleSheet.getElementProperties( mWidget ); + CSS::StyleSheet::StyleSheetPseudoClassProperties propertiesByPseudoClass = styleSheet.getElementPropertiesByState( mWidget ); if ( !propertiesByPseudoClass.empty() ) { Uint32 stateFlag;