| 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
|
|
|