]> git.saurik.com Git - wxWidgets.git/commitdiff
implemented 'shaft scrolling' of children in wxUnivWindow::ScrollWindow
authorVáclav Slavík <vslavik@fastmail.fm>
Sun, 17 Mar 2002 14:13:56 +0000 (14:13 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Sun, 17 Mar 2002 14:13:56 +0000 (14:13 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14659 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/univ/winuniv.cpp

index 33de11472160ddb1cf092b05a2e52c6d88e59f05..7ad89e6f76c0bcc46b0c315e3af76dcbd6a3c1ea 100644 (file)
@@ -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);
         }