Start cleaning icon.

This commit is contained in:
jmsgrogan 2023-01-19 15:42:34 +00:00
parent 97afa782a0
commit 3915a40c96
10 changed files with 172 additions and 33 deletions

View file

@ -41,7 +41,7 @@ public:
void setName(const std::string& name); void setName(const std::string& name);
void setLocation(const Point& loc); virtual void setLocation(const Point& loc);
virtual void update(SceneInfo* sceneInfo); virtual void update(SceneInfo* sceneInfo);

View file

@ -5,7 +5,7 @@
PathNode::PathNode(const Point& loc, const std::string& psPath) PathNode::PathNode(const Point& loc, const std::string& psPath)
: GeometryNode(loc), : GeometryNode(loc),
mPathString(psPath) mPathString(psPath)
{ {
} }

View file

@ -7,7 +7,7 @@
#include "SvgShapeElements.h" #include "SvgShapeElements.h"
SvgNode::SvgNode(const Point& location) SvgNode::SvgNode(const Point& location)
: AbstractVisualNode(location) : MaterialNode(location)
{ {
} }
@ -18,7 +18,25 @@ void SvgNode::setContent(std::unique_ptr<SvgDocument> doc)
mContentDirty = true; mContentDirty = true;
mChildren.clear(); mChildren.clear();
mManagedChildren.clear(); mGeometryNodes.clear();
}
void SvgNode::setWidth(unsigned width)
{
if (mWidth != width)
{
mWidth = width;
mTransformIsDirty = true;
}
}
void SvgNode::setHeight(unsigned height)
{
if (mHeight != height)
{
mHeight = height;
mTransformIsDirty = true;
}
} }
void SvgNode::updateTransform() void SvgNode::updateTransform()
@ -37,25 +55,23 @@ void SvgNode::createOrUpdateGeometry(SceneInfo* sceneInfo)
for (const auto& svg_element : mContent->getRoot()->getChildren()) for (const auto& svg_element : mContent->getRoot()->getChildren())
{ {
std::unique_ptr<AbstractVisualNode> node; std::unique_ptr<GeometryNode> geom_node;
if (svg_element->getTagName() == "circle") if (svg_element->getTagName() == "circle")
{ {
onCircle(svg_element.get(), node); onCircle(svg_element.get(), geom_node);
} }
else if (svg_element->getTagName() == "path") else if (svg_element->getTagName() == "path")
{ {
onPath(svg_element.get(), node); onPath(svg_element.get(), geom_node);
} }
if (!node) AbstractVisualNode* raw_node{ nullptr };
if (geom_node)
{ {
continue; raw_node = geom_node.get();
mGeometryNodes.push_back(std::move(geom_node));
} }
auto raw_node = node.get();
mManagedChildren.push_back(std::move(node));
addChild(raw_node); addChild(raw_node);
} }
} }
@ -73,9 +89,43 @@ void SvgNode::update(SceneInfo* sceneInfo)
updateTransform(); updateTransform();
mTransformIsDirty = false; mTransformIsDirty = false;
} }
if (mMaterialIsDirty)
{
if (mHasFillColor)
{
for (const auto& geom_node : mGeometryNodes)
{
geom_node->setFillColor(mFillColor);
}
}
else
{
for (const auto& geom_node : mGeometryNodes)
{
geom_node->setHasFillColor(false);
}
}
if (mHasStrokeColor)
{
for (const auto& geom_node : mGeometryNodes)
{
geom_node->setStrokeColor(mStrokeColor);
}
}
else
{
for (const auto& geom_node : mGeometryNodes)
{
geom_node->setHasStrokeColor(false);
}
}
mMaterialIsDirty = false;
}
} }
void SvgNode::onCircle(XmlElement* element, std::unique_ptr<AbstractVisualNode>& node) void SvgNode::onCircle(XmlElement* element, std::unique_ptr<GeometryNode>& node)
{ {
auto svg_circle = dynamic_cast<SvgCircle*>(element); auto svg_circle = dynamic_cast<SvgCircle*>(element);
auto loc = svg_circle->getLocation(); auto loc = svg_circle->getLocation();
@ -100,7 +150,7 @@ void SvgNode::onCircle(XmlElement* element, std::unique_ptr<AbstractVisualNode>&
node = std::move(circle_node); node = std::move(circle_node);
} }
void SvgNode::onPath(XmlElement* element, std::unique_ptr<AbstractVisualNode>& node) void SvgNode::onPath(XmlElement* element, std::unique_ptr<GeometryNode>& node)
{ {
auto svg_path = dynamic_cast<SvgPath*>(element); auto svg_path = dynamic_cast<SvgPath*>(element);

View file

@ -1,28 +1,35 @@
#pragma once #pragma once
#include "AbstractVisualNode.h" #include "MaterialNode.h"
#include "GeometryNode.h"
#include "SvgDocument.h" #include "SvgDocument.h"
#include <memory> #include <memory>
#include <vector> #include <vector>
class SvgNode : public AbstractVisualNode class SvgNode : public MaterialNode
{ {
public: public:
SvgNode(const Point& location); SvgNode(const Point& location);
void setContent(std::unique_ptr<SvgDocument> doc); void setContent(std::unique_ptr<SvgDocument> doc);
void setWidth(unsigned width);
void setHeight(unsigned height);
void update(SceneInfo* sceneInfo); void update(SceneInfo* sceneInfo);
private: private:
void createOrUpdateGeometry(SceneInfo* sceneInfo); void createOrUpdateGeometry(SceneInfo* sceneInfo);
void updateTransform(); void updateTransform();
void onCircle(XmlElement* element, std::unique_ptr<AbstractVisualNode>& node); void onCircle(XmlElement* element, std::unique_ptr<GeometryNode>& node);
void onPath(XmlElement* element, std::unique_ptr<AbstractVisualNode>& node); void onPath(XmlElement* element, std::unique_ptr<GeometryNode>& node);
unsigned mWidth{ 0 };
unsigned mHeight{ 0 };
bool mContentDirty{ true }; bool mContentDirty{ true };
std::vector<std::unique_ptr<AbstractVisualNode> > mManagedChildren; std::vector<std::unique_ptr<GeometryNode> > mGeometryNodes;
std::unique_ptr<SvgDocument> mContent; std::unique_ptr<SvgDocument> mContent;
}; };

View file

@ -21,6 +21,8 @@ Button::Button(ButtonData::Component component)
{ {
mStyle.mComponent = component; mStyle.mComponent = component;
mName = "Button"; mName = "Button";
setWidth(150);
setMaxWidth(150);
setHeight(mStyle.getContainerHeight()); setHeight(mStyle.getContainerHeight());
setMaxHeight(mStyle.getContainerHeight()); setMaxHeight(mStyle.getContainerHeight());
@ -95,6 +97,9 @@ void Button::updateState()
setLabelTextColor(mStyle.getLabelTextColor()); setLabelTextColor(mStyle.getLabelTextColor());
setLabelTextOpacity(mStyle.getLabelOpacity()); setLabelTextOpacity(mStyle.getLabelOpacity());
setLabelTextTypescale(mStyle.getLabelTypescale()); setLabelTextTypescale(mStyle.getLabelTypescale());
setIconColor(mStyle.getIconColor());
//setIconOpacity()
} }
void Button::setLabelTextColor(Theme::Sys::Color color) void Button::setLabelTextColor(Theme::Sys::Color color)
@ -124,6 +129,24 @@ void Button::setLabelTextTypescale(Theme::Sys::Typescale typescale)
} }
} }
void Button::setIconColor(Theme::Sys::Color color)
{
if (mIconColor != color)
{
mIconColor = color;
mMaterialDirty = true;
}
}
void Button::setIconOpacity(float opacity)
{
if (mIconOpacity!= opacity)
{
mIconOpacity = opacity;
mMaterialDirty = true;
}
}
void Button::onMyMouseEvent(const MouseEvent* event) void Button::onMyMouseEvent(const MouseEvent* event)
{ {
if (!mEnabled) if (!mEnabled)
@ -237,6 +260,10 @@ void Button::updateIcon(const PaintEvent* event)
mIconNode->setContent(IconNode::IconType::Svg, MediaResourceManager::getSvgIconNode(mIcon)); mIconNode->setContent(IconNode::IconType::Svg, MediaResourceManager::getSvgIconNode(mIcon));
mRootNode->addChild(mIconNode.get()); mRootNode->addChild(mIconNode.get());
} }
else if (mContentDirty && mIcon != Resource::Icon::Svg::NONE)
{
mIconNode->setContent(IconNode::IconType::Svg, MediaResourceManager::getSvgIconNode(mIcon));
}
if (!mIconNode) if (!mIconNode)
{ {
@ -252,11 +279,7 @@ void Button::updateIcon(const PaintEvent* event)
{ {
auto icon_fill = event->getThemesManager()->getColor(mIconColor); auto icon_fill = event->getThemesManager()->getColor(mIconColor);
icon_fill.setAlpha(mIconOpacity); icon_fill.setAlpha(mIconOpacity);
} mIconNode->setFillColor(icon_fill);
if (mContentDirty)
{
mIconNode->setContent(IconNode::IconType::Svg, MediaResourceManager::getSvgIconNode(mIcon));
} }
if (mVisibilityDirty) if (mVisibilityDirty)

View file

@ -43,6 +43,9 @@ protected:
void setLabelTextOpacity(float opacity); void setLabelTextOpacity(float opacity);
void setLabelTextTypescale(Theme::Sys::Typescale typescale); void setLabelTextTypescale(Theme::Sys::Typescale typescale);
void setIconColor(Theme::Sys::Color color);
void setIconOpacity(float opacity);
void updateLabel(const PaintEvent* event); void updateLabel(const PaintEvent* event);
void updateIcon(const PaintEvent* event); void updateIcon(const PaintEvent* event);

View file

@ -1,14 +1,55 @@
#include "IconNode.h" #include "IconNode.h"
#include "SvgNode.h"
IconNode::IconNode(const Point& loc) IconNode::IconNode(const Point& loc)
: AbstractVisualNode(loc) : AbstractVisualNode(loc)
{ {
} }
void IconNode::setContent(IconType type, std::unique_ptr<AbstractVisualNode> content) void IconNode::setSvgContent(std::unique_ptr<SvgNode> svg_node)
{ {
mType = type; mChildren.clear();
mContent = std::move(content);
mType = IconType::Svg;
mSvgContent = std::move(svg_node);
mContentDirty = true; mContentDirty = true;
addChild(mSvgContent.get());
}
void IconNode::setFillColor(const Color& color)
{
if (mType == IconType::Svg)
{
mSvgContent->setFillColor(color);
mSvgContent->setHasStrokeColor(false);
}
}
void IconNode::setWidth(unsigned width)
{
if (mType == IconType::Svg)
{
mSvgContent->setWidth(width);
}
}
void IconNode::setHeight(unsigned height)
{
if (mType == IconType::Svg)
{
mSvgContent->setFillColor(height);
mSvgContent->setHasStrokeColor(false);
}
}
void IconNode::setOutlineColor(const Color& color)
{
if (mType == IconType::Svg)
{
dynamic_cast<SvgNode*>(mContent.get())->setStrokeColor(color);
}
} }

View file

@ -2,6 +2,8 @@
#include "AbstractVisualNode.h" #include "AbstractVisualNode.h"
#include "SvgNode.h"
class IconNode : public AbstractVisualNode class IconNode : public AbstractVisualNode
{ {
public: public:
@ -14,10 +16,21 @@ public:
IconNode(const Point& loc); IconNode(const Point& loc);
void setContent(IconType type, std::unique_ptr<AbstractVisualNode>); void setLocation(const Point& loc) override;
void setWidth(unsigned width);
void setHeight(unsigned height);
void setFillColor(const Color& color);
void setOutlineColor(const Color& color);
void setSvgContent(std::unique_ptr<SvgNode> svg_node);
private: private:
std::unique_ptr<AbstractVisualNode> mContent; std::unique_ptr<SvgNode> mSvgContent;
IconType mType{ IconType::Svg }; IconType mType{ IconType::Svg };
bool mContentDirty{ true }; bool mContentDirty{ true };

View file

@ -42,7 +42,7 @@ unsigned FontTokens::getSize(Theme::Sys::Typescale typescale)
switch (typescale) switch (typescale)
{ {
case Theme::Sys::Typescale::Label_Large: case Theme::Sys::Typescale::Label_Large:
return static_cast<unsigned>(57/3); return static_cast<unsigned>(57/3.5);
default: default:
return 57; return 57;
} }

View file

@ -23,18 +23,20 @@ TEST_CASE(TestButton_Elevated, "ui_controls")
enabled_button->setLabel("Enabled"); enabled_button->setLabel("Enabled");
enabled_button->setSvgIcon(Resource::Icon::Svg::HOME_MEDIUM); enabled_button->setSvgIcon(Resource::Icon::Svg::HOME_MEDIUM);
/*
auto disabled_button = Button::Create(ButtonData::Component::Elevated); auto disabled_button = Button::Create(ButtonData::Component::Elevated);
disabled_button->setEnabled(false); disabled_button->setEnabled(false);
disabled_button->setLabel("Disabled"); disabled_button->setLabel("Disabled");
disabled_button->setSvgIcon(Resource::Icon::Svg::HOME_MEDIUM);
/*
auto pressed_button = Button::Create(ButtonData::Component::Elevated); auto pressed_button = Button::Create(ButtonData::Component::Elevated);
pressed_button->setLabel("Pressed"); pressed_button->setLabel("Pressed");
*/ */
spacer.addWidget(std::move(enabled_button)); spacer.addWidget(std::move(enabled_button));
//spacer.addWidget(std::move(disabled_button)); spacer.addWidget(std::move(disabled_button));
//spacer.addWidget(std::move(pressed_button)); //spacer.addWidget(std::move(pressed_button));
auto node = spacer.getRootNode(); auto node = spacer.getRootNode();