Index: ash/frame/custom_frame_view_ash.cc |
diff --git a/ash/frame/custom_frame_view_ash.cc b/ash/frame/custom_frame_view_ash.cc |
index 90d5c6af3dd921c5e225364a22ecf6446d2d6b4a..dfa1912a4e1c94ad269b8525476db2bccb172cf3 100644 |
--- a/ash/frame/custom_frame_view_ash.cc |
+++ b/ash/frame/custom_frame_view_ash.cc |
@@ -8,10 +8,12 @@ |
#include <vector> |
#include "ash/ash_switches.h" |
+#include "ash/frame/caption_buttons/frame_caption_button.h" |
#include "ash/frame/caption_buttons/frame_caption_button_container_view.h" |
#include "ash/frame/default_header_painter.h" |
#include "ash/frame/frame_border_hit_test_controller.h" |
#include "ash/frame/header_painter.h" |
+#include "ash/frame/header_painter_util.h" |
#include "ash/session/session_state_delegate.h" |
#include "ash/shell.h" |
#include "ash/shell_observer.h" |
@@ -23,12 +25,14 @@ |
#include "ui/aura/client/aura_constants.h" |
#include "ui/aura/window.h" |
#include "ui/aura/window_observer.h" |
+#include "ui/base/hit_test.h" |
#include "ui/gfx/canvas.h" |
#include "ui/gfx/geometry/rect.h" |
#include "ui/gfx/geometry/rect_conversions.h" |
#include "ui/gfx/geometry/size.h" |
#include "ui/gfx/image/image.h" |
#include "ui/views/controls/image_view.h" |
+#include "ui/views/layout/box_layout.h" |
#include "ui/views/view.h" |
#include "ui/views/view_targeter.h" |
#include "ui/views/widget/widget.h" |
@@ -114,6 +118,39 @@ class CustomFrameViewAshWindowStateDelegate |
DISALLOW_COPY_AND_ASSIGN(CustomFrameViewAshWindowStateDelegate); |
}; |
+class LeftHeaderView : public views::View { |
+ public: |
+ explicit LeftHeaderView(ash::FrameCaptionButton* caption_button) |
+ : caption_button_(caption_button) { |
+ SetLayoutManager( |
+ new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0)); |
+ AddChildView(caption_button_); |
+ caption_button_->SetState(views::Button::STATE_NORMAL); |
+ } |
+ ~LeftHeaderView() override {} |
+ |
+ void SetPaintAsActive(bool active) { |
+ caption_button_->set_paint_as_active(active); |
+ } |
+ |
+ private: |
+ ash::FrameCaptionButton* caption_button_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(LeftHeaderView); |
+}; |
+ |
+// Combines View::ConvertPointToTarget() and View::HitTest() for a given |
+// |point|. Converts |point| from |src| to |dst| and hit tests it against |dst|. |
+bool ConvertedHitTest(views::View* src, |
+ views::View* dst, |
+ const gfx::Point& point) { |
+ DCHECK(src); |
+ DCHECK(dst); |
+ gfx::Point converted_point(point); |
+ views::View::ConvertPointToTarget(src, dst, &converted_point); |
+ return dst->HitTestPoint(converted_point); |
+} |
+ |
} // namespace |
namespace ash { |
@@ -153,6 +190,8 @@ class CustomFrameViewAsh::HeaderView |
void SetFrameColors(SkColor active_frame_color, SkColor inactive_frame_color); |
+ void SetLeftCaptionButton(FrameCaptionButton* left_caption_button); |
+ |
// views::View: |
void Layout() override; |
void OnPaint(gfx::Canvas* canvas) override; |
@@ -170,6 +209,8 @@ class CustomFrameViewAsh::HeaderView |
return avatar_icon_; |
} |
+ views::View* left_header_view() const { return left_header_view_; } |
+ |
private: |
// ImmersiveFullscreenController::Delegate: |
void OnImmersiveRevealStarted() override; |
@@ -189,6 +230,9 @@ class CustomFrameViewAsh::HeaderView |
// View which contains the window caption buttons. |
FrameCaptionButtonContainerView* caption_button_container_; |
+ // View which contains the left caption button. |
+ LeftHeaderView* left_header_view_; |
+ |
// The fraction of the header's height which is visible while in fullscreen. |
// This value is meaningless when not in fullscreen. |
double fullscreen_visible_fraction_; |
@@ -201,6 +245,7 @@ CustomFrameViewAsh::HeaderView::HeaderView(views::Widget* frame) |
header_painter_(new ash::DefaultHeaderPainter), |
avatar_icon_(NULL), |
caption_button_container_(NULL), |
+ left_header_view_(NULL), |
fullscreen_visible_fraction_(0) { |
caption_button_container_ = new FrameCaptionButtonContainerView(frame_); |
caption_button_container_->UpdateSizeButtonVisibility(); |
@@ -274,18 +319,35 @@ void CustomFrameViewAsh::HeaderView::SetFrameColors( |
header_painter_->SetFrameColors(active_frame_color, inactive_frame_color); |
} |
+void CustomFrameViewAsh::HeaderView::SetLeftCaptionButton( |
+ FrameCaptionButton* left_caption_button) { |
+ if (left_header_view_) |
+ delete left_header_view_; |
+ left_header_view_ = new LeftHeaderView(left_caption_button); |
+ AddChildView(left_header_view_); |
+ header_painter_->UpdateLeftHeaderView(left_header_view_); |
+ Layout(); |
+} |
+ |
/////////////////////////////////////////////////////////////////////////////// |
// CustomFrameViewAsh::HeaderView, views::View overrides: |
void CustomFrameViewAsh::HeaderView::Layout() { |
header_painter_->LayoutHeader(); |
+ if (left_header_view_) { |
+ header_painter_->UpdateLeftViewXInset(0); |
+ } else { |
+ header_painter_->UpdateLeftViewXInset( |
+ ash::HeaderPainterUtil::GetDefaultLeftViewXInset()); |
+ } |
} |
void CustomFrameViewAsh::HeaderView::OnPaint(gfx::Canvas* canvas) { |
bool paint_as_active = |
frame_->non_client_view()->frame_view()->ShouldPaintAsActive(); |
caption_button_container_->SetPaintAsActive(paint_as_active); |
- |
+ if (left_header_view_) |
+ left_header_view_->SetPaintAsActive(paint_as_active); |
HeaderPainter::Mode header_mode = paint_as_active ? |
HeaderPainter::MODE_ACTIVE : HeaderPainter::MODE_INACTIVE; |
header_painter_->PaintHeader(canvas, header_mode); |
@@ -461,6 +523,11 @@ void CustomFrameViewAsh::SetFrameColors(SkColor active_frame_color, |
header_view_->SetFrameColors(active_frame_color, inactive_frame_color); |
} |
+void CustomFrameViewAsh::SetLeftCaptionButton( |
+ FrameCaptionButton* left_caption_button) { |
+ header_view_->SetLeftCaptionButton(left_caption_button); |
+} |
+ |
//////////////////////////////////////////////////////////////////////////////// |
// CustomFrameViewAsh, views::NonClientFrameView overrides: |
@@ -478,8 +545,16 @@ gfx::Rect CustomFrameViewAsh::GetWindowBoundsForClientBounds( |
} |
int CustomFrameViewAsh::NonClientHitTest(const gfx::Point& point) { |
- return FrameBorderHitTestController::NonClientHitTest(this, |
- header_view_->caption_button_container(), point); |
+ int hit_test = FrameBorderHitTestController::NonClientHitTest( |
+ this, header_view_->caption_button_container(), point); |
+ |
+ // See if the point is actually within the left header view. |
+ if (hit_test == HTCAPTION && header_view_->left_header_view() && |
+ ConvertedHitTest(this, header_view_->left_header_view(), point)) { |
+ return HTCLIENT; |
+ } |
+ |
+ return hit_test; |
} |
void CustomFrameViewAsh::GetWindowMask(const gfx::Size& size, |