default_header_painter.cc revision 23730a6e56a168d1879203e4b3819bb36e3d8f1f
1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file. 4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/frame/default_header_painter.h" 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/frame/caption_buttons/frame_caption_button_container_view.h" 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/frame/header_painter_util.h" 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/debug/leak_annotations.h" 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/logging.h" // DCHECK 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "grit/ash_resources.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "third_party/skia/include/core/SkColor.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "third_party/skia/include/core/SkPaint.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "third_party/skia/include/core/SkPath.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gfx/animation/slide_animation.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gfx/canvas.h" 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gfx/font_list.h" 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gfx/image/image.h" 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gfx/rect.h" 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gfx/skia_util.h" 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/views/view.h" 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/views/widget/native_widget_aura.h" 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/views/widget/widget.h" 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/views/widget/widget_delegate.h" 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using views::Widget; 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace { 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Color for the window title text. 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const SkColor kTitleTextColor = SkColorSetRGB(40, 40, 40); 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Color of the active window header/content separator line. 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const SkColor kHeaderContentSeparatorColor = SkColorSetRGB(180, 180, 182); 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Color of the inactive window header/content separator line. 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const SkColor kHeaderContentSeparatorInactiveColor = 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkColorSetRGB(150, 150, 152); 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Duration of crossfade animation for activating and deactivating frame. 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const int kActivationCrossfadeDurationMs = 200; 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Tiles an image into an area, rounding the top corners. 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void TileRoundRect(gfx::Canvas* canvas, 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const gfx::ImageSkia& image, 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const SkPaint& paint, 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const gfx::Rect& bounds, 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int corner_radius) { 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkRect rect = gfx::RectToSkRect(bounds); 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const SkScalar corner_radius_scalar = SkIntToScalar(corner_radius); 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkScalar radii[8] = { 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) corner_radius_scalar, corner_radius_scalar, // top-left 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) corner_radius_scalar, corner_radius_scalar, // top-right 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 0, 0, // bottom-right 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 0, 0}; // bottom-left 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkPath path; 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) path.addRoundRect(rect, radii, SkPath::kCW_Direction); 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) canvas->DrawImageInPath(image, 0, 0, path, paint); 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Returns the FontList to use for the title. 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const gfx::FontList& GetTitleFontList() { 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static const gfx::FontList* title_font_list = 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new gfx::FontList(views::NativeWidgetAura::GetWindowTitleFontList()); 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ANNOTATE_LEAKING_OBJECT_PTR(title_font_list); 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return *title_font_list; 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace ash { 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// DefaultHeaderPainter, public: 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)DefaultHeaderPainter::DefaultHeaderPainter() 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : frame_(NULL), 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) view_(NULL), 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) window_icon_(NULL), 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_(NULL), 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) height_(0), 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mode_(MODE_INACTIVE), 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) initial_paint_(true), 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) activation_animation_(new gfx::SlideAnimation(this)) { 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)DefaultHeaderPainter::~DefaultHeaderPainter() { 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DefaultHeaderPainter::Init( 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) views::Widget* frame, 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) views::View* header_view, 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) views::View* window_icon, 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FrameCaptionButtonContainerView* caption_button_container) { 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(frame); 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(header_view); 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // window_icon may be NULL. 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(caption_button_container); 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) frame_ = frame; 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) view_ = header_view; 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) window_icon_ = window_icon; 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_ = caption_button_container; 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_->SetButtonImages( 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CAPTION_BUTTON_ICON_MINIMIZE, 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_ICON_MINIMIZE, 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_ICON_MINIMIZE_I, 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_BACKGROUND_H, 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_BACKGROUND_P); 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_->SetButtonImages( 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CAPTION_BUTTON_ICON_MAXIMIZE_RESTORE, 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_ICON_SIZE, 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_ICON_SIZE_I, 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_BACKGROUND_H, 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_BACKGROUND_P); 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_->SetButtonImages( 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CAPTION_BUTTON_ICON_CLOSE, 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_ICON_CLOSE, 117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_ICON_CLOSE_I, 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_BACKGROUND_H, 119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_BACKGROUND_P); 120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // There is no dedicated icon for the snap-left and snap-right buttons 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // when |frame_| is inactive because they should never be visible while 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // |frame_| is inactive. 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_->SetButtonImages( 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CAPTION_BUTTON_ICON_LEFT_SNAPPED, 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_ICON_LEFT_SNAPPED, 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_ICON_LEFT_SNAPPED, 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_BACKGROUND_H, 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_BACKGROUND_P); 130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_->SetButtonImages( 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CAPTION_BUTTON_ICON_RIGHT_SNAPPED, 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_ICON_RIGHT_SNAPPED, 133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_ICON_RIGHT_SNAPPED, 134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_BACKGROUND_H, 135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_CONTROL_BACKGROUND_P); 136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)int DefaultHeaderPainter::GetMinimumHeaderWidth() const { 139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Ensure we have enough space for the window icon and buttons. We allow 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // the title string to collapse to zero width. 141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return GetTitleBounds().x() + 142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_->GetMinimumSize().width(); 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DefaultHeaderPainter::PaintHeader(gfx::Canvas* canvas, Mode mode) { 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Mode old_mode = mode_; 147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mode_ = mode; 148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (mode_ != old_mode) { 150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!initial_paint_ && HeaderPainterUtil::CanAnimateActivation(frame_)) { 151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) activation_animation_->SetSlideDuration(kActivationCrossfadeDurationMs); 152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (mode_ == MODE_ACTIVE) 153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) activation_animation_->Show(); 154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) else 155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) activation_animation_->Hide(); 156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (mode_ == MODE_ACTIVE) 158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) activation_animation_->Reset(1); 159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) else 160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) activation_animation_->Reset(0); 161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) initial_paint_ = false; 163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int corner_radius = (frame_->IsMaximized() || frame_->IsFullscreen()) ? 166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 0 : HeaderPainterUtil::GetTopCornerRadiusWhenRestored(); 167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int active_alpha = activation_animation_->CurrentValueBetween(0, 255); 169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int inactive_alpha = 255 - active_alpha; 170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkPaint paint; 173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (inactive_alpha > 0) { 174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (active_alpha > 0) 175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) paint.setXfermodeMode(SkXfermode::kPlus_Mode); 176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) paint.setAlpha(inactive_alpha); 178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::ImageSkia inactive_frame = 179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) *rb.GetImageSkiaNamed(IDR_AURA_WINDOW_HEADER_BASE_INACTIVE); 180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TileRoundRect(canvas, inactive_frame, paint, GetLocalBounds(), 181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) corner_radius); 182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (active_alpha > 0) { 185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) paint.setAlpha(active_alpha); 186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::ImageSkia active_frame = 187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) *rb.GetImageSkiaNamed(IDR_AURA_WINDOW_HEADER_BASE_ACTIVE); 188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TileRoundRect(canvas, active_frame, paint, GetLocalBounds(), 189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) corner_radius); 190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!frame_->IsMaximized() && 193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) !frame_->IsFullscreen() && 194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mode_ == MODE_INACTIVE) { 195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PaintHighlightForInactiveRestoredWindow(canvas); 196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (frame_->widget_delegate() && 198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) frame_->widget_delegate()->ShouldShowWindowTitle()) { 199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PaintTitleBar(canvas); 200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PaintHeaderContentSeparator(canvas); 202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DefaultHeaderPainter::LayoutHeader() { 205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_->Layout(); 206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Size caption_button_container_size = 208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_->GetPreferredSize(); 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_->SetBounds( 210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) view_->width() - caption_button_container_size.width(), 211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 0, 212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_size.width(), 213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) caption_button_container_size.height()); 214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (window_icon_) { 216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Vertically center the window icon with respect to the caption button 217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // container. 218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int icon_size = HeaderPainterUtil::GetIconSize(); 21923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Floor when computing the center of |caption_button_container_|. 22023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int icon_offset_y = caption_button_container_->height() / 2 - icon_size / 2; 221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) window_icon_->SetBounds(HeaderPainterUtil::GetIconXOffset(), icon_offset_y, 222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) icon_size, icon_size); 223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 22523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // The header/content separator line overlays the caption buttons. 22623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetHeaderHeightForPainting(caption_button_container_->height()); 227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)int DefaultHeaderPainter::GetHeaderHeightForPainting() const { 230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return height_; 231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DefaultHeaderPainter::SetHeaderHeightForPainting(int height) { 234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) height_ = height; 235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DefaultHeaderPainter::SchedulePaintForTitle() { 238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) view_->SchedulePaintInRect(GetTitleBounds()); 239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// gfx::AnimationDelegate overrides: 243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DefaultHeaderPainter::AnimationProgressed( 245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const gfx::Animation* animation) { 246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) view_->SchedulePaintInRect(GetLocalBounds()); 247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 248a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// DefaultHeaderPainter, private: 251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DefaultHeaderPainter::PaintHighlightForInactiveRestoredWindow( 253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Canvas* canvas) { 254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 255a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::ImageSkia top_edge = *rb.GetImageSkiaNamed( 256a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_HEADER_SHADE_INACTIVE_TOP); 257a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::ImageSkia left_edge = *rb.GetImageSkiaNamed( 258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_HEADER_SHADE_INACTIVE_LEFT); 259a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::ImageSkia right_edge = *rb.GetImageSkiaNamed( 260a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_HEADER_SHADE_INACTIVE_RIGHT); 261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::ImageSkia bottom_edge = *rb.GetImageSkiaNamed( 262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IDR_AURA_WINDOW_HEADER_SHADE_INACTIVE_BOTTOM); 263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 264a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int left_edge_width = left_edge.width(); 265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int right_edge_width = right_edge.width(); 266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) canvas->DrawImageInt(left_edge, 0, 0); 267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) canvas->DrawImageInt(right_edge, view_->width() - right_edge_width, 0); 268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) canvas->TileImageInt( 269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) top_edge, 270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) left_edge_width, 271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 0, 272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) view_->width() - left_edge_width - right_edge_width, 273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) top_edge.height()); 274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 275a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK_EQ(left_edge.height(), right_edge.height()); 276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int bottom = left_edge.height(); 277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int bottom_height = bottom_edge.height(); 278a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) canvas->TileImageInt( 279a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bottom_edge, 280a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) left_edge_width, 281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bottom - bottom_height, 282a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) view_->width() - left_edge_width - right_edge_width, 283a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bottom_height); 284a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 285a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 286a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DefaultHeaderPainter::PaintTitleBar(gfx::Canvas* canvas) { 287a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The window icon is painted by its own views::View. 288a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Rect title_bounds = GetTitleBounds(); 289a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) title_bounds.set_x(view_->GetMirroredXForRect(title_bounds)); 290a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) canvas->DrawStringRectWithFlags(frame_->widget_delegate()->GetWindowTitle(), 291a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetTitleFontList(), 292a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kTitleTextColor, 293a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) title_bounds, 294a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::Canvas::NO_SUBPIXEL_RENDERING); 295a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 297a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DefaultHeaderPainter::PaintHeaderContentSeparator(gfx::Canvas* canvas) { 298a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SkColor color = (mode_ == MODE_ACTIVE) ? 299a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kHeaderContentSeparatorColor : 300a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kHeaderContentSeparatorInactiveColor; 301a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 30223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SkPaint paint; 30323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) paint.setColor(color); 30423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Draw the line as 1px thick regardless of scale factor. 30523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) paint.setStrokeWidth(0); 30623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 30723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) float thickness = 1 / canvas->image_scale(); 30823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SkScalar y = SkIntToScalar(height_) - SkFloatToScalar(thickness); 30923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) canvas->sk_canvas()->drawLine(0, y, SkIntToScalar(view_->width()), y, paint); 310a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 312a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)gfx::Rect DefaultHeaderPainter::GetLocalBounds() const { 313a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return gfx::Rect(view_->width(), height_); 314a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 315a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 316a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)gfx::Rect DefaultHeaderPainter::GetTitleBounds() const { 317a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return HeaderPainterUtil::GetTitleBounds( 318a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) window_icon_, caption_button_container_, GetTitleFontList()); 319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 320a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 321a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace ash 322