Simplify wxEVT_PAINT handling in wxScrollHelperBase.
Just always call the virtual OnDraw() if wxEVT_PAINT wasn't handled. This is much simpler than connecting our own special handler just to set a flag saying whether the event was processed which was very complicated and didn't work anyhow for the statically connected wxEVT_PAINT handlers. See #14757. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72939 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -252,10 +252,6 @@ protected:
|
|||||||
// delete the event handler we installed
|
// delete the event handler we installed
|
||||||
void DeleteEvtHandler();
|
void DeleteEvtHandler();
|
||||||
|
|
||||||
// calls wxScrollHelperEvtHandler::ResetDrawnFlag(), see explanation
|
|
||||||
// in wxScrollHelperEvtHandler::ProcessEvent()
|
|
||||||
void ResetDrawnFlag();
|
|
||||||
|
|
||||||
// this function should be overridden to return the size available for
|
// this function should be overridden to return the size available for
|
||||||
// m_targetWindow inside m_win of the given size
|
// m_targetWindow inside m_win of the given size
|
||||||
//
|
//
|
||||||
@@ -376,8 +372,6 @@ public:
|
|||||||
this->MacSetClipChildren(true);
|
this->MacSetClipChildren(true);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
this->Connect(wxEVT_PAINT, wxPaintEventHandler(wxScrolled::OnPaint));
|
|
||||||
|
|
||||||
// by default, we're scrollable in both directions (but if one of the
|
// by default, we're scrollable in both directions (but if one of the
|
||||||
// styles is specified explicitly, we shouldn't add the other one
|
// styles is specified explicitly, we shouldn't add the other one
|
||||||
// automatically)
|
// automatically)
|
||||||
@@ -408,16 +402,6 @@ protected:
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// this is needed for wxEVT_PAINT processing hack described in
|
|
||||||
// wxScrollHelperEvtHandler::ProcessEvent()
|
|
||||||
void OnPaint(wxPaintEvent& event)
|
|
||||||
{
|
|
||||||
// the user code didn't really draw the window if we got here, so set
|
|
||||||
// this flag to try to call OnDraw() later
|
|
||||||
ResetDrawnFlag();
|
|
||||||
event.Skip();
|
|
||||||
}
|
|
||||||
|
|
||||||
// VC++ 6 gives warning for the declaration of template member function
|
// VC++ 6 gives warning for the declaration of template member function
|
||||||
// without definition
|
// without definition
|
||||||
#ifndef __VISUALC6__
|
#ifndef __VISUALC6__
|
||||||
|
@@ -79,13 +79,9 @@ public:
|
|||||||
|
|
||||||
virtual bool ProcessEvent(wxEvent& event);
|
virtual bool ProcessEvent(wxEvent& event);
|
||||||
|
|
||||||
void ResetDrawnFlag() { m_hasDrawnWindow = false; }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
wxScrollHelperBase *m_scrollHelper;
|
wxScrollHelperBase *m_scrollHelper;
|
||||||
|
|
||||||
bool m_hasDrawnWindow;
|
|
||||||
|
|
||||||
wxDECLARE_NO_COPY_CLASS(wxScrollHelperEvtHandler);
|
wxDECLARE_NO_COPY_CLASS(wxScrollHelperEvtHandler);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -186,24 +182,6 @@ bool wxScrollHelperEvtHandler::ProcessEvent(wxEvent& event)
|
|||||||
{
|
{
|
||||||
wxEventType evType = event.GetEventType();
|
wxEventType evType = event.GetEventType();
|
||||||
|
|
||||||
// the explanation of wxEVT_PAINT processing hack: for historic reasons
|
|
||||||
// there are 2 ways to process this event in classes deriving from
|
|
||||||
// wxScrolledWindow. The user code may
|
|
||||||
//
|
|
||||||
// 1. override wxScrolledWindow::OnDraw(dc)
|
|
||||||
// 2. define its own OnPaint() handler
|
|
||||||
//
|
|
||||||
// In addition, in wxUniversal wxWindow defines OnPaint() itself and
|
|
||||||
// always processes the draw event, so we can't just try the window
|
|
||||||
// OnPaint() first and call our HandleOnPaint() if it doesn't process it
|
|
||||||
// (the latter would never be called in wxUniversal).
|
|
||||||
//
|
|
||||||
// So the solution is to have a flag telling us whether the user code drew
|
|
||||||
// anything in the window. We set it to true here but reset it to false in
|
|
||||||
// wxScrolledWindow::OnPaint() handler (which wouldn't be called if the
|
|
||||||
// user code defined OnPaint() in the derived class)
|
|
||||||
m_hasDrawnWindow = true;
|
|
||||||
|
|
||||||
// Pass it on to the real handler: notice that we must not call
|
// Pass it on to the real handler: notice that we must not call
|
||||||
// ProcessEvent() on this object itself as it wouldn't pass it to the next
|
// ProcessEvent() on this object itself as it wouldn't pass it to the next
|
||||||
// handler (i.e. the real window) if we're called from a previous handler
|
// handler (i.e. the real window) if we're called from a previous handler
|
||||||
@@ -222,22 +200,25 @@ bool wxScrollHelperEvtHandler::ProcessEvent(wxEvent& event)
|
|||||||
if ( evType == wxEVT_SIZE )
|
if ( evType == wxEVT_SIZE )
|
||||||
{
|
{
|
||||||
m_scrollHelper->HandleOnSize((wxSizeEvent &)event);
|
m_scrollHelper->HandleOnSize((wxSizeEvent &)event);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( processed )
|
if ( processed && event.IsCommandEvent())
|
||||||
{
|
return true;
|
||||||
// normally, nothing more to do here - except if it was a paint event
|
|
||||||
// which wasn't really processed, then we'll try to call our
|
|
||||||
// OnDraw() below (from HandleOnPaint)
|
|
||||||
if ( m_hasDrawnWindow || event.IsCommandEvent() )
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( evType == wxEVT_PAINT )
|
// For wxEVT_PAINT the user code can either handle this event as usual or
|
||||||
|
// override virtual OnDraw(), so if the event hasn't been handled we need
|
||||||
|
// to call this virtual function ourselves.
|
||||||
|
if (
|
||||||
|
#ifndef __WXUNIVERSAL__
|
||||||
|
// in wxUniversal "processed" will always be true, because
|
||||||
|
// all windows use the paint event to draw themselves.
|
||||||
|
// In this case we can't use this flag to determine if a custom
|
||||||
|
// paint event handler already drew our window and we just
|
||||||
|
// call OnDraw() anyway.
|
||||||
|
!processed &&
|
||||||
|
#endif // !__WXUNIVERSAL__
|
||||||
|
evType == wxEVT_PAINT )
|
||||||
{
|
{
|
||||||
m_scrollHelper->HandleOnPaint((wxPaintEvent &)event);
|
m_scrollHelper->HandleOnPaint((wxPaintEvent &)event);
|
||||||
return true;
|
return true;
|
||||||
@@ -462,12 +443,6 @@ void wxScrollHelperBase::DeleteEvtHandler()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxScrollHelperBase::ResetDrawnFlag()
|
|
||||||
{
|
|
||||||
wxCHECK_RET( m_handler, "invalid use of ResetDrawnFlag - no handler?" );
|
|
||||||
m_handler->ResetDrawnFlag();
|
|
||||||
}
|
|
||||||
|
|
||||||
void wxScrollHelperBase::DoSetTargetWindow(wxWindow *target)
|
void wxScrollHelperBase::DoSetTargetWindow(wxWindow *target)
|
||||||
{
|
{
|
||||||
m_targetWindow = target;
|
m_targetWindow = target;
|
||||||
|
Reference in New Issue
Block a user