Add wxScrollWindow::ShouldScrollToChildOnFocus() virtual hook

This method can be overridden to indicate that the scrolled window
doesn't want its children to be scrolled into view when they're focused,
which is the default behaviour.

Also reuse this method for Mac-specific scrollbar workaround.
This commit is contained in:
Vadim Zeitlin
2019-07-10 11:54:17 +02:00
parent 4bd78b06a0
commit b69b4206c6
3 changed files with 36 additions and 3 deletions

View File

@@ -14,6 +14,10 @@
#include "wx/control.h"
#include "wx/panel.h"
#ifdef __WXOSX__
#include "wx/scrolbar.h"
#endif
class WXDLLIMPEXP_FWD_CORE wxScrollHelperEvtHandler;
class WXDLLIMPEXP_FWD_BASE wxTimer;
@@ -305,6 +309,21 @@ protected:
return size;
}
// Can be overridden to return false if the child window shouldn't be
// scrolled into view automatically when it gets focus, which is the
// default behaviour.
virtual bool ShouldScrollToChildOnFocus(wxWindow* child)
{
#if defined(__WXOSX__) && wxUSE_SCROLLBAR
if ( wxDynamicCast(child, wxScrollBar) )
return false;
#else
wxUnusedVar(child);
#endif
return true;
}
double m_scaleX;
double m_scaleY;

View File

@@ -581,6 +581,19 @@ public:
*/
virtual bool SendAutoScrollEvents(wxScrollWinEvent& event) const;
/**
This method can be overridden in a derived class to prevent scrolling
the child window into view automatically when it gets focus.
The default behaviour is to scroll this window to show its currently
focused child automatically, to ensure that the user can interact with
it. This is usually helpful, but can be undesirable for some windows,
in which case this method can be overridden to return @false for them
to prevent any scrolling from taking place when such windows get focus.
@since 3.1.3
*/
virtual bool ShouldScrollToChildOnFocus(wxWindow* child)
protected:
/**

View File

@@ -1070,10 +1070,11 @@ void wxScrollHelperBase::HandleOnChildFocus(wxChildFocusEvent& event)
if ( win == m_targetWindow )
return; // nothing to do
#if defined( __WXOSX__ ) && wxUSE_SCROLLBAR
if (wxDynamicCast(win, wxScrollBar))
if ( !ShouldScrollToChildOnFocus(win) )
{
// the window does not require to be scrolled into view
return;
#endif
}
// Fixing ticket: https://trac.wxwidgets.org/ticket/9563
// When a child inside a wxControlContainer receives a focus, the