added EstimateTotalHeight
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@21426 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -90,6 +90,25 @@ Just as with the ctor above, {\tt wxVSCROLL} style is always used, there is no
|
|||||||
need to specify it explicitly.
|
need to specify it explicitly.
|
||||||
|
|
||||||
|
|
||||||
|
\membersection{wxVScrolledWindow::EstimateTotalHeight}\label{wxvscrolledwindowestimatetotalheight}
|
||||||
|
|
||||||
|
\constfunc{virtual wxCoord}{EstimateTotalHeight}{\void}
|
||||||
|
|
||||||
|
This protected function is used internally by wxVScrolledWindow to estimate the
|
||||||
|
total height of the window when \helpref{SetLineCount}{wxvscrolledwindowsetlinecount}
|
||||||
|
is called. The default implementation uses the brute force approach if the
|
||||||
|
number of the items in the control is small enough. Otherwise, it tries to find
|
||||||
|
the average line height using some lines in the beginning, middle and the end.
|
||||||
|
|
||||||
|
If it is undesirable to access all these lines (some of which might be never
|
||||||
|
shown) just for the total height calculation, you may override the function and
|
||||||
|
provide your own guess better and/or faster.
|
||||||
|
|
||||||
|
Note that although returning a totally wrong value would still work, it risks
|
||||||
|
to result in very strange scrollbar behaviour so this function should really
|
||||||
|
try to make the best guess possible.
|
||||||
|
|
||||||
|
|
||||||
\membersection{wxVScrolledWindow::GetFirstVisibleLine}\label{wxvscrolledwindowgetfirstvisibleline}
|
\membersection{wxVScrolledWindow::GetFirstVisibleLine}\label{wxvscrolledwindowgetfirstvisibleline}
|
||||||
|
|
||||||
\constfunc{size\_t}{GetFirstVisibleLine}{\void}
|
\constfunc{size\_t}{GetFirstVisibleLine}{\void}
|
||||||
|
@@ -144,6 +144,16 @@ protected:
|
|||||||
// usual
|
// usual
|
||||||
virtual void OnGetLinesHint(size_t lineMin, size_t lineMax) const { }
|
virtual void OnGetLinesHint(size_t lineMin, size_t lineMax) const { }
|
||||||
|
|
||||||
|
// when the number of lines changes, we try to estimate the total height
|
||||||
|
// of all lines which is a rather expensive operation in terms of lines
|
||||||
|
// access, so if the user code may estimate the average height
|
||||||
|
// better/faster than we do, it should override this function to implement
|
||||||
|
// its own logic
|
||||||
|
//
|
||||||
|
// this function should return the best guess for the total height it may
|
||||||
|
// make
|
||||||
|
virtual wxCoord EstimateTotalHeight() const;
|
||||||
|
|
||||||
|
|
||||||
// the event handlers
|
// the event handlers
|
||||||
void OnSize(wxSizeEvent& event);
|
void OnSize(wxSizeEvent& event);
|
||||||
|
@@ -53,6 +53,38 @@ void wxVScrolledWindow::Init()
|
|||||||
// various helpers
|
// various helpers
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
wxCoord wxVScrolledWindow::EstimateTotalHeight() const
|
||||||
|
{
|
||||||
|
// estimate the total height: it is impossible to call
|
||||||
|
// OnGetLineHeight() for every line because there may be too many of
|
||||||
|
// them, so we just make a guess using some lines in the beginning,
|
||||||
|
// some in the end and some in the middle
|
||||||
|
static const size_t NUM_LINES_TO_SAMPLE = 10;
|
||||||
|
|
||||||
|
wxCoord heightTotal;
|
||||||
|
if ( m_lineMax < 3*NUM_LINES_TO_SAMPLE )
|
||||||
|
{
|
||||||
|
// in this case calculating exactly is faster and more correct than
|
||||||
|
// guessing
|
||||||
|
heightTotal = GetLinesHeight(0, m_lineMax);
|
||||||
|
}
|
||||||
|
else // too many lines to calculate exactly
|
||||||
|
{
|
||||||
|
// look at some lines in the beginning/middle/end
|
||||||
|
heightTotal =
|
||||||
|
GetLinesHeight(0, NUM_LINES_TO_SAMPLE) +
|
||||||
|
GetLinesHeight(m_lineMax - NUM_LINES_TO_SAMPLE, m_lineMax) +
|
||||||
|
GetLinesHeight(m_lineMax/2 - NUM_LINES_TO_SAMPLE/2,
|
||||||
|
m_lineMax/2 + NUM_LINES_TO_SAMPLE/2);
|
||||||
|
|
||||||
|
// use the height of the lines we looked as the average
|
||||||
|
heightTotal = (wxCoord)
|
||||||
|
(((float)m_heightTotal / (3*NUM_LINES_TO_SAMPLE)) * m_lineMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
return heightTotal;
|
||||||
|
}
|
||||||
|
|
||||||
wxCoord wxVScrolledWindow::GetLinesHeight(size_t lineMin, size_t lineMax) const
|
wxCoord wxVScrolledWindow::GetLinesHeight(size_t lineMin, size_t lineMax) const
|
||||||
{
|
{
|
||||||
if ( lineMin == lineMax )
|
if ( lineMin == lineMax )
|
||||||
@@ -147,33 +179,8 @@ void wxVScrolledWindow::SetLineCount(size_t count)
|
|||||||
// save the number of lines
|
// save the number of lines
|
||||||
m_lineMax = count;
|
m_lineMax = count;
|
||||||
|
|
||||||
|
// and our estimate for their total height
|
||||||
// estimate the total height: it is impossible to call
|
m_heightTotal = EstimateTotalHeight();
|
||||||
// OnGetLineHeight() for every line because there may be too many of
|
|
||||||
// them, so we just make a guess using some lines in the beginning,
|
|
||||||
// some in the end and some in the middle
|
|
||||||
static const size_t NUM_LINES_TO_SAMPLE = 10;
|
|
||||||
|
|
||||||
if ( count < 3*NUM_LINES_TO_SAMPLE )
|
|
||||||
{
|
|
||||||
// in this case calculating exactly is faster and more correct than
|
|
||||||
// guessing
|
|
||||||
m_heightTotal = GetLinesHeight(0, m_lineMax);
|
|
||||||
}
|
|
||||||
else // too many lines to calculate exactly
|
|
||||||
{
|
|
||||||
// look at some lines in the beginning/middle/end
|
|
||||||
m_heightTotal =
|
|
||||||
GetLinesHeight(0, NUM_LINES_TO_SAMPLE) +
|
|
||||||
GetLinesHeight(count - NUM_LINES_TO_SAMPLE, count) +
|
|
||||||
GetLinesHeight(count/2 - NUM_LINES_TO_SAMPLE/2,
|
|
||||||
count/2 + NUM_LINES_TO_SAMPLE/2);
|
|
||||||
|
|
||||||
// use the height of the lines we looked as the average
|
|
||||||
m_heightTotal = (wxCoord)
|
|
||||||
(((float)m_heightTotal / (3*NUM_LINES_TO_SAMPLE)) * m_lineMax);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// recalculate the scrollbars parameters
|
// recalculate the scrollbars parameters
|
||||||
m_lineFirst = 1; // make sure it is != 0
|
m_lineFirst = 1; // make sure it is != 0
|
||||||
|
Reference in New Issue
Block a user