From: Václav Slavík Date: Sun, 17 Mar 2002 14:13:56 +0000 (+0000) Subject: implemented 'shaft scrolling' of children in wxUnivWindow::ScrollWindow X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/1c9f1f4d512874c2f563a86acfbb69c000956e7a?ds=sidebyside;hp=d027179b48bc55d5166cd5ab727d50bf1beff153 implemented 'shaft scrolling' of children in wxUnivWindow::ScrollWindow git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14659 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/univ/winuniv.cpp b/src/univ/winuniv.cpp index 33de114721..7ad89e6f76 100644 --- a/src/univ/winuniv.cpp +++ b/src/univ/winuniv.cpp @@ -795,8 +795,32 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect) node; node = node->GetNext()) { wxWindow *child = node->GetData(); - if ( child != m_scrollbarVert && child != m_scrollbarHorz && - (rect == NULL || rect->Intersects(child->GetRect())) ) + if ( child == m_scrollbarVert || child == m_scrollbarHorz ) + continue; + + // VS: Scrolling children has non-trivial semantics. If rect=NULL then + // it is easy: we scroll all children. Otherwise it gets + // complicated: + // 1. if scrolling in one direction only, scroll only + // those children that intersect shaft defined by the rectangle + // and scrolling direction + // 2. if scrolling in both axes, scroll all children + + if ( rect && (dx * dy == 0 /* moving in only one of x, y axis */) ) + { + wxRect childRect = child->GetRect(); + if ( dx == 0 && (childRect.GetLeft() <= rect->GetRight() || + childRect.GetRight() >= rect->GetLeft()) ) + { + child->Move(child->GetPosition() + offset); + } + else if ( dy == 0 && (childRect.GetTop() <= rect->GetBottom() || + childRect.GetBottom() >= rect->GetTop()) ) + { + child->Move(child->GetPosition() + offset); + } + } + else { child->Move(child->GetPosition() + offset); }