pcbnew: disable autopanning when cursor entered auto-pan margin following a keyboard cursor move command

Fixes: lp:1803523
* https://bugs.launchpad.net/kicad/+bug/1803523
This commit is contained in:
Tomasz Włostowski 2018-12-23 18:57:40 +01:00
parent 10887868dc
commit bebbe6ed22
5 changed files with 42 additions and 8 deletions

View File

@ -116,7 +116,7 @@ int COMMON_TOOLS::CursorControl( const TOOL_EVENT& aEvent )
break; break;
} }
getViewControls()->SetCursorPosition( cursor ); getViewControls()->SetCursorPosition( cursor, true, true );
return 0; return 0;
} }

View File

@ -95,6 +95,8 @@ WX_VIEW_CONTROLS::WX_VIEW_CONTROLS( VIEW* aView, wxScrolledCanvas* aParentPanel
m_panTimer.SetOwner( this ); m_panTimer.SetOwner( this );
this->Connect( wxEVT_TIMER, this->Connect( wxEVT_TIMER,
wxTimerEventHandler( WX_VIEW_CONTROLS::onTimer ), NULL, this ); wxTimerEventHandler( WX_VIEW_CONTROLS::onTimer ), NULL, this );
m_settings.m_lastKeyboardCursorPositionValid = false;
} }
@ -439,9 +441,16 @@ VECTOR2D WX_VIEW_CONTROLS::GetCursorPosition( bool aEnableSnapping ) const
} }
void WX_VIEW_CONTROLS::SetCursorPosition( const VECTOR2D& aPosition, bool aWarpView ) void WX_VIEW_CONTROLS::SetCursorPosition( const VECTOR2D& aPosition, bool aWarpView, bool aTriggeredByArrows )
{ {
m_updateCursor = false; m_updateCursor = false;
if( aTriggeredByArrows )
{
m_settings.m_lastKeyboardCursorPositionValid = true;
m_settings.m_lastKeyboardCursorPosition = aPosition;
} else {
m_settings.m_lastKeyboardCursorPositionValid = false;
}
WarpCursor( aPosition, true, aWarpView ); WarpCursor( aPosition, true, aWarpView );
m_cursorPos = aPosition; m_cursorPos = aPosition;
} }
@ -508,13 +517,23 @@ void WX_VIEW_CONTROLS::CenterOnCursor() const
bool WX_VIEW_CONTROLS::handleAutoPanning( const wxMouseEvent& aEvent ) bool WX_VIEW_CONTROLS::handleAutoPanning( const wxMouseEvent& aEvent )
{ {
VECTOR2D p( aEvent.GetX(), aEvent.GetY() ); VECTOR2I p( aEvent.GetX(), aEvent.GetY() );
VECTOR2I pKey( m_view->ToScreen(m_settings.m_lastKeyboardCursorPosition ) );
if( m_settings.m_lastKeyboardCursorPositionValid && (p == pKey) )
{
// last cursor move event came from keyboard cursor control. If auto-panning is enabled and
// the next position is inside the autopan zone, check if it really came from a mouse event, otherwise
// disable autopan temporarily.
return true;
}
// Compute areas where autopanning is active // Compute areas where autopanning is active
double borderStart = std::min( m_settings.m_autoPanMargin * m_view->GetScreenPixelSize().x, int borderStart = std::min( m_settings.m_autoPanMargin * m_view->GetScreenPixelSize().x,
m_settings.m_autoPanMargin * m_view->GetScreenPixelSize().y ); m_settings.m_autoPanMargin * m_view->GetScreenPixelSize().y );
double borderEndX = m_view->GetScreenPixelSize().x - borderStart; int borderEndX = m_view->GetScreenPixelSize().x - borderStart;
double borderEndY = m_view->GetScreenPixelSize().y - borderStart; int borderEndY = m_view->GetScreenPixelSize().y - borderStart;
if( p.x < borderStart ) if( p.x < borderStart )
m_panDirection.x = -( borderStart - p.x ); m_panDirection.x = -( borderStart - p.x );
@ -642,3 +661,9 @@ void WX_VIEW_CONTROLS::UpdateScrollbars()
m_scrollPos = newScroll; m_scrollPos = newScroll;
} }
} }
void WX_VIEW_CONTROLS::ForceCursorPosition( bool aEnabled, const VECTOR2D& aPosition )
{
m_settings.m_forceCursorPosition = aEnabled;
m_settings.m_forcedPosition = aPosition;
}

View File

@ -92,6 +92,12 @@ struct VC_SETTINGS
///> Allow panning with the left button in addition to middle ///> Allow panning with the left button in addition to middle
bool m_panWithLeftButton; bool m_panWithLeftButton;
///> Is last cursor motion event coming from keyboard arrow cursor motion action
bool m_lastKeyboardCursorPositionValid;
///> Position of the above event
VECTOR2D m_lastKeyboardCursorPosition;
}; };
@ -233,7 +239,7 @@ public:
* @param aPosition is the requested cursor position in the world coordinates. * @param aPosition is the requested cursor position in the world coordinates.
* @param aWarpView enables/disables view warp if the cursor is outside the current viewport. * @param aWarpView enables/disables view warp if the cursor is outside the current viewport.
*/ */
virtual void SetCursorPosition( const VECTOR2D& aPosition, bool aWarpView = true ) = 0; virtual void SetCursorPosition( const VECTOR2D& aPosition, bool aWarpView = true, bool aTriggeredByArrows = false ) = 0;
/** /**

View File

@ -85,7 +85,7 @@ public:
/// @copydoc VIEW_CONTROLS::GetRawCursorPosition() /// @copydoc VIEW_CONTROLS::GetRawCursorPosition()
VECTOR2D GetRawCursorPosition( bool aSnappingEnabled = true ) const override; VECTOR2D GetRawCursorPosition( bool aSnappingEnabled = true ) const override;
void SetCursorPosition( const VECTOR2D& aPosition, bool warpView ) override; void SetCursorPosition( const VECTOR2D& aPosition, bool warpView, bool aTriggeredByArrows ) override;
/// @copydoc VIEW_CONTROLS::SetCrossHairCursorPosition() /// @copydoc VIEW_CONTROLS::SetCrossHairCursorPosition()
void SetCrossHairCursorPosition( const VECTOR2D& aPosition, bool aWarpView ) override; void SetCrossHairCursorPosition( const VECTOR2D& aPosition, bool aWarpView ) override;
@ -100,6 +100,8 @@ public:
/// Adjusts the scrollbars position to match the current viewport. /// Adjusts the scrollbars position to match the current viewport.
void UpdateScrollbars(); void UpdateScrollbars();
void ForceCursorPosition( bool aEnabled, const VECTOR2D& aPosition = VECTOR2D( 0, 0 ) ) override;
/// Event that forces mouse move event in the dispatcher (eg. used in autopanning, when mouse /// Event that forces mouse move event in the dispatcher (eg. used in autopanning, when mouse
/// cursor does not move in screen coordinates, but does in world coordinates) /// cursor does not move in screen coordinates, but does in world coordinates)
static const wxEventType EVT_REFRESH_MOUSE; static const wxEventType EVT_REFRESH_MOUSE;

View File

@ -128,6 +128,7 @@ void LENGTH_TUNER_TOOL::Reset( RESET_REASON aReason )
void LENGTH_TUNER_TOOL::updateStatusPopup( PNS_TUNE_STATUS_POPUP& aPopup ) void LENGTH_TUNER_TOOL::updateStatusPopup( PNS_TUNE_STATUS_POPUP& aPopup )
{ {
// fixme: wx code not allowed inside tools!
wxPoint p = wxGetMousePosition(); wxPoint p = wxGetMousePosition();
p.x += 20; p.x += 20;