From: Robert Roebling Date: Tue, 22 Feb 2000 22:39:55 +0000 (+0000) Subject: Playing with scrolling, als fixed redraw X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/8e217128a047598380aa8483c472c822ea9ab9c9 Playing with scrolling, als fixed redraw bug in wxGrid (outer regions). You must not to maths with update regions within an scroll related OnPaint(). Everything else is allowed. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6224 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/samples/scroll/scroll.cpp b/samples/scroll/scroll.cpp index bb4006f44c..c16f08b042 100644 --- a/samples/scroll/scroll.cpp +++ b/samples/scroll/scroll.cpp @@ -61,6 +61,8 @@ public: void OnAbout( wxCommandEvent &event ); void OnQuit( wxCommandEvent &event ); + void OnDeleteAll( wxCommandEvent &event ); + void OnInsertNew( wxCommandEvent &event ); MyCanvas *m_canvas; wxTextCtrl *m_log; @@ -265,10 +267,14 @@ void MyCanvas::OnScroll( wxScrollWinEvent &event ) const int ID_QUIT = 108; const int ID_ABOUT = 109; +const int ID_DELETE_ALL = 110; +const int ID_INSERT_NEW = 111; IMPLEMENT_DYNAMIC_CLASS( MyFrame, wxFrame ) BEGIN_EVENT_TABLE(MyFrame,wxFrame) + EVT_MENU (ID_DELETE_ALL, MyFrame::OnDeleteAll) + EVT_MENU (ID_INSERT_NEW, MyFrame::OnInsertNew) EVT_MENU (ID_ABOUT, MyFrame::OnAbout) EVT_MENU (ID_QUIT, MyFrame::OnQuit) END_EVENT_TABLE() @@ -278,6 +284,8 @@ MyFrame::MyFrame() wxPoint(20,20), wxSize(470,500) ) { wxMenu *file_menu = new wxMenu(); + file_menu->Append( ID_DELETE_ALL, "Delete all"); + file_menu->Append( ID_INSERT_NEW, "Insert new"); file_menu->Append( ID_ABOUT, "&About.."); file_menu->Append( ID_QUIT, "E&xit\tAlt-X"); @@ -306,6 +314,16 @@ MyFrame::MyFrame() SetSizer( topsizer ); } +void MyFrame::OnDeleteAll( wxCommandEvent &WXUNUSED(event) ) +{ + m_canvas->DestroyChildren(); +} + +void MyFrame::OnInsertNew( wxCommandEvent &WXUNUSED(event) ) +{ + (void)new wxButton( m_canvas, -1, "Hello", wxPoint(100,100) ); +} + void MyFrame::OnQuit( wxCommandEvent &WXUNUSED(event) ) { Close( TRUE ); diff --git a/src/generic/grid.cpp b/src/generic/grid.cpp index 777c2b46b3..2287804451 100644 --- a/src/generic/grid.cpp +++ b/src/generic/grid.cpp @@ -4955,6 +4955,7 @@ void wxGrid::DrawAllGridLines( wxDC& dc, const wxRegion & reg ) int top, bottom, left, right; +#ifndef __WXGTK__ if (reg.IsEmpty()) { int cw, ch; @@ -4972,6 +4973,12 @@ void wxGrid::DrawAllGridLines( wxDC& dc, const wxRegion & reg ) CalcUnscrolledPosition( x, y, &left, &top ); CalcUnscrolledPosition( x + w, y + h, &right, &bottom ); } +#else + int cw, ch; + m_gridWin->GetClientSize(&cw, &ch); + CalcUnscrolledPosition( 0, 0, &left, &top ); + CalcUnscrolledPosition( cw, ch, &right, &bottom ); +#endif // avoid drawing grid lines past the last row and col // diff --git a/src/gtk/win_gtk.c b/src/gtk/win_gtk.c index 58b2ec367b..44f804dc2d 100644 --- a/src/gtk/win_gtk.c +++ b/src/gtk/win_gtk.c @@ -186,6 +186,9 @@ gtk_pizza_init (GtkPizza *pizza) pizza->height = 20; pizza->bin_window = NULL; + + pizza->xoffset = 0; + pizza->yoffset = 0; pizza->configure_serial = 0; pizza->scroll_x = 0; diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 47eefa20dd..6dea5fdd64 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -3444,6 +3444,60 @@ void wxWindow::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) ) wxCHECK_RET( m_widget != NULL, wxT("invalid window") ); wxCHECK_RET( m_wxwindow != NULL, wxT("window needs client area for scrolling") ); + + if ((dx == 0) && (dy == 0)) return; gtk_pizza_scroll( GTK_PIZZA(m_wxwindow), -dx, -dy ); + +/* + if (m_children.GetCount() > 0) + { + gtk_pizza_scroll( GTK_PIZZA(m_wxwindow), -dx, -dy ); + } + else + { + GtkPizza *pizza = GTK_PIZZA(m_wxwindow); + + pizza->xoffset -= dx; + pizza->yoffset -= dy; + + GdkGC *m_scrollGC = gdk_gc_new( pizza->bin_window ); + gdk_gc_set_exposures( m_scrollGC, TRUE ); + + int cw = 0; + int ch = 0; + GetClientSize( &cw, &ch ); + int w = cw - abs(dx); + int h = ch - abs(dy); + + if ((h < 0) || (w < 0)) + { + Refresh(); + } + else + { + int s_x = 0; + int s_y = 0; + if (dx < 0) s_x = -dx; + if (dy < 0) s_y = -dy; + int d_x = 0; + int d_y = 0; + if (dx > 0) d_x = dx; + if (dy > 0) d_y = dy; + + gdk_window_copy_area( pizza->bin_window, m_scrollGC, d_x, d_y, + pizza->bin_window, s_x, s_y, w, h ); + + wxRect rect; + if (dx < 0) rect.x = cw+dx; else rect.x = 0; + if (dy < 0) rect.y = ch+dy; else rect.y = 0; + if (dy != 0) rect.width = cw; else rect.width = abs(dx); + if (dx != 0) rect.height = ch; else rect.height = abs(dy); + + Refresh( TRUE, &rect ); + } + + gdk_gc_unref( m_scrollGC ); + } +*/ } diff --git a/src/gtk1/win_gtk.c b/src/gtk1/win_gtk.c index 58b2ec367b..44f804dc2d 100644 --- a/src/gtk1/win_gtk.c +++ b/src/gtk1/win_gtk.c @@ -186,6 +186,9 @@ gtk_pizza_init (GtkPizza *pizza) pizza->height = 20; pizza->bin_window = NULL; + + pizza->xoffset = 0; + pizza->yoffset = 0; pizza->configure_serial = 0; pizza->scroll_x = 0; diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index 47eefa20dd..6dea5fdd64 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -3444,6 +3444,60 @@ void wxWindow::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) ) wxCHECK_RET( m_widget != NULL, wxT("invalid window") ); wxCHECK_RET( m_wxwindow != NULL, wxT("window needs client area for scrolling") ); + + if ((dx == 0) && (dy == 0)) return; gtk_pizza_scroll( GTK_PIZZA(m_wxwindow), -dx, -dy ); + +/* + if (m_children.GetCount() > 0) + { + gtk_pizza_scroll( GTK_PIZZA(m_wxwindow), -dx, -dy ); + } + else + { + GtkPizza *pizza = GTK_PIZZA(m_wxwindow); + + pizza->xoffset -= dx; + pizza->yoffset -= dy; + + GdkGC *m_scrollGC = gdk_gc_new( pizza->bin_window ); + gdk_gc_set_exposures( m_scrollGC, TRUE ); + + int cw = 0; + int ch = 0; + GetClientSize( &cw, &ch ); + int w = cw - abs(dx); + int h = ch - abs(dy); + + if ((h < 0) || (w < 0)) + { + Refresh(); + } + else + { + int s_x = 0; + int s_y = 0; + if (dx < 0) s_x = -dx; + if (dy < 0) s_y = -dy; + int d_x = 0; + int d_y = 0; + if (dx > 0) d_x = dx; + if (dy > 0) d_y = dy; + + gdk_window_copy_area( pizza->bin_window, m_scrollGC, d_x, d_y, + pizza->bin_window, s_x, s_y, w, h ); + + wxRect rect; + if (dx < 0) rect.x = cw+dx; else rect.x = 0; + if (dy < 0) rect.y = ch+dy; else rect.y = 0; + if (dy != 0) rect.width = cw; else rect.width = abs(dx); + if (dx != 0) rect.height = ch; else rect.height = abs(dy); + + Refresh( TRUE, &rect ); + } + + gdk_gc_unref( m_scrollGC ); + } +*/ }