From 4320841adebdc074c6bd9b298abbddda04e0d9f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Mon, 10 Feb 2020 03:19:07 -0300 Subject: [PATCH] Removed StyleSheetElement interface in favor of using UIWidget directly. Thanks to this all dynamic_casts has been removed at the cost of a little less readable code. --- include/eepp/scene/action.hpp | 5 +++ include/eepp/ui.hpp | 1 - include/eepp/ui/css/stylesheet.hpp | 4 +-- include/eepp/ui/css/stylesheetelement.hpp | 28 --------------- .../ui/css/stylesheetpropertytransition.hpp | 2 ++ include/eepp/ui/css/stylesheetselector.hpp | 13 +++---- .../eepp/ui/css/stylesheetselectorrule.hpp | 8 +++-- include/eepp/ui/uiwidget.hpp | 9 +++-- projects/linux/ee.files | 1 - src/eepp/scene/action.cpp | 10 +++++- src/eepp/ui/css/stylesheet.cpp | 3 +- .../ui/css/stylesheetpropertytransition.cpp | 4 ++- src/eepp/ui/css/stylesheetselector.cpp | 25 +++++++------- src/eepp/ui/css/stylesheetselectorrule.cpp | 4 +-- src/eepp/ui/uistyle.cpp | 34 +++++++++---------- src/eepp/ui/uiwidget.cpp | 12 +++---- 16 files changed, 73 insertions(+), 90 deletions(-) delete mode 100644 include/eepp/ui/css/stylesheetelement.hpp diff --git a/include/eepp/scene/action.hpp b/include/eepp/scene/action.hpp index 914e8a126..5ec4158ac 100644 --- a/include/eepp/scene/action.hpp +++ b/include/eepp/scene/action.hpp @@ -54,6 +54,10 @@ class EE_API Action { void setTarget( Node* target ); + void setId( const Uint32& id ); + + const Uint32& getId(); + protected: friend class Node; typedef std::map> ActionCallbackMap; @@ -62,6 +66,7 @@ class EE_API Action { Uint32 mFlags; Uint32 mTag; Uint32 mNumCallBacks; + Uint32 mId; ActionCallbackMap mCallbacks; virtual void onStart(); diff --git a/include/eepp/ui.hpp b/include/eepp/ui.hpp index 9056f17ae..b1ef7cfaa 100644 --- a/include/eepp/ui.hpp +++ b/include/eepp/ui.hpp @@ -50,7 +50,6 @@ #include #include -#include #include #include #include diff --git a/include/eepp/ui/css/stylesheet.hpp b/include/eepp/ui/css/stylesheet.hpp index eb2dfc177..f41a4b393 100644 --- a/include/eepp/ui/css/stylesheet.hpp +++ b/include/eepp/ui/css/stylesheet.hpp @@ -6,8 +6,6 @@ namespace EE { namespace UI { namespace CSS { -class StyleSheetElement; - class EE_API StyleSheet { public: StyleSheet(); @@ -20,7 +18,7 @@ class EE_API StyleSheet { void combineStyleSheet( const StyleSheet& styleSheet ); - StyleSheetStyleVector getElementStyles( StyleSheetElement* element, + StyleSheetStyleVector getElementStyles( UIWidget* element, const bool& applyPseudo = false ) const; const StyleSheetStyleVector& getStyles() const; diff --git a/include/eepp/ui/css/stylesheetelement.hpp b/include/eepp/ui/css/stylesheetelement.hpp deleted file mode 100644 index 53891dd1d..000000000 --- a/include/eepp/ui/css/stylesheetelement.hpp +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef EE_UI_CSS_STYLESHEETELEMENT_HPP -#define EE_UI_CSS_STYLESHEETELEMENT_HPP - -#include -#include -#include - -namespace EE { namespace UI { namespace CSS { - -class EE_API StyleSheetElement { - public: - virtual const std::string& getStyleSheetTag() const = 0; - - virtual const std::string& getStyleSheetId() const = 0; - - virtual const std::vector& getStyleSheetClasses() const = 0; - - virtual StyleSheetElement* getStyleSheetParentElement() const = 0; - - virtual StyleSheetElement* getStyleSheetPreviousSiblingElement() const = 0; - - virtual StyleSheetElement* getStyleSheetNextSiblingElement() const = 0; - - virtual const std::vector& getStyleSheetPseudoClasses() const = 0; -}; -}}} // namespace EE::UI::CSS - -#endif diff --git a/include/eepp/ui/css/stylesheetpropertytransition.hpp b/include/eepp/ui/css/stylesheetpropertytransition.hpp index 5075a7b07..2290bd717 100644 --- a/include/eepp/ui/css/stylesheetpropertytransition.hpp +++ b/include/eepp/ui/css/stylesheetpropertytransition.hpp @@ -17,6 +17,8 @@ namespace EE { namespace UI { namespace CSS { class EE_API StyleSheetPropertyTransition : public Action { public: + static constexpr Uint32 ID = String::hash( "StyleSheetPropertyTransition" ); + static bool transitionSupported( const PropertyType& type ); static StyleSheetPropertyTransition* New( const PropertyDefinition* property, diff --git a/include/eepp/ui/css/stylesheetselector.hpp b/include/eepp/ui/css/stylesheetselector.hpp index 73c34445b..5a6ee5267 100644 --- a/include/eepp/ui/css/stylesheetselector.hpp +++ b/include/eepp/ui/css/stylesheetselector.hpp @@ -1,12 +1,13 @@ #ifndef EE_UI_CSS_STYLESHEETSELECTOR_HPP #define EE_UI_CSS_STYLESHEETSELECTOR_HPP -#include #include -namespace EE { namespace UI { namespace CSS { +namespace EE { namespace UI { +class UIWidget; +}} // namespace EE::UI -class StyleSheetElement; +namespace EE { namespace UI { namespace CSS { class EE_API StyleSheetSelector { public: @@ -20,7 +21,7 @@ class EE_API StyleSheetSelector { const Uint32& getSpecificity() const; - bool select( StyleSheetElement* element, const bool& applyPseudo = true ) const; + bool select( UIWidget* element, const bool& applyPseudo = true ) const; const bool& isCacheable() const; @@ -28,8 +29,8 @@ class EE_API StyleSheetSelector { bool hasPseudoClasses() const; - std::vector getRelatedElements( StyleSheetElement* element, - const bool& applyPseudo = true ) const; + std::vector getRelatedElements( UIWidget* element, + const bool& applyPseudo = true ) const; protected: std::string mName; diff --git a/include/eepp/ui/css/stylesheetselectorrule.hpp b/include/eepp/ui/css/stylesheetselectorrule.hpp index b759014cc..5501b93dd 100644 --- a/include/eepp/ui/css/stylesheetselectorrule.hpp +++ b/include/eepp/ui/css/stylesheetselectorrule.hpp @@ -3,9 +3,11 @@ #include -namespace EE { namespace UI { namespace CSS { +namespace EE { namespace UI { +class UIWidget; +}} // namespace EE::UI -class StyleSheetElement; +namespace EE { namespace UI { namespace CSS { class EE_API StyleSheetSelectorRule { public: @@ -48,7 +50,7 @@ class EE_API StyleSheetSelectorRule { const int& getSpecificity() const { return mSpecificity; } - bool matches( StyleSheetElement* element, const bool& applyPseudo = true ) const; + bool matches( UIWidget* element, const bool& applyPseudo = true ) const; bool hasClass( const std::string& cls ) const; diff --git a/include/eepp/ui/uiwidget.hpp b/include/eepp/ui/uiwidget.hpp index 833cb5cb5..017a09b9b 100644 --- a/include/eepp/ui/uiwidget.hpp +++ b/include/eepp/ui/uiwidget.hpp @@ -1,7 +1,6 @@ #ifndef EE_UIUIWIDGET_HPP #define EE_UIUIWIDGET_HPP -#include #include #include #include @@ -21,7 +20,7 @@ namespace EE { namespace UI { class UITooltip; class UIStyle; -class EE_API UIWidget : public UINode, public CSS::StyleSheetElement { +class EE_API UIWidget : public UINode { public: static UIWidget* New(); @@ -132,11 +131,11 @@ class EE_API UIWidget : public UINode, public CSS::StyleSheetElement { const std::vector& getStyleSheetClasses() const; - StyleSheetElement* getStyleSheetParentElement() const; + UIWidget* getStyleSheetParentElement() const; - StyleSheetElement* getStyleSheetPreviousSiblingElement() const; + UIWidget* getStyleSheetPreviousSiblingElement() const; - StyleSheetElement* getStyleSheetNextSiblingElement() const; + UIWidget* getStyleSheetNextSiblingElement() const; const std::vector& getStyleSheetPseudoClasses() const; diff --git a/projects/linux/ee.files b/projects/linux/ee.files index b1000cf23..4c87080d3 100644 --- a/projects/linux/ee.files +++ b/projects/linux/ee.files @@ -293,7 +293,6 @@ ../../include/eepp/ui/css/propertyspecification.hpp ../../include/eepp/ui/css/shorthanddefinition.hpp ../../include/eepp/ui/css/stylesheet.hpp -../../include/eepp/ui/css/stylesheetelement.hpp ../../include/eepp/ui/css/stylesheetlength.hpp ../../include/eepp/ui/css/stylesheetparser.hpp ../../include/eepp/ui/css/stylesheetpropertiesparser.hpp diff --git a/src/eepp/scene/action.cpp b/src/eepp/scene/action.cpp index 97c271bb4..ce25f415c 100644 --- a/src/eepp/scene/action.cpp +++ b/src/eepp/scene/action.cpp @@ -3,7 +3,7 @@ namespace EE { namespace Scene { -Action::Action() : mNode( NULL ), mFlags( 0 ), mTag( 0 ), mNumCallBacks( 0 ) {} +Action::Action() : mNode( NULL ), mFlags( 0 ), mTag( 0 ), mNumCallBacks( 0 ), mId( 0 ) {} Action::~Action() { sendEvent( ActionType::OnDelete ); @@ -29,6 +29,14 @@ void Action::setTarget( Node* target ) { mNode = target; } +void Action::setId( const Uint32& id ) { + mId = id; +} + +const Uint32& Action::getId() { + return mId; +} + Node* Action::getTarget() const { return mNode; } diff --git a/src/eepp/ui/css/stylesheet.cpp b/src/eepp/ui/css/stylesheet.cpp index 5bea69320..a4ffa2acc 100644 --- a/src/eepp/ui/css/stylesheet.cpp +++ b/src/eepp/ui/css/stylesheet.cpp @@ -1,6 +1,5 @@ #include #include -#include #include #include #include @@ -31,7 +30,7 @@ void StyleSheet::combineStyleSheet( const StyleSheet& styleSheet ) { } } -StyleSheetStyleVector StyleSheet::getElementStyles( StyleSheetElement* element, +StyleSheetStyleVector StyleSheet::getElementStyles( UIWidget* element, const bool& applyPseudo ) const { StyleSheetStyleVector styles; diff --git a/src/eepp/ui/css/stylesheetpropertytransition.cpp b/src/eepp/ui/css/stylesheetpropertytransition.cpp index f92a74b28..4715259ed 100644 --- a/src/eepp/ui/css/stylesheetpropertytransition.cpp +++ b/src/eepp/ui/css/stylesheetpropertytransition.cpp @@ -40,7 +40,9 @@ StyleSheetPropertyTransition::StyleSheetPropertyTransition( const PropertyDefini mStartValue( startValue ), mEndValue( endValue ), mDuration( duration ), - mType( type ) {} + mType( type ) { + mId = ID; +} Action* StyleSheetPropertyTransition::clone() const { return StyleSheetPropertyTransition::New( mProperty, mStartValue, mEndValue, mDuration, mType ); diff --git a/src/eepp/ui/css/stylesheetselector.cpp b/src/eepp/ui/css/stylesheetselector.cpp index ec71e9f50..2c47db0c0 100644 --- a/src/eepp/ui/css/stylesheetselector.cpp +++ b/src/eepp/ui/css/stylesheetselector.cpp @@ -1,5 +1,5 @@ -#include #include +#include namespace EE { namespace UI { namespace CSS { @@ -116,11 +116,11 @@ bool StyleSheetSelector::hasPseudoClasses() const { return mSelectorRules.empty() || mSelectorRules[0].hasPseudoClasses(); } -bool StyleSheetSelector::select( StyleSheetElement* element, const bool& applyPseudo ) const { +bool StyleSheetSelector::select( UIWidget* element, const bool& applyPseudo ) const { if ( mSelectorRules.empty() ) return false; - StyleSheetElement* curElement = element; + UIWidget* curElement = element; for ( size_t i = 0; i < mSelectorRules.size(); i++ ) { const StyleSheetSelectorRule& selectorRule = mSelectorRules[i]; @@ -168,8 +168,8 @@ bool StyleSheetSelector::select( StyleSheetElement* element, const bool& applyPs } case StyleSheetSelectorRule::SIBLING: { bool foundSibling = false; - StyleSheetElement* prevSibling = curElement->getStyleSheetPreviousSiblingElement(); - StyleSheetElement* nextSibling = curElement->getStyleSheetNextSiblingElement(); + UIWidget* prevSibling = curElement->getStyleSheetPreviousSiblingElement(); + UIWidget* nextSibling = curElement->getStyleSheetNextSiblingElement(); while ( NULL != prevSibling && !foundSibling ) { if ( selectorRule.matches( prevSibling, applyPseudo ) ) { @@ -200,15 +200,14 @@ bool StyleSheetSelector::select( StyleSheetElement* element, const bool& applyPs return true; } -std::vector -StyleSheetSelector::getRelatedElements( StyleSheetElement* element, - const bool& applyPseudo ) const { - static std::vector EMPTY_ELEMENTS; - std::vector elements; +std::vector StyleSheetSelector::getRelatedElements( UIWidget* element, + const bool& applyPseudo ) const { + static std::vector EMPTY_ELEMENTS; + std::vector elements; if ( mSelectorRules.empty() ) return elements; - StyleSheetElement* curElement = element; + UIWidget* curElement = element; for ( size_t i = 0; i < mSelectorRules.size(); i++ ) { const StyleSheetSelectorRule& selectorRule = mSelectorRules[i]; @@ -271,8 +270,8 @@ StyleSheetSelector::getRelatedElements( StyleSheetElement* element, } case StyleSheetSelectorRule::SIBLING: { bool foundSibling = false; - StyleSheetElement* prevSibling = curElement->getStyleSheetPreviousSiblingElement(); - StyleSheetElement* nextSibling = curElement->getStyleSheetNextSiblingElement(); + UIWidget* prevSibling = curElement->getStyleSheetPreviousSiblingElement(); + UIWidget* nextSibling = curElement->getStyleSheetNextSiblingElement(); while ( NULL != prevSibling && !foundSibling ) { if ( selectorRule.matches( prevSibling, applyPseudo ) ) { diff --git a/src/eepp/ui/css/stylesheetselectorrule.cpp b/src/eepp/ui/css/stylesheetselectorrule.cpp index 3180d5f5b..5ddc3475e 100644 --- a/src/eepp/ui/css/stylesheetselectorrule.cpp +++ b/src/eepp/ui/css/stylesheetselectorrule.cpp @@ -1,6 +1,6 @@ #include -#include #include +#include namespace EE { namespace UI { namespace CSS { @@ -207,7 +207,7 @@ bool StyleSheetSelectorRule::hasStructuralPseudoClass( const std::string& cls ) mStructuralPseudoClasses.end(); } -bool StyleSheetSelectorRule::matches( StyleSheetElement* element, const bool& applyPseudo ) const { +bool StyleSheetSelectorRule::matches( UIWidget* element, const bool& applyPseudo ) const { Uint32 flags = 0; if ( mTagName == "*" ) { diff --git a/src/eepp/ui/uistyle.cpp b/src/eepp/ui/uistyle.cpp index c21209b0f..10d56db97 100644 --- a/src/eepp/ui/uistyle.cpp +++ b/src/eepp/ui/uistyle.cpp @@ -255,23 +255,22 @@ void UIStyle::onStateChange() { Time duration( transitionInfo.getDuration() ); - if ( !previousTransitions.empty() ) { + if ( !previousTransitions.empty() && + previousTransitions[0]->getId() == StyleSheetPropertyTransition::ID ) { StyleSheetPropertyTransition* prevTransition = - dynamic_cast( previousTransitions[0] ); + reinterpret_cast( + previousTransitions[0] ); - if ( NULL != prevTransition ) { - if ( prevTransition->getEndValue() == property.getValue() ) { - continue; - } else if ( prevTransition->getStartValue() == property.getValue() ) { - Float currentProgress = - prevTransition->getElapsed().asMilliseconds() / - prevTransition->getDuration().asMilliseconds(); - currentProgress = eemin( 1.f, currentProgress ); - if ( 0.f != currentProgress ) { - duration = Milliseconds( - transitionInfo.getDuration().asMilliseconds() * - currentProgress ); - } + if ( prevTransition->getEndValue() == property.getValue() ) { + continue; + } else if ( prevTransition->getStartValue() == property.getValue() ) { + Float currentProgress = prevTransition->getElapsed().asMilliseconds() / + prevTransition->getDuration().asMilliseconds(); + currentProgress = eemin( 1.f, currentProgress ); + if ( 0.f != currentProgress ) { + duration = + Milliseconds( transitionInfo.getDuration().asMilliseconds() * + currentProgress ); } } @@ -360,12 +359,11 @@ void UIStyle::updateState() { void UIStyle::subscribeNonCacheableStyles() { for ( auto& style : mNoncacheableStyles ) { - std::vector elements = - style.getSelector().getRelatedElements( mWidget, false ); + std::vector elements = style.getSelector().getRelatedElements( mWidget, false ); if ( !elements.empty() ) { for ( auto& element : elements ) { - UIWidget* widget = dynamic_cast( element ); + UIWidget* widget = element->asType(); if ( NULL != widget && NULL != widget->getUIStyle() ) { widget->getUIStyle()->subscribeRelated( mWidget ); diff --git a/src/eepp/ui/uiwidget.cpp b/src/eepp/ui/uiwidget.cpp index 300837c1b..af81e8d1e 100644 --- a/src/eepp/ui/uiwidget.cpp +++ b/src/eepp/ui/uiwidget.cpp @@ -577,19 +577,19 @@ const std::vector& UIWidget::getStyleSheetClasses() const { return mClasses; } -CSS::StyleSheetElement* UIWidget::getStyleSheetParentElement() const { +UIWidget* UIWidget::getStyleSheetParentElement() const { return NULL != mParentCtrl && mParentCtrl->isWidget() - ? dynamic_cast( mParentCtrl ) + ? mParentCtrl->asType() : NULL; } -CSS::StyleSheetElement* UIWidget::getStyleSheetPreviousSiblingElement() const { - return NULL != mPrev && mPrev->isWidget() ? dynamic_cast( mPrev ) +UIWidget* UIWidget::getStyleSheetPreviousSiblingElement() const { + return NULL != mPrev && mPrev->isWidget() ? mPrev->asType() : NULL; } -CSS::StyleSheetElement* UIWidget::getStyleSheetNextSiblingElement() const { - return NULL != mNext && mNext->isWidget() ? dynamic_cast( mNext ) +UIWidget* UIWidget::getStyleSheetNextSiblingElement() const { + return NULL != mNext && mNext->isWidget() ? mNext->asType() : NULL; }