Added wxRegion::Offset(x,y)

Go to plan B: wxWindow::Scroll() now moved the
    m_updateRegion for later processing.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13930 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2002-01-30 17:25:18 +00:00
parent a2717c3d0c
commit 35917d228a
9 changed files with 57 additions and 46 deletions

View File

@@ -1,6 +1,19 @@
*** wxWindows 2.3.3 *** *** wxWindows 2.3.3 ***
New behaviour for wxWindow::Refresh() as it now produces a
delayed refresh. Call the new wxWindow::Update() to force
an immediate update.
Support for more SGI hardware (12-bit mode among others).
Changed wxDC::Blit() to honour source DC's logical coordinates.
Implemented wxIdleEvent::RequestMore() for simple background
tasks (unlike thread work).
Various updates to wxHTML.
Some wxFont changes for better mixing of native fonts Some wxFont changes for better mixing of native fonts
and wxFont's accessors. and wxFont's accessors.

View File

@@ -67,6 +67,8 @@ public:
void Clear(); void Clear();
bool Offset( wxCoord x, wxCoord y );
bool Union( wxCoord x, wxCoord y, wxCoord width, wxCoord height ); bool Union( wxCoord x, wxCoord y, wxCoord width, wxCoord height );
bool Union( const wxRect& rect ); bool Union( const wxRect& rect );
bool Union( const wxRegion& region ); bool Union( const wxRegion& region );

View File

@@ -67,6 +67,8 @@ public:
void Clear(); void Clear();
bool Offset( wxCoord x, wxCoord y );
bool Union( wxCoord x, wxCoord y, wxCoord width, wxCoord height ); bool Union( wxCoord x, wxCoord y, wxCoord width, wxCoord height );
bool Union( const wxRect& rect ); bool Union( const wxRect& rect );
bool Union( const wxRegion& region ); bool Union( const wxRegion& region );

View File

