Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1070)

Unified Diff: ui/views/controls/button/label_button.cc

Issue 371633002: LabelButton: cache the last computed preferred size (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/views/controls/button/label_button.h ('k') | ui/views/controls/button/label_button_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « ui/views/controls/button/label_button.h ('k') | ui/views/controls/button/label_button_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698