1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/ui/views/frame/desktop_linux_browser_frame_view.h"
6 
7 #include "chrome/browser/ui/views/frame/desktop_linux_browser_frame_view_layout.h"
8 #include "ui/views/controls/button/image_button.h"
9 
operator ==(const DrawFrameButtonParams & other) const10 bool DesktopLinuxBrowserFrameView::DrawFrameButtonParams::operator==(
11     const DrawFrameButtonParams& other) const {
12   return top_area_height == other.top_area_height &&
13          maximized == other.maximized && active == other.active;
14 }
15 
DesktopLinuxBrowserFrameView(BrowserFrame * frame,BrowserView * browser_view,OpaqueBrowserFrameViewLayout * layout,std::unique_ptr<views::NavButtonProvider> nav_button_provider)16 DesktopLinuxBrowserFrameView::DesktopLinuxBrowserFrameView(
17     BrowserFrame* frame,
18     BrowserView* browser_view,
19     OpaqueBrowserFrameViewLayout* layout,
20     std::unique_ptr<views::NavButtonProvider> nav_button_provider)
21     : OpaqueBrowserFrameView(frame, browser_view, layout),
22       nav_button_provider_(std::move(nav_button_provider)) {}
23 
24 DesktopLinuxBrowserFrameView::~DesktopLinuxBrowserFrameView() = default;
25 
Layout()26 void DesktopLinuxBrowserFrameView::Layout() {
27   // Calling MaybeUpdateCachedFrameButtonImages() from Layout() is sufficient to
28   // catch all cases that could update the appearance, since
29   // DesktopWindowTreeHostPlatform::On{Window,Activation}StateChanged() does a
30   // layout any time the maximized and activation state changes, respectively.
31   MaybeUpdateCachedFrameButtonImages();
32   OpaqueBrowserFrameView::Layout();
33 }
34 
35 DesktopLinuxBrowserFrameView::FrameButtonStyle
GetFrameButtonStyle() const36 DesktopLinuxBrowserFrameView::GetFrameButtonStyle() const {
37   return FrameButtonStyle::kImageButton;
38 }
39 
MaybeUpdateCachedFrameButtonImages()40 void DesktopLinuxBrowserFrameView::MaybeUpdateCachedFrameButtonImages() {
41   DrawFrameButtonParams params{
42       GetTopAreaHeight() - layout()->FrameTopThickness(!IsMaximized()),
43       IsMaximized(), ShouldPaintAsActive()};
44   if (cache_ == params)
45     return;
46   cache_ = params;
47   nav_button_provider_->RedrawImages(params.top_area_height, params.maximized,
48                                      params.active);
49   for (auto type : {
50            views::NavButtonProvider::FrameButtonDisplayType::kMinimize,
51            IsMaximized()
52                ? views::NavButtonProvider::FrameButtonDisplayType::kRestore
53                : views::NavButtonProvider::FrameButtonDisplayType::kMaximize,
54            views::NavButtonProvider::FrameButtonDisplayType::kClose,
55        }) {
56     for (size_t state = 0; state < views::Button::STATE_COUNT; state++) {
57       views::Button::ButtonState button_state =
58           static_cast<views::Button::ButtonState>(state);
59       views::Button* button = GetButtonFromDisplayType(type);
60       DCHECK_EQ(std::string(views::ImageButton::kViewClassName),
61                 button->GetClassName());
62       static_cast<views::ImageButton*>(button)->SetImage(
63           button_state, nav_button_provider_->GetImage(type, button_state));
64     }
65   }
66 }
67 
GetButtonFromDisplayType(views::NavButtonProvider::FrameButtonDisplayType type)68 views::Button* DesktopLinuxBrowserFrameView::GetButtonFromDisplayType(
69     views::NavButtonProvider::FrameButtonDisplayType type) {
70   switch (type) {
71     case views::NavButtonProvider::FrameButtonDisplayType::kMinimize:
72       return minimize_button();
73     case views::NavButtonProvider::FrameButtonDisplayType::kMaximize:
74       return maximize_button();
75     case views::NavButtonProvider::FrameButtonDisplayType::kRestore:
76       return restore_button();
77     case views::NavButtonProvider::FrameButtonDisplayType::kClose:
78       return close_button();
79     default:
80       NOTREACHED();
81       return nullptr;
82   }
83 }
84