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