From 5f0ce77fca840c4e2ad13d921e9de4435a85cf1c Mon Sep 17 00:00:00 2001 From: elushaX Date: Wed, 20 Mar 2024 20:00:52 -0700 Subject: [PATCH] Add color sliders to sketch3d --- Sketch3D/private/Sketch3D.cpp | 4 -- Sketch3D/public/Sketch3DWidget.hpp | 25 ++++++++ Widgets/public/SliderWidget.hpp | 98 ++++++++++++++++++++++++++++++ Widgets/public/WidgetBase.hpp | 4 +- Widgets/public/Widgets.hpp | 1 + 5 files changed, 127 insertions(+), 5 deletions(-) create mode 100644 Widgets/public/SliderWidget.hpp diff --git a/Sketch3D/private/Sketch3D.cpp b/Sketch3D/private/Sketch3D.cpp index 2690e16..8fb4103 100644 --- a/Sketch3D/private/Sketch3D.cpp +++ b/Sketch3D/private/Sketch3D.cpp @@ -315,10 +315,6 @@ void Project::sample(halnf pressure, halnf cameraRatio, Vec2F relativeCameraPos) if (idx) { auto brush = mBrushes.getSlotVal(idx); - if (brush->mType == "pencil") { - ((tp::PencilBrush*) brush)->mCol = RGBA(1.f); - } - brush->sample(this, relativeCameraPos, pressure); } } diff --git a/Sketch3D/public/Sketch3DWidget.hpp b/Sketch3D/public/Sketch3DWidget.hpp index b7efa0a..787672a 100644 --- a/Sketch3D/public/Sketch3DWidget.hpp +++ b/Sketch3D/public/Sketch3DWidget.hpp @@ -80,6 +80,10 @@ namespace tp { canvas.drawImage(this->mArea, &mImage, 0, 1, 12); } + void setColor(const RGBA& color) { + ((PencilBrush*) mProject.mBrushes.get("pencil"))->mCol = color; + } + public: enum class Mode { MOVE, ROTATE, ZOOM, DRAW, NONE @@ -113,6 +117,21 @@ namespace tp { mOptions.mContents.append(mMoveButton); mOptions.mContents.append(mRotateButton); mOptions.mContents.append(mZoomButton); + + // add color sliders + mRed = new NamedSliderWidget < Events, Canvas >("Red"); + mGreen = new NamedSliderWidget < Events, Canvas >("Green"); + mBlue = new NamedSliderWidget < Events, Canvas >("Blue"); + + mOptions.mContents.append(mRed); + mOptions.mContents.append(mGreen); + mOptions.mContents.append(mBlue); + } + + ~Sketch3DGUI() { + for (auto item : mOptions.mContents) { + delete item.data(); + } } void proc(const Events& events, const RectF& areaParent, const RectF& area) override { @@ -133,6 +152,8 @@ namespace tp { } else if (mZoomButton->mIsPressed) { mViewport.mMode = Sketch3DWidget::Mode::ZOOM; } + + mViewport.setColor(RGBA(mRed->mSlider.mFactor, mGreen->mSlider.mFactor, mBlue->mSlider.mFactor, 1.f)); } void draw(Canvas& canvas) override { @@ -154,5 +175,9 @@ namespace tp { ButtonWidget* mMoveButton = nullptr; ButtonWidget* mRotateButton = nullptr; ButtonWidget* mZoomButton = nullptr; + + NamedSliderWidget* mRed = nullptr; + NamedSliderWidget* mGreen = nullptr; + NamedSliderWidget* mBlue = nullptr; }; } \ No newline at end of file diff --git a/Widgets/public/SliderWidget.hpp b/Widgets/public/SliderWidget.hpp new file mode 100644 index 0000000..098d44e --- /dev/null +++ b/Widgets/public/SliderWidget.hpp @@ -0,0 +1,98 @@ +#pragma once + +#include "LabelWidget.hpp" + +namespace tp { + + template + class SliderWidget : public Widget { + public: + SliderWidget() { + this->createConfig("SliderWidget"); + this->addColor("Default", "Base"); + this->addColor("Handle", "Accent"); + this->addColor("Hovered", "Interaction"); + this->addColor("Scrolling", "Action"); + this->addValue("Padding", "Padding"); + this->addValue("HandleSize", 20.f); + this->addValue("MinSize", 20.f); + this->addValue("Rounding", "Rounding"); + } + + void proc(const Events& events, const tp::RectF& areaParent, const tp::RectF& aArea) override { + this->mArea = aArea; + this->mVisible = areaParent.isOverlap(aArea); + if (!this->mVisible) return; + + if (events.isPressed(InputID::MOUSE1) && this->mArea.isInside(events.getPointer())) { + mIsSliding = true; + } else if (events.isReleased(InputID::MOUSE1)) { + mIsSliding = false; + } + + if (mIsSliding) { + const auto handleSize = this->getValue("HandleSize"); + mFactor = (events.getPointer().x - this->mArea.x - handleSize / 2.f) / (this->mArea.z - handleSize); + } + + mFactor = tp::clamp(mFactor, 0.f, 1.f); + } + + void draw(Canvas& canvas) override { + if (!this->mVisible) return; + canvas.rect(this->mArea, this->getColor("Default"), this->getValue("Rounding")); + canvas.rect(getHandle(), this->getColor("Handle"), this->getValue("Rounding")); + } + + RectF getHandle() const { + const auto handle = this->getValue("HandleSize"); + const auto halfHandle = handle / 2.f; + const auto left = this->mArea.x + (this->mArea.z - handle) * mFactor; + return { left, this->mArea.y, handle, this->mArea.w }; + } + + public: + halnf mFactor = 0.f; + bool mIsSliding = false; + }; + + template + class NamedSliderWidget : public Widget { + public: + NamedSliderWidget(const char* name = "Value") { + mLabel.mLabel = name; + this->mArea = { 0, 0, 100, 30 }; + } + + void proc(const Events& events, const tp::RectF& areaParent, const tp::RectF& aArea) override { + this->mArea = aArea; + this->mVisible = areaParent.isOverlap(aArea); + if (!this->mVisible) return; + + const auto widthFirst = this->mArea.z * mFactor; + const auto widthSecond = this->mArea.z * (1.f - mFactor); + + RectF rec = this->mArea; + rec.size.x = widthFirst; + + mLabel.proc(events, this->mArea, rec); + + rec.pos.x += widthFirst; + rec.size.x = widthSecond; + + mSlider.proc(events, this->mArea, rec); + } + + void draw(Canvas& canvas) override { + if (!this->mVisible) return; + mSlider.draw(canvas); + mLabel.draw(canvas); + } + + public: + SliderWidget mSlider; + LabelWidget mLabel; + + halnf mFactor = 0.5f; + }; +} \ No newline at end of file diff --git a/Widgets/public/WidgetBase.hpp b/Widgets/public/WidgetBase.hpp index 3cb8433..d1fc60f 100644 --- a/Widgets/public/WidgetBase.hpp +++ b/Widgets/public/WidgetBase.hpp @@ -7,7 +7,9 @@ namespace tp { template class Widget { public: - Widget() = default; + Widget() { + this->mArea = { 0, 0, 100, 100 }; + } [[nodiscard]] const RGBA& getColor(const String& name) const { const auto& node = cfg->values.get(name); diff --git a/Widgets/public/Widgets.hpp b/Widgets/public/Widgets.hpp index 1661f73..95d35b8 100644 --- a/Widgets/public/Widgets.hpp +++ b/Widgets/public/Widgets.hpp @@ -5,4 +5,5 @@ #include "ScrollableWidget.hpp" #include "SplitViewWidget.hpp" #include "TextInputWidget.hpp" +#include "SliderWidget.hpp" #include "Animations.hpp" \ No newline at end of file