1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2013 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)#ifndef ASH_FRAME_CAPTION_BUTTONS_FRAME_CAPTION_BUTTON_H_ 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define ASH_FRAME_CAPTION_BUTTONS_FRAME_CAPTION_BUTTON_H_ 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/ash_export.h" 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/frame/caption_buttons/caption_button_types.h" 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gfx/image/image_skia.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/views/controls/button/custom_button.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace gfx { 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class SlideAnimation; 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace ash { 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Base class for the window caption buttons (minimize, maximize, restore, 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// close). 226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)class ASH_EXPORT FrameCaptionButton : public views::CustomButton { 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) enum Animate { 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ANIMATE_YES, 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ANIMATE_NO 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) }; 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static const char kViewClassName[]; 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FrameCaptionButton(views::ButtonListener* listener, CaptionButtonIcon icon); 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual ~FrameCaptionButton(); 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Sets the images to use to paint the button. If |animate| is ANIMATE_YES, 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // the button crossfades to the new visuals. If the image ids match those 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // currently used by the button and |animate| is ANIMATE_NO the crossfade 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // animation is progressed to the end. 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void SetImages(CaptionButtonIcon icon, 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Animate animate, 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int icon_image_id, 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int inactive_icon_image_id, 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int hovered_background_image_id, 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int pressed_background_image_id); 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Returns true if the button is crossfading to new visuals set in 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // SetImages(). 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool IsAnimatingImageSwap() const; 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Sets the alpha to use for painting. Used to animate visibility changes. 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void SetAlpha(int alpha); 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // views::View overrides: 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual gfx::Size GetPreferredSize() const OVERRIDE; 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual const char* GetClassName() const OVERRIDE; 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void set_paint_as_active(bool paint_as_active) { 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) paint_as_active_ = paint_as_active; 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CaptionButtonIcon icon() const { 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return icon_; 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected: 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // views::CustomButton override: 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE; 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Returns the icon image to paint based on |paint_as_active_|. 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const gfx::ImageSkia& GetIconImageToPaint() const; 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Paints |to_center| centered within the button with |alpha|. 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void PaintCentered(gfx::Canvas* canvas, 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const gfx::ImageSkia& to_center, 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int alpha); 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The button's current icon. 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CaptionButtonIcon icon_; 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Whether the button should be painted as active. 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool paint_as_active_; 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Current alpha to use for painting. 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int alpha_; 865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The images and image ids used to paint the button. 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int icon_image_id_; 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int inactive_icon_image_id_; 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int hovered_background_image_id_; 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int pressed_background_image_id_; 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::ImageSkia icon_image_; 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::ImageSkia inactive_icon_image_; 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::ImageSkia hovered_background_image_; 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::ImageSkia pressed_background_image_; 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The icon image to crossfade from. 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gfx::ImageSkia crossfade_icon_image_; 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Crossfade animation started when the button's images are changed by 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // SetImages(). 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<gfx::SlideAnimation> swap_images_animation_; 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FrameCaptionButton); 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace ash 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif // ASH_FRAME_CAPTION_BUTTONS_FRAME_CAPTION_BUTTON_H_ 110