diff --git a/src/base/core/Color.h b/src/base/core/Color.h index 1b6c8ef..ea70540 100644 --- a/src/base/core/Color.h +++ b/src/base/core/Color.h @@ -25,6 +25,11 @@ public: std::string toString() const; + void setAlpha(float alpha) + { + mAlpha = static_cast(alpha); + } + bool operator==(const Color& rhs) const { return (mR == rhs.mR) diff --git a/src/base/geometry/primitives/Rectangle.cpp b/src/base/geometry/primitives/Rectangle.cpp index b8a7814..1122a8e 100644 --- a/src/base/geometry/primitives/Rectangle.cpp +++ b/src/base/geometry/primitives/Rectangle.cpp @@ -50,4 +50,14 @@ namespace ntk { { return mBottomLeft; } + + double Rectangle::getRadius() const + { + return mRadius; + } + + void Rectangle::setRadius(double radius) + { + mRadius = radius; + } } diff --git a/src/base/geometry/primitives/Rectangle.h b/src/base/geometry/primitives/Rectangle.h index ed37cdd..5f0babd 100644 --- a/src/base/geometry/primitives/Rectangle.h +++ b/src/base/geometry/primitives/Rectangle.h @@ -19,12 +19,17 @@ public: Type getType() const override; + double getRadius() const; + + void setRadius(double radius); + void sample(SparseGrid* grid) const override; private: Point mBottomLeft; double mWidth{0}; double mHeight{0}; + double mRadius{ 0.0 }; }; } diff --git a/src/rendering/visual_elements/basic_shapes/RectangleNode.cpp b/src/rendering/visual_elements/basic_shapes/RectangleNode.cpp index b9852cc..8670c50 100644 --- a/src/rendering/visual_elements/basic_shapes/RectangleNode.cpp +++ b/src/rendering/visual_elements/basic_shapes/RectangleNode.cpp @@ -33,6 +33,11 @@ double RectangleNode::getHeight() const return mHeight; } +double RectangleNode::getRadius() const +{ + return mRadius; +} + void RectangleNode::setWidth(double width) { if (mWidth != width) @@ -51,20 +56,42 @@ void RectangleNode::setHeight(double height) } } +void RectangleNode::setRadius(double radius) +{ + if (mRadius != radius) + { + mGeometryIsDirty = true; + mRadius = radius; + } +} + void RectangleNode::createOrUpdateGeometry(SceneInfo* sceneInfo) { - if (sceneInfo->mSupportsGeometryPrimitives) + if (!mBackgroundItem) { - auto rect = std::make_unique(Point{ 0, 0 }, 1, 1); - mBackgroundItem = std::make_unique(std::move(rect)); + if (sceneInfo->mSupportsGeometryPrimitives) + { + auto rect = std::make_unique(Point{ 0, 0 }, 1, 1); + rect->setRadius(mRadius); + mBackgroundItem = std::make_unique(std::move(rect)); + } + else + { + auto mesh = MeshPrimitives::buildRectangleAsTriMesh(); + mBackgroundItem = std::make_unique(std::move(mesh)); + + } + mBackgroundItem->setName(mName + "_Model"); } else { - auto mesh = MeshPrimitives::buildRectangleAsTriMesh(); - mBackgroundItem = std::make_unique(std::move(mesh)); - + if (sceneInfo->mSupportsGeometryPrimitives) + { + auto rect = std::make_unique(Point{ 0, 0 }, 1, 1); + rect->setRadius(mRadius); + mBackgroundItem->updateGeometry(std::move(rect)); + } } - mBackgroundItem->setName(mName + "_Model"); } void RectangleNode::updateTransform() diff --git a/src/rendering/visual_elements/basic_shapes/RectangleNode.h b/src/rendering/visual_elements/basic_shapes/RectangleNode.h index 2fff6fc..57a5756 100644 --- a/src/rendering/visual_elements/basic_shapes/RectangleNode.h +++ b/src/rendering/visual_elements/basic_shapes/RectangleNode.h @@ -14,15 +14,19 @@ public: double getWidth() const; double getHeight() const; + double getRadius() const; void setWidth(double width); void setHeight(double height); + void setRadius(double radius); + private: void createOrUpdateGeometry(SceneInfo* sceneInfo) override; void updateTransform() override; double mWidth{1}; double mHeight{1}; + double mRadius{ 0.0 }; }; using RectangleNodePtr = std::unique_ptr; diff --git a/src/rendering/visual_elements/nodes/MaterialNode.cpp b/src/rendering/visual_elements/nodes/MaterialNode.cpp index 1833141..e64106e 100644 --- a/src/rendering/visual_elements/nodes/MaterialNode.cpp +++ b/src/rendering/visual_elements/nodes/MaterialNode.cpp @@ -29,6 +29,15 @@ void MaterialNode::setHasStrokeColor(bool hasStroke) } } +void MaterialNode::setHasFillColor(bool hasFill) +{ + if (mHasFillColor != hasFill) + { + mHasFillColor = hasFill; + mMaterialIsDirty = true; + } +} + void MaterialNode::setFillColor(const Color& color) { mHasFillColor = true; diff --git a/src/rendering/visual_elements/nodes/MaterialNode.h b/src/rendering/visual_elements/nodes/MaterialNode.h index aee2016..82d720e 100644 --- a/src/rendering/visual_elements/nodes/MaterialNode.h +++ b/src/rendering/visual_elements/nodes/MaterialNode.h @@ -13,6 +13,7 @@ public: const Color& getStrokeColor() const; void setHasStrokeColor(bool hasStroke); + void setHasFillColor(bool hasFill); void setFillColor(const Color& color); void setStrokeColor(const Color& color); diff --git a/src/ui/ui_controls/Button.cpp b/src/ui/ui_controls/Button.cpp index 32b31ee..83beacc 100644 --- a/src/ui/ui_controls/Button.cpp +++ b/src/ui/ui_controls/Button.cpp @@ -42,22 +42,79 @@ void Button::setLabel(const std::string& text) } } +void Button::setState(ButtonData::State state) +{ + if (mStyle.mState != state) + { + mStyle.mState = state; + mStateDirty = true; + } +} + +void Button::setEnabled(bool isEnabled) +{ + if (mEnabled != isEnabled) + { + mEnabled = isEnabled; + if (mStyle.mState == ButtonData::State::Disabled) + { + setState(ButtonData::State::Enabled); + } + } +} + +void Button::updateState() +{ + setBackground(mStyle.getContainerColor()); + +} + void Button::onMyMouseEvent(const MouseEvent* event) { - MLOG_INFO("Widget mouse event"); - if(event->getAction() == MouseEvent::Action::Pressed) + if (!mEnabled) { - mStyle.mState = ButtonData::State::Pressed; - setBackground(mStyle.getContainerColor()); - if(mClickFunc) + return; + } + + if (event->getAction() == MouseEvent::Action::Pressed) + { + setState(ButtonData::State::Pressed); + } + else if (event->getAction() == MouseEvent::Action::Released) + { + resetState(); + if (mClickFunc) { mClickFunc(this); } } - else if(event->getAction() == MouseEvent::Action::Released) + else if (event->getAction() == MouseEvent::Action::Enter) { - mStyle.mState = ButtonData::State::Enabled; - setBackground(mStyle.getContainerColor()); + resetState(); + } + else if (event->getAction() == MouseEvent::Action::Leave) + { + resetState(); + } +} + +void Button::resetState() +{ + if (mHasFocus) + { + setState(ButtonData::State::Focused); + } + else if (mContainsMouse) + { + setState(ButtonData::State::Hovered); + } + else if (mEnabled) + { + setState(ButtonData::State::Enabled); + } + else + { + setState(ButtonData::State::Disabled); } } diff --git a/src/ui/ui_controls/Button.h b/src/ui/ui_controls/Button.h index e3fac65..7b90e57 100644 --- a/src/ui/ui_controls/Button.h +++ b/src/ui/ui_controls/Button.h @@ -24,6 +24,8 @@ public: void setLabel(const std::string& text); + void setEnabled(bool isEnabled); + void setOnClickFunction(clickFunc func); protected: @@ -34,6 +36,10 @@ protected: void updateLabel(const PaintEvent* event); + void setState(ButtonData::State state); + void resetState(); + void updateState() override; + private: ButtonData mStyle; @@ -42,6 +48,8 @@ private: std::unique_ptr mTextNode; bool mContentDirty{true}; + + bool mEnabled{ true }; }; using ButtonUPtr = std::unique_ptr