mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-29 19:53:44 -06:00 
			
		
		
		
	FIX: handle mouseCaptureLost in common ctrls
Change-Id: Ifde2406911a628fa61acf41c0e7a5120612d73bf
This commit is contained in:
		
							parent
							
								
									e2d10baea0
								
							
						
					
					
						commit
						3d7d2badf7
					
				
					 6 changed files with 42 additions and 3 deletions
				
			
		|  | @ -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) { | ||||
|  |  | |||
|  | @ -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(); | ||||
|  |  | |||
|  | @ -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(); | ||||
|  |  | |||
|  | @ -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); | ||||
| 
 | ||||
|  |  | |||
|  | @ -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) | ||||
|  |  | |||
|  | @ -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; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 chunmao.guo
						chunmao.guo