From f585f87497f4a7992e680374bd5f1a23f4e26757 Mon Sep 17 00:00:00 2001 From: Leon Styhre Date: Sat, 12 Feb 2022 17:38:55 +0100 Subject: [PATCH] Added support for setting component opacity from the theme configuration. --- es-core/src/GuiComponent.cpp | 10 ++++---- es-core/src/GuiComponent.h | 3 ++- es-core/src/ThemeData.cpp | 13 ++++++++++- es-core/src/ThemeData.h | 3 ++- es-core/src/components/BadgeComponent.cpp | 6 ++--- es-core/src/components/ImageComponent.cpp | 6 ++--- es-core/src/components/LottieComponent.cpp | 6 ++--- es-core/src/components/RatingComponent.cpp | 6 +++-- .../src/components/ScrollableContainer.cpp | 2 +- es-core/src/components/SwitchComponent.h | 2 +- es-core/src/components/TextComponent.cpp | 23 +++++++++---------- es-core/src/components/TextComponent.h | 5 +++- 12 files changed, 51 insertions(+), 34 deletions(-) diff --git a/es-core/src/GuiComponent.cpp b/es-core/src/GuiComponent.cpp index 0abb63b66..09609ebcf 100644 --- a/es-core/src/GuiComponent.cpp +++ b/es-core/src/GuiComponent.cpp @@ -31,6 +31,7 @@ GuiComponent::GuiComponent() , mRotationOrigin {0.5f, 0.5f} , mSize {0.0f, 0.0f} , mOpacity {1.0f} + , mThemeOpacity {1.0f} , mRotation {0.0f} , mScale {1.0f} , mDefaultZIndex {0.0f} @@ -356,10 +357,11 @@ void GuiComponent::applyTheme(const std::shared_ptr& theme, else setZIndex(getDefaultZIndex()); - if (properties & ThemeFlags::VISIBLE && elem->has("visible")) - setVisible(elem->get("visible")); - else - setVisible(true); + if (properties & ThemeFlags::OPACITY && elem->has("opacity")) + mThemeOpacity = glm::clamp(elem->get("opacity"), 0.0f, 1.0f); + + if (properties & ThemeFlags::VISIBLE && elem->has("visible") && !elem->get("visible")) + mThemeOpacity = 0.0f; } void GuiComponent::updateHelpPrompts() diff --git a/es-core/src/GuiComponent.h b/es-core/src/GuiComponent.h index 49cd66f57..fb690b8e6 100644 --- a/es-core/src/GuiComponent.h +++ b/es-core/src/GuiComponent.h @@ -191,7 +191,7 @@ public: virtual bool isListScrolling() { return false; } virtual void stopListScrolling() {} - virtual float getOpacity() const { return mOpacity; } + virtual const float getOpacity() const { return mOpacity; } virtual void setOpacity(float opacity); virtual unsigned int getColor() const { return mColor; } virtual unsigned int getColorShift() const { return mColorShift; } @@ -291,6 +291,7 @@ protected: glm::vec2 mSize; float mOpacity; + float mThemeOpacity; float mRotation; float mScale; float mDefaultZIndex; diff --git a/es-core/src/ThemeData.cpp b/es-core/src/ThemeData.cpp index 7844d69bd..88397bfdc 100644 --- a/es-core/src/ThemeData.cpp +++ b/es-core/src/ThemeData.cpp @@ -94,6 +94,7 @@ std::map> {"colorEnd", COLOR}, {"gradientType", STRING}, {"scrollFadeIn", BOOLEAN}, + {"opacity", FLOAT}, {"visible", BOOLEAN}, {"zIndex", FLOAT}}}, {"video", @@ -107,8 +108,11 @@ std::map> {"default", PATH}, {"defaultImage", PATH}, {"imageMetadata", STRING}, + {"pillarboxes", BOOLEAN}, + {"scanlines", BOOLEAN}, {"delay", FLOAT}, {"scrollFadeIn", BOOLEAN}, + {"opacity", FLOAT}, {"visible", BOOLEAN}, {"zIndex", FLOAT}, {"showSnapshotNoVideo", BOOLEAN}, // For backward compatibility with legacy themes. @@ -123,6 +127,7 @@ std::map> {"speed", FLOAT}, {"direction", STRING}, {"keepAspectRatio", BOOLEAN}, + {"opacity", FLOAT}, {"visible", BOOLEAN}, {"zIndex", FLOAT}}}, {"badges", @@ -142,6 +147,7 @@ std::map> {"controllerSize", FLOAT}, {"customBadgeIcon", PATH}, {"customControllerIcon", PATH}, + {"opacity", FLOAT}, {"visible", BOOLEAN}, {"zIndex", FLOAT}}}, {"text", @@ -166,6 +172,7 @@ std::map> {"letterCase", STRING}, {"forceUppercase", BOOLEAN}, // For backward compatibility with legacy themes. {"lineSpacing", FLOAT}, + {"opacity", FLOAT}, {"visible", BOOLEAN}, {"zIndex", FLOAT}}}, {"datetime", @@ -187,6 +194,7 @@ std::map> {"lineSpacing", FLOAT}, {"format", STRING}, {"displayRelative", BOOLEAN}, + {"opacity", FLOAT}, {"visible", BOOLEAN}, {"zIndex", FLOAT}}}, {"gamelistinfo", @@ -202,6 +210,7 @@ std::map> {"horizontalAlignment", STRING}, {"verticalAlignment", STRING}, {"alignment", STRING}, // For backward compatibility with legacy themes. + {"opacity", FLOAT}, {"visible", BOOLEAN}, {"zIndex", FLOAT}}}, {"rating", @@ -213,6 +222,8 @@ std::map> {"color", COLOR}, {"filledPath", PATH}, {"unfilledPath", PATH}, + {"opacity", FLOAT}, + {"visible", BOOLEAN}, {"zIndex", FLOAT}}}, {"carousel", {{"type", STRING}, @@ -240,7 +251,7 @@ std::map> {"fontSize", FLOAT}, {"lineSpacing", FLOAT}, {"zIndex", FLOAT}, - {"legacyZIndexMode", STRING}}}, + {"legacyZIndexMode", STRING}}}, // For backward compatibility with legacy themes. {"textlist", {{"pos", NORMALIZED_PAIR}, {"size", NORMALIZED_PAIR}, diff --git a/es-core/src/ThemeData.h b/es-core/src/ThemeData.h index 868f61b61..911cf23c7 100644 --- a/es-core/src/ThemeData.h +++ b/es-core/src/ThemeData.h @@ -56,7 +56,8 @@ namespace ThemeFlags DELAY = 0x00002000, Z_INDEX = 0x00004000, ROTATION = 0x00008000, - VISIBLE = 0x00010000, + OPACITY = 0x00010000, + VISIBLE = 0x00020000, ALL = 0xFFFFFFFF }; // clang-format on diff --git a/es-core/src/components/BadgeComponent.cpp b/es-core/src/components/BadgeComponent.cpp index eeb5dec1f..989133f67 100644 --- a/es-core/src/components/BadgeComponent.cpp +++ b/es-core/src/components/BadgeComponent.cpp @@ -168,14 +168,14 @@ const std::string BadgeComponent::getDisplayName(const std::string& shortName) void BadgeComponent::render(const glm::mat4& parentTrans) { - if (!isVisible()) + if (!isVisible() || mThemeOpacity == 0.0f) return; - if (mOpacity == 1.0f) { + if (mOpacity * mThemeOpacity == 1.0f) { mFlexboxComponent.render(parentTrans); } else { - mFlexboxComponent.setOpacity(mOpacity); + mFlexboxComponent.setOpacity(mOpacity * mThemeOpacity); mFlexboxComponent.render(parentTrans); mFlexboxComponent.setOpacity(1.0f); } diff --git a/es-core/src/components/ImageComponent.cpp b/es-core/src/components/ImageComponent.cpp index 57ec218da..50d6ab2dd 100644 --- a/es-core/src/components/ImageComponent.cpp +++ b/es-core/src/components/ImageComponent.cpp @@ -369,7 +369,7 @@ void ImageComponent::updateVertices() void ImageComponent::updateColors() { - const float opacity = (mOpacity * (mFading ? mFadeOpacity : 1.0f)); + const float opacity = (mOpacity * mThemeOpacity * (mFading ? mFadeOpacity : 1.0f)); const unsigned int color = Renderer::convertRGBAToABGR( (mColorShift & 0xFFFFFF00) | static_cast((mColorShift & 0xFF) * opacity)); const unsigned int colorEnd = @@ -384,8 +384,8 @@ void ImageComponent::updateColors() void ImageComponent::render(const glm::mat4& parentTrans) { - if (!isVisible() || mTexture == nullptr || mTargetSize == glm::vec2 {0.0f, 0.0f} || - mSize == glm::vec2 {0.0f, 0.0f}) + if (!isVisible() || mThemeOpacity == 0.0f || mTexture == nullptr || + mTargetSize == glm::vec2 {0.0f, 0.0f} || mSize == glm::vec2 {0.0f, 0.0f}) return; glm::mat4 trans {parentTrans * getTransform()}; diff --git a/es-core/src/components/LottieComponent.cpp b/es-core/src/components/LottieComponent.cpp index 834f0e80a..560267201 100644 --- a/es-core/src/components/LottieComponent.cpp +++ b/es-core/src/components/LottieComponent.cpp @@ -330,10 +330,7 @@ void LottieComponent::update(int deltaTime) void LottieComponent::render(const glm::mat4& parentTrans) { - if (!isVisible()) - return; - - if (mAnimation == nullptr) + if (!isVisible() || mThemeOpacity == 0.0f || mAnimation == nullptr) return; glm::mat4 trans {parentTrans * getTransform()}; @@ -472,6 +469,7 @@ void LottieComponent::render(const glm::mat4& parentTrans) #if defined(USE_OPENGL_21) // Perform color space conversion from BGRA to RGBA. + vertices[0].opacity = mThemeOpacity; vertices[0].shaders = Renderer::SHADER_BGRA_TO_RGBA; #endif diff --git a/es-core/src/components/RatingComponent.cpp b/es-core/src/components/RatingComponent.cpp index 294525a25..af178780c 100644 --- a/es-core/src/components/RatingComponent.cpp +++ b/es-core/src/components/RatingComponent.cpp @@ -85,7 +85,8 @@ std::string RatingComponent::getRatingValue() const void RatingComponent::setOpacity(float opacity) { mOpacity = opacity; - mColorShift = (mColorShift >> 8 << 8) | static_cast(mOpacity * 255.0f); + mColorShift = + (mColorShift >> 8 << 8) | static_cast(mOpacity * mThemeOpacity * 255.0f); updateColors(); } @@ -148,7 +149,8 @@ void RatingComponent::updateColors() void RatingComponent::render(const glm::mat4& parentTrans) { - if (!isVisible() || mFilledTexture == nullptr || mUnfilledTexture == nullptr) + if (!isVisible() || mFilledTexture == nullptr || mUnfilledTexture == nullptr || + mThemeOpacity == 0.0f) return; glm::mat4 trans {parentTrans * getTransform()}; diff --git a/es-core/src/components/ScrollableContainer.cpp b/es-core/src/components/ScrollableContainer.cpp index c477e3c56..7ea5edc0e 100644 --- a/es-core/src/components/ScrollableContainer.cpp +++ b/es-core/src/components/ScrollableContainer.cpp @@ -214,7 +214,7 @@ void ScrollableContainer::update(int deltaTime) void ScrollableContainer::render(const glm::mat4& parentTrans) { - if (!isVisible()) + if (!isVisible() || mThemeOpacity == 0.0f || mChildren.front()->getValue() == "") return; glm::mat4 trans {parentTrans * getTransform()}; diff --git a/es-core/src/components/SwitchComponent.h b/es-core/src/components/SwitchComponent.h index 26acf5d50..653f3d13a 100644 --- a/es-core/src/components/SwitchComponent.h +++ b/es-core/src/components/SwitchComponent.h @@ -32,7 +32,7 @@ public: void setChangedColor(unsigned int color) override { mColorChangedValue = color; } void setCallback(const std::function& callbackFunc) { mToggleCallback = callbackFunc; } - float getOpacity() const override { return mImage.getOpacity(); } + float const getOpacity() const override { return mImage.getOpacity(); } void setOpacity(float opacity) override { mImage.setOpacity(opacity); } // Multiply all pixels in the image by this color when rendering. void setColorShift(unsigned int color) override { mImage.setColorShift(color); } diff --git a/es-core/src/components/TextComponent.cpp b/es-core/src/components/TextComponent.cpp index 1288091b5..77cc15679 100644 --- a/es-core/src/components/TextComponent.cpp +++ b/es-core/src/components/TextComponent.cpp @@ -95,12 +95,11 @@ void TextComponent::setBackgroundColor(unsigned int color) // Scale the opacity. void TextComponent::setOpacity(float opacity) { - // This function is mostly called to do fade in and fade out of the text component element. - float o {opacity * mColorOpacity}; - mColor = (mColor & 0xFFFFFF00) | static_cast(o * 255.0f); + float textOpacity {opacity * mColorOpacity * mThemeOpacity}; + mColor = (mColor & 0xFFFFFF00) | static_cast(textOpacity * 255.0f); - float bgo {opacity * mBgColorOpacity}; - mBgColor = (mBgColor & 0xFFFFFF00) | static_cast(bgo * 255.0f); + float textBackgroundOpacity {opacity * mBgColorOpacity * mThemeOpacity}; + mBgColor = (mBgColor & 0xFFFFFF00) | static_cast(textBackgroundOpacity * 255.0f); onColorChanged(); GuiComponent::setOpacity(opacity); @@ -149,7 +148,7 @@ void TextComponent::setCapitalize(bool capitalize) void TextComponent::render(const glm::mat4& parentTrans) { - if (!isVisible()) + if (!isVisible() || mThemeOpacity == 0.0f) return; glm::mat4 trans {parentTrans * getTransform()}; @@ -302,18 +301,18 @@ void TextComponent::onTextChanged() } text.append(abbrev); - mTextCache = std::shared_ptr(f->buildTextCache( - text, glm::vec2 {}, (mColor >> 8 << 8) | static_cast(mOpacity * 255.0f), - mSize.x, mHorizontalAlignment, mLineSpacing, mNoTopMargin)); + text, glm::vec2 {}, mColor, mSize.x, mHorizontalAlignment, mLineSpacing, mNoTopMargin)); } else { mTextCache = std::shared_ptr( - f->buildTextCache(f->wrapText(text, mSize.x), glm::vec2 {}, - (mColor >> 8 << 8) | static_cast(mOpacity * 255.0f), - mSize.x, mHorizontalAlignment, mLineSpacing, mNoTopMargin)); + f->buildTextCache(f->wrapText(text, mSize.x), glm::vec2 {}, mColor, mSize.x, + mHorizontalAlignment, mLineSpacing, mNoTopMargin)); } + if (mOpacity != 1.0f || mThemeOpacity != 1.0f) + setOpacity(mOpacity); + // This is required to set the color transparency. onColorChanged(); } diff --git a/es-core/src/components/TextComponent.h b/es-core/src/components/TextComponent.h index 3a00c6db2..ea6b2a2a0 100644 --- a/es-core/src/components/TextComponent.h +++ b/es-core/src/components/TextComponent.h @@ -57,7 +57,10 @@ public: std::string getHiddenValue() const override { return mHiddenText; } void setHiddenValue(const std::string& value) override { setHiddenText(value); } - float getOpacity() const override { return static_cast((mColor & 0x000000FF) / 255.0f); } + float const getOpacity() const override + { + return static_cast((mColor & 0x000000FF) / 255.0f); + } void setOpacity(float opacity) override; void setSelectable(bool status) { mSelectable = status; }