Added support for setting component opacity from the theme configuration.

This commit is contained in:
Leon Styhre 2022-02-12 17:38:55 +01:00
parent c24cf1e57a
commit f585f87497
12 changed files with 51 additions and 34 deletions

View file

@ -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<ThemeData>& theme,
else
setZIndex(getDefaultZIndex());
if (properties & ThemeFlags::VISIBLE && elem->has("visible"))
setVisible(elem->get<bool>("visible"));
else
setVisible(true);
if (properties & ThemeFlags::OPACITY && elem->has("opacity"))
mThemeOpacity = glm::clamp(elem->get<float>("opacity"), 0.0f, 1.0f);
if (properties & ThemeFlags::VISIBLE && elem->has("visible") && !elem->get<bool>("visible"))
mThemeOpacity = 0.0f;
}
void GuiComponent::updateHelpPrompts()

View file

@ -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;

View file

@ -94,6 +94,7 @@ std::map<std::string, std::map<std::string, ThemeData::ElementPropertyType>>
{"colorEnd", COLOR},
{"gradientType", STRING},
{"scrollFadeIn", BOOLEAN},
{"opacity", FLOAT},
{"visible", BOOLEAN},
{"zIndex", FLOAT}}},
{"video",
@ -107,8 +108,11 @@ std::map<std::string, std::map<std::string, ThemeData::ElementPropertyType>>
{"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<std::string, std::map<std::string, ThemeData::ElementPropertyType>>
{"speed", FLOAT},
{"direction", STRING},
{"keepAspectRatio", BOOLEAN},
{"opacity", FLOAT},
{"visible", BOOLEAN},
{"zIndex", FLOAT}}},
{"badges",
@ -142,6 +147,7 @@ std::map<std::string, std::map<std::string, ThemeData::ElementPropertyType>>
{"controllerSize", FLOAT},
{"customBadgeIcon", PATH},
{"customControllerIcon", PATH},
{"opacity", FLOAT},
{"visible", BOOLEAN},
{"zIndex", FLOAT}}},
{"text",
@ -166,6 +172,7 @@ std::map<std::string, std::map<std::string, ThemeData::ElementPropertyType>>
{"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<std::string, std::map<std::string, ThemeData::ElementPropertyType>>
{"lineSpacing", FLOAT},
{"format", STRING},
{"displayRelative", BOOLEAN},
{"opacity", FLOAT},
{"visible", BOOLEAN},
{"zIndex", FLOAT}}},
{"gamelistinfo",
@ -202,6 +210,7 @@ std::map<std::string, std::map<std::string, ThemeData::ElementPropertyType>>
{"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<std::string, std::map<std::string, ThemeData::ElementPropertyType>>
{"color", COLOR},
{"filledPath", PATH},
{"unfilledPath", PATH},
{"opacity", FLOAT},
{"visible", BOOLEAN},
{"zIndex", FLOAT}}},
{"carousel",
{{"type", STRING},
@ -240,7 +251,7 @@ std::map<std::string, std::map<std::string, ThemeData::ElementPropertyType>>
{"fontSize", FLOAT},
{"lineSpacing", FLOAT},
{"zIndex", FLOAT},
{"legacyZIndexMode", STRING}}},
{"legacyZIndexMode", STRING}}}, // For backward compatibility with legacy themes.
{"textlist",
{{"pos", NORMALIZED_PAIR},
{"size", NORMALIZED_PAIR},

View file

@ -56,7 +56,8 @@ namespace ThemeFlags
DELAY = 0x00002000,
Z_INDEX = 0x00004000,
ROTATION = 0x00008000,
VISIBLE = 0x00010000,
OPACITY = 0x00010000,
VISIBLE = 0x00020000,
ALL = 0xFFFFFFFF
};
// clang-format on

View file

@ -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);
}

View file

@ -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<unsigned char>((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()};

View file

@ -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

View file

@ -85,7 +85,8 @@ std::string RatingComponent::getRatingValue() const
void RatingComponent::setOpacity(float opacity)
{
mOpacity = opacity;
mColorShift = (mColorShift >> 8 << 8) | static_cast<unsigned char>(mOpacity * 255.0f);
mColorShift =
(mColorShift >> 8 << 8) | static_cast<unsigned char>(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()};

View file

@ -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()};

View file

@ -32,7 +32,7 @@ public:
void setChangedColor(unsigned int color) override { mColorChangedValue = color; }
void setCallback(const std::function<void()>& 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); }

View file

@ -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<unsigned char>(o * 255.0f);
float textOpacity {opacity * mColorOpacity * mThemeOpacity};
mColor = (mColor & 0xFFFFFF00) | static_cast<unsigned char>(textOpacity * 255.0f);
float bgo {opacity * mBgColorOpacity};
mBgColor = (mBgColor & 0xFFFFFF00) | static_cast<unsigned char>(bgo * 255.0f);
float textBackgroundOpacity {opacity * mBgColorOpacity * mThemeOpacity};
mBgColor = (mBgColor & 0xFFFFFF00) | static_cast<unsigned char>(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<TextCache>(f->buildTextCache(
text, glm::vec2 {}, (mColor >> 8 << 8) | static_cast<unsigned char>(mOpacity * 255.0f),
mSize.x, mHorizontalAlignment, mLineSpacing, mNoTopMargin));
text, glm::vec2 {}, mColor, mSize.x, mHorizontalAlignment, mLineSpacing, mNoTopMargin));
}
else {
mTextCache = std::shared_ptr<TextCache>(
f->buildTextCache(f->wrapText(text, mSize.x), glm::vec2 {},
(mColor >> 8 << 8) | static_cast<unsigned char>(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();
}

View file

@ -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<float>((mColor & 0x000000FF) / 255.0f); }
float const getOpacity() const override
{
return static_cast<float>((mColor & 0x000000FF) / 255.0f);
}
void setOpacity(float opacity) override;
void setSelectable(bool status) { mSelectable = status; }