diff options
Diffstat (limited to 'chromium/ash/system/tray/tray_bar_button_with_title.cc')
-rw-r--r-- | chromium/ash/system/tray/tray_bar_button_with_title.cc | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/chromium/ash/system/tray/tray_bar_button_with_title.cc b/chromium/ash/system/tray/tray_bar_button_with_title.cc new file mode 100644 index 00000000000..0fd94d84892 --- /dev/null +++ b/chromium/ash/system/tray/tray_bar_button_with_title.cc @@ -0,0 +1,113 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/system/tray/tray_bar_button_with_title.h" + +#include "ash/system/tray/tray_constants.h" +#include "base/memory/scoped_ptr.h" +#include "grit/ui_resources.h" +#include "ui/base/resource/resource_bundle.h" +#include "ui/gfx/image/image_skia.h" +#include "ui/views/controls/label.h" +#include "ui/views/painter.h" + +namespace ash { +namespace internal { + +namespace { + +const int kBarImagesActive[] = { + IDR_SLIDER_ACTIVE_LEFT, + IDR_SLIDER_ACTIVE_CENTER, + IDR_SLIDER_ACTIVE_RIGHT, +}; + +const int kBarImagesDisabled[] = { + IDR_SLIDER_DISABLED_LEFT, + IDR_SLIDER_DISABLED_CENTER, + IDR_SLIDER_DISABLED_RIGHT, +}; + +} // namespace + +class TrayBarButtonWithTitle::TrayBarButton : public views::View { + public: + TrayBarButton(const int bar_active_images[], const int bar_disabled_images[]) + : views::View(), + bar_active_images_(bar_active_images), + bar_disabled_images_(bar_disabled_images), + painter_(new views::HorizontalPainter(bar_active_images_)){ + } + virtual ~TrayBarButton() {} + + // Overriden from views::View: + virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE { + painter_->Paint(canvas, size()); + } + + void Update(bool control_on) { + painter_.reset(new views::HorizontalPainter( + control_on ? bar_active_images_ : bar_disabled_images_)); + SchedulePaint(); + } + + private: + const int* bar_active_images_; + const int* bar_disabled_images_; + scoped_ptr<views::HorizontalPainter> painter_; + + DISALLOW_COPY_AND_ASSIGN(TrayBarButton); +}; + +TrayBarButtonWithTitle::TrayBarButtonWithTitle(views::ButtonListener* listener, + int title_id, + int width) + : views::CustomButton(listener), + image_(new TrayBarButton(kBarImagesActive, kBarImagesDisabled)), + title_(NULL), + width_(width) { + AddChildView(image_); + if (title_id != -1) { + title_ = new views::Label; + ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); + base::string16 text = rb.GetLocalizedString(title_id); + title_->SetText(text); + AddChildView(title_); + } + + image_height_ = ui::ResourceBundle::GetSharedInstance().GetImageNamed( + kBarImagesActive[0]).ToImageSkia()->height(); +} + +TrayBarButtonWithTitle::~TrayBarButtonWithTitle() {} + +void TrayBarButtonWithTitle::UpdateButton(bool control_on) { + image_->Update(control_on); +} + +gfx::Size TrayBarButtonWithTitle::GetPreferredSize() { + return gfx::Size(width_, kTrayPopupItemHeight); +} + +void TrayBarButtonWithTitle::Layout() { + gfx::Rect rect(GetContentsBounds()); + int bar_image_y = rect.height() / 2 - image_height_ / 2; + gfx::Rect bar_image_rect(rect.x(), + bar_image_y, + rect.width(), + image_height_); + image_->SetBoundsRect(bar_image_rect); + if (title_) { + // The image_ has some empty space below the bar image, move the title + // a little bit up to look closer to the bar. + gfx::Size title_size = title_->GetPreferredSize(); + title_->SetBounds(rect.x(), + bar_image_y + image_height_ - 3, + rect.width(), + title_size.height()); + } +} + +} // namespace internal +} // namespace ash |