diff --git a/src/publishing/svg/SvgPainter.cpp b/src/publishing/svg/SvgPainter.cpp index c8e5e62..f43a7dc 100644 --- a/src/publishing/svg/SvgPainter.cpp +++ b/src/publishing/svg/SvgPainter.cpp @@ -96,11 +96,17 @@ void SvgPainter::setStyle(SceneModel* model, SvgShapeElement* element) const if (model->hasFillColor()) { element->setFill(model->getFillColor()); + auto opacity = static_cast(model->getFillColor().getAlpha()); + if (opacity != 1.0) + { + element->setFillOpacity(opacity); + } } else { element->setNoFill(); } + if (model->hasOutlineColor()) { element->setStrokeColor(model->getOutlineColor()); @@ -156,10 +162,18 @@ void SvgPainter::paintText(SvgDocument* document, SceneText* text) const { auto svg_text = std::make_unique(); svg_text->setContent(text->getTextData().mContent); - svg_text->setLocation(text->getTransform().getLocation()); + auto loc = text->getTransform().getLocation(); + loc.move(0.0, text->getTextHeight()); + svg_text->setLocation(loc); svg_text->setFontFamily(text->getTextData().mFont.getFaceName()); svg_text->setFill(text->getFillColor()); + auto opacity = static_cast(text->getFillColor().getAlpha()); + if (opacity != 1.0) + { + svg_text->setFillOpacity(opacity); + } + svg_text->setFontSize(text->getTextData().mFont.getSize()); document->getRoot()->addChild(std::move(svg_text)); diff --git a/src/rendering/visual_elements/CMakeLists.txt b/src/rendering/visual_elements/CMakeLists.txt index 8e42e6b..5bc122a 100644 --- a/src/rendering/visual_elements/CMakeLists.txt +++ b/src/rendering/visual_elements/CMakeLists.txt @@ -34,6 +34,8 @@ list(APPEND visual_elements_LIB_INCLUDES svg/elements/SvgShapeElements.cpp nodes/MaterialNode.h nodes/MaterialNode.cpp + nodes/ImageNode.h + nodes/ImageNode.cpp nodes/MeshNode.h nodes/MeshNode.cpp nodes/TextNode.h diff --git a/src/rendering/visual_elements/nodes/ImageNode.cpp b/src/rendering/visual_elements/nodes/ImageNode.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/rendering/visual_elements/nodes/ImageNode.h b/src/rendering/visual_elements/nodes/ImageNode.h new file mode 100644 index 0000000..e69de29 diff --git a/src/rendering/visual_elements/svg/SvgShapeElement.cpp b/src/rendering/visual_elements/svg/SvgShapeElement.cpp index 864f609..de74522 100644 --- a/src/rendering/visual_elements/svg/SvgShapeElement.cpp +++ b/src/rendering/visual_elements/svg/SvgShapeElement.cpp @@ -130,7 +130,13 @@ void SvgShapeElement::setStrokeWidth(double width) { auto attr = std::make_unique("stroke-width"); attr->setValue(std::to_string(width)); + addAttribute(std::move(attr)); +} +void SvgShapeElement::setFillOpacity(float opacity) +{ + auto attr = std::make_unique("fill-opacity"); + attr->setValue(std::to_string(opacity)); addAttribute(std::move(attr)); } diff --git a/src/rendering/visual_elements/svg/SvgShapeElement.h b/src/rendering/visual_elements/svg/SvgShapeElement.h index 869e2da..00fab67 100644 --- a/src/rendering/visual_elements/svg/SvgShapeElement.h +++ b/src/rendering/visual_elements/svg/SvgShapeElement.h @@ -17,6 +17,8 @@ public: void setNoFill(); + void setFillOpacity(float opacity); + void setStrokeWidth(double width); void setStrokeColor(const Color& stroke); diff --git a/src/rendering/visual_elements/svg/SvgTextElement.cpp b/src/rendering/visual_elements/svg/SvgTextElement.cpp index 4b463c2..dfcbaf2 100644 --- a/src/rendering/visual_elements/svg/SvgTextElement.cpp +++ b/src/rendering/visual_elements/svg/SvgTextElement.cpp @@ -10,6 +10,13 @@ SvgTextElement::SvgTextElement() } +void SvgTextElement::setFillOpacity(float opacity) +{ + auto attr = std::make_unique("fill-opacity"); + attr->setValue(std::to_string(opacity)); + addAttribute(std::move(attr)); +} + void SvgTextElement::setLocation(const Point& loc) { auto x = std::make_unique("x"); diff --git a/src/rendering/visual_elements/svg/SvgTextElement.h b/src/rendering/visual_elements/svg/SvgTextElement.h index d988b2b..bf41967 100644 --- a/src/rendering/visual_elements/svg/SvgTextElement.h +++ b/src/rendering/visual_elements/svg/SvgTextElement.h @@ -15,6 +15,8 @@ public: void setFill(const Color& fill); + void setFillOpacity(float opacity); + void setFontFamily(const std::string& family); void setFontSize(float size); diff --git a/src/ui/ui_controls/Button.cpp b/src/ui/ui_controls/Button.cpp index ac41981..1ac8175 100644 --- a/src/ui/ui_controls/Button.cpp +++ b/src/ui/ui_controls/Button.cpp @@ -62,16 +62,21 @@ void Button::setEnabled(bool isEnabled) if (mEnabled != isEnabled) { mEnabled = isEnabled; - if (mStyle.mState == ButtonData::State::Disabled) + if (isEnabled && mStyle.mState == ButtonData::State::Disabled) { setState(ButtonData::State::Enabled); } + else if (!isEnabled && mStyle.mState == ButtonData::State::Enabled) + { + setState(ButtonData::State::Disabled); + } } } void Button::updateState() { setBackground(mStyle.getContainerColor()); + setBackgroundOpacity(mStyle.getStateLayerOverlayOpacity()); setBackgroundTone(mStyle.getContainerSurfaceTintColor()); setElevation(mStyle.getContainerElevation()); diff --git a/src/ui/ui_controls/Button.h b/src/ui/ui_controls/Button.h index 2bd6049..dbead48 100644 --- a/src/ui/ui_controls/Button.h +++ b/src/ui/ui_controls/Button.h @@ -10,6 +10,7 @@ class PaintEvent; class MouseEvent; class TextNode; +class IconNode; class Button : public Widget { @@ -57,6 +58,8 @@ private: std::unique_ptr mTextNode; bool mContentDirty{true}; + std::unique_ptr mIconNode; + bool mEnabled{ true }; }; diff --git a/src/ui/ui_elements/CMakeLists.txt b/src/ui/ui_elements/CMakeLists.txt index 7bd2baf..0fabaa1 100644 --- a/src/ui/ui_elements/CMakeLists.txt +++ b/src/ui/ui_elements/CMakeLists.txt @@ -36,6 +36,10 @@ list(APPEND LIB_INCLUDES style/FontTokens.cpp style/ElevationTokens.h style/OpacityTokens.h + style/MediaResources.h + style/MediaResources.cpp + style/MediaResourceManager.h + style/MediaResourceManager.cpp IconNode.h IconNode.cpp ) diff --git a/src/ui/ui_elements/IconNode.h b/src/ui/ui_elements/IconNode.h index e69de29..f78b737 100644 --- a/src/ui/ui_elements/IconNode.h +++ b/src/ui/ui_elements/IconNode.h @@ -0,0 +1,9 @@ +#pragma once + +#include "AbstractVisualNode.h" + +class IconNode +{ +private: + +}; \ No newline at end of file diff --git a/src/ui/ui_elements/style/MediaResourceManager.cpp b/src/ui/ui_elements/style/MediaResourceManager.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/ui/ui_elements/style/MediaResourceManager.h b/src/ui/ui_elements/style/MediaResourceManager.h new file mode 100644 index 0000000..e69de29 diff --git a/src/ui/ui_elements/style/MediaResources.cpp b/src/ui/ui_elements/style/MediaResources.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/ui/ui_elements/style/MediaResources.h b/src/ui/ui_elements/style/MediaResources.h new file mode 100644 index 0000000..e69de29 diff --git a/test/ui_controls/TestButton.cpp b/test/ui_controls/TestButton.cpp index a110ae2..3ad4c60 100644 --- a/test/ui_controls/TestButton.cpp +++ b/test/ui_controls/TestButton.cpp @@ -4,6 +4,7 @@ #include "ThemeManager.h" #include "PaintEvent.h" +#include "MouseEvent.h" #include "VerticalSpacer.h" @@ -24,14 +25,23 @@ TEST_CASE(TestButton_Elevated, "ui_controls") disabled_button->setEnabled(false); disabled_button->setLabel("Disabled"); + auto pressed_button = Button::Create(ButtonData::Component::Elevated); + pressed_button->setLabel("Pressed"); + spacer.addWidget(std::move(enabled_button)); spacer.addWidget(std::move(disabled_button)); + spacer.addWidget(std::move(pressed_button)); auto node = spacer.getRootNode(); TestRenderer renderer; renderer.getScene()->addNode(node); + auto mouse_event = MouseEvent::Create(); + mouse_event->setAction(MouseEvent::Action::Pressed); + mouse_event->setClientLocation({ 250, 20 }); + spacer.onMouseEvent(mouse_event.get()); + auto paint_event = PaintEvent::Create(theme_manager.get(), nullptr); spacer.onPaintEvent(paint_event.get());