diff --git a/res/layouts/pages/content.xml.lua b/res/layouts/pages/content.xml.lua index c0edf7f9..5cab6efd 100644 --- a/res/layouts/pages/content.xml.lua +++ b/res/layouts/pages/content.xml.lua @@ -44,11 +44,15 @@ function place_pack(panel, packid, packinfo, callback) packinfo.id_verbose = packid packinfo.callback = callback panel:add(gui.template("pack", packinfo)) + if callback == "" then + document["pack_"..packinfo.id].enabled = false + end end function refresh() packs_installed = pack.get_installed() packs_available = pack.get_available() + packs_all = {unpack(packs_installed), unpack(packs_available)} local packs_cur = document.packs_cur local packs_add = document.packs_add @@ -67,7 +71,19 @@ function refresh() for i,id in ipairs(packs_available) do local packinfo = pack.get_info(id) packinfo.index = i + packinfo.missing = "" callback = string.format('move_pack("%s")', id) + if packinfo.dependencies then + for j,dep in ipairs(packinfo.dependencies) do + local depid = dep:sub(2,-1) + if dep:sub(1,1) == '!' and not table.has(packs_all, depid) then + packinfo.missing = depid + packinfo.description = "" + callback = '' + end + end + end + place_pack(packs_add, id, packinfo, callback) end diff --git a/res/layouts/templates/pack.xml b/res/layouts/templates/pack.xml index ae637cc0..6117a5e5 100644 --- a/res/layouts/templates/pack.xml +++ b/res/layouts/templates/pack.xml @@ -7,6 +7,7 @@ gravity='bottom-right'> %{creator} + diff --git a/src/graphics/ui/elements/Button.cpp b/src/graphics/ui/elements/Button.cpp index 579bb56f..ef4c6195 100644 --- a/src/graphics/ui/elements/Button.cpp +++ b/src/graphics/ui/elements/Button.cpp @@ -79,7 +79,7 @@ void Button::drawBackground(const DrawContext* pctx, Assets* assets) { glm::vec2 pos = calcPos(); auto batch = pctx->getBatch2D(); batch->texture(nullptr); - if (enabled) { + if (isEnabled()) { batch->setColor(isPressed() ? pressedColor : (hover ? hoverColor : color)); } else { batch->setColor({color.r, color.g, color.b, color.a * 0.5f}); diff --git a/src/graphics/ui/elements/Container.cpp b/src/graphics/ui/elements/Container.cpp index 93dead99..52969bea 100644 --- a/src/graphics/ui/elements/Container.cpp +++ b/src/graphics/ui/elements/Container.cpp @@ -11,7 +11,7 @@ Container::Container(glm::vec2 size) : UINode(size) { } std::shared_ptr Container::getAt(glm::vec2 pos, std::shared_ptr self) { - if (!interactive || !enabled) { + if (!interactive || !isEnabled()) { return nullptr; } if (!isInside(pos)) return nullptr; @@ -92,7 +92,12 @@ void Container::draw(const DrawContext* pctx, Assets* assets) { } void Container::drawBackground(const DrawContext* pctx, Assets* assets) { - glm::vec4 color = isPressed() ? pressedColor : (hover ? hoverColor : this->color); + glm::vec4 color = this->color; + if (isEnabled()) { + color = (isPressed() ? pressedColor : (hover ? hoverColor : color)); + } else { + color = glm::vec4(color.r, color.g, color.b, color.a * 0.5f); + } if (color.a <= 0.001f) return; glm::vec2 pos = calcPos(); diff --git a/src/graphics/ui/elements/Image.cpp b/src/graphics/ui/elements/Image.cpp index 0b2d4945..d2d2aee1 100644 --- a/src/graphics/ui/elements/Image.cpp +++ b/src/graphics/ui/elements/Image.cpp @@ -22,7 +22,7 @@ void Image::draw(const DrawContext* pctx, Assets* assets) { setSize(glm::vec2(texture->getWidth(), texture->getHeight())); } batch->texture(texture); - if (enabled) { + if (isEnabled()) { batch->setColor(isPressed() ? pressedColor : (hover ? hoverColor : color)); } else { batch->setColor({color.r, color.g, color.b, color.a * 0.5f}); diff --git a/src/graphics/ui/elements/Label.cpp b/src/graphics/ui/elements/Label.cpp index 6c285ece..13f61725 100644 --- a/src/graphics/ui/elements/Label.cpp +++ b/src/graphics/ui/elements/Label.cpp @@ -149,7 +149,11 @@ void Label::draw(const DrawContext* pctx, Assets* assets) { cache.update(text, multiline, textWrap); } - batch->setColor(getColor()); + if (isEnabled()) { + batch->setColor(isPressed() ? pressedColor : (hover ? hoverColor : color)); + } else { + batch->setColor({color.r, color.g, color.b, color.a * 0.5f}); + } uint lineHeight = font->getLineHeight(); if (cache.lines.size() > 1) { diff --git a/src/graphics/ui/elements/UINode.cpp b/src/graphics/ui/elements/UINode.cpp index cd85e265..b05fb4ed 100644 --- a/src/graphics/ui/elements/UINode.cpp +++ b/src/graphics/ui/elements/UINode.cpp @@ -29,6 +29,9 @@ void UINode::setEnabled(bool flag) { } bool UINode::isEnabled() const { + if (enabled && parent) { + return parent->isEnabled(); + } return enabled; } diff --git a/src/graphics/ui/elements/UINode.hpp b/src/graphics/ui/elements/UINode.hpp index 236b968d..fd269c89 100644 --- a/src/graphics/ui/elements/UINode.hpp +++ b/src/graphics/ui/elements/UINode.hpp @@ -47,6 +47,8 @@ namespace gui { class UINode { /// @brief element identifier used for direct access in UiDocument std::string id = ""; + /// @brief element enabled state + bool enabled = true; protected: /// @brief element position within the parent element glm::vec2 pos {0.0f}; @@ -62,8 +64,6 @@ namespace gui { glm::vec4 pressedColor {1.0f}; /// @brief element margin (only supported for Panel sub-nodes) glm::vec4 margin {1.0f}; - /// @brief element enabled state - bool enabled = true; /// @brief is element visible bool visible = true; /// @brief is mouse over the element