From 3d7d2badf700c0625423c9a9a0c0604d5b6044b9 Mon Sep 17 00:00:00 2001 From: "chunmao.guo" Date: Sat, 8 Oct 2022 11:39:23 +0800 Subject: [PATCH] FIX: handle mouseCaptureLost in common ctrls Change-Id: Ifde2406911a628fa61acf41c0e7a5120612d73bf --- src/slic3r/GUI/Widgets/Button.cpp | 10 +++++++++- src/slic3r/GUI/Widgets/Button.hpp | 1 + src/slic3r/GUI/Widgets/DropDown.cpp | 10 ++++++++++ src/slic3r/GUI/Widgets/DropDown.hpp | 1 + src/slic3r/GUI/Widgets/StepCtrl.cpp | 22 ++++++++++++++++++++-- src/slic3r/GUI/Widgets/StepCtrl.hpp | 1 + 6 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/Widgets/Button.cpp b/src/slic3r/GUI/Widgets/Button.cpp index be988020d7..401fb89c9f 100644 --- a/src/slic3r/GUI/Widgets/Button.cpp +++ b/src/slic3r/GUI/Widgets/Button.cpp @@ -7,6 +7,7 @@ BEGIN_EVENT_TABLE(Button, StaticBox) EVT_LEFT_DOWN(Button::mouseDown) EVT_LEFT_UP(Button::mouseReleased) +EVT_MOUSE_CAPTURE_LOST(Button::mouseCaptureLost) EVT_KEY_DOWN(Button::keyDownUp) EVT_KEY_UP(Button::keyDownUp) @@ -242,12 +243,19 @@ void Button::mouseReleased(wxMouseEvent& event) event.Skip(); if (pressedDown) { pressedDown = false; - ReleaseMouse(); + if (HasCapture()) + ReleaseMouse(); if (wxRect({0, 0}, GetSize()).Contains(event.GetPosition())) sendButtonEvent(); } } +void Button::mouseCaptureLost(wxMouseCaptureLostEvent &event) +{ + wxMouseEvent evt; + mouseReleased(evt); +} + void Button::keyDownUp(wxKeyEvent &event) { if (event.GetKeyCode() == WXK_SPACE || event.GetKeyCode() == WXK_RETURN) { diff --git a/src/slic3r/GUI/Widgets/Button.hpp b/src/slic3r/GUI/Widgets/Button.hpp index 5ab6e4cd9a..43aac6b9fb 100644 --- a/src/slic3r/GUI/Widgets/Button.hpp +++ b/src/slic3r/GUI/Widgets/Button.hpp @@ -67,6 +67,7 @@ private: // some useful events void mouseDown(wxMouseEvent& event); void mouseReleased(wxMouseEvent& event); + void mouseCaptureLost(wxMouseCaptureLostEvent &event); void keyDownUp(wxKeyEvent &event); void sendButtonEvent(); diff --git a/src/slic3r/GUI/Widgets/DropDown.cpp b/src/slic3r/GUI/Widgets/DropDown.cpp index a7ed6be9fb..c0074b531d 100644 --- a/src/slic3r/GUI/Widgets/DropDown.cpp +++ b/src/slic3r/GUI/Widgets/DropDown.cpp @@ -9,6 +9,7 @@ BEGIN_EVENT_TABLE(DropDown, wxPopupTransientWindow) EVT_LEFT_DOWN(DropDown::mouseDown) EVT_LEFT_UP(DropDown::mouseReleased) +EVT_MOUSE_CAPTURE_LOST(DropDown::mouseCaptureLost) EVT_MOTION(DropDown::mouseMove) EVT_MOUSEWHEEL(DropDown::mouseWheelMoved) @@ -377,6 +378,7 @@ void DropDown::mouseDown(wxMouseEvent& event) // force calc hover item again mouseMove(event); pressedDown = true; + CaptureMouse(); dragStart = event.GetPosition(); } @@ -385,6 +387,8 @@ void DropDown::mouseReleased(wxMouseEvent& event) if (pressedDown) { dragStart = wxPoint(); pressedDown = false; + if (HasCapture()) + ReleaseMouse(); if (hover_item >= 0) { // not moved sendDropDownEvent(); DismissAndNotify(); @@ -392,6 +396,12 @@ void DropDown::mouseReleased(wxMouseEvent& event) } } +void DropDown::mouseCaptureLost(wxMouseCaptureLostEvent &event) +{ + wxMouseEvent evt; + mouseReleased(evt); +} + void DropDown::mouseMove(wxMouseEvent &event) { wxPoint pt = event.GetPosition(); diff --git a/src/slic3r/GUI/Widgets/DropDown.hpp b/src/slic3r/GUI/Widgets/DropDown.hpp index 60a404b5de..b2b7eaa73e 100644 --- a/src/slic3r/GUI/Widgets/DropDown.hpp +++ b/src/slic3r/GUI/Widgets/DropDown.hpp @@ -98,6 +98,7 @@ private: // some useful events void mouseDown(wxMouseEvent& event); void mouseReleased(wxMouseEvent &event); + void mouseCaptureLost(wxMouseCaptureLostEvent &event); void mouseMove(wxMouseEvent &event); void mouseWheelMoved(wxMouseEvent &event); diff --git a/src/slic3r/GUI/Widgets/StepCtrl.cpp b/src/slic3r/GUI/Widgets/StepCtrl.cpp index e64c9fb0fe..fa47545815 100644 --- a/src/slic3r/GUI/Widgets/StepCtrl.cpp +++ b/src/slic3r/GUI/Widgets/StepCtrl.cpp @@ -8,6 +8,7 @@ BEGIN_EVENT_TABLE(StepCtrl, StepCtrlBase) EVT_LEFT_DOWN(StepCtrl::mouseDown) EVT_MOTION(StepCtrl::mouseMove) EVT_LEFT_UP(StepCtrl::mouseUp) +EVT_MOUSE_CAPTURE_LOST(StepCtrl::mouseCaptureLost) END_EVENT_TABLE() StepCtrlBase::StepCtrlBase(wxWindow * parent, @@ -133,6 +134,7 @@ void StepCtrl::mouseDown(wxMouseEvent &event) if (rcThumb.Contains(pt)) { pos_thumb = wxPoint{circleX, size.y / 2}; drag_offset = pos_thumb - pt; + CaptureMouse(); } else if (rcBar.Contains(pt)) { if (pt.x < circleX) { if (step > 0) SelectItem(step - 1); @@ -151,6 +153,10 @@ void StepCtrl::mouseMove(wxMouseEvent &event) wxSize size = GetSize(); int itemWidth = size.x / steps.size(); int index = pos_thumb.x / itemWidth; + if (index < 0) + index = 0; + else if (index >= steps.size()) + index = steps.size() - 1; if (index != pos_thumb.y) { pos_thumb.y = index; Refresh(); @@ -163,8 +169,20 @@ void StepCtrl::mouseUp(wxMouseEvent &event) wxSize size = GetSize(); int itemWidth = size.x / steps.size(); int index = pos_thumb.x / itemWidth; - pos_thumb = {0, 0}; - SelectItem(index < steps.size() ? index : steps.size() - 1); + if (index < 0) + index = 0; + else if (index >= steps.size()) + index = steps.size() - 1; + pos_thumb = {0, 0}; + SelectItem(index); + if (HasCapture()) + ReleaseMouse(); +} + +void StepCtrl::mouseCaptureLost(wxMouseCaptureLostEvent &event) +{ + wxMouseEvent evt; + mouseUp(evt); } void StepCtrl::doRender(wxDC &dc) diff --git a/src/slic3r/GUI/Widgets/StepCtrl.hpp b/src/slic3r/GUI/Widgets/StepCtrl.hpp index 4986e39ca2..c7c5ebd475 100644 --- a/src/slic3r/GUI/Widgets/StepCtrl.hpp +++ b/src/slic3r/GUI/Widgets/StepCtrl.hpp @@ -77,6 +77,7 @@ private: void mouseDown(wxMouseEvent &event); void mouseMove(wxMouseEvent &event); void mouseUp(wxMouseEvent &event); + void mouseCaptureLost(wxMouseCaptureLostEvent &event); void doRender(wxDC &dc) override;