@@ -516,6 +516,16 @@ wxRect wxRegion::GetBox() const
return wxRect( x, y, w, h ); return wxRect( x, y, w, h );
} }
bool wxRegion::Offset( wxCoord x, wxCoord y )
{
if (!m_refData)
return FALSE;
gdk_region_offset( M_REGIONDATA->m_region, x, y );
return TRUE;
}
bool wxRegion::Empty() const bool wxRegion::Empty() const
{ {
if (!m_refData) if (!m_refData)

View File

@@ -320,9 +320,6 @@ void wxScrolledWindow::SetScrollbars (int pixelsPerUnitX, int pixelsPerUnitY,
int noUnitsX, int noUnitsY, int noUnitsX, int noUnitsY,
int xPos, int yPos, bool noRefresh ) int xPos, int yPos, bool noRefresh )
{ {
// Update any invalidates areas before the get moved/scrolled.
Update();
int old_x = m_xScrollPixelsPerLine * m_xScrollPosition; int old_x = m_xScrollPixelsPerLine * m_xScrollPosition;
int old_y = m_yScrollPixelsPerLine * m_yScrollPosition; int old_y = m_yScrollPixelsPerLine * m_yScrollPosition;
@@ -358,9 +355,6 @@ void wxScrolledWindow::SetScrollbars (int pixelsPerUnitX, int pixelsPerUnitY,
void wxScrolledWindow::AdjustScrollbars() void wxScrolledWindow::AdjustScrollbars()
{ {
// Update any invalidates areas before the get moved/scrolled.
Update();
int w, h; int w, h;
m_targetWindow->GetClientSize( &w, &h ); m_targetWindow->GetClientSize( &w, &h );
@@ -435,9 +429,6 @@ void wxScrolledWindow::OnScroll(wxScrollWinEvent& event)
int nScrollInc = CalcScrollInc(event); int nScrollInc = CalcScrollInc(event);
if (nScrollInc == 0) return; if (nScrollInc == 0) return;
// Update any invalidates areas before the get moved/scrolled.
Update();
if (orient == wxHORIZONTAL) if (orient == wxHORIZONTAL)
{ {
int newPos = m_xScrollPosition + nScrollInc; int newPos = m_xScrollPosition + nScrollInc;
@@ -482,9 +473,6 @@ void wxScrolledWindow::Scroll( int x_pos, int y_pos )
if (((x_pos == -1) || (x_pos == m_xScrollPosition)) && if (((x_pos == -1) || (x_pos == m_xScrollPosition)) &&
((y_pos == -1) || (y_pos == m_yScrollPosition))) return; ((y_pos == -1) || (y_pos == m_yScrollPosition))) return;
// Update any invalidates areas before the get moved/scrolled.
Update();
if ((x_pos != -1) && (m_xScrollPixelsPerLine)) if ((x_pos != -1) && (m_xScrollPixelsPerLine))
{ {
int max = (int)(m_hAdjust->upper - m_hAdjust->page_size + 0.5); int max = (int)(m_hAdjust->upper - m_hAdjust->page_size + 0.5);
@@ -537,9 +525,6 @@ void wxScrolledWindow::GtkVScroll( float value )
if (y_pos == m_yScrollPosition) if (y_pos == m_yScrollPosition)
return; return;
// Update any invalidates areas before the get moved/scrolled.
Update();
GtkScrolledWindow *scrolledWindow = GTK_SCROLLED_WINDOW(m_widget); GtkScrolledWindow *scrolledWindow = GTK_SCROLLED_WINDOW(m_widget);
GtkRange *range = GTK_RANGE(scrolledWindow->vscrollbar); GtkRange *range = GTK_RANGE(scrolledWindow->vscrollbar);
@@ -567,9 +552,6 @@ void wxScrolledWindow::GtkHScroll( float value )
if (x_pos == m_xScrollPosition) if (x_pos == m_xScrollPosition)
return; return;
// Update any invalidates areas before the get moved/scrolled.
Update();
GtkScrolledWindow *scrolledWindow = GTK_SCROLLED_WINDOW(m_widget); GtkScrolledWindow *scrolledWindow = GTK_SCROLLED_WINDOW(m_widget);
GtkRange *range = GTK_RANGE(scrolledWindow->hscrollbar); GtkRange *range = GTK_RANGE(scrolledWindow->hscrollbar);
@@ -714,11 +696,6 @@ void wxScrolledWindow::SetScrollPos( int orient, int pos, bool refresh )
wxCHECK_RET( m_wxwindow != NULL, wxT("window needs client area for scrolling") ); wxCHECK_RET( m_wxwindow != NULL, wxT("window needs client area for scrolling") );
// Update any invalidates areas before the get moved/scrolled.
// We ignore the refresh parameter here because it is meant
// to control the behaviour AFTER scrolling happens.
Update();
if (orient == wxHORIZONTAL) if (orient == wxHORIZONTAL)
{ {
int max = (int)(m_hAdjust->upper - m_hAdjust->page_size + 0.5); int max = (int)(m_hAdjust->upper - m_hAdjust->page_size + 0.5);

View File

@@ -4091,6 +4091,16 @@ void wxWindowGTK::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) )
// No scrolling requested. // No scrolling requested.
if ((dx == 0) && (dy == 0)) return; if ((dx == 0) && (dy == 0)) return;
if (!m_updateRegion.IsEmpty())
{
m_updateRegion.Offset( dx, dy );
int cw = 0;
int ch = 0;
GetClientSize( &cw, &ch );
m_updateRegion.Intersect( 0, 0, cw, ch );
}
#if 1 #if 1
m_clipPaintRegion = TRUE; m_clipPaintRegion = TRUE;

View File

@@ -516,6 +516,16 @@ wxRect wxRegion::GetBox() const
return wxRect( x, y, w, h ); return wxRect( x, y, w, h );
} }
bool wxRegion::Offset( wxCoord x, wxCoord y )
{
if (!m_refData)
return FALSE;
gdk_region_offset( M_REGIONDATA->m_region, x, y );
return TRUE;
}
bool wxRegion::Empty() const bool wxRegion::Empty() const
{ {
if (!m_refData) if (!m_refData)

View File

@@ -320,9 +320,6 @@ void wxScrolledWindow::SetScrollbars (int pixelsPerUnitX, int pixelsPerUnitY,
int noUnitsX, int noUnitsY, int noUnitsX, int noUnitsY,
int xPos, int yPos, bool noRefresh ) int xPos, int yPos, bool noRefresh )
{ {
// Update any invalidates areas before the get moved/scrolled.
Update();
int old_x = m_xScrollPixelsPerLine * m_xScrollPosition; int old_x = m_xScrollPixelsPerLine * m_xScrollPosition;
int old_y = m_yScrollPixelsPerLine * m_yScrollPosition; int old_y = m_yScrollPixelsPerLine * m_yScrollPosition;
@@ -358,9 +355,6 @@ void wxScrolledWindow::SetScrollbars (int pixelsPerUnitX, int pixelsPerUnitY,
void wxScrolledWindow::AdjustScrollbars() void wxScrolledWindow::AdjustScrollbars()
{ {
// Update any invalidates areas before the get moved/scrolled.
Update();
int w, h; int w, h;
m_targetWindow->GetClientSize( &w, &h ); m_targetWindow->GetClientSize( &w, &h );
@@ -435,9 +429,6 @@ void wxScrolledWindow::OnScroll(wxScrollWinEvent& event)
int nScrollInc = CalcScrollInc(event); int nScrollInc = CalcScrollInc(event);
if (nScrollInc == 0) return; if (nScrollInc == 0) return;
// Update any invalidates areas before the get moved/scrolled.
Update();
if (orient == wxHORIZONTAL) if (orient == wxHORIZONTAL)
{ {
int newPos = m_xScrollPosition + nScrollInc; int newPos = m_xScrollPosition + nScrollInc;
@@ -482,9 +473,6 @@ void wxScrolledWindow::Scroll( int x_pos, int y_pos )
if (((x_pos == -1) || (x_pos == m_xScrollPosition)) && if (((x_pos == -1) || (x_pos == m_xScrollPosition)) &&
((y_pos == -1) || (y_pos == m_yScrollPosition))) return; ((y_pos == -1) || (y_pos == m_yScrollPosition))) return;
// Update any invalidates areas before the get moved/scrolled.
Update();
if ((x_pos != -1) && (m_xScrollPixelsPerLine)) if ((x_pos != -1) && (m_xScrollPixelsPerLine))
{ {
int max = (int)(m_hAdjust->upper - m_hAdjust->page_size + 0.5); int max = (int)(m_hAdjust->upper - m_hAdjust->page_size + 0.5);
@@ -537,9 +525,6 @@ void wxScrolledWindow::GtkVScroll( float value )
if (y_pos == m_yScrollPosition) if (y_pos == m_yScrollPosition)
return; return;
// Update any invalidates areas before the get moved/scrolled.
Update();
GtkScrolledWindow *scrolledWindow = GTK_SCROLLED_WINDOW(m_widget); GtkScrolledWindow *scrolledWindow = GTK_SCROLLED_WINDOW(m_widget);
GtkRange *range = GTK_RANGE(scrolledWindow->vscrollbar); GtkRange *range = GTK_RANGE(scrolledWindow->vscrollbar);
@@ -567,9 +552,6 @@ void wxScrolledWindow::GtkHScroll( float value )
if (x_pos == m_xScrollPosition) if (x_pos == m_xScrollPosition)
return; return;
// Update any invalidates areas before the get moved/scrolled.
Update();
GtkScrolledWindow *scrolledWindow = GTK_SCROLLED_WINDOW(m_widget); GtkScrolledWindow *scrolledWindow = GTK_SCROLLED_WINDOW(m_widget);
GtkRange *range = GTK_RANGE(scrolledWindow->hscrollbar); GtkRange *range = GTK_RANGE(scrolledWindow->hscrollbar);
@@ -714,11 +696,6 @@ void wxScrolledWindow::SetScrollPos( int orient, int pos, bool refresh )
wxCHECK_RET( m_wxwindow != NULL, wxT("window needs client area for scrolling") ); wxCHECK_RET( m_wxwindow != NULL, wxT("window needs client area for scrolling") );
// Update any invalidates areas before the get moved/scrolled.
// We ignore the refresh parameter here because it is meant
// to control the behaviour AFTER scrolling happens.
Update();
if (orient == wxHORIZONTAL) if (orient == wxHORIZONTAL)
{ {
int max = (int)(m_hAdjust->upper - m_hAdjust->page_size + 0.5); int max = (int)(m_hAdjust->upper - m_hAdjust->page_size + 0.5);

View File

@@ -4091,6 +4091,16 @@ void wxWindowGTK::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) )
// No scrolling requested. // No scrolling requested.
if ((dx == 0) && (dy == 0)) return; if ((dx == 0) && (dy == 0)) return;
if (!m_updateRegion.IsEmpty())
{
m_updateRegion.Offset( dx, dy );
int cw = 0;
int ch = 0;
GetClientSize( &cw, &ch );
m_updateRegion.Intersect( 0, 0, cw, ch );
}
#if 1 #if 1
m_clipPaintRegion = TRUE; m_clipPaintRegion = TRUE;