From e5b926690efec60ff9c4c0a19ce6a5f4a2eb2445 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 26 Jan 2024 16:06:10 +0100 Subject: [PATCH] Revert "Revert "Fix for #11988 : Drop down menus appear outside of PS and cannot be opened again"" This reverts commit 69e0bc3064298fc58dd2a870801161821fa16da5. The reason the original commit was reverted was to get cleaner git history after merging master_27x into master. The change in this commit is implemented in master as b85e80c. --- src/slic3r/GUI/Plater.cpp | 28 ++++++++++++++++++++++++++++ src/slic3r/GUI/Widgets/DropDown.hpp | 2 ++ 2 files changed, 30 insertions(+) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 5da84a6fbb..e3a184639f 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -753,10 +753,38 @@ static wxRichToolTipPopup* get_rtt_popup(wxButton* btn) return nullptr; } +// Help function to find and check if some combobox is dropped down and then dismiss it +static bool found_and_dismiss_shown_dropdown(wxWindow* win) +{ + auto children = win->GetChildren(); + if (children.IsEmpty()) { + if (auto dd = dynamic_cast(win); dd && dd->IsShown()) { + dd->CallDismissAndNotify(); + return true; + } + } + + for (auto child : children) { + if (found_and_dismiss_shown_dropdown(child)) + return true; + } + return false; +} + void Sidebar::priv::show_rich_tip(const wxString& tooltip, wxButton* btn) { if (tooltip.IsEmpty()) return; + + // Currently state (propably wxWidgets issue) : + // When second wxPopupTransientWindow is popped up, then first wxPopupTransientWindow doesn't receive EVT_DISMISS and stay on the top. + // New comboboxes use wxPopupTransientWindow as DropDown now + // That is why DropDown stay on top, when we show rich tooltip for btn. + // (see https://github.com/prusa3d/PrusaSlicer/issues/11988) + + // So, check the combo boxes and close them if necessary before showing the rich tip. + found_and_dismiss_shown_dropdown(scrolled); + wxRichToolTip tip(tooltip, ""); tip.SetIcon(wxICON_NONE); tip.SetTipKind(wxTipKind_BottomRight); diff --git a/src/slic3r/GUI/Widgets/DropDown.hpp b/src/slic3r/GUI/Widgets/DropDown.hpp index 8a4757f5f7..8d17ea658d 100644 --- a/src/slic3r/GUI/Widgets/DropDown.hpp +++ b/src/slic3r/GUI/Widgets/DropDown.hpp @@ -86,6 +86,8 @@ public: bool HasDismissLongTime(); static void SetTransparentBG(wxDC& dc, wxWindow* win); + + void CallDismissAndNotify() { DismissAndNotify(); } protected: void OnDismiss() override;