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

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

Issue 1018463004: Fix focus rectangle for label. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: GetFocusBounds Created 5 years, 9 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 unified diff | Download patch
« no previous file with comments | « ui/views/controls/label.h ('k') | ui/views/controls/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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/label.h" 5 #include "ui/views/controls/label.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cmath> 8 #include <cmath>
9 #include <limits> 9 #include <limits>
10 #include <vector> 10 #include <vector>
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 347
348 is_first_paint_text_ = false; 348 is_first_paint_text_ = false;
349 PaintText(canvas); 349 PaintText(canvas);
350 } else { 350 } else {
351 // TODO(vadimt): Remove ScopedTracker below once crbug.com/431326 is fixed. 351 // TODO(vadimt): Remove ScopedTracker below once crbug.com/431326 is fixed.
352 tracked_objects::ScopedTracker tracking_profile( 352 tracked_objects::ScopedTracker tracking_profile(
353 FROM_HERE_WITH_EXPLICIT_FUNCTION("431326 Label::PaintText not first")); 353 FROM_HERE_WITH_EXPLICIT_FUNCTION("431326 Label::PaintText not first"));
354 354
355 PaintText(canvas); 355 PaintText(canvas);
356 } 356 }
357 if (HasFocus()) { 357 if (HasFocus())
358 gfx::Rect focus_bounds = GetLocalBounds(); 358 canvas->DrawFocusRect(GetFocusBounds());
359 focus_bounds.Inset(-kFocusBorderPadding, -kFocusBorderPadding);
360 canvas->DrawFocusRect(focus_bounds);
361 }
362 } 359 }
363 360
364 void Label::OnNativeThemeChanged(const ui::NativeTheme* theme) { 361 void Label::OnNativeThemeChanged(const ui::NativeTheme* theme) {
365 UpdateColorsFromTheme(theme); 362 UpdateColorsFromTheme(theme);
366 } 363 }
367 364
368 void Label::OnDeviceScaleFactorChanged(float device_scale_factor) { 365 void Label::OnDeviceScaleFactorChanged(float device_scale_factor) {
369 View::OnDeviceScaleFactorChanged(device_scale_factor); 366 View::OnDeviceScaleFactorChanged(device_scale_factor);
370 // When the device scale factor is changed, some font rendering parameters is 367 // When the device scale factor is changed, some font rendering parameters is
371 // changed (especially, hinting). The bounding box of the text has to be 368 // changed (especially, hinting). The bounding box of the text has to be
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
426 render_text->SetCursorEnabled(false); 423 render_text->SetCursorEnabled(false);
427 render_text->SetText(text); 424 render_text->SetText(text);
428 return render_text.Pass(); 425 return render_text.Pass();
429 } 426 }
430 427
431 void Label::MaybeBuildRenderTextLines() { 428 void Label::MaybeBuildRenderTextLines() {
432 if (!lines_.empty()) 429 if (!lines_.empty())
433 return; 430 return;
434 431
435 gfx::Rect rect = GetContentsBounds(); 432 gfx::Rect rect = GetContentsBounds();
433 if (focusable())
434 rect.Inset(kFocusBorderPadding, kFocusBorderPadding);
436 if (rect.IsEmpty()) 435 if (rect.IsEmpty())
437 return; 436 return;
438 437
439 gfx::HorizontalAlignment alignment = horizontal_alignment(); 438 gfx::HorizontalAlignment alignment = horizontal_alignment();
440 gfx::DirectionalityMode directionality = render_text_->directionality_mode(); 439 gfx::DirectionalityMode directionality = render_text_->directionality_mode();
441 if (multi_line()) { 440 if (multi_line()) {
442 // Force the directionality and alignment of the first line on other lines. 441 // Force the directionality and alignment of the first line on other lines.
443 bool rtl = 442 bool rtl =
444 render_text_->GetDisplayTextDirection() == base::i18n::RIGHT_TO_LEFT; 443 render_text_->GetDisplayTextDirection() == base::i18n::RIGHT_TO_LEFT;
445 if (alignment == gfx::ALIGN_TO_HEAD) 444 if (alignment == gfx::ALIGN_TO_HEAD)
(...skipping 26 matching lines...) Expand all
472 lines_.push_back(line.release()); 471 lines_.push_back(line.release());
473 rect.set_y(rect.y() + rect.height()); 472 rect.set_y(rect.y() + rect.height());
474 } 473 }
475 // Append the remaining text to the last visible line. 474 // Append the remaining text to the last visible line.
476 for (size_t i = lines_.size(); i < lines.size(); ++i) 475 for (size_t i = lines_.size(); i < lines.size(); ++i)
477 lines_.back()->SetText(lines_.back()->text() + lines[i]); 476 lines_.back()->SetText(lines_.back()->text() + lines[i]);
478 } 477 }
479 RecalculateColors(); 478 RecalculateColors();
480 } 479 }
481 480
481 gfx::Rect Label::GetFocusBounds() {
482 MaybeBuildRenderTextLines();
483
484 gfx::Rect focus_bounds;
485 if (lines_.empty()) {
486 focus_bounds = gfx::Rect(GetTextSize());
487 } else {
488 for (size_t i = 0; i < lines_.size(); ++i) {
489 gfx::Point origin;
490 origin += lines_[i]->GetLineOffset(0);
491 focus_bounds.Union(gfx::Rect(origin, lines_[i]->GetStringSize()));
492 }
493 }
494
495 focus_bounds.Inset(-kFocusBorderPadding, -kFocusBorderPadding);
496 focus_bounds.Intersect(GetLocalBounds());
497 return focus_bounds;
498 }
499
482 std::vector<base::string16> Label::GetLinesForWidth(int width) const { 500 std::vector<base::string16> Label::GetLinesForWidth(int width) const {
483 std::vector<base::string16> lines; 501 std::vector<base::string16> lines;
484 const gfx::WordWrapBehavior wrap = 502 const gfx::WordWrapBehavior wrap =
485 allow_character_break_ ? gfx::WRAP_LONG_WORDS : gfx::TRUNCATE_LONG_WORDS; 503 allow_character_break_ ? gfx::WRAP_LONG_WORDS : gfx::TRUNCATE_LONG_WORDS;
486 gfx::ElideRectangleText(render_text_->GetDisplayText(), font_list(), width, 504 gfx::ElideRectangleText(render_text_->GetDisplayText(), font_list(), width,
487 std::numeric_limits<int>::max(), wrap, &lines); 505 std::numeric_limits<int>::max(), wrap, &lines);
488 return lines; 506 return lines;
489 } 507 }
490 508
491 gfx::Size Label::GetTextSize() const { 509 gfx::Size Label::GetTextSize() const {
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
554 } 572 }
555 573
556 bool Label::ShouldShowDefaultTooltip() const { 574 bool Label::ShouldShowDefaultTooltip() const {
557 const gfx::Size text_size = GetTextSize(); 575 const gfx::Size text_size = GetTextSize();
558 const gfx::Size size = GetContentsBounds().size(); 576 const gfx::Size size = GetContentsBounds().size();
559 return !obscured() && (text_size.width() > size.width() || 577 return !obscured() && (text_size.width() > size.width() ||
560 (multi_line() && text_size.height() > size.height())); 578 (multi_line() && text_size.height() > size.height()));
561 } 579 }
562 580
563 } // namespace views 581 } // namespace views
OLDNEW
« no previous file with comments | « ui/views/controls/label.h ('k') | ui/views/controls/label_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698