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
This commit is contained in:
@@ -61,6 +61,8 @@ public:
|
|||||||
|
|
||||||
void OnAbout( wxCommandEvent &event );
|
void OnAbout( wxCommandEvent &event );
|
||||||
void OnQuit( wxCommandEvent &event );
|
void OnQuit( wxCommandEvent &event );
|
||||||
|
void OnDeleteAll( wxCommandEvent &event );
|
||||||
|
void OnInsertNew( wxCommandEvent &event );
|
||||||
|
|
||||||
MyCanvas *m_canvas;
|
MyCanvas *m_canvas;
|
||||||
wxTextCtrl *m_log;
|
wxTextCtrl *m_log;
|
||||||
@@ -265,10 +267,14 @@ void MyCanvas::OnScroll( wxScrollWinEvent &event )
|
|||||||
|
|
||||||
const int ID_QUIT = 108;
|
const int ID_QUIT = 108;
|
||||||
const int ID_ABOUT = 109;
|
const int ID_ABOUT = 109;
|
||||||
|
const int ID_DELETE_ALL = 110;
|
||||||
|
const int ID_INSERT_NEW = 111;
|
||||||
|
|
||||||
IMPLEMENT_DYNAMIC_CLASS( MyFrame, wxFrame )
|
IMPLEMENT_DYNAMIC_CLASS( MyFrame, wxFrame )
|
||||||
|
|
||||||
BEGIN_EVENT_TABLE(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_ABOUT, MyFrame::OnAbout)
|
||||||
EVT_MENU (ID_QUIT, MyFrame::OnQuit)
|
EVT_MENU (ID_QUIT, MyFrame::OnQuit)
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
@@ -278,6 +284,8 @@ MyFrame::MyFrame()
|
|||||||
wxPoint(20,20), wxSize(470,500) )
|
wxPoint(20,20), wxSize(470,500) )
|
||||||
{
|
{
|
||||||
wxMenu *file_menu = new wxMenu();
|
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_ABOUT, "&About..");
|
||||||
file_menu->Append( ID_QUIT, "E&xit\tAlt-X");
|
file_menu->Append( ID_QUIT, "E&xit\tAlt-X");
|
||||||
|
|
||||||
@@ -306,6 +314,16 @@ MyFrame::MyFrame()
|
|||||||
SetSizer( topsizer );
|
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) )
|
void MyFrame::OnQuit( wxCommandEvent &WXUNUSED(event) )
|
||||||
{
|
{
|
||||||
Close( TRUE );
|
Close( TRUE );
|
||||||
|
@@ -4955,6 +4955,7 @@ void wxGrid::DrawAllGridLines( wxDC& dc, const wxRegion & reg )
|
|||||||
|
|
||||||
int top, bottom, left, right;
|
int top, bottom, left, right;
|
||||||
|
|
||||||
|
#ifndef __WXGTK__
|
||||||
if (reg.IsEmpty())
|
if (reg.IsEmpty())
|
||||||
{
|
{
|
||||||
int cw, ch;
|
int cw, ch;
|
||||||
@@ -4972,6 +4973,12 @@ void wxGrid::DrawAllGridLines( wxDC& dc, const wxRegion & reg )
|
|||||||
CalcUnscrolledPosition( x, y, &left, &top );
|
CalcUnscrolledPosition( x, y, &left, &top );
|
||||||
CalcUnscrolledPosition( x + w, y + h, &right, &bottom );
|
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
|
// avoid drawing grid lines past the last row and col
|
||||||
//
|
//
|
||||||
|
@@ -187,6 +187,9 @@ gtk_pizza_init (GtkPizza *pizza)
|
|||||||
|
|
||||||
pizza->bin_window = NULL;
|
pizza->bin_window = NULL;
|
||||||
|
|
||||||
|
pizza->xoffset = 0;
|
||||||
|
pizza->yoffset = 0;
|
||||||
|
|
||||||
pizza->configure_serial = 0;
|
pizza->configure_serial = 0;
|
||||||
pizza->scroll_x = 0;
|
pizza->scroll_x = 0;
|
||||||
pizza->scroll_y = 0;
|
pizza->scroll_y = 0;
|
||||||
|
@@ -3445,5 +3445,59 @@ void wxWindow::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) )
|
|||||||
|
|
||||||
wxCHECK_RET( m_wxwindow != NULL, wxT("window needs client area for scrolling") );
|
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 );
|
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 );
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
@@ -187,6 +187,9 @@ gtk_pizza_init (GtkPizza *pizza)
|
|||||||
|
|
||||||
pizza->bin_window = NULL;
|
pizza->bin_window = NULL;
|
||||||
|
|
||||||
|
pizza->xoffset = 0;
|
||||||
|
pizza->yoffset = 0;
|
||||||
|
|
||||||
pizza->configure_serial = 0;
|
pizza->configure_serial = 0;
|
||||||
pizza->scroll_x = 0;
|
pizza->scroll_x = 0;
|
||||||
pizza->scroll_y = 0;
|
pizza->scroll_y = 0;
|
||||||
|
@@ -3445,5 +3445,59 @@ void wxWindow::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) )
|
|||||||
|
|
||||||
wxCHECK_RET( m_wxwindow != NULL, wxT("window needs client area for scrolling") );
|
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 );
|
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 );
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user