update widgets

This commit is contained in:
IlyaShurupov 2024-05-06 16:33:35 +03:00 committed by Ilya Shurupov
parent 1767b65c7e
commit 35cb553ecb
24 changed files with 284 additions and 370 deletions

View file

@ -22,14 +22,15 @@ public:
~EditorGUI() override { delete mGui; } ~EditorGUI() override { delete mGui; }
void processFrame(EventHandler* eventHandler) override { void processFrame(EventHandler* eventHandler) override {
auto rec = RectF({ 0, 0 }, mWindow->getSize()); auto rec = RectF({ 0, 0 }, mWindow->getSize());
mGui->updateConfigCache(mWidgetManager); mGui->setArea(rec);
mGui->proc(*eventHandler, rec, rec); mGui->setVisible(true);
mGui->updateConfigWrapper(mWidgetManager);
mGui->procWrapper(*eventHandler);
} }
void drawFrame(Canvas* canvas) override { mGui->draw(*canvas); } void drawFrame(Canvas* canvas) override { mGui->drawWrapper(*canvas); }
private: private:
Scene geometry; Scene geometry;

View file

@ -16,17 +16,9 @@ namespace tp {
~ViewportWidget() { mCanvas->deleteImageHandle(mImage); } ~ViewportWidget() { mCanvas->deleteImageHandle(mImage); }
void proc(const Events& events, const RectF& areaParent, const RectF& aArea) override { void procCallback(const Events& events) override { mGeometry->mCamera.rotate(0.01f, 0.0); }
this->mArea = aArea;
this->mVisible = areaParent.isOverlap(aArea);
if (!this->mVisible) return;
mGeometry->mCamera.rotate(0.01f, 0.0);
}
void draw(Canvas& canvas) override {
if (!this->mVisible) return;
void drawCallback(Canvas& canvas) override {
mRender.render(*mGeometry, this->mArea.size); mRender.render(*mGeometry, this->mArea.size);
canvas.drawImage(this->mArea, &mImage, PI); canvas.drawImage(this->mArea, &mImage, PI);
} }
@ -42,32 +34,22 @@ namespace tp {
class EditorWidget : public Widget<Events, Canvas> { class EditorWidget : public Widget<Events, Canvas> {
public: public:
EditorWidget(Canvas* canvas, Scene* geometry, Vec2F renderResolution) : EditorWidget(Canvas* canvas, Scene* geometry, Vec2F renderResolution) :
mViewport(canvas, geometry, renderResolution) {} mViewport(canvas, geometry, renderResolution) {
void proc(const Events& events, const RectF& areaParent, const RectF& aArea) override { this->mChildWidgets.pushBack(&mViewport);
this->mArea = aArea; this->mChildWidgets.pushBack(&mSplitView);
this->mVisible = areaParent.isOverlap(aArea);
if (!this->mVisible) return;
mSplitView.proc(events, aArea, aArea);
mViewport.proc(events, aArea, mSplitView.getFirst());
} }
void draw(Canvas& canvas) override { void procCallback(const Events& events) override {
if (!this->mVisible) return; mSplitView.setArea(this->mArea);
mViewport.setArea(mSplitView.getFirst());
canvas.rect(this->mArea, mBaseColor);
mSplitView.draw(canvas);
mViewport.draw(canvas);
} }
void updateConfigCache(WidgetManager& wm) override { void drawCallback(Canvas& canvas) override { canvas.rect(this->mArea, mBaseColor); }
void updateConfigCallback(WidgetManager& wm) override {
wm.setActiveId("3DEditor"); wm.setActiveId("3DEditor");
mBaseColor = wm.getColor("Base", "Base"); mBaseColor = wm.getColor("Base", "Base");
mViewport.updateConfigCache(wm);
mSplitView.updateConfigCache(wm);
} }
public: public:

View file

@ -75,9 +75,12 @@ namespace tp {
List(const List& in) { this->operator=(in); } List(const List& in) { this->operator=(in); }
List(const InitialierList<Type>& list) { operator=(list); } List(const InitialierList<Type>& list) { operator=(list); }
[[nodiscard]] inline Node* first() const { return mFirst; } [[nodiscard]] inline Type& first() const { return mFirst->data; }
[[nodiscard]] inline Node* last() const { return mLast; } [[nodiscard]] inline Type& last() const { return mLast->data; }
[[nodiscard]] inline Node* firstNode() const { return mFirst; }
[[nodiscard]] inline Node* lastNode() const { return mLast; }
[[nodiscard]] inline Index length() const { return mLength; } [[nodiscard]] inline Index length() const { return mLength; }
[[nodiscard]] inline Index size() const { return length(); }
[[nodiscard]] Node* newNode() { return new (mAlloc.allocate(sizeof(Node))) Node(); } [[nodiscard]] Node* newNode() { return new (mAlloc.allocate(sizeof(Node))) Node(); }
[[nodiscard]] Node* newNode(TypeArg arg) { return new (mAlloc.allocate(sizeof(Node))) Node(arg); } [[nodiscard]] Node* newNode(TypeArg arg) { return new (mAlloc.allocate(sizeof(Node))) Node(arg); }
@ -250,8 +253,8 @@ namespace tp {
if (in.length() != length()) { if (in.length() != length()) {
return false; return false;
} }
Node* left = in.first(); Node* left = in.firstNode();
Node* right = first(); Node* right = firstNode();
while (left && right) { while (left && right) {
if (left->data != right->data) { if (left->data != right->data) {
return false; return false;

View file

@ -35,10 +35,10 @@ bool transitionsReduce[4][4] = {
void EventHandler::processEvent() { void EventHandler::processEvent() {
mMutex.lock(); mMutex.lock();
auto lastEvent = mEventQueue.last(); auto lastEvent = &mEventQueue.last();
const auto& eventData = lastEvent->data.second; const auto& eventData = lastEvent->second;
const auto& inputId = lastEvent->data.first; const auto& inputId = lastEvent->first;
switch (eventData.type) { switch (eventData.type) {
case InputEvent::Type::MOUSE_POS: case InputEvent::Type::MOUSE_POS:

View file

@ -17,11 +17,13 @@ public:
void processFrame(EventHandler* eventHandler) override { void processFrame(EventHandler* eventHandler) override {
auto rec = RectF{ { 0, 0 }, mWindow->getSize() }; auto rec = RectF{ { 0, 0 }, mWindow->getSize() };
gui.updateConfigCache(mWidgetManager); gui.setVisible(true);
gui.proc(*eventHandler, rec, rec); gui.setArea(rec);
gui.updateConfigWrapper(mWidgetManager);
gui.procWrapper(*eventHandler);
} }
void drawFrame(Canvas* canvas) override { gui.draw(*canvas); } void drawFrame(Canvas* canvas) override { gui.drawWrapper(*canvas); }
private: private:
Player player; Player player;

View file

@ -18,7 +18,7 @@ namespace tp {
col.mColor.setNoTransition({ 0.15f, 0.15f, 0.15f, 0.f }); col.mColor.setNoTransition({ 0.15f, 0.15f, 0.15f, 0.f });
}; };
void procBody(const Events& events) override { void procCallback(const Events& events) override {
mSelected = false; mSelected = false;
if (!mTrack) return; if (!mTrack) return;
if (this->mArea.isInside(events.getPointer())) { if (this->mArea.isInside(events.getPointer())) {
@ -29,7 +29,7 @@ namespace tp {
} }
} }
void drawBody(Canvas& canvas) override { void drawCallback(Canvas& canvas) override {
if (!mTrack) return; if (!mTrack) return;
canvas.rect(this->mArea, col.get(), 4.f); canvas.rect(this->mArea, col.get(), 4.f);
@ -76,7 +76,7 @@ namespace tp {
items.append({ "Date Last Played" }); items.append({ "Date Last Played" });
} }
void drawBody(Canvas&) override { void drawCallback(Canvas&) override {
if (!mTrack) return; if (!mTrack) return;
// canvas.rect(this->mArea, { 0.13f, 0.13f, 0.13f, 1.f }, 4.f); // canvas.rect(this->mArea, { 0.13f, 0.13f, 0.13f, 1.f }, 4.f);
renderUI(); renderUI();
@ -196,6 +196,11 @@ namespace tp {
updateTracks(); updateTracks();
mCurrentTrackInfo.mPlayer = mPlayer; mCurrentTrackInfo.mPlayer = mPlayer;
this->mChildWidgets.pushBack(&mSplitView);
this->mChildWidgets.pushBack(&mSongList);
this->mChildWidgets.pushBack(&mCurrentTrackInfo);
this->mChildWidgets.pushBack(&mCurrentTrack);
} }
void updateTracks() { void updateTracks() {
@ -205,36 +210,30 @@ namespace tp {
} }
} }
void procBody(const Events& events) override { void procCallback(const Events& events) override {
filter(); filter();
mSplitView.proc(events, this->mArea, this->mArea); mSplitView.setArea(this->mArea);
mSongList.proc(events, this->mArea, mSplitView.getFirst()); mSongList.setArea(mSplitView.getFirst());
for (auto track : mSongList.mContents) { for (auto track : mSongList.getContent()) {
auto trackWidget = (TrackWidget<Events, Canvas>*) track.data(); auto trackWidget = (TrackWidget<Events, Canvas>*) track.data();
if (trackWidget->mSelected) { if (trackWidget->mSelected) {
mCurrentTrackInfo.mTrack = trackWidget->mTrack; mCurrentTrackInfo.mTrack = trackWidget->mTrack;
} }
} }
mCurrentTrackInfo.proc(events, this->mArea, mSplitView.getSecond()); mCurrentTrackInfo.setArea(mSplitView.getSecond());
// mCurrentTrack.proc(events, this->mArea, mSplitView.getFirst()); // mCurrentTrack.proc(events, this->mArea, mSplitView.getFirst());
} }
void drawBody(Canvas& canvas) override { void drawCallback(Canvas& canvas) override { canvas.rect(this->mArea, { 0.1f, 0.1f, 0.1f, 1.f }); }
canvas.rect(this->mArea, { 0.1f, 0.1f, 0.1f, 1.f });
mSplitView.draw(canvas);
mSongList.draw(canvas);
mCurrentTrackInfo.draw(canvas);
}
void filter() { void filter() {
if (!mCurrentTrackInfo.isSongFilterChanged) return; if (!mCurrentTrackInfo.isSongFilterChanged) return;
mSongList.mContents.clear(); mSongList.clearContent();
for (auto track : mTracks) { for (auto track : mTracks) {
if (!mCurrentTrackInfo.songFilter.PassFilter(track->mTrack->mName.c_str()) && if (!mCurrentTrackInfo.songFilter.PassFilter(track->mTrack->mName.c_str()) &&
@ -256,20 +255,12 @@ namespace tp {
break; break;
} }
mSongList.mContents.append(&track.data()); mSongList.addWidget(&track.data());
} }
mCurrentTrackInfo.isSongFilterChanged = false; mCurrentTrackInfo.isSongFilterChanged = false;
} }
void updateConfigCache(WidgetManager& wm) override {
wm.setActiveId("LibraryWidget");
mSplitView.updateConfigCache(wm);
mCurrentTrack.updateConfigCache(wm);
mCurrentTrackInfo.updateConfigCache(wm);
mSongList.updateConfigCache(wm);
}
private: private:
Library* mLibrary = nullptr; Library* mLibrary = nullptr;
Player* mPlayer = nullptr; Player* mPlayer = nullptr;

View file

@ -153,10 +153,10 @@ void obj::ObjectsGUI::cd(obj::Object* child, const std::string& name) {
void obj::ObjectsGUI::cdup() { void obj::ObjectsGUI::cdup() {
if (mViewStack.length() > 1) { if (mViewStack.length() > 1) {
obj::objects_api::destroy(mViewStack.last()->data.obj); obj::objects_api::destroy(mViewStack.lastNode()->data.obj);
mViewStack.popBack(); mViewStack.popBack();
mActive = mViewStack.last()->data.obj; mActive = mViewStack.lastNode()->data.obj;
} }
} }
@ -890,15 +890,15 @@ void obj::ObjectsGUI::explorer() {
ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_HorizontalScrollbar ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_HorizontalScrollbar
); );
tp::List<ViewStackNode*> rev_path; tp::List<ViewStackNode*> rev_path;
for (auto childo = mViewStack.last(); childo; childo = childo->prev) { for (auto childo = mViewStack.lastNode(); childo; childo = childo->prev) {
rev_path.pushBack(&childo->data); rev_path.pushBack(&childo->data);
} }
tp::alni idx = 0; tp::alni idx = 0;
for (auto childo = rev_path.last(); childo; childo = childo->prev) { for (auto childo = rev_path.lastNode(); childo; childo = childo->prev) {
ImGui::PushID((int) idx); ImGui::PushID((int) idx);
bool go_back = false; bool go_back = false;
if (childo == rev_path.last()) { if (childo == rev_path.lastNode()) {
go_back = ImGui::Button(childo->data->id.c_str()); go_back = ImGui::Button(childo->data->id.c_str());
ImGui::SameLine(); ImGui::SameLine();
} else { } else {
@ -952,7 +952,7 @@ void obj::ObjectsGUI::explorer() {
} }
if (go_back) { if (go_back) {
while (&mViewStack.last()->data != childo->data) { while (&mViewStack.lastNode()->data != childo->data) {
cdup(); cdup();
} }
mActive = childo->data->obj; mActive = childo->data->obj;

View file

@ -543,9 +543,9 @@ void FunctionDefinition::generateByteCode(ByteCode& out) {
List<Instruction>::Node* FunctionDefinition::inst(Instruction inst) { List<Instruction>::Node* FunctionDefinition::inst(Instruction inst) {
mInstructions.pushBack(inst); mInstructions.pushBack(inst);
auto out = &mInstructions.last()->data; auto out = &mInstructions.lastNode()->data;
out->mInstIdx = (alni) mInstructions.length() - 1; out->mInstIdx = (alni) mInstructions.length() - 1;
return mInstructions.last(); return mInstructions.lastNode();
} }
void obj::initialize() {} void obj::initialize() {}

View file

@ -52,7 +52,7 @@ void ScopeStack::addTemp(obj::Object* tmp) {
} }
void ScopeStack::popTemp() { void ScopeStack::popTemp() {
objects_api::destroy(mBuff[mIdx - 1].mTemps.last()->data); objects_api::destroy(mBuff[mIdx - 1].mTemps.last());
mBuff[mIdx - 1].mTemps.popBack(); mBuff[mIdx - 1].mTemps.popBack();
} }

View file

@ -93,7 +93,7 @@ void ListObject::delNode(tp::List<Object*>::Node* node) {
} }
void ListObject::popBack() { void ListObject::popBack() {
auto obj = items.last(); auto obj = items.lastNode();
if (obj) obj::objects_api::destroy(obj->data); if (obj) obj::objects_api::destroy(obj->data);
items.popBack(); items.popBack();
} }

View file

@ -13,11 +13,14 @@ public:
void processFrame(EventHandler* eventHandler) override { void processFrame(EventHandler* eventHandler) override {
auto rec = RectF({ 0, 0 }, mWindow->getSize()); auto rec = RectF({ 0, 0 }, mWindow->getSize());
mGui.updateConfigCache(mWidgetManager);
mGui.proc(*eventHandler, rec, rec); mGui.setVisible(true);
mGui.setArea(rec);
mGui.updateConfigWrapper(mWidgetManager);
mGui.procWrapper(*eventHandler);
} }
void drawFrame(Canvas* canvas) override { mGui.draw(*canvas); } void drawFrame(Canvas* canvas) override { mGui.drawWrapper(*canvas); }
private: private:
WidgetManager mWidgetManager; WidgetManager mWidgetManager;

View file

@ -66,7 +66,7 @@ void Stroke::compress(halnf factor) {
min_node = nullptr; min_node = nullptr;
halnf min_factor = factor; halnf min_factor = factor;
List<StrokePoint>::Node* iter = passed_poits.first()->next; List<StrokePoint>::Node* iter = passed_poits.firstNode()->next;
for (; iter->next; iter = iter->next) { for (; iter->next; iter = iter->next) {
Vec3F dir1 = (iter->data.pos - iter->prev->data.pos).normalize(); Vec3F dir1 = (iter->data.pos - iter->prev->data.pos).normalize();
Vec3F dir2 = (iter->next->data.pos - iter->data.pos).normalize(); Vec3F dir2 = (iter->next->data.pos - iter->data.pos).normalize();
@ -111,7 +111,7 @@ void Stroke::subdiv(halnf precision, const Camera* cam, halni passes) {
auto n_points = new_points.length(); auto n_points = new_points.length();
auto p0 = new_points.first(); auto p0 = new_points.firstNode();
auto p1 = p0->next; auto p1 = p0->next;
auto p2 = p1->next; auto p2 = p1->next;
auto p3 = p2->next; auto p3 = p2->next;
@ -234,7 +234,7 @@ void PencilBrush::sample(Project* proj, Vec2F crs, halnf pressure) {
mStroke = new Stroke(); mStroke = new Stroke();
mStroke->setColor(mCol); mStroke->setColor(mCol);
mStroke->getPoints().append(proj->mLayers[proj->mActiveLayer]->strokes.last()->data->getPoints().last()); mStroke->getPoints().append(proj->mLayers[proj->mActiveLayer]->strokes.last()->getPoints().last());
} }
if (!pressure) { if (!pressure) {

View file

@ -18,12 +18,7 @@ namespace tp {
~Sketch3DWidget() { mCanvas->deleteImageHandle(mImage); } ~Sketch3DWidget() { mCanvas->deleteImageHandle(mImage); }
void proc(const Events& events, const RectF& areaParent, const RectF& area) override { void procCallback(const Events& events) override {
this->mArea = area;
this->mVisible = area.isOverlap(areaParent);
if (!this->mVisible) return;
if (!this->mArea.isInside(events.getPointer())) { if (!this->mArea.isInside(events.getPointer())) {
return; return;
} }
@ -76,7 +71,7 @@ namespace tp {
mActionPosAbsolutePrev = absolutePos; mActionPosAbsolutePrev = absolutePos;
} }
void drawBody(Canvas& canvas) override { void drawCallback(Canvas& canvas) override {
mRenderer.renderToTexture(&mProject, this->mArea.size); mRenderer.renderToTexture(&mProject, this->mArea.size);
canvas.drawImage(this->mArea, &mImage, 0, 1, 12); canvas.drawImage(this->mArea, &mImage, 0, 1, 12);
} }
@ -106,31 +101,35 @@ namespace tp {
mRotateButton = new ButtonWidget<Events, Canvas>("Rotate view", { 0, 0, 100, 30 }); mRotateButton = new ButtonWidget<Events, Canvas>("Rotate view", { 0, 0, 100, 30 });
mZoomButton = new ButtonWidget<Events, Canvas>("Zoom view", { 0, 0, 100, 30 }); mZoomButton = new ButtonWidget<Events, Canvas>("Zoom view", { 0, 0, 100, 30 });
mOptions.mContents.append(mDrawButton); mOptions.addWidget(mDrawButton);
mOptions.mContents.append(mMoveButton); mOptions.addWidget(mMoveButton);
mOptions.mContents.append(mRotateButton); mOptions.addWidget(mRotateButton);
mOptions.mContents.append(mZoomButton); mOptions.addWidget(mZoomButton);
// add color sliders // add color sliders
mRed = new NamedSliderWidget<Events, Canvas>("Red"); mRed = new NamedSliderWidget<Events, Canvas>("Red");
mGreen = new NamedSliderWidget<Events, Canvas>("Green"); mGreen = new NamedSliderWidget<Events, Canvas>("Green");
mBlue = new NamedSliderWidget<Events, Canvas>("Blue"); mBlue = new NamedSliderWidget<Events, Canvas>("Blue");
mOptions.mContents.append(mRed); mOptions.addWidget(mRed);
mOptions.mContents.append(mGreen); mOptions.addWidget(mGreen);
mOptions.mContents.append(mBlue); mOptions.addWidget(mBlue);
this->mChildWidgets.pushBack(&mViewport);
this->mChildWidgets.pushBack(&mSplitView);
this->mChildWidgets.pushBack(&mOptions);
} }
~Sketch3DGUI() { ~Sketch3DGUI() {
for (auto item : mOptions.mContents) { for (auto item : mOptions.getContent()) {
delete item.data(); delete item.data();
} }
} }
void procBody(const Events& events) override { void procCallback(const Events& events) override {
mSplitView.proc(events, this->mArea, this->mArea); mSplitView.setArea(this->mArea);
mViewport.proc(events, this->mArea, mSplitView.getFirst()); mViewport.setArea(mSplitView.getFirst());
mOptions.proc(events, this->mArea, mSplitView.getSecond()); mOptions.setArea(mSplitView.getSecond());
if (mDrawButton->mIsPressed) { if (mDrawButton->mIsPressed) {
mViewport.mMode = Sketch3DWidget<Events, Canvas>::Mode::DRAW; mViewport.mMode = Sketch3DWidget<Events, Canvas>::Mode::DRAW;
@ -145,23 +144,13 @@ namespace tp {
mViewport.setColor(RGBA(mRed->mSlider.mFactor, mGreen->mSlider.mFactor, mBlue->mSlider.mFactor, 1.f)); mViewport.setColor(RGBA(mRed->mSlider.mFactor, mGreen->mSlider.mFactor, mBlue->mSlider.mFactor, 1.f));
} }
void drawBody(Canvas& canvas) override { void drawCallback(Canvas& canvas) override { canvas.rect(this->mArea, mBackgroundColor, mRounding); }
canvas.rect(this->mArea, mBackgroundColor, mRounding);
mSplitView.draw(canvas); void updateConfigCallback(WidgetManager& wm) override {
mViewport.draw(canvas);
mOptions.draw(canvas);
}
void updateConfigCache(WidgetManager& wm) override {
wm.setActiveId("Sketch3DGui"); wm.setActiveId("Sketch3DGui");
mBackgroundColor = wm.getColor("Background", "Background"); mBackgroundColor = wm.getColor("Background", "Background");
mRounding = wm.getNumber("Rounding", "Rounding"); mRounding = wm.getNumber("Rounding", "Rounding");
mSplitView.updateConfigCache(wm);
mOptions.updateConfigCache(wm);
mViewport.updateConfigCache(wm);
} }
private: private:

View file

@ -12,12 +12,14 @@ public:
void processFrame(EventHandler* eventHandler) override { void processFrame(EventHandler* eventHandler) override {
auto rec = RectF({ 0, 0 }, mWindow->getSize()); auto rec = RectF({ 0, 0 }, mWindow->getSize());
mGui.updateConfigCache(mWidgetManager); mGui.updateConfigWrapper(mWidgetManager);
mGui.setArea(rec);
mGui.setVisible(true);
mGui.proc(*eventHandler, rec, rec); mGui.procWrapper(*eventHandler);
} }
void drawFrame(Canvas* canvas) override { mGui.draw(*canvas); } void drawFrame(Canvas* canvas) override { mGui.drawWrapper(*canvas); }
private: private:
WidgetManager mWidgetManager; WidgetManager mWidgetManager;

View file

@ -9,25 +9,19 @@ namespace tp {
public: public:
UserWidget() = default; UserWidget() = default;
void proc(const Events& events, const RectF& areaParent, const RectF& aArea) override { void procCallback(const Events& events) override {
this->mArea = aArea;
this->mArea.w = 30; this->mArea.w = 30;
this->mVisible = areaParent.isOverlap(aArea); mIsHover = this->mArea.isInside(events.getPointer());
if (!this->mVisible) return;
mIsHover = aArea.isInside(events.getPointer());
} }
void draw(Canvas& canvas) override { void drawCallback(Canvas& canvas) override {
if (!this->mVisible) return;
if (mIsHover) canvas.rect(this->mArea, mAccentColor, mRounding); if (mIsHover) canvas.rect(this->mArea, mAccentColor, mRounding);
else canvas.rect(this->mArea, mBaseColor, mRounding); else canvas.rect(this->mArea, mBaseColor, mRounding);
canvas.text(mUser.c_str(), this->mArea, mFontSize, Canvas::CC, mPadding, mUserColor); canvas.text(mUser.c_str(), this->mArea, mFontSize, Canvas::CC, mPadding, mUserColor);
} }
public: public:
void updateConfigCache(WidgetManager& wm) override { void updateConfigCallback(WidgetManager& wm) override {
wm.setActiveId("UserWidget"); wm.setActiveId("UserWidget");
mBaseColor = wm.getColor("Base", "Base"); mBaseColor = wm.getColor("Base", "Base");
@ -55,16 +49,9 @@ namespace tp {
public: public:
MessageWidget() = default; MessageWidget() = default;
void proc(const Events& events, const RectF& areaParent, const RectF& aArea) override { void procCallback(const Events& events) override { mIsHover = this->mArea.isInside(events.getPointer()); }
this->mArea = aArea;
this->mArea.w = 50;
this->mVisible = areaParent.isOverlap(aArea);
if (!this->mVisible) return;
mIsHover = aArea.isInside(events.getPointer());
}
void draw(Canvas& canvas) override { void drawCallback(Canvas& canvas) override {
if (!this->mVisible) return;
if (mIsHover) canvas.rect(this->mArea, mBaseColor, mRounding); if (mIsHover) canvas.rect(this->mArea, mBaseColor, mRounding);
auto userName = this->mArea; auto userName = this->mArea;
@ -78,7 +65,7 @@ namespace tp {
canvas.text(mUser.c_str(), userName, mFontSizeDim, Canvas::LC, mPadding, mUserColor); canvas.text(mUser.c_str(), userName, mFontSizeDim, Canvas::LC, mPadding, mUserColor);
} }
void updateConfigCache(WidgetManager& wm) override { void updateConfigCallback(WidgetManager& wm) override {
wm.setActiveId("MessageWidget"); wm.setActiveId("MessageWidget");
mBaseColor = wm.getColor("Base", "Base"); mBaseColor = wm.getColor("Base", "Base");
@ -111,16 +98,20 @@ namespace tp {
mPass.mId = "pass"; mPass.mId = "pass";
mUser.mId = "user"; mUser.mId = "user";
mButton.mLabel.mLabel = "Login"; mButton.mLabel.mLabel = "Login";
this->mChildWidgets.pushBack(&mPass);
this->mChildWidgets.pushBack(&mUser);
this->mChildWidgets.pushBack(&mButton);
} }
void proc(const Events& events, const RectF& areaParent, const RectF& aArea) override { void procCallback(const Events& events) override {
this->mArea = aArea;
mLogged = false; mLogged = false;
const auto xval = aArea.z / 2 - 100; const auto xval = this->mArea.z / 2 - 100;
mUser.proc(events, aArea, { xval, 10, 200, 30 });
mPass.proc(events, aArea, { xval, 50, 200, 30 }); mUser.setArea({ xval, 10, 200, 30 });
mButton.proc(events, aArea, { xval, 90, 200, 30 }); mPass.setArea({ xval, 50, 200, 30 });
mButton.setArea({ xval, 90, 200, 30 });
if (mButton.mIsReleased) { if (mButton.mIsReleased) {
mButton.mIsReleased = false; mButton.mIsReleased = false;
@ -128,22 +119,12 @@ namespace tp {
} }
} }
void draw(Canvas& canvas) override { void drawCallback(Canvas& canvas) override { canvas.rect(this->mArea, mBGColor); }
canvas.rect(this->mArea, mBGColor);
mButton.draw(canvas);
mUser.draw(canvas);
mPass.draw(canvas);
}
public: public:
void updateConfigCache(WidgetManager& wm) override { void updateConfigCallback(WidgetManager& wm) override {
wm.setActiveId("LoginWidget"); wm.setActiveId("LoginWidget");
mBGColor = wm.getColor("Back", "Base"); mBGColor = wm.getColor("Back", "Base");
mUser.updateConfigCache(wm);
mPass.updateConfigCache(wm);
mButton.updateConfigCache(wm);
} }
public: public:
@ -161,11 +142,13 @@ namespace tp {
ActiveChatWidget() { ActiveChatWidget() {
mSend.mLabel.mLabel = "Send"; mSend.mLabel.mLabel = "Send";
mMessage.mId = "Message"; mMessage.mId = "Message";
this->mChildWidgets.pushBack(&mHistoryView);
this->mChildWidgets.pushBack(&mMessage);
this->mChildWidgets.pushBack(&mSend);
} }
void proc(const Events& events, const RectF& areaParent, const RectF& aArea) override { void procCallback(const Events& events) override {
this->mArea = aArea;
auto history = this->mArea; auto history = this->mArea;
history.w -= 50; history.w -= 50;
@ -182,36 +165,22 @@ namespace tp {
inputSend.x = inputMessage.x + inputMessage.z + mPadding; inputSend.x = inputMessage.x + inputMessage.z + mPadding;
inputSend.z = 100 - mPadding * 2; inputSend.z = 100 - mPadding * 2;
mSend.proc(events, this->mArea, inputSend); mSend.setArea(inputSend);
mMessage.proc(events, this->mArea, inputMessage); mMessage.setArea(inputMessage);
if (mSend.mIsReleased) { if (mSend.mIsReleased) {
mSend.mIsReleased = false; mSend.mIsReleased = false;
} }
mHistoryView.proc(events, this->mArea, history); mHistoryView.setArea(history);
} }
void draw(Canvas& canvas) override { void drawCallback(Canvas& canvas) override { canvas.rect(this->mArea, mBGColor); }
canvas.rect(this->mArea, mBGColor);
mHistoryView.draw(canvas);
mMessage.draw(canvas);
mSend.draw(canvas);
}
void updateConfigCache(WidgetManager& wm) override { void updateConfigCallback(WidgetManager& wm) override {
wm.setActiveId("ActiveChat"); wm.setActiveId("ActiveChat");
mBGColor = wm.getColor("Back", "Background"); mBGColor = wm.getColor("Back", "Background");
mPadding = wm.getNumber("Padding", "Padding"); mPadding = wm.getNumber("Padding", "Padding");
mHistoryView.updateConfigCache(wm);
mMessage.updateConfigCache(wm);
mSend.updateConfigCache(wm);
for (auto message : mMessages) {
message->updateConfigCache(wm);
}
} }
public: public:
@ -238,49 +207,37 @@ namespace tp {
mUsers[2].mArea = { 0, 0, 100, 100 }; mUsers[2].mArea = { 0, 0, 100, 100 };
for (auto message : mUsers) { for (auto message : mUsers) {
mSideView.mContents.append(&message.data()); mSideView.addWidget(&message.data());
} }
mActive.mMessages.append(MessageWidget<Events, Canvas>()); mActive.mMessages.append(MessageWidget<Events, Canvas>());
mActive.mMessages.append(MessageWidget<Events, Canvas>()); mActive.mMessages.append(MessageWidget<Events, Canvas>());
mActive.mMessages.append(MessageWidget<Events, Canvas>()); mActive.mMessages.append(MessageWidget<Events, Canvas>());
mActive.mMessages[0].mArea = { 0, 0, 100, 100 }; mActive.mMessages[0].mArea = { 0, 0, 100, 50 };
mActive.mMessages[1].mArea = { 0, 0, 100, 100 }; mActive.mMessages[1].mArea = { 0, 0, 100, 50 };
mActive.mMessages[2].mArea = { 0, 0, 100, 100 }; mActive.mMessages[2].mArea = { 0, 0, 100, 50 };
for (auto message : mActive.mMessages) { for (auto message : mActive.mMessages) {
mActive.mHistoryView.mContents.append(&message.data()); mActive.mHistoryView.addWidget(&message.data());
} }
this->mChildWidgets.pushBack(&mSideView);
this->mChildWidgets.pushBack(&mActive);
this->mChildWidgets.pushBack(&mSplitView);
} }
void proc(const Events& events, const RectF& areaParent, const RectF& aArea) override { void procCallback(const Events& events) override {
this->mArea = aArea; mSplitView.setArea(this->mArea);
mSideView.setArea(mSplitView.getSecond());
mSplitView.proc(events, aArea, aArea); mActive.setArea(mSplitView.getFirst());
mSideView.proc(events, this->mArea, mSplitView.getSecond());
mActive.proc(events, aArea, mSplitView.getFirst());
} }
void draw(Canvas& canvas) override { void drawCallback(Canvas& canvas) override { canvas.rect(this->mArea, mBGColor); }
canvas.rect(this->mArea, mBGColor);
mSplitView.draw(canvas);
mSideView.draw(canvas);
mActive.draw(canvas);
}
void updateConfigCache(WidgetManager& wm) override { void updateConfigCallback(WidgetManager& wm) override {
wm.setActiveId("ChattingWidget"); wm.setActiveId("ChattingWidget");
mBGColor = wm.getColor("Back", "Background"); mBGColor = wm.getColor("Back", "Background");
mSideView.updateConfigCache(wm);
mActive.updateConfigCache(wm);
mSplitView.updateConfigCache(wm);
for (auto user : mUsers) {
user->updateConfigCache(wm);
}
} }
public: public:
@ -295,34 +252,26 @@ namespace tp {
template <typename Events, typename Canvas> template <typename Events, typename Canvas>
class ComplexWidget : public Widget<Events, Canvas> { class ComplexWidget : public Widget<Events, Canvas> {
public: public:
ComplexWidget() = default; ComplexWidget() {
this->mChildWidgets.pushBack(&mLogin);
void proc(const Events& events, const RectF& areaParent, const RectF& aArea) override { this->mChildWidgets.pushBack(&mChatting);
this->mArea = aArea;
if (mLogged) {
mChatting.proc(events, aArea, aArea);
} else {
mLogin.proc(events, aArea, aArea);
mLogged = mLogin.mLogged;
if (mLogged) {
mChatting.proc(events, aArea, aArea);
}
}
} }
void draw(Canvas& canvas) override { void procCallback(const Events& events) override {
canvas.rect(this->mArea, mBGColor); mLogged = mLogin.mLogged;
if (mLogged) mChatting.draw(canvas);
else mLogin.draw(canvas); mLogin.setEnable(!mLogged);
mChatting.setEnable(mLogged);
mLogin.setArea(this->mArea);
mChatting.setArea(this->mArea);
} }
void updateConfigCache(WidgetManager& wm) override { void drawCallback(Canvas& canvas) override { canvas.rect(this->mArea, mBGColor); }
void updateConfigCallback(WidgetManager& wm) override {
wm.setActiveId("ChatGui"); wm.setActiveId("ChatGui");
mBGColor = wm.getColor("Back", "Background"); mBGColor = wm.getColor("Back", "Background");
mLogin.updateConfigCache(wm);
mChatting.updateConfigCache(wm);
} }
private: private:

View file

@ -8,24 +8,24 @@ using namespace tp;
class SimpleGUI : public Application { class SimpleGUI : public Application {
public: public:
SimpleGUI() { SimpleGUI() {
mGui.mContents.append(&mButton); mGui.addWidget(&mButton);
mGui.mContents.append(&mSlider); mGui.addWidget(&mLabel);
mGui.mContents.append(&mLabel); mGui.addWidget(&mSlider);
} }
void processFrame(EventHandler* eventHandler) override { void processFrame(EventHandler* eventHandler) override {
mGui.updateConfigCache(mWidgetManager);
mSlider.updateConfigCache(mWidgetManager);
mLabel.updateConfigCache(mWidgetManager);
mButton.updateConfigCache(mWidgetManager);
const auto rec = RectF({ 0, 0 }, mWindow->getSize()); const auto rec = RectF({ 0, 0 }, mWindow->getSize());
mGui.proc(*eventHandler, rec, rec);
mGui.setArea(rec);
mGui.setVisible(true);
mGui.updateConfigWrapper(mWidgetManager);
mGui.procWrapper(*eventHandler);
} }
void drawFrame(Canvas* canvas) override { mGui.draw(*canvas); } void drawFrame(Canvas* canvas) override {
canvas->rect(mGui.mArea, { 0, 0, 0, 1 });
mGui.drawWrapper(*canvas);
}
private: private:
WidgetManager mWidgetManager; WidgetManager mWidgetManager;
@ -33,7 +33,7 @@ private:
ButtonWidget<EventHandler, Canvas> mButton; ButtonWidget<EventHandler, Canvas> mButton;
LabelWidget<EventHandler, Canvas> mLabel; LabelWidget<EventHandler, Canvas> mLabel;
SliderWidget<EventHandler, Canvas> mSlider; NamedSliderWidget<EventHandler, Canvas> mSlider;
}; };
int main() { int main() {

View file

@ -1,6 +0,0 @@
#include "WidgetBase.hpp"
#include "Graphics.hpp"
namespace tp {}

View file

@ -7,14 +7,20 @@ namespace tp {
template <typename Events, typename Canvas> template <typename Events, typename Canvas>
class ButtonWidget : public Widget<Events, Canvas> { class ButtonWidget : public Widget<Events, Canvas> {
public: public:
ButtonWidget() { this->mArea = { 0, 0, 100, 100 }; } ButtonWidget() {
this->setArea({ 0, 0, 100, 100 });
ButtonWidget(const std::string& label, const tp::RectF& aArea) { this->mChildWidgets.pushBack(&mLabel);
this->mArea = aArea;
this->mLabel.mLabel = label;
} }
void procBody(const Events& events) { ButtonWidget(const std::string& label, const tp::RectF& aArea) {
this->setArea(aArea);
mLabel.mLabel = label;
this->mChildWidgets.pushBack(&mLabel);
}
void procCallback(const Events& events) override {
mLabel.setArea(this->mArea);
mIsHover = this->mArea.isInside(events.getPointer()); mIsHover = this->mArea.isInside(events.getPointer());
if (events.isPressed(InputID::MOUSE1) && mIsHover) { if (events.isPressed(InputID::MOUSE1) && mIsHover) {
@ -27,11 +33,9 @@ namespace tp {
} }
if (!mIsHover) mIsPressed = false; if (!mIsHover) mIsPressed = false;
mLabel.proc(events, this->mArea, this->mArea);
} }
void drawBody(Canvas& canvas) override { void drawCallback(Canvas& canvas) override {
if (mIsPressed) { if (mIsPressed) {
canvas.rect(this->mArea, pressedColor, rounding); canvas.rect(this->mArea, pressedColor, rounding);
} else if (mIsHover) { } else if (mIsHover) {
@ -39,11 +43,10 @@ namespace tp {
} else { } else {
canvas.rect(this->mArea, accentColor, rounding); canvas.rect(this->mArea, accentColor, rounding);
} }
mLabel.draw(canvas);
} }
public: public:
void updateConfigCache(WidgetManager& wm) override { void updateConfigCallback(WidgetManager& wm) override {
wm.setActiveId("Button"); wm.setActiveId("Button");
pressedColor = wm.getColor("Pressed", "Action"); pressedColor = wm.getColor("Pressed", "Action");
@ -52,8 +55,6 @@ namespace tp {
rounding = wm.getNumber("Rounding", "Rounding"); rounding = wm.getNumber("Rounding", "Rounding");
// mPressEvent = wm.getEventState("Activate", { { InputID::MOUSE1, InputState::PRESSED } }); // mPressEvent = wm.getEventState("Activate", { { InputID::MOUSE1, InputState::PRESSED } });
mLabel.updateConfigCache(wm);
} }
public: public:
@ -68,6 +69,6 @@ namespace tp {
RGBA accentColor; RGBA accentColor;
halnf rounding = 0; halnf rounding = 0;
InputState mPressEvent; // InputState mPressEvent;
}; };
} }

View file

@ -8,12 +8,12 @@ namespace tp {
public: public:
LabelWidget() = default; LabelWidget() = default;
void drawBody(Canvas& canvas) override { void drawCallback(Canvas& canvas) override {
canvas.text(mLabel.c_str(), this->mArea, fontSize, Canvas::CC, padding, fontColor); canvas.text(mLabel.c_str(), this->mArea, fontSize, Canvas::CC, padding, fontColor);
} }
public: public:
void updateConfigCache(WidgetManager& wm) override { void updateConfigCallback(WidgetManager& wm) override {
wm.setActiveId("Label"); wm.setActiveId("Label");
fontSize = wm.getNumber("Size", "FontSize"); fontSize = wm.getNumber("Size", "FontSize");

View file

@ -11,11 +11,7 @@ namespace tp {
ScrollBarWidget() = default; ScrollBarWidget() = default;
// takes whole area // takes whole area
void proc(const Events& events, const tp::RectF& areaParent, const tp::RectF& aArea) override { void procCallback(const Events& events) override {
this->mArea = aArea;
this->mVisible = areaParent.isOverlap(aArea);
if (!this->mVisible) return;
auto area = getHandle(); auto area = getHandle();
mHovered = getHandleHandle().isInside(events.getPointer()); mHovered = getHandleHandle().isInside(events.getPointer());
@ -24,12 +20,7 @@ namespace tp {
return; return;
} }
if (!areaParent.isOverlap(area)) { if (events.getScrollY() != 0) {
mIsScrolling = false;
return;
}
if (events.getScrollY() != 0 && areaParent.isInside(events.getPointer())) {
auto offset = events.getScrollY() < 0 ? 1.0f : -1.0f; auto offset = events.getScrollY() < 0 ? 1.0f : -1.0f;
if (scrollInertia * offset > 0) { if (scrollInertia * offset > 0) {
scrollInertia += offset; scrollInertia += offset;
@ -61,9 +52,7 @@ namespace tp {
mPositionFraction = tp::clamp(mPositionFraction, 0.f, 1.f - mSizeFraction); mPositionFraction = tp::clamp(mPositionFraction, 0.f, 1.f - mSizeFraction);
} }
void draw(Canvas& canvas) override { void drawCallback(Canvas& canvas) override {
if (!this->mVisible) return;
auto area = getHandle(); auto area = getHandle();
if (mSizeFraction > 1.f) return; if (mSizeFraction > 1.f) return;
@ -78,7 +67,6 @@ namespace tp {
} }
canvas.rect(area, mDefaultColor, mRounding); canvas.rect(area, mDefaultColor, mRounding);
canvas.rect(getHandleHandle(), col, mRounding); canvas.rect(getHandleHandle(), col, mRounding);
} }
@ -104,7 +92,7 @@ namespace tp {
} }
public: public:
void updateConfigCache(WidgetManager& wm) override { void updateConfigCallback(WidgetManager& wm) override {
wm.setActiveId("Scrollbar"); wm.setActiveId("Scrollbar");
mDefaultColor = wm.getColor("Default", "Base"); mDefaultColor = wm.getColor("Default", "Base");
@ -138,99 +126,89 @@ namespace tp {
template <typename Events, typename Canvas> template <typename Events, typename Canvas>
class ScrollableWindow : public Widget<Events, Canvas> { class ScrollableWindow : public Widget<Events, Canvas> {
public: public:
ScrollableWindow() = default; ScrollableWindow() {
this->mChildWidgets.pushBack(&mScroller);
this->mChildWidgets.pushBack(&mContentWidget);
}
~ScrollableWindow() = default; ~ScrollableWindow() = default;
// takes whole area // takes whole area
void procBody(const Events& events) override { void procCallback(const Events& events) override {
updateContents(); List<Widget<Events, Canvas>*>& content = mContentWidget.mChildWidgets;
updateContentSize();
updateContents(content);
updateContentSize(content);
const auto padding = mPadding; const auto padding = mPadding;
mScroller.mSizeFraction = this->mArea.w / mContentSize; mScroller.mSizeFraction = mContentWidget.mArea.w / mContentSize;
mScroller.proc(events, this->mArea, this->mArea); mScroller.setArea(this->mArea);
mContentWidget.setArea(mScroller.getViewport());
if (mScroller.mSizeFraction > 1.f) { if (mScroller.mSizeFraction > 1.f) {
setOffset(0); setOffset(content, 0);
} else { } else {
setOffset((-mScroller.mPositionFraction) * mContentSize); setOffset(content, (-mScroller.mPositionFraction) * mContentSize);
} }
for (auto widget : mContents) { for (auto widget : content) {
widget->proc( widget->setArea({ mContentWidget.mArea.x + padding,
events, widget->mArea.y,
this->mArea, mScroller.getViewport().z - padding * 2,
{ this->mArea.x + padding, widget->mArea.y, mScroller.getViewport().z - padding * 2, widget->mArea.w } widget->mArea.w });
);
} }
} }
void drawBody(Canvas& canvas) override { void addWidget(Widget<Events, Canvas>* widget) { mContentWidget.mChildWidgets.pushBack(widget); }
mScroller.draw(canvas); void clearContent() { mContentWidget.mChildWidgets.removeAll(); }
List<Widget<Events, Canvas>*>& getContent() { return mContentWidget.mChildWidgets; }
canvas.pushClamp(this->mArea); void updateConfigCallback(WidgetManager& wm) override {
for (auto widget : mContents) {
widget->draw(canvas);
}
canvas.popClamp();
}
public:
void updateConfigCache(WidgetManager& wm) override {
wm.setActiveId("ScrollableWidget"); wm.setActiveId("ScrollableWidget");
mDefaultColor = wm.getColor("Default", "Base");
mPadding = wm.getNumber("Padding", "Padding"); mPadding = wm.getNumber("Padding", "Padding");
mScroller.updateConfigCache(wm);
for (auto item : mContents) {
item->updateConfigCache(wm);
}
} }
private: private:
void updateContents() { void updateContents(List<Widget<Events, Canvas>*>& contentWidgets) {
if (mContents.size()) { if (contentWidgets.size()) {
const halnf offset = mContents.first()->mArea.y + mPadding; const halnf offset = contentWidgets.first()->mArea.y + mPadding;
halnf start = 0; halnf start = 0;
for (auto widget : mContents) { for (auto widget : contentWidgets) {
widget->mArea.y = start; widget->mArea.y = start;
start += widget->mArea.w + mPadding; start += widget->mArea.w + mPadding;
} }
for (auto widget : mContents) { for (auto widget : contentWidgets) {
widget->mArea.y += offset; widget->mArea.y += offset;
} }
} }
} }
void updateContentSize() { void updateContentSize(List<Widget<Events, Canvas>*>& contentWidgets) {
mContentSize = 0; mContentSize = 0;
if (mContents.size()) { if (contentWidgets.size()) {
mContentSize = mContents.last()->mArea.y - mContents.first()->mArea.y; mContentSize = contentWidgets.last()->mArea.y - contentWidgets.first()->mArea.y;
mContentSize += mContents.last()->mArea.w; mContentSize += contentWidgets.last()->mArea.w;
mContentSize += 2 * mPadding; mContentSize += 2 * mPadding;
} }
} }
void setOffset(const halnf offset) { void setOffset(List<Widget<Events, Canvas>*>& contentWidgets, const halnf offset) {
if (!mContents.size()) return; if (!contentWidgets.size()) return;
auto newOffset = offset - mContents.first()->mArea.y + mPadding; auto newOffset = offset - contentWidgets.first()->mArea.y + mPadding;
for (auto widget : mContents) { for (auto widget : contentWidgets) {
widget->mArea.y += newOffset; widget->mArea.y += newOffset;
} }
} }
public: private:
halnf mContentSize = 0; Widget<Events, Canvas> mContentWidget;
Buffer<Widget<Events, Canvas>*> mContents;
ScrollBarWidget<Events, Canvas> mScroller; ScrollBarWidget<Events, Canvas> mScroller;
RGBA mDefaultColor; halnf mContentSize = 0;
halnf mPadding = 0; halnf mPadding = 0;
}; };
} }

View file

@ -9,7 +9,7 @@ namespace tp {
public: public:
SliderWidget() = default; SliderWidget() = default;
void procBody(const Events& events) override { void procCallback(const Events& events) override {
if (events.isPressed(InputID::MOUSE1) && this->mArea.isInside(events.getPointer())) { if (events.isPressed(InputID::MOUSE1) && this->mArea.isInside(events.getPointer())) {
mIsSliding = true; mIsSliding = true;
} else if (events.isReleased(InputID::MOUSE1)) { } else if (events.isReleased(InputID::MOUSE1)) {
@ -23,7 +23,7 @@ namespace tp {
mFactor = tp::clamp(mFactor, 0.f, 1.f); mFactor = tp::clamp(mFactor, 0.f, 1.f);
} }
void drawBody(Canvas& canvas) override { void drawCallback(Canvas& canvas) override {
canvas.rect(this->mArea, defaultColor, rounding); canvas.rect(this->mArea, defaultColor, rounding);
canvas.rect(getHandle(), handleColor, rounding); canvas.rect(getHandle(), handleColor, rounding);
} }
@ -34,7 +34,7 @@ namespace tp {
} }
public: public:
void updateConfigCache(WidgetManager& wm) override { void updateConfigCallback(WidgetManager& wm) override {
wm.setActiveId("Slider"); wm.setActiveId("Slider");
defaultColor = wm.getColor("Default", "Base"); defaultColor = wm.getColor("Default", "Base");
handleColor = wm.getColor("Handle", "Accent"); handleColor = wm.getColor("Handle", "Accent");
@ -58,32 +58,24 @@ namespace tp {
explicit NamedSliderWidget(const char* name = "Value") { explicit NamedSliderWidget(const char* name = "Value") {
mLabel.mLabel = name; mLabel.mLabel = name;
this->mArea = { 0, 0, 100, 30 }; this->mArea = { 0, 0, 100, 30 };
this->mChildWidgets.pushBack(&mSlider);
this->mChildWidgets.pushBack(&mLabel);
} }
void procBody(const Events& events) override { void procCallback(const Events& events) override {
const auto widthFirst = this->mArea.z * mFactor; const auto widthFirst = this->mArea.z * mFactor;
const auto widthSecond = this->mArea.z * (1.f - mFactor); const auto widthSecond = this->mArea.z * (1.f - mFactor);
RectF rec = this->mArea; RectF rec = this->mArea;
rec.size.x = widthFirst; rec.size.x = widthFirst;
mLabel.proc(events, this->mArea, rec); mLabel.setArea(rec);
rec.pos.x += widthFirst; rec.pos.x += widthFirst;
rec.size.x = widthSecond; rec.size.x = widthSecond;
mSlider.proc(events, this->mArea, rec); mSlider.setArea(rec);
}
void drawBody(Canvas& canvas) override {
mSlider.draw(canvas);
mLabel.draw(canvas);
}
virtual void updateConfigCache(WidgetManager& wm) {
wm.setActiveId("NamedSlider");
mSlider.updateConfigCache(wm);
mLabel.updateConfigCache(wm);
} }
public: public:

View file

@ -8,7 +8,8 @@ namespace tp {
public: public:
SplitView() = default; SplitView() = default;
void procBody(const Events& events) override { // takes whole area
void procCallback(const Events& events) override {
mIsHover = getHandle().isInside(events.getPointer()); mIsHover = getHandle().isInside(events.getPointer());
if (events.isPressed(InputID::MOUSE1) && mIsHover) { if (events.isPressed(InputID::MOUSE1) && mIsHover) {
@ -30,8 +31,7 @@ namespace tp {
} }
} }
// takes whole area void drawCallback(Canvas& canvas) override {
void drawBody(Canvas& canvas) override {
if (mResizeInProcess) canvas.rect(getHandle(), mResizingColor); if (mResizeInProcess) canvas.rect(getHandle(), mResizingColor);
else if (mIsHover) canvas.rect(getHandle(), mHoveredColor); else if (mIsHover) canvas.rect(getHandle(), mHoveredColor);
else canvas.rect(getHandle(), mHandleColor); else canvas.rect(getHandle(), mHandleColor);
@ -53,7 +53,7 @@ namespace tp {
} }
public: public:
void updateConfigCache(WidgetManager& wm) override { void updateConfigCallback(WidgetManager& wm) override {
wm.setActiveId("SplitView"); wm.setActiveId("SplitView");
mHandleColor = wm.getColor("Handle", "Accent"); mHandleColor = wm.getColor("Handle", "Accent");

View file

@ -11,7 +11,7 @@ namespace tp {
public: public:
TextInputWidget() = default; TextInputWidget() = default;
void drawBody(Canvas& canvas) override { void drawCallback(Canvas&) override {
nChanged = false; nChanged = false;
const auto col = mAccentColor; const auto col = mAccentColor;
@ -51,7 +51,7 @@ namespace tp {
} }
public: public:
void updateConfigCache(WidgetManager& wm) override { void updateConfigCallback(WidgetManager& wm) override {
wm.setActiveId("TextInput"); wm.setActiveId("TextInput");
mAccentColor = wm.getColor("Accent", "Accent"); mAccentColor = wm.getColor("Accent", "Accent");

View file

@ -2,42 +2,69 @@
#include "EventHandler.hpp" #include "EventHandler.hpp"
#include "WidgetManager.hpp" #include "WidgetManager.hpp"
#include "List.hpp"
namespace tp { namespace tp {
template <typename Events, typename Canvas> template <typename Events, typename Canvas>
class Widget { class Widget {
public: public:
Widget() { this->mArea = { 0, 0, 100, 100 }; } Widget() { mArea = { 0, 0, 100, 100 }; }
virtual void proc(const Events& events, const tp::RectF& areaParent, const tp::RectF& aArea) { virtual ~Widget() = default;
mVisible = areaParent.isOverlap(aArea);
if (!mVisible) { virtual void procWrapper(const Events& events) {
return; if (!mEnable) return;
if (!mVisible) return;
procCallback(events);
for (auto child : mChildWidgets) {
const bool isChildVisible = getArea().isOverlap(child->getArea());
child->setVisible(isChildVisible);
child->procWrapper(events);
} }
this->mArea = aArea;
this->mAreaParent = areaParent;
procBody(events);
} }
virtual void draw(Canvas& canvas) { virtual void drawWrapper(Canvas& canvas) {
if (!mVisible) { if (!mEnable) return;
return; if (!mVisible) return;
drawCallback(canvas);
canvas.pushClamp(this->mArea);
for (auto child : mChildWidgets) {
child->drawWrapper(canvas);
} }
drawBody(canvas); canvas.popClamp();
} }
virtual void procBody(const Events& events) {} virtual void updateConfigWrapper(WidgetManager& wm) {
virtual void drawBody(Canvas& canvas) {} wm.setActiveId("Global");
virtual void updateConfigCache(WidgetManager& wm) {} updateConfigCallback(wm);
for (auto child : mChildWidgets) {
child->updateConfigWrapper(wm);
}
}
virtual void procCallback(const Events& events) {}
virtual void drawCallback(Canvas& canvas) {}
virtual void updateConfigCallback(WidgetManager& wm) {}
public:
void setEnable(bool enable) { mEnable = enable; }
void setVisible(bool visible) { mVisible = visible; }
const RectF& getArea() const { return mArea; }
void setArea(const RectF& area) { mArea = area; }
public: public:
RectF mArea; RectF mArea;
RectF mAreaParent; List<Widget<Events, Canvas>*> mChildWidgets;
bool mVisible = false; bool mVisible = false;
bool mEnable = true;
}; };
} }