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

Side by Side Diff: ui/views/controls/button/text_button.cc

Issue 284033002: Allow TextButton derivatives to override drawing of certain parts. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address review comments Created 6 years, 7 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 | Annotate | Revision Log
« no previous file with comments | « ui/views/controls/button/text_button.h ('k') | no next file » | 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/button/text_button.h" 5 #include "ui/views/controls/button/text_button.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "grit/ui_resources.h" 10 #include "grit/ui_resources.h"
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after
351 int h = font_list_.GetHeight(); 351 int h = font_list_.GetHeight();
352 int w = multi_line_ ? max_width : 0; 352 int w = multi_line_ ? max_width : 0;
353 int flags = ComputeCanvasStringFlags(); 353 int flags = ComputeCanvasStringFlags();
354 if (!multi_line_) 354 if (!multi_line_)
355 flags |= gfx::Canvas::NO_ELLIPSIS; 355 flags |= gfx::Canvas::NO_ELLIPSIS;
356 356
357 gfx::Canvas::SizeStringInt(text_, font_list_, &w, &h, 0, flags); 357 gfx::Canvas::SizeStringInt(text_, font_list_, &w, &h, 0, flags);
358 text_size->SetSize(w, h); 358 text_size->SetSize(w, h);
359 } 359 }
360 360
361 void TextButtonBase::OnPaintText(gfx::Canvas* canvas, PaintButtonMode mode) {
362 gfx::Rect text_bounds(GetTextBounds());
363 if (text_bounds.width() > 0) {
364 // Because the text button can (at times) draw multiple elements on the
365 // canvas, we can not mirror the button by simply flipping the canvas as
366 // doing this will mirror the text itself. Flipping the canvas will also
367 // make the icons look wrong because icons are almost always represented as
368 // direction-insensitive images and such images should never be flipped
369 // horizontally.
370 //
371 // Due to the above, we must perform the flipping manually for RTL UIs.
372 text_bounds.set_x(GetMirroredXForRect(text_bounds));
373
374 SkColor text_color = (show_multiple_icon_states_ &&
375 (state() == STATE_HOVERED || state() == STATE_PRESSED)) ?
376 color_hover_ : color_;
377
378 int draw_string_flags = gfx::Canvas::DefaultCanvasTextAlignment() |
379 ComputeCanvasStringFlags();
380
381 if (mode == PB_FOR_DRAG) {
382 // Disable sub-pixel rendering as background is transparent.
383 draw_string_flags |= gfx::Canvas::NO_SUBPIXEL_RENDERING;
384 canvas->DrawStringRectWithHalo(text_, font_list_,
385 SK_ColorBLACK, SK_ColorWHITE,
386 text_bounds, draw_string_flags);
387 } else {
388 canvas->DrawStringRectWithFlags(text_, font_list_, text_color,
389 text_bounds, draw_string_flags);
390 }
391 }
392 }
393
361 int TextButtonBase::ComputeCanvasStringFlags() const { 394 int TextButtonBase::ComputeCanvasStringFlags() const {
362 if (!multi_line_) 395 if (!multi_line_)
363 return 0; 396 return 0;
364 397
365 int flags = gfx::Canvas::MULTI_LINE; 398 int flags = gfx::Canvas::MULTI_LINE;
366 switch (alignment_) { 399 switch (alignment_) {
367 case ALIGN_LEFT: 400 case ALIGN_LEFT:
368 flags |= gfx::Canvas::TEXT_ALIGN_LEFT; 401 flags |= gfx::Canvas::TEXT_ALIGN_LEFT;
369 break; 402 break;
370 case ALIGN_RIGHT: 403 case ALIGN_RIGHT:
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
438 focus_painter_ = focus_painter.Pass(); 471 focus_painter_ = focus_painter.Pass();
439 } 472 }
440 473
441 void TextButtonBase::PaintButton(gfx::Canvas* canvas, PaintButtonMode mode) { 474 void TextButtonBase::PaintButton(gfx::Canvas* canvas, PaintButtonMode mode) {
442 if (mode == PB_NORMAL) { 475 if (mode == PB_NORMAL) {
443 OnPaintBackground(canvas); 476 OnPaintBackground(canvas);
444 OnPaintBorder(canvas); 477 OnPaintBorder(canvas);
445 Painter::PaintFocusPainter(this, canvas, focus_painter_.get()); 478 Painter::PaintFocusPainter(this, canvas, focus_painter_.get());
446 } 479 }
447 480
448 gfx::Rect text_bounds(GetTextBounds()); 481 OnPaintText(canvas, mode);
449 if (text_bounds.width() > 0) {
450 // Because the text button can (at times) draw multiple elements on the
451 // canvas, we can not mirror the button by simply flipping the canvas as
452 // doing this will mirror the text itself. Flipping the canvas will also
453 // make the icons look wrong because icons are almost always represented as
454 // direction-insensitive images and such images should never be flipped
455 // horizontally.
456 //
457 // Due to the above, we must perform the flipping manually for RTL UIs.
458 text_bounds.set_x(GetMirroredXForRect(text_bounds));
459
460 SkColor text_color = (show_multiple_icon_states_ &&
461 (state() == STATE_HOVERED || state() == STATE_PRESSED)) ?
462 color_hover_ : color_;
463
464 int draw_string_flags = gfx::Canvas::DefaultCanvasTextAlignment() |
465 ComputeCanvasStringFlags();
466
467 if (mode == PB_FOR_DRAG) {
468 // Disable sub-pixel rendering as background is transparent.
469 draw_string_flags |= gfx::Canvas::NO_SUBPIXEL_RENDERING;
470 canvas->DrawStringRectWithHalo(text_, font_list_,
471 SK_ColorBLACK, SK_ColorWHITE,
472 text_bounds, draw_string_flags);
473 } else {
474 canvas->DrawStringRectWithFlags(text_, font_list_, text_color,
475 text_bounds, draw_string_flags);
476 }
477 }
478 } 482 }
479 483
480 gfx::Size TextButtonBase::GetMinimumSize() { 484 gfx::Size TextButtonBase::GetMinimumSize() {
481 return max_text_size_; 485 return max_text_size_;
482 } 486 }
483 487
484 void TextButtonBase::OnEnabledChanged() { 488 void TextButtonBase::OnEnabledChanged() {
485 // We should always call UpdateColor() since the state of the button might be 489 // We should always call UpdateColor() since the state of the button might be
486 // changed by other functions like CustomButton::SetState(). 490 // changed by other functions like CustomButton::SetState().
487 UpdateColor(); 491 UpdateColor();
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
623 prefsize.set_height(std::max(prefsize.height(), min_height_)); 627 prefsize.set_height(std::max(prefsize.height(), min_height_));
624 628
625 return prefsize; 629 return prefsize;
626 } 630 }
627 631
628 void TextButton::PaintButton(gfx::Canvas* canvas, PaintButtonMode mode) { 632 void TextButton::PaintButton(gfx::Canvas* canvas, PaintButtonMode mode) {
629 if (full_justification_ && icon_placement_ == ICON_ON_LEFT) 633 if (full_justification_ && icon_placement_ == ICON_ON_LEFT)
630 set_alignment(ALIGN_RIGHT); 634 set_alignment(ALIGN_RIGHT);
631 635
632 TextButtonBase::PaintButton(canvas, mode); 636 TextButtonBase::PaintButton(canvas, mode);
637 OnPaintIcon(canvas, mode);
638 }
633 639
640 void TextButton::OnPaintIcon(gfx::Canvas* canvas, PaintButtonMode mode) {
634 const gfx::ImageSkia& icon = GetImageToPaint(); 641 const gfx::ImageSkia& icon = GetImageToPaint();
635 642
636 if (icon.width() > 0) { 643 if (icon.width() > 0) {
637 gfx::Rect text_bounds = GetTextBounds(); 644 gfx::Rect text_bounds = GetTextBounds();
638 int icon_x = 0; 645 int icon_x = 0;
639 int spacing = text_.empty() ? 0 : icon_text_spacing_; 646 int spacing = text_.empty() ? 0 : icon_text_spacing_;
640 gfx::Insets insets = GetInsets(); 647 gfx::Insets insets = GetInsets();
641 switch (icon_placement_) { 648 switch (icon_placement_) {
642 case ICON_ON_LEFT: 649 case ICON_ON_LEFT:
643 icon_x = full_justification_ ? insets.left() 650 icon_x = full_justification_ ? insets.left()
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
712 if (show_multiple_icon_states_) { 719 if (show_multiple_icon_states_) {
713 if (has_hover_icon_ && (state() == STATE_HOVERED)) 720 if (has_hover_icon_ && (state() == STATE_HOVERED))
714 return icon_hover_; 721 return icon_hover_;
715 if (has_pushed_icon_ && (state() == STATE_PRESSED)) 722 if (has_pushed_icon_ && (state() == STATE_PRESSED))
716 return icon_pushed_; 723 return icon_pushed_;
717 } 724 }
718 return icon_; 725 return icon_;
719 } 726 }
720 727
721 } // namespace views 728 } // namespace views
OLDNEW
« no previous file with comments | « ui/views/controls/button/text_button.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698