FIX: handle mouseCaptureLost in common ctrls

Change-Id: Ifde2406911a628fa61acf41c0e7a5120612d73bf
This commit is contained in:
chunmao.guo 2022-10-08 11:39:23 +08:00 committed by Lane.Wei
parent e2d10baea0
commit 3d7d2badf7
6 changed files with 42 additions and 3 deletions

View File

@ -7,6 +7,7 @@ BEGIN_EVENT_TABLE(Button, StaticBox)
EVT_LEFT_DOWN(Button::mouseDown) EVT_LEFT_DOWN(Button::mouseDown)
EVT_LEFT_UP(Button::mouseReleased) EVT_LEFT_UP(Button::mouseReleased)
EVT_MOUSE_CAPTURE_LOST(Button::mouseCaptureLost)
EVT_KEY_DOWN(Button::keyDownUp) EVT_KEY_DOWN(Button::keyDownUp)
EVT_KEY_UP(Button::keyDownUp) EVT_KEY_UP(Button::keyDownUp)
@ -242,12 +243,19 @@ void Button::mouseReleased(wxMouseEvent& event)
event.Skip(); event.Skip();
if (pressedDown) { if (pressedDown) {
pressedDown = false; pressedDown = false;
ReleaseMouse(); if (HasCapture())
ReleaseMouse();
if (wxRect({0, 0}, GetSize()).Contains(event.GetPosition())) if (wxRect({0, 0}, GetSize()).Contains(event.GetPosition()))
sendButtonEvent(); sendButtonEvent();
} }
} }
void Button::mouseCaptureLost(wxMouseCaptureLostEvent &event)
{
wxMouseEvent evt;
mouseReleased(evt);
}
void Button::keyDownUp(wxKeyEvent &event) void Button::keyDownUp(wxKeyEvent &event)
{ {
if (event.GetKeyCode() == WXK_SPACE || event.GetKeyCode() == WXK_RETURN) { if (event.GetKeyCode() == WXK_SPACE || event.GetKeyCode() == WXK_RETURN) {

View File

@ -67,6 +67,7 @@ private:
// some useful events // some useful events
void mouseDown(wxMouseEvent& event); void mouseDown(wxMouseEvent& event);
void mouseReleased(wxMouseEvent& event); void mouseReleased(wxMouseEvent& event);
void mouseCaptureLost(wxMouseCaptureLostEvent &event);
void keyDownUp(wxKeyEvent &event); void keyDownUp(wxKeyEvent &event);
void sendButtonEvent(); void sendButtonEvent();

View File

@ -9,6 +9,7 @@ BEGIN_EVENT_TABLE(DropDown, wxPopupTransientWindow)
EVT_LEFT_DOWN(DropDown::mouseDown) EVT_LEFT_DOWN(DropDown::mouseDown)
EVT_LEFT_UP(DropDown::mouseReleased) EVT_LEFT_UP(DropDown::mouseReleased)
EVT_MOUSE_CAPTURE_LOST(DropDown::mouseCaptureLost)
EVT_MOTION(DropDown::mouseMove) EVT_MOTION(DropDown::mouseMove)
EVT_MOUSEWHEEL(DropDown::mouseWheelMoved) EVT_MOUSEWHEEL(DropDown::mouseWheelMoved)
@ -377,6 +378,7 @@ void DropDown::mouseDown(wxMouseEvent& event)
// force calc hover item again // force calc hover item again
mouseMove(event); mouseMove(event);
pressedDown = true; pressedDown = true;
CaptureMouse();
dragStart = event.GetPosition(); dragStart = event.GetPosition();
} }
@ -385,6 +387,8 @@ void DropDown::mouseReleased(wxMouseEvent& event)
if (pressedDown) { if (pressedDown) {
dragStart = wxPoint(); dragStart = wxPoint();
pressedDown = false; pressedDown = false;
if (HasCapture())
ReleaseMouse();
if (hover_item >= 0) { // not moved if (hover_item >= 0) { // not moved
sendDropDownEvent(); sendDropDownEvent();
DismissAndNotify(); DismissAndNotify();
@ -392,6 +396,12 @@ void DropDown::mouseReleased(wxMouseEvent& event)
} }
} }
void DropDown::mouseCaptureLost(wxMouseCaptureLostEvent &event)
{
wxMouseEvent evt;
mouseReleased(evt);
}
void DropDown::mouseMove(wxMouseEvent &event) void DropDown::mouseMove(wxMouseEvent &event)
{ {
wxPoint pt = event.GetPosition(); wxPoint pt = event.GetPosition();

View File

@ -98,6 +98,7 @@ private:
// some useful events // some useful events
void mouseDown(wxMouseEvent& event); void mouseDown(wxMouseEvent& event);
void mouseReleased(wxMouseEvent &event); void mouseReleased(wxMouseEvent &event);
void mouseCaptureLost(wxMouseCaptureLostEvent &event);
void mouseMove(wxMouseEvent &event); void mouseMove(wxMouseEvent &event);
void mouseWheelMoved(wxMouseEvent &event); void mouseWheelMoved(wxMouseEvent &event);

View File

@ -8,6 +8,7 @@ BEGIN_EVENT_TABLE(StepCtrl, StepCtrlBase)
EVT_LEFT_DOWN(StepCtrl::mouseDown) EVT_LEFT_DOWN(StepCtrl::mouseDown)
EVT_MOTION(StepCtrl::mouseMove) EVT_MOTION(StepCtrl::mouseMove)
EVT_LEFT_UP(StepCtrl::mouseUp) EVT_LEFT_UP(StepCtrl::mouseUp)
EVT_MOUSE_CAPTURE_LOST(StepCtrl::mouseCaptureLost)
END_EVENT_TABLE() END_EVENT_TABLE()
StepCtrlBase::StepCtrlBase(wxWindow * parent, StepCtrlBase::StepCtrlBase(wxWindow * parent,
@ -133,6 +134,7 @@ void StepCtrl::mouseDown(wxMouseEvent &event)
if (rcThumb.Contains(pt)) { if (rcThumb.Contains(pt)) {
pos_thumb = wxPoint{circleX, size.y / 2}; pos_thumb = wxPoint{circleX, size.y / 2};
drag_offset = pos_thumb - pt; drag_offset = pos_thumb - pt;
CaptureMouse();
} else if (rcBar.Contains(pt)) { } else if (rcBar.Contains(pt)) {
if (pt.x < circleX) { if (pt.x < circleX) {
if (step > 0) SelectItem(step - 1); if (step > 0) SelectItem(step - 1);
@ -151,6 +153,10 @@ void StepCtrl::mouseMove(wxMouseEvent &event)
wxSize size = GetSize(); wxSize size = GetSize();
int itemWidth = size.x / steps.size(); int itemWidth = size.x / steps.size();
int index = pos_thumb.x / itemWidth; 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) { if (index != pos_thumb.y) {
pos_thumb.y = index; pos_thumb.y = index;
Refresh(); Refresh();
@ -163,8 +169,20 @@ void StepCtrl::mouseUp(wxMouseEvent &event)
wxSize size = GetSize(); wxSize size = GetSize();
int itemWidth = size.x / steps.size(); int itemWidth = size.x / steps.size();
int index = pos_thumb.x / itemWidth; int index = pos_thumb.x / itemWidth;
pos_thumb = {0, 0}; if (index < 0)
SelectItem(index < steps.size() ? index : steps.size() - 1); 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) void StepCtrl::doRender(wxDC &dc)

View File

@ -77,6 +77,7 @@ private:
void mouseDown(wxMouseEvent &event); void mouseDown(wxMouseEvent &event);
void mouseMove(wxMouseEvent &event); void mouseMove(wxMouseEvent &event);
void mouseUp(wxMouseEvent &event); void mouseUp(wxMouseEvent &event);
void mouseCaptureLost(wxMouseCaptureLostEvent &event);
void doRender(wxDC &dc) override; void doRender(wxDC &dc) override;