]> git.saurik.com Git - wxWidgets.git/commitdiff
wxDFB: fix rendering artefacts when scrolling wxScrolledWindow that contains other...
authorVáclav Slavík <vslavik@fastmail.fm>
Mon, 22 Jan 2007 15:10:26 +0000 (15:10 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Mon, 22 Jan 2007 15:10:26 +0000 (15:10 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@44290 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/menu.h
include/wx/statusbr.h
include/wx/window.h
src/dfb/dcclient.cpp
src/dfb/window.cpp
src/univ/winuniv.cpp

index 9967d81d0d7dcd5ae3e79cf55aa5e0bdd53dc6b4..bd5e59176c06fc0af18ba6d216c62de538770182 100644 (file)
@@ -488,6 +488,8 @@ public:
     // update all menu item states in all menus
     virtual void UpdateMenus();
 
     // update all menu item states in all menus
     virtual void UpdateMenus();
 
+    virtual bool CanBeOutsideClientArea() const { return true; }
+
 protected:
     // the list of all our menus
     wxMenuList m_menus;
 protected:
     // the list of all our menus
     wxMenuList m_menus;
index 3c892013ad1b96bd04f1c3496d2962b9e1fdeeff..8d7594ac78473e282ba1d018f963aecbb339ce63 100644 (file)
@@ -97,6 +97,8 @@ public:
     // don't want status bars to accept the focus at all
     virtual bool AcceptsFocus() const { return false; }
 
     // don't want status bars to accept the focus at all
     virtual bool AcceptsFocus() const { return false; }
 
+    virtual bool CanBeOutsideClientArea() const { return true; }
+
 protected:
     // set the widths array to NULL
     void InitWidths();
 protected:
     // set the widths array to NULL
     void InitWidths();
index 30f4f2f57c0a5e510aadc825ab2ccdd276008fbf..04b76e9670a583402b23922a02a4421a6106e96e 100644 (file)
@@ -1136,6 +1136,10 @@ public:
     // behaviour in the most common case
     virtual bool ShouldInheritColours() const { return false; }
 
     // behaviour in the most common case
     virtual bool ShouldInheritColours() const { return false; }
 
+    // returns true if the window can be positioned outside of parent's client
+    // area (normal windows can't, but e.g. menubar or statusbar can):
+    virtual bool CanBeOutsideClientArea() const { return false; }
+
 protected:
     // event handling specific to wxWindow
     virtual bool TryValidator(wxEvent& event);
 protected:
     // event handling specific to wxWindow
     virtual bool TryValidator(wxEvent& event);
index 1045b6305eca8100159593f950b453308a4792ec..6e9945e1ba856614c0e818c76a0f86f8525a94bc 100644 (file)
@@ -58,6 +58,11 @@ static wxRect GetUncoveredWindowArea(wxWindow *win)
     // coordinates; this will remove parts of 'r' that are outside of the
     // parent's area:
     wxRect rp(GetUncoveredWindowArea(parent));
     // coordinates; this will remove parts of 'r' that are outside of the
     // parent's area:
     wxRect rp(GetUncoveredWindowArea(parent));
+
+    // normal windows cannot extend out of its parent's client area:
+    if ( !win->CanBeOutsideClientArea() )
+        rp.Intersect(parent->GetClientRect());
+
     rp.Offset(-win->GetPosition());
     rp.Offset(-parent->GetClientAreaOrigin());
     r.Intersect(rp);
     rp.Offset(-win->GetPosition());
     rp.Offset(-parent->GetClientAreaOrigin());
     r.Intersect(rp);
index 70ee92126693fe889df78b99dff7975769c52e71..5fdf3cdc3016815a8fdd5f2b4fb241c0f7d73463 100644 (file)
@@ -492,6 +492,15 @@ void wxWindowDFB::DoMoveWindow(int x, int y, int width, int height)
     {
         // queue both former and new position of the window for repainting:
         wxWindow *parent = GetParent();
     {
         // queue both former and new position of the window for repainting:
         wxWindow *parent = GetParent();
+
+        // only refresh the visible parts:
+        if ( !CanBeOutsideClientArea() )
+        {
+            wxRect parentClient(parent->GetClientSize());
+            oldpos.Intersect(parentClient);
+            newpos.Intersect(parentClient);
+        }
+
         parent->RefreshRect(oldpos);
         parent->RefreshRect(newpos);
     }
         parent->RefreshRect(oldpos);
         parent->RefreshRect(newpos);
     }
@@ -682,6 +691,11 @@ void wxWindowDFB::DoRefreshRect(const wxRect& rect)
     r.Offset(GetPosition());
     r.Offset(parent->GetClientAreaOrigin());
 
     r.Offset(GetPosition());
     r.Offset(parent->GetClientAreaOrigin());
 
+    // normal windows cannot extend out of its parent's client area, so don't
+    // refresh any hidden parts:
+    if ( !CanBeOutsideClientArea() )
+        r.Intersect(parent->GetClientRect());
+
     parent->DoRefreshRect(r);
 }
 
     parent->DoRefreshRect(r);
 }
 
