diff --git a/Sketch3D/CMakeLists.txt b/Sketch3D/CMakeLists.txt index 248c80d..34a642c 100644 --- a/Sketch3D/CMakeLists.txt +++ b/Sketch3D/CMakeLists.txt @@ -19,4 +19,4 @@ add_executable(Sketch3DApp ./applications/Entry.cpp) target_link_libraries(Sketch3DApp ${PROJECT_NAME}) file(COPY "rsc" DESTINATION "${CMAKE_BINARY_DIR}/${PROJECT_NAME}/") -file(COPY "applications/Font.ttf" DESTINATION "${CMAKE_BINARY_DIR}/${PROJECT_NAME}/") +file(COPY "../Graphics/rsc" DESTINATION "${CMAKE_BINARY_DIR}/${PROJECT_NAME}/") diff --git a/Sketch3D/applications/Font.ttf b/Sketch3D/applications/Font.ttf deleted file mode 100644 index 8a63054..0000000 Binary files a/Sketch3D/applications/Font.ttf and /dev/null differ diff --git a/Widgets/private/RootWidget.cpp b/Widgets/private/RootWidget.cpp index f1322a7..065794c 100644 --- a/Widgets/private/RootWidget.cpp +++ b/Widgets/private/RootWidget.cpp @@ -150,9 +150,11 @@ void RootWidget::openPopup(Widget* widget) { } void RootWidget::closePopup(Widget* widget) { - mPopups.removeChild(widget); - mUpdateManager.freeFocus(widget); + if (mUpdateManager.canRemoveWidget(widget)) { + mPopups.removeChild(widget); + mUpdateManager.removeWidget(widget); + } } void RootWidget::lockFocus(Widget* widget) { mUpdateManager.lockFocus(widget); } -void RootWidget::freeFocus(Widget* widget) { mUpdateManager.freeFocus(widget); } +void RootWidget::freeFocus(Widget* widget) { mUpdateManager.freeFocus(widget); } \ No newline at end of file diff --git a/Widgets/private/managers/DebugManager.cpp b/Widgets/private/managers/DebugManager.cpp index bd0de0a..04a5738 100644 --- a/Widgets/private/managers/DebugManager.cpp +++ b/Widgets/private/managers/DebugManager.cpp @@ -113,8 +113,8 @@ void DebugManager::recursiveDraw(Canvas& canvas, Widget* active, const Vec2F& po canvas.text((active->mDebug.id + ":" + std::to_string(depthOrder)).c_str(), area, 22, Canvas::Align::LC, 2, color); } - if (active == mRootWidget->mUpdateManager.mFocusLockWidget) { - canvas.frame(area, { 0, 1, 0, 1 }); + if (mRootWidget->mUpdateManager.mFocusLockStack.find(active)) { + canvas.frame(area, { 0, 1, 0, 0.5f }); } if (active->mFlags.get(Widget::IN_FOCUS)) { diff --git a/Widgets/private/managers/UpdateManager.cpp b/Widgets/private/managers/UpdateManager.cpp index b269a99..5d15414 100644 --- a/Widgets/private/managers/UpdateManager.cpp +++ b/Widgets/private/managers/UpdateManager.cpp @@ -75,16 +75,16 @@ Widget* UpdateManager::findFocusWidget(Widget* root, EventHandler& events) { mInFocusWidget = nullptr; findMouseFocusWidget(root, &mInFocusWidget, events.getPointer()); - if (mFocusLockWidget) { + if (mFocusLockStack.size()) { bool hasLockedWidget = false; for (auto iter = mInFocusWidget; iter; iter = iter->mParent) { - if (iter == mFocusLockWidget) { + if (iter == mFocusLockStack.last()) { hasLockedWidget = true; break; } } if (!hasLockedWidget) { - mInFocusWidget = mFocusLockWidget; + mInFocusWidget = mFocusLockStack.last(); } } @@ -212,10 +212,24 @@ void UpdateManager::procWidget(Widget* widget, EventHandler& events, bool withEv } void UpdateManager::lockFocus(tp::Widget* widget) { - mFocusLockWidget = widget; + DEBUG_ASSERT(mFocusLockStack.find(widget) == nullptr) + // TODO : check that widget is a child of top of the stack + mFocusLockStack.pushBack(widget); } void UpdateManager::freeFocus(tp::Widget* widget) { - DEBUG_ASSERT(mFocusLockWidget == widget) - mFocusLockWidget = nullptr; -} \ No newline at end of file + DEBUG_ASSERT(mFocusLockStack.last() == widget) + mFocusLockStack.popBack(); +} + +bool UpdateManager::canRemoveWidget(Widget* widget) const { + if (auto node = mFocusLockStack.find(widget)) { + if (node->next) return false; + } + + return true; +} + +void UpdateManager::removeWidget(Widget* widget) { + freeFocus(widget); +} diff --git a/Widgets/private/widgets/DockWidget.cpp b/Widgets/private/widgets/DockWidget.cpp index b75a35c..799bba7 100644 --- a/Widgets/private/widgets/DockWidget.cpp +++ b/Widgets/private/widgets/DockWidget.cpp @@ -86,7 +86,7 @@ void DockWidget::process(const EventHandler& events) { } } else if (events.isReleased(InputID::MOUSE1)) { layout()->endResize(); - freeFocus(); + if (layout()->isResizing()) freeFocus(); } if (layout()->isResizing()) { diff --git a/Widgets/public/mangers/UpdateManager.hpp b/Widgets/public/mangers/UpdateManager.hpp index f97ba62..2a8f661 100644 --- a/Widgets/public/mangers/UpdateManager.hpp +++ b/Widgets/public/mangers/UpdateManager.hpp @@ -35,13 +35,16 @@ namespace tp { Widget* getFocusWidget() { return mInFocusWidget; } + bool canRemoveWidget(Widget* widget) const; + void removeWidget(Widget* widget); + private: static void procWidget(Widget* widget, EventHandler& events, bool withEvents = false); private: std::map mTriggeredWidgets; Widget* mInFocusWidget = nullptr; - Widget* mFocusLockWidget = nullptr; + List mFocusLockStack; private: int mDebugWidgetsToProcess = 0;