new widgets
This commit is contained in:
parent
5cc982fa00
commit
285ca80b4b
18 changed files with 373 additions and 43 deletions
|
|
@ -32,6 +32,10 @@ namespace tp {
|
|||
}
|
||||
}
|
||||
|
||||
void setLabel(const std::string& string) {
|
||||
mLabel.mLabel = string;
|
||||
}
|
||||
|
||||
public:
|
||||
void eventUpdateConfiguration(WidgetManager& wm) override {
|
||||
wm.setActiveId("Button");
|
||||
|
|
|
|||
91
Widgets/public/CollapsableMenu.hpp
Normal file
91
Widgets/public/CollapsableMenu.hpp
Normal 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;
|
||||
};
|
||||
}
|
||||
46
Widgets/public/FloatingWidget.hpp
Normal file
46
Widgets/public/FloatingWidget.hpp
Normal 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;
|
||||
|
||||
};
|
||||
}
|
||||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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()) {
|
||||
|
|
|
|||
|
|
@ -6,4 +6,6 @@
|
|||
#include "SplitViewWidget.hpp"
|
||||
#include "TextInputWidget.hpp"
|
||||
#include "SliderWidget.hpp"
|
||||
#include "CollapsableMenu.hpp"
|
||||
#include "FloatingWidget.hpp"
|
||||
#include "Animations.hpp"
|
||||
Loading…
Add table
Add a link
Reference in a new issue