From: Jaakko Salli Date: Sun, 28 Feb 2010 10:16:49 +0000 (+0000) Subject: Sometimes change in varscrollable window's size can result in unused empty space... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/0fa9b2ed61307e4cc7ccf19441b1c047daee2a7f?ds=inline Sometimes change in varscrollable window's size can result in unused empty space after the last item. Fix it by decrementing first visible item position as long there is available space (fixes #11758). git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63570 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/generic/vscroll.cpp b/src/generic/vscroll.cpp index 7ce1079c42..809ae48576 100644 --- a/src/generic/vscroll.cpp +++ b/src/generic/vscroll.cpp @@ -674,6 +674,39 @@ bool wxVarScrollHelperBase::DoScrollPages(int pages) void wxVarScrollHelperBase::HandleOnSize(wxSizeEvent& event) { + if ( m_unitMax ) + { + // sometimes change in varscrollable window's size can result in + // unused empty space after the last item. Fix it by decrementing + // first visible item position according to the available space. + + // determine free space + const wxCoord sWindow = GetOrientationTargetSize(); + wxCoord s = 0; + size_t unit; + for ( unit = m_unitFirst; unit < m_unitMax; ++unit ) + { + if ( s > sWindow ) + break; + + s += OnGetUnitSize(unit); + } + wxCoord freeSpace = sWindow - s; + + // decrement first visible item index as long as there is free space + size_t idealUnitFirst; + for ( idealUnitFirst = m_unitFirst; + idealUnitFirst > 0; + idealUnitFirst-- ) + { + wxCoord us = OnGetUnitSize(idealUnitFirst-1); + if ( freeSpace < us ) + break; + freeSpace -= us; + } + m_unitFirst = idealUnitFirst; + } + UpdateScrollbar(); event.Skip();