Index: ui/views/controls/button/label_button.cc |
diff --git a/ui/views/controls/button/label_button.cc b/ui/views/controls/button/label_button.cc |
index 5ee97918dc9f794c1d1189ffa3e570449e6c16f7..229731f524f9fbfa4c6eca323290cc9992162a82 100644 |
--- a/ui/views/controls/button/label_button.cc |
+++ b/ui/views/controls/button/label_button.cc |
@@ -144,6 +144,16 @@ void LabelButton::SetHorizontalAlignment(gfx::HorizontalAlignment alignment) { |
InvalidateLayout(); |
} |
+void LabelButton::SetMinSize(const gfx::Size& min_size) { |
+ min_size_ = min_size; |
+ ResetCachedPreferredSize(); |
+} |
+ |
+void LabelButton::SetMaxSize(const gfx::Size& max_size) { |
+ max_size_ = max_size; |
+ ResetCachedPreferredSize(); |
+} |
+ |
void LabelButton::SetIsDefault(bool is_default) { |
if (is_default == is_default_) |
return; |
@@ -172,9 +182,9 @@ void LabelButton::SetStyle(ButtonStyle style) { |
SetFocusable(true); |
} |
if (style == STYLE_BUTTON) |
- set_min_size(gfx::Size(70, 33)); |
- |
+ SetMinSize(gfx::Size(70, 33)); |
OnNativeThemeChanged(GetNativeTheme()); |
+ ResetCachedPreferredSize(); |
} |
void LabelButton::SetFocusPainter(scoped_ptr<Painter> focus_painter) { |
@@ -182,6 +192,9 @@ void LabelButton::SetFocusPainter(scoped_ptr<Painter> focus_painter) { |
} |
gfx::Size LabelButton::GetPreferredSize() const { |
+ if (cached_preferred_size_valid_) |
+ return cached_preferred_size_; |
+ |
// Use a temporary label copy for sizing to avoid calculation side-effects. |
Label label(GetText(), cached_normal_font_list_); |
label.SetShadows(label_->shadows()); |
@@ -217,7 +230,11 @@ gfx::Size LabelButton::GetPreferredSize() const { |
size.set_width(std::min(max_size_.width(), size.width())); |
if (max_size_.height() > 0) |
size.set_height(std::min(max_size_.height(), size.height())); |
- return size; |
+ |
+ // Cache this computed size, as recomputing it is an expensive operation. |
+ cached_preferred_size_valid_ = true; |
+ cached_preferred_size_ = size; |
+ return cached_preferred_size_; |
} |
int LabelButton::GetHeightForWidth(int w) const { |
@@ -292,6 +309,7 @@ scoped_ptr<LabelButtonBorder> LabelButton::CreateDefaultBorder() const { |
void LabelButton::SetBorder(scoped_ptr<Border> border) { |
border_is_themed_border_ = false; |
View::SetBorder(border.Pass()); |
+ ResetCachedPreferredSize(); |
} |
gfx::Rect LabelButton::GetChildAreaBounds() { |
@@ -376,6 +394,7 @@ void LabelButton::ResetColorsFromNativeTheme() { |
void LabelButton::UpdateImage() { |
image_->SetImage(GetImage(state())); |
+ ResetCachedPreferredSize(); |
} |
void LabelButton::UpdateThemedBorder() { |
@@ -411,6 +430,7 @@ void LabelButton::StateChanged() { |
} |
void LabelButton::ChildPreferredSizeChanged(View* child) { |
+ ResetCachedPreferredSize(); |
PreferredSizeChanged(); |
} |
@@ -458,4 +478,9 @@ ui::NativeTheme::State LabelButton::GetForegroundThemeState( |
return ui::NativeTheme::kHovered; |
} |
+void LabelButton::ResetCachedPreferredSize() { |
+ cached_preferred_size_valid_ = false; |
+ cached_preferred_size_= gfx::Size(); |
+} |
+ |
} // namespace views |