From 150c8d89c7f5e04045e55391b34167f2c4165b8b Mon Sep 17 00:00:00 2001 From: Ron Lee Date: Mon, 27 Jan 2003 09:02:58 +0000 Subject: [PATCH] Fixed bug in FlexGridSizer mods that prevented them from ever shrinking. Reverted the earlier SetScrollbars patch and fixed a bug in GetVirtualSize that was hopefully the real cause of all the preceding woe. Added a comment and a kludge for a most unusual bug manifesting in the scrollsub sample. If it is resized quickly size events appear to get lost and the scrollbar is set incorrectly. Adding an extra call to AdjustScrollbars masks the problem, though its clearly superfluous since the FitInside above already calls it. This seems to be a brand new problem (on both Gtk and msw) as of some time prior to this patch and it should be looked into further. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@18959 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/common/sizer.cpp | 17 +++++++++++++++-- src/common/wincmn.cpp | 8 ++------ src/generic/scrlwing.cpp | 26 ++++++++++++-------------- src/gtk/scrolwin.cpp | 9 ++++++++- src/gtk1/scrolwin.cpp | 9 ++++++++- 5 files changed, 45 insertions(+), 24 deletions(-) diff --git a/src/common/sizer.cpp b/src/common/sizer.cpp index a0ee65773c..dfe492531d 100644 --- a/src/common/sizer.cpp +++ b/src/common/sizer.cpp @@ -1114,16 +1114,29 @@ void wxFlexGridSizer::RecalcSizes() wxSize wxFlexGridSizer::CalcMin() { - int nrows, ncols; + int nrows, + ncols; + size_t i, s; + if ( !CalcRowsCols(nrows, ncols) ) return wxSize(10, 10); + // We have to clear the old sizes out if any item has wxADJUST_MINSIZE + // set on it. Its probably quicker to just always do it than test for + // that though. At least do it before resizing the arrays, SetCount will + // initialise new elements to zero. + for( s = m_rowHeights.GetCount(), i = 0; i < s; ++i ) + m_rowHeights[ i ] = 0; + + for( s = m_colWidths.GetCount(), i = 0; i < s; ++i ) + m_colWidths[ i ] = 0; + m_rowHeights.SetCount(nrows); m_colWidths.SetCount(ncols); - int i = 0; wxSizerItemList::Node *node = m_children.GetFirst(); + i = 0; while (node) { wxSizerItem *item = node->GetData(); diff --git a/src/common/wincmn.cpp b/src/common/wincmn.cpp index aa805541da..65d02ccc85 100644 --- a/src/common/wincmn.cpp +++ b/src/common/wincmn.cpp @@ -634,12 +634,8 @@ wxSize wxWindowBase::DoGetVirtualSize() const { wxSize s( GetClientSize() ); - if( m_virtualSize.GetWidth() != -1 ) - s.SetWidth( m_virtualSize.GetWidth() ); - if( m_virtualSize.GetHeight() != -1 ) - s.SetHeight( m_virtualSize.GetHeight() ); - - return s; + return wxSize( wxMax( m_virtualSize.GetWidth(), s.GetWidth() ), + wxMax( m_virtualSize.GetHeight(), s.GetHeight() ) ); } // ---------------------------------------------------------------------------- diff --git a/src/generic/scrlwing.cpp b/src/generic/scrlwing.cpp index f516a8552d..944ff42b1e 100644 --- a/src/generic/scrlwing.cpp +++ b/src/generic/scrlwing.cpp @@ -344,23 +344,18 @@ void wxScrollHelper::SetScrollbars(int pixelsPerUnitX, m_xScrollPosition = xPos; m_yScrollPosition = yPos; + int w = noUnitsX * pixelsPerUnitX; + int h = noUnitsY * pixelsPerUnitY; + // For better backward compatibility we set persisting limits // here not just the size. It makes SetScrollbars 'sticky' // emulating the old non-autoscroll behaviour. - wxSize sz = m_targetWindow->GetClientSize(); -#if 1 - int x = wxMax(noUnitsX * pixelsPerUnitX, sz.x); - int y = wxMax(noUnitsY * pixelsPerUnitY, sz.y); -#else - int x = noUnitsX * pixelsPerUnitX; - int y = noUnitsY * pixelsPerUnitY; -#endif - m_targetWindow->SetVirtualSizeHints( x, y ); + m_targetWindow->SetVirtualSizeHints( w, h ); // The above should arguably be deprecated, this however we still need. - m_targetWindow->SetVirtualSize( x, y ); + m_targetWindow->SetVirtualSize( w, h ); if (do_refresh && !noRefresh) m_targetWindow->Refresh(TRUE, GetRect()); @@ -891,16 +886,19 @@ void wxScrollHelper::DoCalcUnscrolledPosition(int x, int y, int *xx, int *yy) co // Default OnSize resets scrollbars, if any void wxScrollHelper::HandleOnSize(wxSizeEvent& WXUNUSED(event)) { - if( m_win->GetAutoLayout() ) + if( m_win->GetAutoLayout() || m_targetWindow->GetAutoLayout() ) { if ( m_targetWindow != m_win ) m_targetWindow->FitInside(); m_win->FitInside(); -#if wxUSE_CONSTRAINTS - m_win->Layout(); -#endif + // FIXME: Something is really weird here... This should be + // called by FitInside above (and apparently is), yet the + // scrollsub sample will get the scrollbar wrong if resized + // quickly. This masks the bug, but is surely not the right + // answer at all. + AdjustScrollbars(); } else AdjustScrollbars(); diff --git a/src/gtk/scrolwin.cpp b/src/gtk/scrolwin.cpp index ff1c2da0a0..9a792a679e 100644 --- a/src/gtk/scrolwin.cpp +++ b/src/gtk/scrolwin.cpp @@ -833,12 +833,19 @@ bool wxScrolledWindow::Layout() // Default OnSize resets scrollbars, if any void wxScrolledWindow::OnSize(wxSizeEvent& WXUNUSED(event)) { - if( GetAutoLayout() ) + if( GetAutoLayout() || m_targetWindow->GetAutoLayout() ) { if( m_targetWindow != this ) m_targetWindow->FitInside(); FitInside(); + + // FIXME: Something is really weird here... This should be + // called by FitInside above (and apparently is), yet the + // scrollsub sample will get the scrollbar wrong if resized + // quickly. This masks the bug, but is surely not the right + // answer at all. + AdjustScrollbars(); } else { diff --git a/src/gtk1/scrolwin.cpp b/src/gtk1/scrolwin.cpp index ff1c2da0a0..9a792a679e 100644 --- a/src/gtk1/scrolwin.cpp +++ b/src/gtk1/scrolwin.cpp @@ -833,12 +833,19 @@ bool wxScrolledWindow::Layout() // Default OnSize resets scrollbars, if any void wxScrolledWindow::OnSize(wxSizeEvent& WXUNUSED(event)) { - if( GetAutoLayout() ) + if( GetAutoLayout() || m_targetWindow->GetAutoLayout() ) { if( m_targetWindow != this ) m_targetWindow->FitInside(); FitInside(); + + // FIXME: Something is really weird here... This should be + // called by FitInside above (and apparently is), yet the + // scrollsub sample will get the scrollbar wrong if resized + // quickly. This masks the bug, but is surely not the right + // answer at all. + AdjustScrollbars(); } else {