Avoid unnecessarily refreshing last column in generic wxDataViewCtrl

UpdateColumnSizes() was called whenever the control was modified in any way
since 4156e1a5c9 and it refreshed the entire
last column even if absolutely nothing changed.

Don't do this unless the last column width has really changed.
This commit is contained in:
Vadim Zeitlin
2016-03-05 19:51:06 +01:00
parent d613fb75f6
commit a9be974d5b
2 changed files with 21 additions and 6 deletions

View File

@@ -64,11 +64,10 @@ public:
virtual void SetWidth(int width) wxOVERRIDE
{
if ( width != m_width )
{
m_width = width;
UpdateDisplay();
}
// As a small optimization, use this method to avoid calling
// UpdateDisplay() if the width didn't really change, even if we don't
// care about its return value.
(void)WXUpdateWidth(width);
}
virtual int GetWidth() const wxOVERRIDE;
@@ -122,6 +121,18 @@ public:
UpdateDisplay();
}
// This method is specific to the generic implementation and is used only
// by wxWidgets itself.
bool WXUpdateWidth(int width)
{
if ( width == m_width )
return false;
m_width = width;
UpdateDisplay();
return true;
}
private:
// common part of all ctors

View File

@@ -4577,7 +4577,11 @@ void wxDataViewMainWindow::UpdateColumnSizes()
if ( lastColX < fullWinWidth )
{
int desiredWidth = wxMax(fullWinWidth - lastColX, lastCol->GetMinWidth());
lastCol->SetWidth(desiredWidth);
if ( !lastCol->WXUpdateWidth(desiredWidth) )
{
// The column width didn't change, no need to do anything else.
return;
}
// All columns fit on screen, so we don't need horizontal scrolling.
// To prevent flickering scrollbar when resizing the window to be