diff --git a/common/view/wx_view_controls.cpp b/common/view/wx_view_controls.cpp index 1349948501..cbbe289cef 100644 --- a/common/view/wx_view_controls.cpp +++ b/common/view/wx_view_controls.cpp @@ -28,7 +28,6 @@ #include #include #include -#include using namespace KiGfx; @@ -59,13 +58,19 @@ WX_VIEW_CONTROLS::WX_VIEW_CONTROLS( VIEW* aView, wxWindow* aParentPanel ) : WX_VIEW_CONTROLS::onTimer ), NULL, this ); } +void VIEW_CONTROLS::ShowCursor ( bool aEnabled ) +{ + m_view->GetGAL()->SetCursorEnabled( aEnabled ); +} void WX_VIEW_CONTROLS::onMotion( wxMouseEvent& aEvent ) { m_mousePosition.x = aEvent.GetX(); m_mousePosition.y = aEvent.GetY(); - if( m_snappingEnabled ) + if( m_forceCursorPosition ) + m_cursorPosition = m_view->ToScreen (m_forcedPosition); + else if( m_snappingEnabled ) m_cursorPosition = m_view->GetGAL()->GetGridPoint( m_mousePosition ); else m_cursorPosition = m_mousePosition; @@ -185,28 +190,26 @@ void WX_VIEW_CONTROLS::onTimer( wxTimerEvent& aEvent ) { switch( m_state ) { - case AUTO_PANNING: - { - double borderSize = std::min( m_autoPanMargin * m_view->GetScreenPixelSize().x, - m_autoPanMargin * m_view->GetScreenPixelSize().y ); + case AUTO_PANNING: + { + double borderSize = std::min( m_autoPanMargin * m_view->GetScreenPixelSize().x, + m_autoPanMargin * m_view->GetScreenPixelSize().y ); - VECTOR2D dir( m_panDirection ); + VECTOR2D dir( m_panDirection ); - if( dir.EuclideanNorm() > borderSize ) - dir = dir.Resize( borderSize ); + if( dir.EuclideanNorm() > borderSize ) + dir = dir.Resize( borderSize ); - dir = m_view->ToWorld( dir, false ); - m_view->SetCenter( m_view->GetCenter() + dir * m_autoPanSpeed ); - - // Notify tools that the cursor position has changed in the world coordinates - wxCommandEvent moveEvent( TOOL_DISPATCHER::EVT_REFRESH_MOUSE ); - wxPostEvent( m_parentPanel, moveEvent ); - } - break; - - case IDLE: // Just remove unnecessary warnings - case DRAG_PANNING: + dir = m_view->ToWorld( dir, false ); + m_view->SetCenter( m_view->GetCenter() + dir * m_autoPanSpeed ); + m_parentPanel->Refresh(); + + } break; + + case IDLE: // Just remove unnecessary warnings + case DRAG_PANNING: + break; } } diff --git a/include/view/view_controls.h b/include/view/view_controls.h index 3b686d966c..af664da11c 100644 --- a/include/view/view_controls.h +++ b/include/view/view_controls.h @@ -127,17 +127,21 @@ public: return m_cursorPosition; } - /** - * Function SetCursorPosition() - * Allows to move the cursor to a different location. - * - * @param aPosition is the new location expressed in screen coordinates. + + /** + * Function ForceCursorPosition() + * Places the cursor immediately at a given point. Mouse movement is ignored. + * @param aEnabled enable forced cursor position + * @param aPosition the position */ - virtual void SetCursorPosition( const VECTOR2D& aPosition ) + virtual void ForceCursorPosition( bool aEnabled, const VECTOR2D& aPosition = VECTOR2D(0, 0) ) { - m_cursorPosition = aPosition; + m_forcedPosition = aPosition; + m_forceCursorPosition = aEnabled; } + virtual void ShowCursor ( bool aEnabled ); + protected: /// Pointer to controlled VIEW. VIEW* m_view; @@ -148,6 +152,9 @@ protected: /// Current cursor position VECTOR2D m_cursorPosition; + /// Forced cursor position + VECTOR2D m_forcedPosition; + /// Should the cursor snap to grid or move freely bool m_snappingEnabled; @@ -157,6 +164,8 @@ protected: /// Flag for turning on autopanning bool m_autoPanEnabled; + bool m_forceCursorPosition; + /// Distance from cursor to VIEW edge when panning is active float m_autoPanMargin;