1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
// 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 "ui/message_center/views/padded_button.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/canvas.h"
#include "ui/message_center/message_center_style.h"
#include "ui/views/controls/button/image_button.h"
#include "ui/views/painter.h"
namespace message_center {
PaddedButton::PaddedButton(views::ButtonListener* listener)
: views::ImageButton(listener) {
SetFocusable(true);
set_request_focus_on_press(false);
SetFocusPainter(views::Painter::CreateSolidFocusPainter(
kFocusBorderColor,
gfx::Insets(1, 2, 2, 2)));
}
PaddedButton::~PaddedButton() {
}
void PaddedButton::SetPadding(int horizontal_padding, int vertical_padding) {
padding_.Set(std::max(vertical_padding, 0),
std::max(horizontal_padding, 0),
std::max(-vertical_padding, 0),
std::max(-horizontal_padding, 0));
}
void PaddedButton::SetNormalImage(int resource_id) {
SetImage(views::CustomButton::STATE_NORMAL,
ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
resource_id));
}
void PaddedButton::SetHoveredImage(int resource_id) {
SetImage(views::CustomButton::STATE_HOVERED,
ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
resource_id));
}
void PaddedButton::SetPressedImage(int resource_id) {
SetImage(views::CustomButton::STATE_PRESSED,
ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
resource_id));
}
gfx::Size PaddedButton::GetPreferredSize() const {
return gfx::Size(message_center::kControlButtonSize,
message_center::kControlButtonSize);
}
void PaddedButton::OnPaint(gfx::Canvas* canvas) {
// This is the same implementation as ImageButton::OnPaint except
// that it calls ComputePaddedImagePaintPosition() instead of
// ComputeImagePaintPosition(), in effect overriding that private method.
View::OnPaint(canvas);
gfx::ImageSkia image = GetImageToPaint();
if (!image.isNull()) {
gfx::Point position = ComputePaddedImagePaintPosition(image);
if (!background_image_.isNull())
canvas->DrawImageInt(background_image_, position.x(), position.y());
canvas->DrawImageInt(image, position.x(), position.y());
}
views::Painter::PaintFocusPainter(this, canvas, focus_painter());
}
void PaddedButton::OnFocus() {
views::ImageButton::OnFocus();
ScrollRectToVisible(GetLocalBounds());
}
gfx::Point PaddedButton::ComputePaddedImagePaintPosition(
const gfx::ImageSkia& image) {
gfx::Vector2d offset;
gfx::Rect bounds = GetContentsBounds();
bounds.Inset(padding_);
if (padding_.left() == 0 && padding_.right() == 0)
offset.set_x((bounds.width() - image.width()) / 2); // Center align.
else if (padding_.right() > 0)
offset.set_x(bounds.width() - image.width()); // Right align.
if (padding_.top() == 0 && padding_.bottom() == 0)
offset.set_y((bounds.height() - image.height()) / 2); // Middle align.
else if (padding_.bottom() > 0)
offset.set_y(bounds.height() - image.height()); // Bottom align.
return bounds.origin() + offset;
}
} // namespace message_center
|