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

Side by Side Diff: ui/views/controls/styled_label.cc

Issue 734923003: Fixed StyledLabel size caching (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: code review changes Created 6 years 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 unified diff | Download patch
« no previous file with comments | « ui/views/controls/styled_label.h ('k') | ui/views/controls/styled_label_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/views/controls/styled_label.h" 5 #include "ui/views/controls/styled_label.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/strings/string_util.h" 9 #include "base/strings/string_util.h"
10 #include "ui/gfx/font_list.h" 10 #include "ui/gfx/font_list.h"
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 } 90 }
91 91
92 92
93 // StyledLabel ---------------------------------------------------------------- 93 // StyledLabel ----------------------------------------------------------------
94 94
95 StyledLabel::StyledLabel(const base::string16& text, 95 StyledLabel::StyledLabel(const base::string16& text,
96 StyledLabelListener* listener) 96 StyledLabelListener* listener)
97 : specified_line_height_(0), 97 : specified_line_height_(0),
98 listener_(listener), 98 listener_(listener),
99 displayed_on_background_color_set_(false), 99 displayed_on_background_color_set_(false),
100 auto_color_readability_enabled_(true) { 100 auto_color_readability_enabled_(true),
101 layout_built_for_width_(0) {
101 base::TrimWhitespace(text, base::TRIM_TRAILING, &text_); 102 base::TrimWhitespace(text, base::TRIM_TRAILING, &text_);
102 } 103 }
103 104
104 StyledLabel::~StyledLabel() {} 105 StyledLabel::~StyledLabel() {}
105 106
106 void StyledLabel::SetText(const base::string16& text) { 107 void StyledLabel::SetText(const base::string16& text) {
107 text_ = text; 108 text_ = text;
108 style_ranges_.clear(); 109 style_ranges_.clear();
109 RemoveAllChildViews(true); 110 RemoveAllChildViews(true);
110 PreferredSizeChanged(); 111 PreferredSizeChanged();
(...skipping 22 matching lines...) Expand all
133 default_style_info_ = style_info; 134 default_style_info_ = style_info;
134 PreferredSizeChanged(); 135 PreferredSizeChanged();
135 } 136 }
136 137
137 void StyledLabel::SetLineHeight(int line_height) { 138 void StyledLabel::SetLineHeight(int line_height) {
138 specified_line_height_ = line_height; 139 specified_line_height_ = line_height;
139 PreferredSizeChanged(); 140 PreferredSizeChanged();
140 } 141 }
141 142
142 void StyledLabel::SetDisplayedOnBackgroundColor(SkColor color) { 143 void StyledLabel::SetDisplayedOnBackgroundColor(SkColor color) {
144 if (displayed_on_background_color_ == color)
145 return;
146
143 displayed_on_background_color_ = color; 147 displayed_on_background_color_ = color;
144 displayed_on_background_color_set_ = true; 148 displayed_on_background_color_set_ = true;
149
150 for (int i = 0, count = child_count(); i < count; ++i) {
151 static_cast<Label*>(child_at(i))->
sky 2014/12/11 15:48:54 DCHECK the class name of the child is Label::kView
edjomin 2014/12/12 08:58:23 Done.
152 SetBackgroundColor(displayed_on_background_color_);
153 }
145 } 154 }
146 155
147 gfx::Insets StyledLabel::GetInsets() const { 156 gfx::Insets StyledLabel::GetInsets() const {
148 gfx::Insets insets = View::GetInsets(); 157 gfx::Insets insets = View::GetInsets();
149 158
150 // We need a focus border iff we contain a link that will have a focus border. 159 // We need a focus border iff we contain a link that will have a focus border.
151 // That in turn will be true only if the link is non-empty. 160 // That in turn will be true only if the link is non-empty.
152 for (StyleRanges::const_iterator i(style_ranges_.begin()); 161 for (StyleRanges::const_iterator i(style_ranges_.begin());
153 i != style_ranges_.end(); ++i) { 162 i != style_ranges_.end(); ++i) {
154 if (i->style_info.is_link && !i->range.is_empty()) { 163 if (i->style_info.is_link && !i->range.is_empty()) {
155 const gfx::Insets focus_border_padding( 164 const gfx::Insets focus_border_padding(
156 Label::kFocusBorderPadding, Label::kFocusBorderPadding, 165 Label::kFocusBorderPadding, Label::kFocusBorderPadding,
157 Label::kFocusBorderPadding, Label::kFocusBorderPadding); 166 Label::kFocusBorderPadding, Label::kFocusBorderPadding);
158 insets += focus_border_padding; 167 insets += focus_border_padding;
159 break; 168 break;
160 } 169 }
161 } 170 }
162 171
163 return insets; 172 return insets;
164 } 173 }
165 174
166 int StyledLabel::GetHeightForWidth(int w) const { 175 int StyledLabel::GetHeightForWidth(int w) const {
167 if (w != calculated_size_.width()) { 176 // TODO(erg): Munge the const-ness of the style label. CalculateAndDoLayout
168 // TODO(erg): Munge the const-ness of the style label. CalculateAndDoLayout 177 // doesn't actually make any changes to member variables when |dry_run| is
169 // doesn't actually make any changes to member variables when |dry_run| is 178 // set to true. In general, the mutating and non-mutating parts shouldn't
170 // set to true. In general, the mutating and non-mutating parts shouldn't 179 // be in the same codepath.
171 // be in the same codepath. 180
172 calculated_size_ = 181 // do not store calculated_size_ for dry_run call.
sky 2014/12/11 15:48:53 Update your comment, and make sure you capitalize
edjomin 2014/12/12 08:58:23 Done.
edjomin 2014/12/12 08:58:23 Removed this comment because it's useless now, sor
173 const_cast<StyledLabel*>(this)->CalculateAndDoLayout(w, true); 182 // calculated_size_ should be cached for non-dry calls only,
174 } 183 // because they create controls alongside with size calculation
184 // otherwise all caching is useless
185 calculated_size_ =
186 const_cast<StyledLabel*>(this)->CalculateAndDoLayout(w, true);
175 return calculated_size_.height(); 187 return calculated_size_.height();
176 } 188 }
177 189
178 void StyledLabel::Layout() { 190 void StyledLabel::Layout() {
179 calculated_size_ = CalculateAndDoLayout(GetLocalBounds().width(), false); 191 calculated_size_ = CalculateAndDoLayout(GetLocalBounds().width(), false);
192 layout_built_for_width_ = calculated_size_.width();
180 } 193 }
181 194
182 void StyledLabel::PreferredSizeChanged() { 195 void StyledLabel::PreferredSizeChanged() {
183 calculated_size_ = gfx::Size(); 196 calculated_size_ = gfx::Size();
184 View::PreferredSizeChanged(); 197 View::PreferredSizeChanged();
185 } 198 }
186 199
187 void StyledLabel::LinkClicked(Link* source, int event_flags) { 200 void StyledLabel::LinkClicked(Link* source, int event_flags) {
188 if (listener_) 201 if (listener_)
189 listener_->StyledLabelLinkClicked(link_targets_[source], event_flags); 202 listener_->StyledLabelLinkClicked(link_targets_[source], event_flags);
190 } 203 }
191 204
192 gfx::Size StyledLabel::CalculateAndDoLayout(int width, bool dry_run) { 205 gfx::Size StyledLabel::CalculateAndDoLayout(int width, bool dry_run) {
206 width -= GetInsets().width();
207 if (width == calculated_size_.width() &&
208 (dry_run || layout_built_for_width_ == width))
209 return calculated_size_;
210
193 if (!dry_run) { 211 if (!dry_run) {
194 RemoveAllChildViews(true); 212 RemoveAllChildViews(true);
195 link_targets_.clear(); 213 link_targets_.clear();
196 } 214 }
197 215
198 width -= GetInsets().width();
199 if (width <= 0 || text_.empty()) 216 if (width <= 0 || text_.empty())
200 return gfx::Size(); 217 return gfx::Size();
201 218
202 const int line_height = specified_line_height_ > 0 ? specified_line_height_ 219 const int line_height = specified_line_height_ > 0 ? specified_line_height_
203 : CalculateLineHeight(font_list_); 220 : CalculateLineHeight(font_list_);
204 // The index of the line we're on. 221 // The index of the line we're on.
205 int line = 0; 222 int line = 0;
206 // The x position (in pixels) of the line we're on, relative to content 223 // The x position (in pixels) of the line we're on, relative to content
207 // bounds. 224 // bounds.
208 int x = 0; 225 int x = 0;
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
316 } 333 }
317 334
318 // The user-specified line height only applies to interline spacing, so the 335 // The user-specified line height only applies to interline spacing, so the
319 // final line's height is unaffected. 336 // final line's height is unaffected.
320 int total_height = line * line_height + 337 int total_height = line * line_height +
321 CalculateLineHeight(font_list_) + GetInsets().height(); 338 CalculateLineHeight(font_list_) + GetInsets().height();
322 return gfx::Size(width, total_height); 339 return gfx::Size(width, total_height);
323 } 340 }
324 341
325 } // namespace views 342 } // namespace views
OLDNEW
« no previous file with comments | « ui/views/controls/styled_label.h ('k') | ui/views/controls/styled_label_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698