@@ -763,6 +777,10 @@ void wxWindowDFB::PaintWindow(const wxRect& rect)
 
     m_updateRegion.Clear();
 
 
     m_updateRegion.Clear();
 
+    // client area portion of 'rect':
+    wxRect rectClientOnly(rect);
+    rectClientOnly.Intersect(clientRect);
+
     // paint the children:
     wxPoint origin = GetClientAreaOrigin();
     wxWindowList& children = GetChildren();
     // paint the children:
     wxPoint origin = GetClientAreaOrigin();
     wxWindowList& children = GetChildren();
@@ -777,7 +795,12 @@ void wxWindowDFB::PaintWindow(const wxRect& rect)
         // compute child's area to repaint
         wxRect childrect(child->GetRect());
         childrect.Offset(origin);
         // compute child's area to repaint
         wxRect childrect(child->GetRect());
         childrect.Offset(origin);
-        childrect.Intersect(rect);
+
+        if ( child->CanBeOutsideClientArea() )
+            childrect.Intersect(rect);
+        else
+            childrect.Intersect(rectClientOnly);
+
         if ( childrect.IsEmpty() )
             continue;
 
         if ( childrect.IsEmpty() )
             continue;
 
index fcdda770e1e0a2aade8a7dba1c06e76e392f942d..75f8f3bc74e9c40e0c0dbd54fbe411c353ca6b40 100644 (file)
 // implementation
 // ============================================================================
 
 // implementation
 // ============================================================================
 
+// ----------------------------------------------------------------------------
+// scrollbars class
+// ----------------------------------------------------------------------------
+
+// This is scrollbar class used to implement wxWindow's "built-in" scrollbars;
+// unlike the standard wxScrollBar class, this one is positioned outside of its
+// parent's client area
+class wxWindowScrollBar : public wxScrollBar
+{
+public:
+    wxWindowScrollBar(wxWindow *parent,
+                      wxWindowID id,
+                      const wxPoint& pos = wxDefaultPosition,
+                      const wxSize& size = wxDefaultSize,
+                      long style = wxSB_HORIZONTAL)
+        : wxScrollBar(parent, id, pos, size, style)
+    {
+    }
+
+    virtual bool CanBeOutsideClientArea() const { return true; }
+};
+
+
 // ----------------------------------------------------------------------------
 // event tables
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // event tables
 // ----------------------------------------------------------------------------
@@ -156,9 +179,9 @@ bool wxWindow::Create(wxWindow *parent,
         SetInsertIntoMain( true );
 #endif
 #if wxUSE_SCROLLBAR
         SetInsertIntoMain( true );
 #endif
 #if wxUSE_SCROLLBAR
-        m_scrollbarVert = new wxScrollBar(this, wxID_ANY,
-                                          wxDefaultPosition, wxDefaultSize,
-                                          wxSB_VERTICAL);
+        m_scrollbarVert = new wxWindowScrollBar(this, wxID_ANY,
+                                                wxDefaultPosition, wxDefaultSize,
+                                                wxSB_VERTICAL);
 #endif // wxUSE_SCROLLBAR
 #if wxUSE_TWO_WINDOWS
         SetInsertIntoMain( false );
 #endif // wxUSE_SCROLLBAR
 #if wxUSE_TWO_WINDOWS
         SetInsertIntoMain( false );
@@ -172,9 +195,9 @@ bool wxWindow::Create(wxWindow *parent,
         SetInsertIntoMain( true );
 #endif
 #if wxUSE_SCROLLBAR
         SetInsertIntoMain( true );
 #endif
 #if wxUSE_SCROLLBAR
-        m_scrollbarHorz = new wxScrollBar(this, wxID_ANY,
-                                          wxDefaultPosition, wxDefaultSize,
-                                          wxSB_HORIZONTAL);
+        m_scrollbarHorz = new wxWindowScrollBar(this, wxID_ANY,
+                                                wxDefaultPosition, wxDefaultSize,
+                                                wxSB_HORIZONTAL);
 #endif // wxUSE_SCROLLBAR
 #if wxUSE_TWO_WINDOWS
         SetInsertIntoMain( false );
 #endif // wxUSE_SCROLLBAR
 #if wxUSE_TWO_WINDOWS
         SetInsertIntoMain( false );
@@ -903,10 +926,10 @@ void wxWindow::SetScrollbar(int orient,
 #if wxUSE_TWO_WINDOWS
             SetInsertIntoMain( true );
 #endif
 #if wxUSE_TWO_WINDOWS
             SetInsertIntoMain( true );
 #endif
-            scrollbar = new wxScrollBar(this, wxID_ANY,
-                                        wxDefaultPosition, wxDefaultSize,
-                                        orient & wxVERTICAL ? wxSB_VERTICAL
-                                                            : wxSB_HORIZONTAL);
+            scrollbar = new wxWindowScrollBar(this, wxID_ANY,
+                                              wxDefaultPosition, wxDefaultSize,
+                                              orient & wxVERTICAL ? wxSB_VERTICAL
+                                                                  : wxSB_HORIZONTAL);
 #if wxUSE_TWO_WINDOWS
             SetInsertIntoMain( false );
 #endif
 #if wxUSE_TWO_WINDOWS
             SetInsertIntoMain( false );
 #endif