| Index: ash/wm/dialog_frame_view.cc
|
| diff --git a/ash/wm/dialog_frame_view.cc b/ash/wm/dialog_frame_view.cc
|
| index 80bc098d6e461e5dfcb568c883e308fa1d72b06d..effd06d95c99aa1cc8982bf8e3128e9a2f62b311 100644
|
| --- a/ash/wm/dialog_frame_view.cc
|
| +++ b/ash/wm/dialog_frame_view.cc
|
| @@ -4,14 +4,50 @@
|
|
|
| #include "ash/wm/dialog_frame_view.h"
|
|
|
| +#include "grit/ui_resources_standard.h"
|
| #include "ui/base/hit_test.h"
|
| +#include "ui/base/resource/resource_bundle.h"
|
| #include "ui/gfx/canvas.h"
|
| #include "ui/gfx/font.h"
|
| +#include "ui/gfx/insets.h"
|
| #include "ui/views/background.h"
|
| #include "ui/views/border.h"
|
| +#include "ui/views/controls/button/image_button.h"
|
| #include "ui/views/widget/widget.h"
|
| #include "ui/views/widget/widget_delegate.h"
|
|
|
| +namespace {
|
| +
|
| +// TODO(benrg): Make frame shadow and stroke agree with the spec.
|
| +
|
| +// TODO(benrg): Title bar text should be #222, not black. Text in the client
|
| +// area should also be #222, but is currently usually black. Punting on this
|
| +// until the overhaul of color handling that will be happening Real Soon Now.
|
| +const SkColor kDialogTitleColor = SK_ColorBLACK;
|
| +const SkColor kDialogBackgroundColor = SK_ColorWHITE;
|
| +
|
| +// Dialog-size-dependent padding values from the spec, in pixels.
|
| +const int kGoogleSmallDialogVPadding = 16;
|
| +const int kGoogleSmallDialogHPadding = 20;
|
| +const int kGoogleMediumDialogVPadding = 28;
|
| +const int kGoogleMediumDialogHPadding = 32;
|
| +const int kGoogleLargeDialogVPadding = 30;
|
| +const int kGoogleLargeDialogHPadding = 42;
|
| +
|
| +// Dialog layouts themselves contain some padding, which should be ignored in
|
| +// favor of the padding values above. Currently we hack it by nudging the
|
| +// client area outward.
|
| +const int kDialogHPaddingNudge = 13;
|
| +const int kDialogTopPaddingNudge = 5;
|
| +const int kDialogBottomPaddingNudge = 10;
|
| +
|
| +// TODO(benrg): There are no examples in the spec of close boxes on medium- or
|
| +// small-size dialogs, and the close button size is not factored into other
|
| +// sizing decisions. This value could cause problems with smaller dialogs.
|
| +const int kCloseButtonSize = 44;
|
| +
|
| +} // namespace
|
| +
|
| namespace ash {
|
| namespace internal {
|
|
|
| @@ -21,24 +57,6 @@ const char DialogFrameView::kViewClassName[] = "ash/wm/DialogFrameView";
|
| // static
|
| gfx::Font* DialogFrameView::title_font_ = NULL;
|
|
|
| -// TODO(benrg): tweak these values until they match Google-style.
|
| -// TODO(benrg): this may also mean tweaking the frame shadow opacity.
|
| -const SkColor kDialogBackgroundColor = SK_ColorWHITE;
|
| -// const SkColor kDialogBorderColor = SkColorSetRGB(0xCC, 0xCC, 0xCC);
|
| -const SkColor kDialogTitleColor = SK_ColorBLACK;
|
| -
|
| -// TODO(benrg): Replace with width-based padding heuristic.
|
| -// |kDialogPadding| is the standardized padding amount, the specific per-side
|
| -// padding values are offset from this to achieve a uniform look with our
|
| -// existing code.
|
| -static int kDialogPadding = 30;
|
| -static int kDialogHPadding = kDialogPadding - 13;
|
| -static int kDialogTopPadding = kDialogPadding;
|
| -static int kDialogBottomPadding = kDialogPadding - 10;
|
| -static int kDialogContentVSpacing = 5;
|
| -
|
| -const int kCloseButtonSize = 16;
|
| -
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // DialogFrameView, public:
|
|
|
| @@ -47,6 +65,18 @@ DialogFrameView::DialogFrameView() {
|
| kDialogBackgroundColor));
|
| if (!title_font_)
|
| title_font_ = new gfx::Font(gfx::Font().DeriveFont(4, gfx::Font::NORMAL));
|
| +
|
| + ResourceBundle& rb = ResourceBundle::GetSharedInstance();
|
| + close_button_ = new views::ImageButton(this);
|
| + close_button_->SetImage(views::CustomButton::BS_NORMAL,
|
| + rb.GetBitmapNamed(IDR_CLOSE_BAR));
|
| + close_button_->SetImage(views::CustomButton::BS_HOT,
|
| + rb.GetBitmapNamed(IDR_CLOSE_BAR_H));
|
| + close_button_->SetImage(views::CustomButton::BS_PUSHED,
|
| + rb.GetBitmapNamed(IDR_CLOSE_BAR_P));
|
| + close_button_->SetImageAlignment(views::ImageButton::ALIGN_CENTER,
|
| + views::ImageButton::ALIGN_MIDDLE);
|
| + AddChildView(close_button_);
|
| }
|
|
|
| DialogFrameView::~DialogFrameView() {
|
| @@ -57,23 +87,21 @@ DialogFrameView::~DialogFrameView() {
|
|
|
| gfx::Rect DialogFrameView::GetBoundsForClientView() const {
|
| gfx::Rect client_bounds = GetLocalBounds();
|
| - client_bounds.Inset(kDialogHPadding, GetNonClientTopHeight(),
|
| - kDialogHPadding, kDialogBottomPadding);
|
| + client_bounds.Inset(GetClientInsets());
|
| return client_bounds;
|
| }
|
|
|
| gfx::Rect DialogFrameView::GetWindowBoundsForClientBounds(
|
| const gfx::Rect& client_bounds) const {
|
| gfx::Rect window_bounds = client_bounds;
|
| - window_bounds.Inset(-kDialogHPadding, -GetNonClientTopHeight(),
|
| - -kDialogHPadding, -kDialogBottomPadding);
|
| + window_bounds.Inset(-GetClientInsets());
|
| return window_bounds;
|
| }
|
|
|
| int DialogFrameView::NonClientHitTest(const gfx::Point& point) {
|
| - if (close_button_rect_.Contains(point))
|
| + if (close_button_->GetMirroredBounds().Contains(point))
|
| return HTCLOSE;
|
| - return point.y() < GetNonClientTopHeight() ? HTCAPTION : HTCLIENT;
|
| + return point.y() < GetClientInsets().top() ? HTCAPTION : HTCLIENT;
|
| }
|
|
|
| void DialogFrameView::GetWindowMask(const gfx::Size& size,
|
| @@ -98,19 +126,18 @@ std::string DialogFrameView::GetClassName() const {
|
|
|
| void DialogFrameView::Layout() {
|
| title_display_rect_ = GetLocalBounds();
|
| - // TODO(benrg): size based on font height rather than bottom padding.
|
| - close_button_rect_.SetRect(width() - kDialogPadding - kCloseButtonSize,
|
| - kDialogTopPadding, kCloseButtonSize,
|
| - kCloseButtonSize);
|
| - title_display_rect_.Inset(kDialogPadding, kDialogTopPadding,
|
| - kDialogPadding + kCloseButtonSize,
|
| - kDialogBottomPadding);
|
| + title_display_rect_.Inset(GetPaddingInsets());
|
| title_display_rect_.set_height(title_font_->GetHeight());
|
| +
|
| + // The hot rectangle for the close button is flush with the upper right of the
|
| + // dialog. The close button image is smaller, and is centered in the hot rect.
|
| + close_button_->SetBounds(
|
| + width() - kCloseButtonSize,
|
| + 0, kCloseButtonSize, kCloseButtonSize);
|
| }
|
|
|
| void DialogFrameView::OnPaint(gfx::Canvas* canvas) {
|
| views::View::OnPaint(canvas);
|
| - canvas->FillRect(SK_ColorRED, close_button_rect_);
|
| views::WidgetDelegate* delegate = GetWidget()->widget_delegate();
|
| if (!delegate)
|
| return;
|
| @@ -118,22 +145,47 @@ void DialogFrameView::OnPaint(gfx::Canvas* canvas) {
|
| kDialogTitleColor, title_display_rect_);
|
| }
|
|
|
| -// TODO(benrg): You may want to use a views::Button for the close box instead.
|
| -bool DialogFrameView::OnMousePressed(const views::MouseEvent& event) {
|
| - if (close_button_rect_.Contains(event.location()))
|
| - return true;
|
| - return View::OnMousePressed(event);
|
| -}
|
| -void DialogFrameView::OnMouseReleased(const views::MouseEvent& event) {
|
| - if (close_button_rect_.Contains(event.location()))
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// DialogFrameView, views::ButtonListener overrides:
|
| +
|
| +void DialogFrameView::ButtonPressed(views::Button* sender,
|
| + const views::Event& event) {
|
| + if (sender == close_button_)
|
| GetWidget()->Close();
|
| }
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // DialogFrameView, private:
|
|
|
| -int DialogFrameView::GetNonClientTopHeight() const {
|
| - return kDialogTopPadding + title_font_->GetHeight() + kDialogContentVSpacing;
|
| +gfx::Insets DialogFrameView::GetPaddingInsets() const {
|
| + // These three discrete padding sizes come from the spec. If we ever wanted
|
| + // our Google-style dialogs to be resizable, we would probably need to
|
| + // smoothly interpolate the padding size instead.
|
| + int v_padding, h_padding;
|
| + if (width() <= 280) {
|
| + v_padding = kGoogleSmallDialogVPadding;
|
| + h_padding = kGoogleSmallDialogHPadding;
|
| + } else if (width() <= 480) {
|
| + v_padding = kGoogleMediumDialogVPadding;
|
| + h_padding = kGoogleMediumDialogHPadding;
|
| + } else {
|
| + v_padding = kGoogleLargeDialogVPadding;
|
| + h_padding = kGoogleLargeDialogHPadding;
|
| + }
|
| + return gfx::Insets(v_padding, h_padding, v_padding, h_padding);
|
| +}
|
| +
|
| +gfx::Insets DialogFrameView::GetClientInsets() const {
|
| + gfx::Insets insets = GetPaddingInsets();
|
| + // The title should be separated from the client area by 1 em (dialog spec),
|
| + // and one em is equal to the font size (CSS spec).
|
| + insets += gfx::Insets(
|
| + title_font_->GetHeight() + title_font_->GetFontSize() -
|
| + kDialogTopPaddingNudge,
|
| + -kDialogHPaddingNudge,
|
| + -kDialogBottomPaddingNudge,
|
| + -kDialogHPaddingNudge);
|
| + return insets;
|
| }
|
|
|
| } // namespace internal
|
|
|