diff options
author | jonross@chromium.org <jonross@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-04 13:49:01 +0000 |
---|---|---|
committer | jonross@chromium.org <jonross@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-04 13:49:01 +0000 |
commit | 244e00be7bb33ca6621ee19fbc2c42a7a78ff430 (patch) | |
tree | 449a8e59ef71173f5262c5ed704f24a4da2a8df5 /ash/frame | |
parent | 37c6b95f44866f2e76b6682bb28e1737958384e8 (diff) | |
download | chromium_src-244e00be7bb33ca6621ee19fbc2c42a7a78ff430.zip chromium_src-244e00be7bb33ca6621ee19fbc2c42a7a78ff430.tar.gz chromium_src-244e00be7bb33ca6621ee19fbc2c42a7a78ff430.tar.bz2 |
When we enter Maximize Mode we do not support the minimize operation, we only support the close and maximize actions. During this mode we want to hide the minimize button in all header areas.
BUG=337565
TEST=FrameCaptionButtonContainerViewTest
TEST=CustomFraneViewAshTest
TEST=BrowserNonClientFrameViewAshTest
Review URL: https://codereview.chromium.org/202563003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@261738 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ash/frame')
-rw-r--r-- | ash/frame/caption_buttons/frame_caption_button_container_view.cc | 14 | ||||
-rw-r--r-- | ash/frame/caption_buttons/frame_caption_button_container_view.h | 11 | ||||
-rw-r--r-- | ash/frame/custom_frame_view_ash.cc | 50 | ||||
-rw-r--r-- | ash/frame/custom_frame_view_ash.h | 5 | ||||
-rw-r--r-- | ash/frame/custom_frame_view_ash_unittest.cc | 46 |
5 files changed, 109 insertions, 17 deletions
diff --git a/ash/frame/caption_buttons/frame_caption_button_container_view.cc b/ash/frame/caption_buttons/frame_caption_button_container_view.cc index 6d2b424..f533f14 100644 --- a/ash/frame/caption_buttons/frame_caption_button_container_view.cc +++ b/ash/frame/caption_buttons/frame_caption_button_container_view.cc @@ -67,7 +67,7 @@ FrameCaptionButtonContainerView::FrameCaptionButtonContainerView( size_button_ = new FrameMaximizeButton(this, frame); size_button_->SetAccessibleName( l10n_util::GetStringUTF16(IDS_APP_ACCNAME_MAXIMIZE)); - size_button_->SetVisible(frame_->widget_delegate()->CanMaximize()); + UpdateSizeButtonVisibility(false); AddChildView(size_button_); close_button_ = new FrameCaptionButton(this, CAPTION_BUTTON_ICON_CLOSE); @@ -135,6 +135,18 @@ int FrameCaptionButtonContainerView::NonClientHitTest( return HTNOWHERE; } +void FrameCaptionButtonContainerView::UpdateSizeButtonVisibility( + bool force_hidden) { + // TODO(flackr): Refactor the Maximize Mode notifications. Currently + // UpdateSizeButtonVisibilty requires a force_hidden parameter. This is + // because Shell::IsMaximizeWindowManagerEnabled is still false at the + // time when ShellObserver::OnMaximizeModeStarted is called. This prevents + // this method from performing that check, and instead relies on the calling + // code to tell it to force being hidden. + size_button_->SetVisible( + !force_hidden && frame_->widget_delegate()->CanMaximize()); +} + gfx::Size FrameCaptionButtonContainerView::GetPreferredSize() { int width = 0; for (int i = 0; i < child_count(); ++i) { diff --git a/ash/frame/caption_buttons/frame_caption_button_container_view.h b/ash/frame/caption_buttons/frame_caption_button_container_view.h index 9324ca2..d50350e 100644 --- a/ash/frame/caption_buttons/frame_caption_button_container_view.h +++ b/ash/frame/caption_buttons/frame_caption_button_container_view.h @@ -91,7 +91,12 @@ class ASH_EXPORT FrameCaptionButtonContainerView // be in the coordinates of the FrameCaptionButtonContainerView. int NonClientHitTest(const gfx::Point& point) const; - // views::View overrides: + // Updates the size button's visibility based on whether |frame_| can be + // maximized and |force_hidden|. A parent view should relayout to reflect the + // change in visibility. + void UpdateSizeButtonVisibility(bool force_hidden); + + // views::View: virtual gfx::Size GetPreferredSize() OVERRIDE; virtual void Layout() OVERRIDE; virtual const char* GetClassName() const OVERRIDE; @@ -121,11 +126,11 @@ class ASH_EXPORT FrameCaptionButtonContainerView CaptionButtonIcon icon, Animate animate); - // views::ButtonListener override: + // views::ButtonListener: virtual void ButtonPressed(views::Button* sender, const ui::Event& event) OVERRIDE; - // AlternateFrameSizeButton::Delegate overrides: + // AlternateFrameSizeButtonDelegate: virtual bool IsMinimizeButtonVisible() const OVERRIDE; virtual void SetButtonsToNormal(Animate animate) OVERRIDE; virtual void SetButtonIcons(CaptionButtonIcon minimize_button_icon, diff --git a/ash/frame/custom_frame_view_ash.cc b/ash/frame/custom_frame_view_ash.cc index 196f901..5a90e87 100644 --- a/ash/frame/custom_frame_view_ash.cc +++ b/ash/frame/custom_frame_view_ash.cc @@ -14,6 +14,7 @@ #include "ash/frame/header_painter.h" #include "ash/session_state_delegate.h" #include "ash/shell.h" +#include "ash/shell_observer.h" #include "ash/wm/immersive_fullscreen_controller.h" #include "ash/wm/window_state.h" #include "ash/wm/window_state_delegate.h" @@ -130,7 +131,8 @@ namespace ash { class CustomFrameViewAsh::HeaderView : public views::View, public ImmersiveFullscreenController::Delegate, - public FrameMaximizeButtonObserver { + public FrameMaximizeButtonObserver, + public ShellObserver { public: // |frame| is the widget that the caption buttons act on. explicit HeaderView(views::Widget* frame); @@ -153,10 +155,14 @@ class CustomFrameViewAsh::HeaderView void UpdateAvatarIcon(); - // views::View overrides: + // views::View: virtual void Layout() OVERRIDE; virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; + // ShellObserver: + virtual void OnMaximizeModeStarted() OVERRIDE; + virtual void OnMaximizeModeEnded() OVERRIDE; + FrameCaptionButtonContainerView* caption_button_container() { return caption_button_container_; } @@ -166,14 +172,14 @@ class CustomFrameViewAsh::HeaderView } private: - // ImmersiveFullscreenController::Delegate overrides: + // ImmersiveFullscreenController::Delegate: virtual void OnImmersiveRevealStarted() OVERRIDE; virtual void OnImmersiveRevealEnded() OVERRIDE; virtual void OnImmersiveFullscreenExited() OVERRIDE; virtual void SetVisibleFraction(double visible_fraction) OVERRIDE; virtual std::vector<gfx::Rect> GetVisibleBoundsInScreen() const OVERRIDE; - // FrameMaximizeButtonObserver overrides: + // FrameMaximizeButtonObserver: virtual void OnMaximizeBubbleShown(views::Widget* bubble) OVERRIDE; // The widget that the caption buttons act on. @@ -216,6 +222,8 @@ CustomFrameViewAsh::HeaderView::HeaderView(views::Widget* frame) FrameCaptionButtonContainerView::MINIMIZE_DISALLOWED; caption_button_container_ = new FrameCaptionButtonContainerView(frame_, minimize_allowed); + caption_button_container_->UpdateSizeButtonVisibility(Shell::GetInstance()-> + IsMaximizeModeWindowManagerEnabled()); AddChildView(caption_button_container_); FrameMaximizeButton* frame_maximize_button = caption_button_container_->GetOldStyleSizeButton(); @@ -224,6 +232,8 @@ CustomFrameViewAsh::HeaderView::HeaderView(views::Widget* frame) header_painter_->Init(frame_, this, NULL, caption_button_container_); UpdateAvatarIcon(); + + Shell::GetInstance()->AddShellObserver(this); } CustomFrameViewAsh::HeaderView::~HeaderView() { @@ -231,6 +241,7 @@ CustomFrameViewAsh::HeaderView::~HeaderView() { caption_button_container_->GetOldStyleSizeButton(); if (frame_maximize_button) frame_maximize_button->RemoveObserver(this); + Shell::GetInstance()->RemoveShellObserver(this); } void CustomFrameViewAsh::HeaderView::SchedulePaintForTitle() { @@ -284,6 +295,9 @@ void CustomFrameViewAsh::HeaderView::UpdateAvatarIcon() { Layout(); } +/////////////////////////////////////////////////////////////////////////////// +// CustomFrameViewAsh::HeaderView, views::View overrides: + void CustomFrameViewAsh::HeaderView::Layout() { header_painter_->LayoutHeader(); } @@ -298,6 +312,23 @@ void CustomFrameViewAsh::HeaderView::OnPaint(gfx::Canvas* canvas) { header_painter_->PaintHeader(canvas, header_mode); } +/////////////////////////////////////////////////////////////////////////////// +// CustomFrameViewAsh::HeaderView, ShellObserver overrides: + +void CustomFrameViewAsh::HeaderView::OnMaximizeModeStarted() { + caption_button_container_->UpdateSizeButtonVisibility(true); + parent()->Layout(); +} + +void CustomFrameViewAsh::HeaderView::OnMaximizeModeEnded() { + caption_button_container_->UpdateSizeButtonVisibility(false); + parent()->Layout(); +} + +/////////////////////////////////////////////////////////////////////////////// +// CustomFrameViewAsh::HeaderView, +// ImmersiveFullscreenController::Delegate overrides: + void CustomFrameViewAsh::HeaderView::OnImmersiveRevealStarted() { fullscreen_visible_fraction_ = 0; SetPaintToLayer(true); @@ -341,6 +372,9 @@ CustomFrameViewAsh::HeaderView::GetVisibleBoundsInScreen() const { return bounds_in_screen; } +/////////////////////////////////////////////////////////////////////////////// +// CustomFrameViewAsh::HeaderView, FrameMaximizeButtonObserver overrides: + void CustomFrameViewAsh::HeaderView::OnMaximizeBubbleShown( views::Widget* bubble) { maximize_bubble_ = bubble; @@ -377,6 +411,9 @@ CustomFrameViewAsh::OverlayView::OverlayView(HeaderView* header_view) CustomFrameViewAsh::OverlayView::~OverlayView() { } +/////////////////////////////////////////////////////////////////////////////// +// CustomFrameViewAsh::OverlayView, views::View overrides: + void CustomFrameViewAsh::OverlayView::Layout() { // Layout |header_view_| because layout affects the result of // GetPreferredOnScreenHeight(). @@ -538,6 +575,11 @@ const views::View* CustomFrameViewAsh::GetAvatarIconViewForTest() const { //////////////////////////////////////////////////////////////////////////////// // CustomFrameViewAsh, private: +FrameCaptionButtonContainerView* CustomFrameViewAsh:: + GetFrameCaptionButtonContainerViewForTest() { + return header_view_->caption_button_container(); +} + int CustomFrameViewAsh::NonClientTopBorderHeight() const { return frame_->IsFullscreen() ? 0 : header_view_->GetPreferredHeight(); } diff --git a/ash/frame/custom_frame_view_ash.h b/ash/frame/custom_frame_view_ash.h index bfa6729..3f02413 100644 --- a/ash/frame/custom_frame_view_ash.h +++ b/ash/frame/custom_frame_view_ash.h @@ -11,6 +11,7 @@ namespace ash { class FrameBorderHitTestController; +class FrameCaptionButtonContainerView; class ImmersiveFullscreenController; } namespace views { @@ -70,6 +71,10 @@ class ASH_EXPORT CustomFrameViewAsh : public views::NonClientFrameView { class OverlayView; friend class TestWidgetConstraintsDelegate; + // Returns the container for the minimize/maximize/close buttons that is held + // by the HeaderView. Used in testing. + FrameCaptionButtonContainerView* GetFrameCaptionButtonContainerViewForTest(); + // Height from top of window to top of client area. int NonClientTopBorderHeight() const; diff --git a/ash/frame/custom_frame_view_ash_unittest.cc b/ash/frame/custom_frame_view_ash_unittest.cc index 68a85a8..7e702d1 100644 --- a/ash/frame/custom_frame_view_ash_unittest.cc +++ b/ash/frame/custom_frame_view_ash_unittest.cc @@ -4,6 +4,8 @@ #include "ash/frame/custom_frame_view_ash.h" +#include "ash/frame/caption_buttons/frame_caption_button.h" +#include "ash/frame/caption_buttons/frame_caption_button_container_view.h" #include "ash/shell.h" #include "ash/test/ash_test_base.h" #include "ash/test/test_session_state_delegate.h" @@ -11,6 +13,7 @@ #include "grit/ash_resources.h" #include "ui/base/resource/resource_bundle.h" #include "ui/gfx/image/image_skia.h" +#include "ui/gfx/rect.h" #include "ui/views/widget/widget.h" #include "ui/views/widget/widget_delegate.h" @@ -19,10 +22,8 @@ namespace ash { // A views::WidgetDelegate which uses a CustomFrameViewAsh. class TestWidgetDelegate : public views::WidgetDelegateView { public: - TestWidgetDelegate() { - } - virtual ~TestWidgetDelegate() { - } + TestWidgetDelegate() {} + virtual ~TestWidgetDelegate() {} virtual views::NonClientFrameView* CreateNonClientFrameView( views::Widget* widget) OVERRIDE { @@ -43,12 +44,10 @@ class TestWidgetDelegate : public views::WidgetDelegateView { class TestWidgetConstraintsDelegate : public TestWidgetDelegate { public: - TestWidgetConstraintsDelegate() { - } - virtual ~TestWidgetConstraintsDelegate() { - } + TestWidgetConstraintsDelegate() {} + virtual ~TestWidgetConstraintsDelegate() {} - // views::View implementation. + // views::View: virtual gfx::Size GetMinimumSize() OVERRIDE { return minimum_size_; } @@ -63,6 +62,11 @@ class TestWidgetConstraintsDelegate : public TestWidgetDelegate { return this; } + // views::WidgetDelegate: + virtual bool CanMaximize() const OVERRIDE { + return true; + } + void set_minimum_size(const gfx::Size& min_size) { minimum_size_ = min_size; } @@ -71,6 +75,11 @@ class TestWidgetConstraintsDelegate : public TestWidgetDelegate { maximum_size_ = max_size; } + const gfx::Rect& GetFrameCaptionButtonContainerViewBounds() { + return custom_frame_view()->GetFrameCaptionButtonContainerViewForTest()-> + bounds(); + } + int GetTitleBarHeight() const { return custom_frame_view()->NonClientTopBorderHeight(); } @@ -191,4 +200,23 @@ TEST_F(CustomFrameViewAshTest, AvatarIcon) { EXPECT_FALSE(custom_frame_view->GetAvatarIconViewForTest()); } +// The visibility of the size button is updated when maximize mode is toggled. +// Verify that the layout of the HeaderView is updated for the size button's +// new visibility. +TEST_F(CustomFrameViewAshTest, HeaderViewNotifiedOfChildSizeChange) { + TestWidgetConstraintsDelegate* delegate = new TestWidgetConstraintsDelegate; + scoped_ptr<views::Widget> widget(CreateWidget(delegate)); + + const gfx::Rect initial = delegate-> + GetFrameCaptionButtonContainerViewBounds(); + Shell::GetInstance()->EnableMaximizeModeWindowManager(true); + const gfx::Rect maximize_mode_bounds = delegate-> + GetFrameCaptionButtonContainerViewBounds(); + EXPECT_GT(initial.width(), maximize_mode_bounds.width()); + Shell::GetInstance()->EnableMaximizeModeWindowManager(false); + const gfx::Rect after_restore = delegate-> + GetFrameCaptionButtonContainerViewBounds(); + EXPECT_EQ(initial, after_restore); +} + } // namespace ash |