From f68f91f7d582ed11ca5bf753799dde3f73186890 Mon Sep 17 00:00:00 2001 From: IlyaShurupov Date: Sun, 20 Oct 2024 12:01:42 +0300 Subject: [PATCH] fix focus locking --- Widgets/examples/Example.cpp | 17 +++++++++++++---- Widgets/private/managers/UpdateManager.cpp | 17 +++++++++++++---- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/Widgets/examples/Example.cpp b/Widgets/examples/Example.cpp index 288d1b1..398298f 100644 --- a/Widgets/examples/Example.cpp +++ b/Widgets/examples/Example.cpp @@ -13,7 +13,7 @@ using namespace tp; class Example : public WidgetApplication { public: Example() { - exampleScrolling(); + examplePopup(); } void exampleAll() { @@ -71,19 +71,28 @@ public: void examplePopup() { static Widget root; + static Widget popup; + static ButtonWidget closeButton; static ButtonWidget openButton; + static ButtonWidget buttons[3]; + + for (auto& button : buttons) { + popup.addChild(&button); + } + + popup.addChild(&closeButton); root.addChild(&openButton); ((BasicLayout*)root.getLayout())->setLayoutPolicy(LayoutPolicy::Passive); openButton.setAction([&](){ - closeButton.setArea({ 50, 50, 100, 100 }); - openButton.openPopup(&closeButton); + popup.setArea({ 50, 50, 300, 300 }); + openButton.openPopup(&popup); }); closeButton.setAction([&](){ - closeButton.closePopup(&closeButton); + closeButton.closePopup(&popup); }); openButton.setText("open"); diff --git a/Widgets/private/managers/UpdateManager.cpp b/Widgets/private/managers/UpdateManager.cpp index 4dcf24c..57e8475 100644 --- a/Widgets/private/managers/UpdateManager.cpp +++ b/Widgets/private/managers/UpdateManager.cpp @@ -76,10 +76,19 @@ void UpdateManager::handleFocusChanges(Widget* root, EventHandler& events) { mInFocusWidget = nullptr; - if (!mFocusLockWidget) { - findFocusWidget(root, &mInFocusWidget, events.getPointer()); - } else { - mInFocusWidget = mFocusLockWidget; + findFocusWidget(root, &mInFocusWidget, events.getPointer()); + + if (mFocusLockWidget) { + bool hasLockedWidget = false; + for (auto iter = mInFocusWidget; iter; iter = iter->mParent) { + if (iter == mFocusLockWidget) { + hasLockedWidget = true; + break; + } + } + if (!hasLockedWidget) { + mInFocusWidget = mFocusLockWidget; + } } // if (mInFocusWidget == prevFocus) return;