From 7bcbf187d0197d78ce4b2b15f2747f8ae1d6093a Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Tue, 6 Nov 2012 16:29:19 +0100 Subject: [PATCH] Optimize column preferred width calculation a bit. Move calculating the width of the column title itself out to OutlineView::GetColumnPreferredWidth(). Previously, each pass would compute the width of both the field itself and the column title, leading to considerable redundant work. Also, take outline level indent into account in the resulting width. Should improve performance a bit. --- src/kits/interface/ColumnListView.cpp | 17 +++++++++++------ src/kits/interface/ColumnTypes.cpp | 10 ++-------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/kits/interface/ColumnListView.cpp b/src/kits/interface/ColumnListView.cpp index 2462cb94a3..09168c7fc3 100644 --- a/src/kits/interface/ColumnListView.cpp +++ b/src/kits/interface/ColumnListView.cpp @@ -62,6 +62,7 @@ All rights reserved. #include #include #include +#include #include #include @@ -4783,16 +4784,20 @@ float OutlineView::GetColumnPreferredWidth(BColumn* column) { float preferred = 0.0; - for (RecursiveOutlineIterator iterator(&fRows); iterator.CurrentRow(); - iterator.GoToNext()) { - BRow* row = iterator.CurrentRow(); + for (RecursiveOutlineIterator iterator(&fRows); BRow* row = + iterator.CurrentRow(); iterator.GoToNext()) { BField* field = row->GetField(column->fFieldID); if (field) { - float width = column->GetPreferredWidth(field, this); - if (preferred < width) - preferred = width; + float width = column->GetPreferredWidth(field, this) + + iterator.CurrentLevel() * kOutlineLevelIndent; + preferred = max_c(preferred, width); } } + + BString name; + column->GetColumnName(&name); + preferred = max_c(preferred, StringWidth(name)); + // Constrain to preferred width. This makes the method do a little // more than asked, but it's for convenience. if (preferred < column->MinWidth()) diff --git a/src/kits/interface/ColumnTypes.cpp b/src/kits/interface/ColumnTypes.cpp index ef3404fee6..432476f23e 100644 --- a/src/kits/interface/ColumnTypes.cpp +++ b/src/kits/interface/ColumnTypes.cpp @@ -106,9 +106,7 @@ BTitledColumn::FontHeight() const float BTitledColumn::GetPreferredWidth(BField *_field, BView* parent) const { - BFont font; - parent->GetFont(&font); - return font.StringWidth(fTitle.String()) + 2 * kTEXT_MARGIN; + return parent->StringWidth(fTitle.String()) + 2 * kTEXT_MARGIN; } @@ -202,11 +200,7 @@ float BStringColumn::GetPreferredWidth(BField *_field, BView* parent) const { BStringField* field = static_cast(_field); - BFont font; - parent->GetFont(&font); - float width = font.StringWidth(field->String()) + 2 * kTEXT_MARGIN; - float parentWidth = BTitledColumn::GetPreferredWidth(_field, parent); - return max_c(width, parentWidth); + return parent->StringWidth(field->String()) + 2 * kTEXT_MARGIN; }