ListBox perf improvements
On Windows, reduces trips through the windows message system, substantially increasing performance of long list boxes (such as in the footprint assignment tool)
This commit is contained in:
parent
4a489a5d16
commit
0e758d6bc2
|
@ -48,33 +48,43 @@ ITEMS_LISTBOX_BASE::~ITEMS_LISTBOX_BASE()
|
||||||
|
|
||||||
void ITEMS_LISTBOX_BASE::UpdateWidth( int aLine )
|
void ITEMS_LISTBOX_BASE::UpdateWidth( int aLine )
|
||||||
{
|
{
|
||||||
|
wxClientDC dc( this );
|
||||||
|
int itemCount = GetItemCount();
|
||||||
|
|
||||||
// Less than zero: recalculate width of all items.
|
// Less than zero: recalculate width of all items.
|
||||||
if( aLine < 0 )
|
if( aLine < 0 )
|
||||||
{
|
{
|
||||||
columnWidth = 0;
|
columnWidth = 0;
|
||||||
for( int ii = 0; ii < GetItemCount(); ii++ )
|
for( int ii = 0; ii < itemCount; ii++ )
|
||||||
{
|
{
|
||||||
UpdateLineWidth( (unsigned)ii );
|
UpdateLineWidth( (unsigned)ii, dc );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Zero or above: update from a single line.
|
// Zero or above: update from a single line.
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if( aLine < GetItemCount() )
|
if( aLine < itemCount )
|
||||||
UpdateLineWidth( (unsigned)aLine );
|
UpdateLineWidth( (unsigned)aLine, dc );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ITEMS_LISTBOX_BASE::UpdateLineWidth( unsigned aLine )
|
void ITEMS_LISTBOX_BASE::UpdateLineWidth( unsigned aLine, wxClientDC& dc )
|
||||||
{
|
{
|
||||||
wxClientDC dc( this );
|
|
||||||
wxCoord w;
|
wxCoord w;
|
||||||
int newWidth = 10; // Value of AUTOSIZE_COL_MARGIN from wxWidgets source.
|
int newWidth = 10; // Value of AUTOSIZE_COL_MARGIN from wxWidgets source.
|
||||||
|
wxString str;
|
||||||
|
|
||||||
dc.SetFont( GetFont() );
|
dc.SetFont( GetFont() );
|
||||||
dc.GetTextExtent( GetItemText( aLine, 0 ) + " ", &w, nullptr );
|
|
||||||
|
if( IsVirtual() )
|
||||||
|
str = OnGetItemText( aLine, 0 );
|
||||||
|
else
|
||||||
|
str = GetItemText( aLine, 0 );
|
||||||
|
str += " ";
|
||||||
|
|
||||||
|
dc.GetTextExtent( str, &w, nullptr );
|
||||||
newWidth += w;
|
newWidth += w;
|
||||||
|
|
||||||
if( newWidth > columnWidth )
|
if( newWidth > columnWidth )
|
||||||
|
@ -93,8 +103,10 @@ int ITEMS_LISTBOX_BASE::GetSelection()
|
||||||
|
|
||||||
void ITEMS_LISTBOX_BASE::DeselectAll()
|
void ITEMS_LISTBOX_BASE::DeselectAll()
|
||||||
{
|
{
|
||||||
for( int i = 0; i < GetItemCount(); i++ )
|
for( int i = GetFirstSelected(); i >= 0; i = GetNextSelected(i))
|
||||||
|
{
|
||||||
Select( i, false );
|
Select( i, false );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -76,7 +76,7 @@ private:
|
||||||
* if needed. This is effectively the wxListCtrl code for autosizing.
|
* if needed. This is effectively the wxListCtrl code for autosizing.
|
||||||
* NB. it relies on the caller checking the given line number is valid.
|
* NB. it relies on the caller checking the given line number is valid.
|
||||||
*/
|
*/
|
||||||
void UpdateLineWidth( unsigned aLine );
|
void UpdateLineWidth( unsigned aLine, wxClientDC& dc );
|
||||||
|
|
||||||
int columnWidth;
|
int columnWidth;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue