GAL now hides cursor when mouse is outside the view. No change to legacy view.

This commit is contained in:
Andrew Zonenberg 2015-07-12 12:10:59 -07:00
parent 2fdfaca38c
commit ed43694682
3 changed files with 53 additions and 3 deletions

View File

@ -36,7 +36,8 @@ using namespace KIGFX;
const wxEventType WX_VIEW_CONTROLS::EVT_REFRESH_MOUSE = wxNewEventType(); const wxEventType WX_VIEW_CONTROLS::EVT_REFRESH_MOUSE = wxNewEventType();
WX_VIEW_CONTROLS::WX_VIEW_CONTROLS( VIEW* aView, wxScrolledCanvas* aParentPanel ) : WX_VIEW_CONTROLS::WX_VIEW_CONTROLS( VIEW* aView, wxScrolledCanvas* aParentPanel ) :
VIEW_CONTROLS( aView ), m_state( IDLE ), m_parentPanel( aParentPanel ), m_scrollScale( 1.0, 1.0 ) VIEW_CONTROLS( aView ), m_state( IDLE ), m_parentPanel( aParentPanel ), m_scrollScale( 1.0, 1.0 ),
m_mouseIsInView(false), m_cursorWasDisplayedOnLeave(false)
{ {
m_parentPanel->Connect( wxEVT_MOTION, m_parentPanel->Connect( wxEVT_MOTION,
wxMouseEventHandler( WX_VIEW_CONTROLS::onMotion ), NULL, this ); wxMouseEventHandler( WX_VIEW_CONTROLS::onMotion ), NULL, this );
@ -54,10 +55,8 @@ WX_VIEW_CONTROLS::WX_VIEW_CONTROLS( VIEW* aView, wxScrolledCanvas* aParentPanel
wxMouseEventHandler( WX_VIEW_CONTROLS::onButton ), NULL, this ); wxMouseEventHandler( WX_VIEW_CONTROLS::onButton ), NULL, this );
m_parentPanel->Connect( wxEVT_LEFT_DOWN, m_parentPanel->Connect( wxEVT_LEFT_DOWN,
wxMouseEventHandler( WX_VIEW_CONTROLS::onButton ), NULL, this ); wxMouseEventHandler( WX_VIEW_CONTROLS::onButton ), NULL, this );
#if defined _WIN32 || defined _WIN64
m_parentPanel->Connect( wxEVT_ENTER_WINDOW, m_parentPanel->Connect( wxEVT_ENTER_WINDOW,
wxMouseEventHandler( WX_VIEW_CONTROLS::onEnter ), NULL, this ); wxMouseEventHandler( WX_VIEW_CONTROLS::onEnter ), NULL, this );
#endif
m_parentPanel->Connect( wxEVT_LEAVE_WINDOW, m_parentPanel->Connect( wxEVT_LEAVE_WINDOW,
wxMouseEventHandler( WX_VIEW_CONTROLS::onLeave ), NULL, this ); wxMouseEventHandler( WX_VIEW_CONTROLS::onLeave ), NULL, this );
m_parentPanel->Connect( wxEVT_SCROLLWIN_THUMBTRACK, m_parentPanel->Connect( wxEVT_SCROLLWIN_THUMBTRACK,
@ -212,12 +211,28 @@ void WX_VIEW_CONTROLS::onButton( wxMouseEvent& aEvent )
void WX_VIEW_CONTROLS::onEnter( wxMouseEvent& aEvent ) void WX_VIEW_CONTROLS::onEnter( wxMouseEvent& aEvent )
{ {
//If the cursor was enabled when we left, turn it on now
m_mouseIsInView = true;
m_view->GetGAL()->SetCursorEnabled(m_cursorWasDisplayedOnLeave);
#if defined _WIN32 || defined _WIN64
m_parentPanel->SetFocus(); m_parentPanel->SetFocus();
#endif
} }
void WX_VIEW_CONTROLS::onLeave( wxMouseEvent& aEvent ) void WX_VIEW_CONTROLS::onLeave( wxMouseEvent& aEvent )
{ {
// Always hide the cursor when the mouse leaves the window to avoid confusing the user
// But we may need to re-enable it, so keep track of whether it was visible
m_mouseIsInView = false;
m_cursorWasDisplayedOnLeave = m_view->GetGAL()->GetCursorEnabled();
m_view->GetGAL()->SetCursorEnabled(false);
// If we hid the cursor, redraw the window to get rid of it
if(m_cursorWasDisplayedOnLeave)
m_view->Redraw();
if( m_cursorCaptured ) if( m_cursorCaptured )
{ {
bool warp = false; bool warp = false;
@ -434,3 +449,15 @@ void WX_VIEW_CONTROLS::UpdateScrollbars()
( viewport.Centre().x - boundary.GetLeft() ) / boundary.GetWidth() * m_scrollScale.x, ( viewport.Centre().x - boundary.GetLeft() ) / boundary.GetWidth() * m_scrollScale.x,
( viewport.Centre().y - boundary.GetTop() ) / boundary.GetHeight() * m_scrollScale.y ); ( viewport.Centre().y - boundary.GetTop() ) / boundary.GetHeight() * m_scrollScale.y );
} }
void WX_VIEW_CONTROLS::ShowCursor( bool aEnabled )
{
// If the mouse is outside the view (on a toolbar etc), don't show the cursor
// until the mouse enters the view again. Just remember we want to show it now
if(!m_mouseIsInView)
m_cursorWasDisplayedOnLeave = aEnabled;
// but if it's in the view, we want to show it right now
else
m_view->GetGAL()->SetCursorEnabled( aEnabled );
}

View File

@ -763,6 +763,16 @@ public:
isCursorEnabled = aCursorEnabled; isCursorEnabled = aCursorEnabled;
} }
/**
* @brief Returns the cursor enable state
*
* @return True if the cursor is being drawn, else false
*/
inline bool GetCursorEnabled() const
{
return isCursorEnabled;
}
/** /**
* @brief Set the cursor color. * @brief Set the cursor color.
* *

View File

@ -85,6 +85,13 @@ public:
m_state = IDLE; m_state = IDLE;
} }
/**
* Function ShowCursor()
* Enables or disables display of cursor.
* @param aEnabled decides if the cursor should be shown.
*/
virtual void ShowCursor( bool aEnabled );
/// @copydoc VIEW_CONTROLS::GetMousePosition() /// @copydoc VIEW_CONTROLS::GetMousePosition()
VECTOR2D GetMousePosition() const; VECTOR2D GetMousePosition() const;
@ -140,6 +147,12 @@ private:
/// Ratio used for scaling world coordinates to scrollbar position. /// Ratio used for scaling world coordinates to scrollbar position.
VECTOR2D m_scrollScale; VECTOR2D m_scrollScale;
/// Indicates whether the mouse is inside the window
bool m_mouseIsInView;
/// Indicates whether the cursor was being displayed at the time the mouse left the window
bool m_cursorWasDisplayedOnLeave;
}; };
} // namespace KIGFX } // namespace KIGFX