new widgets

This commit is contained in:
IlyaShurupov 2024-06-19 22:17:18 +03:00 committed by Ilya Shurupov
parent 5cc982fa00
commit 285ca80b4b
18 changed files with 373 additions and 43 deletions

View file

@ -32,6 +32,10 @@ namespace tp {
}
}
void setLabel(const std::string& string) {
mLabel.mLabel = string;
}
public:
void eventUpdateConfiguration(WidgetManager& wm) override {
wm.setActiveId("Button");

View file

@ -0,0 +1,91 @@
#pragma once
#include "ScrollableWidget.hpp"
#include "ButtonWidget.hpp"
namespace tp {
template <typename Events, typename Canvas>
class CollapsableMenu : public Widget<Events, Canvas> {
public:
CollapsableMenu() {
this->mChildWidgets.pushBack(&mHeader);
this->mChildWidgets.pushBack(&mBody);
}
void eventProcess(const Events&) override {
if (mHeader.isReleased()) {
mCollapsed = !mCollapsed;
}
mHeader.setArea(getHeaderRect());
mBody.mEnable = !mCollapsed;
if (mCollapsed) {
this->mArea.size.y = headerHeight;
} else {
this->mArea.size.y = headerHeight + getBodyRect().size.y + mPadding * 2;
mBody.setArea(getBodyRect());
}
}
void eventDraw(Canvas& canvas) override {
canvas.rect(this->mArea, mBorderColor, rounding);
canvas.rect(this->mArea.shrink(mBorderSize), mMenuColor, rounding);
}
public:
void addWidgetToMenu(Widget<Events, Canvas>* widget) {
mBody.addWidget(widget);
}
void setLabel(const std::string& string) {
mHeader.mLabel = string;
}
private:
RectF getHeaderRect() {
RectF out = { this->mArea.pos, { this->mArea.size.x, headerHeight } };
return out.shrink(mPadding);
}
RectF getBodyRect() {
RectF out = { { this->mArea.pos.x, this->mArea.pos.y + headerHeight },
{ this->mArea.size.x, mBody.getContentSize() }
};
if (mBody.getContentSize()) {
out = out.shrink(mPadding);
out.size.y += mPadding * 2 + 1;
}
return out;
}
public:
void eventUpdateConfiguration(WidgetManager& wm) override {
wm.setActiveId("CollapsableMenu");
headerHeight = wm.getNumber("HeaderHeight", 35);
mMenuColor = wm.getColor("MenuColor", RGBA(0, 0, 0, 1.f));
rounding = wm.getNumber("Rounding", "Rounding");
mBorderColor = wm.getColor("BorderColor", RGBA(0.16, 0.16, 0.16, 1.f));
mBorderSize = wm.getNumber("BorderSize", 2.f);
mPadding = wm.getNumber("Padding", "Padding");
}
protected:
ScrollableWindow<Events, Canvas> mBody;
LabelWidget<Events, Canvas> mHeader;
RGBA mMenuColor;
RGBA mBorderColor;
halnf headerHeight = 30;
halnf rounding = 0;
halnf mBorderSize = 0;
halnf mPadding = 0;
bool mCollapsed = true;
};
}

View file

@ -0,0 +1,46 @@
#pragma once
#include "CollapsableMenu.hpp"
namespace tp {
template <typename Events, typename Canvas>
class FloatingWidget : public CollapsableMenu<Events, Canvas> {
public:
FloatingWidget() {
this->mArea = { 0, 0, 300, 300 };
}
virtual void procWrapper(const Events& events, const RectF& parentArea) override {
if (!this->mEnable) return;
this->checkVisibility(events, parentArea);
if (!this->mVisible) return;
this->checkFocus(events);
this->checkClicked(events);
mParentArea = parentArea;
this->eventProcess(events);
for (auto child : this->mChildWidgets) {
child->procWrapper(events, this->getArea());
}
}
void eventProcess(const Events& events) override {
CollapsableMenu<Events, Canvas>::eventProcess(events);
if (this->mHeader.isHolding()) {
this->mArea.pos += events.getPointerDelta();
if (!this->mArea.isEnclosedIn(mParentArea)) {
this->mArea.pos -= events.getPointerDelta();
}
}
}
RectF mParentArea;
};
}

View file

@ -6,10 +6,12 @@ namespace tp {
template <typename Events, typename Canvas>
class LabelWidget : public Widget<Events, Canvas> {
public:
LabelWidget() = default;
LabelWidget() {
this->mArea = { 0, 0, 100, 30 };
}
void eventDraw(Canvas& canvas) override {
canvas.text(mLabel.c_str(), this->mArea, fontSize, Canvas::CC, padding, fontColor);
canvas.text(mLabel.c_str(), this->mArea, fontSize, Canvas::LC, padding, fontColor);
}
public:

View file

@ -131,7 +131,7 @@ namespace tp {
this->mChildWidgets.pushBack(&mContentWidget);
}
~ScrollableWindow() = default;
virtual ~ScrollableWindow() = default;
// takes whole area
void eventProcess(const Events& events) override {
@ -154,7 +154,7 @@ namespace tp {
for (auto widget : content) {
widget->setArea({ mContentWidget.mArea.x + padding,
widget->mArea.y,
mContentWidget.mArea.y + widget->mArea.y,
mScroller.getViewport().z - padding * 2,
widget->mArea.w });
}
@ -169,23 +169,30 @@ namespace tp {
mPadding = wm.getNumber("Padding", "Padding");
}
[[nodiscard]] halnf getContentSize() const {
return mContentSize;
}
private:
void updateContents(List<Widget<Events, Canvas>*>& contentWidgets) {
if (contentWidgets.size()) {
const halnf offset = contentWidgets.first()->mArea.y + mPadding;
if (!contentWidgets.size()) {
return;
}
halnf start = 0;
for (auto widget : contentWidgets) {
widget->mArea.y = start;
start += widget->mArea.w + mPadding;
}
const halnf offset = contentWidgets.first()->mArea.y + mPadding;
for (auto widget : contentWidgets) {
widget->mArea.y += offset;
}
halnf start = 0;
for (auto widget : contentWidgets) {
widget->mArea.y = start;
start += widget->mArea.w + mPadding;
}
for (auto widget : contentWidgets) {
widget->mArea.y += offset;
}
}
// ready content size
void updateContentSize(List<Widget<Events, Canvas>*>& contentWidgets) {
mContentSize = 0;
if (contentWidgets.size()) {

View file

@ -6,4 +6,6 @@
#include "SplitViewWidget.hpp"
#include "TextInputWidget.hpp"
#include "SliderWidget.hpp"
#include "CollapsableMenu.hpp"
#include "FloatingWidget.hpp"
#include "Animations.hpp"