"Cleaner" pan fix and add internal setter on state

This commit is contained in:
Marek Roszko 2022-09-07 07:18:35 -04:00
parent 6b3d36b6c3
commit 89310bc403
2 changed files with 25 additions and 20 deletions

View File

@ -3,7 +3,7 @@
* *
* Copyright (C) 2012 Torsten Hueter, torstenhtr <at> gmx.de * Copyright (C) 2012 Torsten Hueter, torstenhtr <at> gmx.de
* Copyright (C) 2013-2015 CERN * Copyright (C) 2013-2015 CERN
* Copyright (C) 2012-2021 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 2012-2022 KiCad Developers, see AUTHORS.txt for contributors.
* *
* @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch> * @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
* @author Maciej Suminski <maciej.suminski@cern.ch> * @author Maciej Suminski <maciej.suminski@cern.ch>
@ -43,8 +43,6 @@
#include <wx/log.h> #include <wx/log.h>
#ifdef __WXMSW__ #ifdef __WXMSW__
#include <Windows.h>
#define USE_MOUSE_CAPTURE #define USE_MOUSE_CAPTURE
#endif #endif
@ -396,6 +394,11 @@ void WX_VIEW_CONTROLS::onMagnify( wxMouseEvent& aEvent )
#endif #endif
void WX_VIEW_CONTROLS::setState( STATE aNewState )
{
m_state = aNewState;
}
void WX_VIEW_CONTROLS::onButton( wxMouseEvent& aEvent ) void WX_VIEW_CONTROLS::onButton( wxMouseEvent& aEvent )
{ {
switch( m_state ) switch( m_state )
@ -406,7 +409,7 @@ void WX_VIEW_CONTROLS::onButton( wxMouseEvent& aEvent )
( aEvent.RightDown() && m_settings.m_dragRight == MOUSE_DRAG_ACTION::PAN ) ) ( aEvent.RightDown() && m_settings.m_dragRight == MOUSE_DRAG_ACTION::PAN ) )
{ {
m_dragStartPoint = VECTOR2D( aEvent.GetX(), aEvent.GetY() ); m_dragStartPoint = VECTOR2D( aEvent.GetX(), aEvent.GetY() );
m_state = DRAG_PANNING; setState( DRAG_PANNING );
#if defined USE_MOUSE_CAPTURE #if defined USE_MOUSE_CAPTURE
if( !m_parentPanel->HasCapture() ) if( !m_parentPanel->HasCapture() )
@ -418,7 +421,7 @@ void WX_VIEW_CONTROLS::onButton( wxMouseEvent& aEvent )
{ {
m_dragStartPoint = VECTOR2D( aEvent.GetX(), aEvent.GetY() ); m_dragStartPoint = VECTOR2D( aEvent.GetX(), aEvent.GetY() );
m_zoomStartPoint = m_dragStartPoint; m_zoomStartPoint = m_dragStartPoint;
m_state = DRAG_ZOOMING; setState( DRAG_ZOOMING );
#if defined USE_MOUSE_CAPTURE #if defined USE_MOUSE_CAPTURE
if( !m_parentPanel->HasCapture() ) if( !m_parentPanel->HasCapture() )
@ -427,7 +430,7 @@ void WX_VIEW_CONTROLS::onButton( wxMouseEvent& aEvent )
} }
if( aEvent.LeftUp() ) if( aEvent.LeftUp() )
m_state = IDLE; // Stop autopanning when user release left mouse button setState( IDLE ); // Stop autopanning when user release left mouse button
break; break;
@ -435,7 +438,7 @@ void WX_VIEW_CONTROLS::onButton( wxMouseEvent& aEvent )
case DRAG_PANNING: case DRAG_PANNING:
if( aEvent.MiddleUp() || aEvent.LeftUp() || aEvent.RightUp() ) if( aEvent.MiddleUp() || aEvent.LeftUp() || aEvent.RightUp() )
{ {
m_state = IDLE; setState( IDLE );
#if defined USE_MOUSE_CAPTURE #if defined USE_MOUSE_CAPTURE
if( !m_settings.m_cursorCaptured && m_parentPanel->HasCapture() ) if( !m_settings.m_cursorCaptured && m_parentPanel->HasCapture() )
@ -504,28 +507,25 @@ void WX_VIEW_CONTROLS::onTimer( wxTimerEvent& aEvent )
{ {
if( !m_settings.m_autoPanEnabled ) if( !m_settings.m_autoPanEnabled )
{ {
m_state = IDLE; setState( IDLE );
return; return;
} }
#ifdef __WXMSW__ #ifdef __WXMSW__
// Hackfix: Need to find better solution // Hackfix: It's possible for the mouse to leave the canvas
// It's possible for the mouse to leave the canvas without triggering any leave events // without triggering any leave events on windows
POINT cursorPos; // Use a MSW only wx function
GetCursorPos( &cursorPos ); if( !m_parentPanel->IsMouseInWindow() )
HWND hwndUnderCursor = WindowFromPoint( cursorPos );
if( hwndUnderCursor != m_parentPanel->GetHWND() )
{ {
m_panTimer.Stop(); m_panTimer.Stop();
m_state = IDLE; setState( IDLE );
return; return;
} }
#endif #endif
if( !m_parentPanel->HasFocus() && !m_parentPanel->StatusPopupHasFocus() ) if( !m_parentPanel->HasFocus() && !m_parentPanel->StatusPopupHasFocus() )
{ {
m_state = IDLE; setState( IDLE );
return; return;
} }
@ -654,7 +654,7 @@ void WX_VIEW_CONTROLS::CancelDrag()
{ {
if( m_state == DRAG_PANNING || m_state == DRAG_ZOOMING ) if( m_state == DRAG_PANNING || m_state == DRAG_ZOOMING )
{ {
m_state = IDLE; setState( IDLE );
#if defined USE_MOUSE_CAPTURE #if defined USE_MOUSE_CAPTURE
if( !m_settings.m_cursorCaptured && m_parentPanel->HasCapture() ) if( !m_settings.m_cursorCaptured && m_parentPanel->HasCapture() )
m_parentPanel->ReleaseMouse(); m_parentPanel->ReleaseMouse();
@ -869,7 +869,7 @@ bool WX_VIEW_CONTROLS::handleAutoPanning( const wxMouseEvent& aEvent )
if( !borderHit ) if( !borderHit )
{ {
m_panTimer.Stop(); m_panTimer.Stop();
m_state = IDLE; setState( IDLE );
return false; return false;
} }
@ -879,7 +879,7 @@ bool WX_VIEW_CONTROLS::handleAutoPanning( const wxMouseEvent& aEvent )
case IDLE: case IDLE:
if( borderHit ) if( borderHit )
{ {
m_state = AUTO_PANNING; setState( AUTO_PANNING );
m_panTimer.Start( (int) ( 250.0 / 60.0 ) ); m_panTimer.Start( (int) ( 250.0 / 60.0 ) );
return true; return true;

View File

@ -130,6 +130,11 @@ private:
DRAG_ZOOMING, ///< Zooming with mouse button pressed. DRAG_ZOOMING, ///< Zooming with mouse button pressed.
}; };
/**
* Sets the interaction state, simply a internal setter to make it easier to debug changes
*/
void setState( STATE aNewState );
/** /**
* Compute new viewport settings while in autopanning mode. * Compute new viewport settings while in autopanning mode.
* *