Commit 56709586 authored by Tom Anderson's avatar Tom Anderson Committed by Commit Bot

Move FrameButtonDisplayType into ui/views/linux_ui

This type is specific to NavButtonProvider, which only exists
for Linux, so the type is moved inside NavButtonProvider

R=sky
BUG=None

Change-Id: I910bd42a4ead9a8b6add268f021d01dbc6eb41b5
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2092877
Commit-Queue: Thomas Anderson <thomasanderson@chromium.org>
Reviewed-by: default avatarScott Violet <sky@chromium.org>
Cr-Commit-Position: refs/heads/master@{#748781}
parent 2fd893c9
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_FRAME_BUTTON_DISPLAY_TYPES_H_
#define CHROME_BROWSER_UI_FRAME_BUTTON_DISPLAY_TYPES_H_
namespace chrome {
// This enum is similar to views::FrameButton, except it partitions
// kMaximize and kRestore. This is useful for when we want to be
// explicit about which buttons we want drawn, without having to
// implicitly determine if we should use kMaximize or kRestore
// depending on the browser window's maximized/restored state.
enum class FrameButtonDisplayType {
kMinimize,
kMaximize,
kRestore,
kClose,
};
} // namespace chrome
#endif // CHROME_BROWSER_UI_FRAME_BUTTON_DISPLAY_TYPES_H_
......@@ -23,14 +23,14 @@ const int kNavButtonIconSize = 16;
const int kHeaderSpacing = 6;
const char* ButtonStyleClassFromButtonType(
chrome::FrameButtonDisplayType type) {
views::NavButtonProvider::FrameButtonDisplayType type) {
switch (type) {
case chrome::FrameButtonDisplayType::kMinimize:
case views::NavButtonProvider::FrameButtonDisplayType::kMinimize:
return "minimize";
case chrome::FrameButtonDisplayType::kMaximize:
case chrome::FrameButtonDisplayType::kRestore:
case views::NavButtonProvider::FrameButtonDisplayType::kMaximize:
case views::NavButtonProvider::FrameButtonDisplayType::kRestore:
return "maximize";
case chrome::FrameButtonDisplayType::kClose:
case views::NavButtonProvider::FrameButtonDisplayType::kClose:
return "close";
default:
NOTREACHED();
......@@ -55,15 +55,16 @@ GtkStateFlags GtkStateFlagsFromButtonState(views::Button::ButtonState state) {
}
}
const char* IconNameFromButtonType(chrome::FrameButtonDisplayType type) {
const char* IconNameFromButtonType(
views::NavButtonProvider::FrameButtonDisplayType type) {
switch (type) {
case chrome::FrameButtonDisplayType::kMinimize:
case views::NavButtonProvider::FrameButtonDisplayType::kMinimize:
return "window-minimize-symbolic";
case chrome::FrameButtonDisplayType::kMaximize:
case views::NavButtonProvider::FrameButtonDisplayType::kMaximize:
return "window-maximize-symbolic";
case chrome::FrameButtonDisplayType::kRestore:
case views::NavButtonProvider::FrameButtonDisplayType::kRestore:
return "window-restore-symbolic";
case chrome::FrameButtonDisplayType::kClose:
case views::NavButtonProvider::FrameButtonDisplayType::kClose:
return "window-close-symbolic";
default:
NOTREACHED();
......@@ -108,9 +109,10 @@ gfx::Insets MarginFromStyleContext(GtkStyleContext* context,
return InsetsFromGtkBorder(margin);
}
ScopedGObject<GdkPixbuf> LoadNavButtonIcon(chrome::FrameButtonDisplayType type,
GtkStyleContext* button_context,
int scale) {
ScopedGObject<GdkPixbuf> LoadNavButtonIcon(
views::NavButtonProvider::FrameButtonDisplayType type,
GtkStyleContext* button_context,
int scale) {
const char* icon_name = IconNameFromButtonType(type);
ScopedGObject<GtkIconInfo> icon_info(gtk_icon_theme_lookup_icon_for_scale(
gtk_icon_theme_get_default(), icon_name, kNavButtonIconSize, scale,
......@@ -153,10 +155,11 @@ ScopedStyleContext CreateHeaderContext(bool maximized) {
"GtkHeaderBar#headerbar.header-bar.titlebar");
}
void CalculateUnscaledButtonSize(chrome::FrameButtonDisplayType type,
bool maximized,
gfx::Size* button_size,
gfx::Insets* button_margin) {
void CalculateUnscaledButtonSize(
views::NavButtonProvider::FrameButtonDisplayType type,
bool maximized,
gfx::Size* button_size,
gfx::Insets* button_margin) {
// views::ImageButton expects the images for each state to be of the
// same size, but GTK can, in general, use a differnetly-sized
// button for each state. For this reason, render buttons for all
......@@ -184,7 +187,7 @@ void CalculateUnscaledButtonSize(chrome::FrameButtonDisplayType type,
class NavButtonImageSource : public gfx::ImageSkiaSource {
public:
NavButtonImageSource(chrome::FrameButtonDisplayType type,
NavButtonImageSource(views::NavButtonProvider::FrameButtonDisplayType type,
views::Button::ButtonState state,
bool maximized,
bool active,
......@@ -297,7 +300,7 @@ class NavButtonImageSource : public gfx::ImageSkiaSource {
bool HasRepresentationAtAllScales() const override { return true; }
private:
chrome::FrameButtonDisplayType type_;
views::NavButtonProvider::FrameButtonDisplayType type_;
views::Button::ButtonState state_;
bool maximized_;
bool active_;
......@@ -324,13 +327,15 @@ void NavButtonProviderGtk::RedrawImages(int top_area_height,
#endif
double scale = 1.0f;
std::map<chrome::FrameButtonDisplayType, gfx::Size> button_sizes;
std::map<chrome::FrameButtonDisplayType, gfx::Insets> button_margins;
std::vector<chrome::FrameButtonDisplayType> display_types{
chrome::FrameButtonDisplayType::kMinimize,
maximized ? chrome::FrameButtonDisplayType::kRestore
: chrome::FrameButtonDisplayType::kMaximize,
chrome::FrameButtonDisplayType::kClose,
std::map<views::NavButtonProvider::FrameButtonDisplayType, gfx::Size>
button_sizes;
std::map<views::NavButtonProvider::FrameButtonDisplayType, gfx::Insets>
button_margins;
std::vector<views::NavButtonProvider::FrameButtonDisplayType> display_types{
views::NavButtonProvider::FrameButtonDisplayType::kMinimize,
maximized ? views::NavButtonProvider::FrameButtonDisplayType::kRestore
: views::NavButtonProvider::FrameButtonDisplayType::kMaximize,
views::NavButtonProvider::FrameButtonDisplayType::kClose,
};
for (auto type : display_types) {
CalculateUnscaledButtonSize(type, maximized, &button_sizes[type],
......@@ -387,7 +392,7 @@ void NavButtonProviderGtk::RedrawImages(int top_area_height,
}
gfx::ImageSkia NavButtonProviderGtk::GetImage(
chrome::FrameButtonDisplayType type,
views::NavButtonProvider::FrameButtonDisplayType type,
views::Button::ButtonState state) const {
auto it = button_images_.find(type);
DCHECK(it != button_images_.end());
......@@ -395,7 +400,7 @@ gfx::ImageSkia NavButtonProviderGtk::GetImage(
}
gfx::Insets NavButtonProviderGtk::GetNavButtonMargin(
chrome::FrameButtonDisplayType type) const {
views::NavButtonProvider::FrameButtonDisplayType type) const {
auto it = button_margins_.find(type);
DCHECK(it != button_margins_.end());
return it->second;
......
......@@ -8,7 +8,6 @@
#include <map>
#include "base/component_export.h"
#include "chrome/browser/ui/frame_button_display_types.h"
#include "ui/gfx/image/image_skia.h"
#include "ui/views/controls/button/button.h"
#include "ui/views/linux_ui/nav_button_provider.h"
......@@ -23,18 +22,19 @@ class COMPONENT_EXPORT(GTK) NavButtonProviderGtk
// views::NavButtonProvider:
void RedrawImages(int top_area_height, bool maximized, bool active) override;
gfx::ImageSkia GetImage(chrome::FrameButtonDisplayType type,
gfx::ImageSkia GetImage(views::NavButtonProvider::FrameButtonDisplayType type,
views::Button::ButtonState state) const override;
gfx::Insets GetNavButtonMargin(
chrome::FrameButtonDisplayType type) const override;
views::NavButtonProvider::FrameButtonDisplayType type) const override;
gfx::Insets GetTopAreaSpacing() const override;
int GetInterNavButtonSpacing() const override;
private:
std::map<chrome::FrameButtonDisplayType,
std::map<views::NavButtonProvider::FrameButtonDisplayType,
gfx::ImageSkia[views::Button::STATE_COUNT]>
button_images_;
std::map<chrome::FrameButtonDisplayType, gfx::Insets> button_margins_;
std::map<views::NavButtonProvider::FrameButtonDisplayType, gfx::Insets>
button_margins_;
gfx::Insets top_area_spacing_;
int inter_button_spacing_;
};
......
......@@ -6,7 +6,6 @@
#include "chrome/browser/ui/views/frame/desktop_linux_browser_frame_view_layout.h"
#include "ui/views/controls/button/image_button.h"
#include "ui/views/linux_ui/nav_button_provider.h"
bool DesktopLinuxBrowserFrameView::DrawFrameButtonParams::operator==(
const DrawFrameButtonParams& other) const {
......@@ -48,10 +47,11 @@ void DesktopLinuxBrowserFrameView::MaybeUpdateCachedFrameButtonImages() {
nav_button_provider_->RedrawImages(params.top_area_height, params.maximized,
params.active);
for (auto type : {
chrome::FrameButtonDisplayType::kMinimize,
IsMaximized() ? chrome::FrameButtonDisplayType::kRestore
: chrome::FrameButtonDisplayType::kMaximize,
chrome::FrameButtonDisplayType::kClose,
views::NavButtonProvider::FrameButtonDisplayType::kMinimize,
IsMaximized()
? views::NavButtonProvider::FrameButtonDisplayType::kRestore
: views::NavButtonProvider::FrameButtonDisplayType::kMaximize,
views::NavButtonProvider::FrameButtonDisplayType::kClose,
}) {
for (size_t state = 0; state < views::Button::STATE_COUNT; state++) {
views::Button::ButtonState button_state =
......@@ -66,15 +66,15 @@ void DesktopLinuxBrowserFrameView::MaybeUpdateCachedFrameButtonImages() {
}
views::Button* DesktopLinuxBrowserFrameView::GetButtonFromDisplayType(
chrome::FrameButtonDisplayType type) {
views::NavButtonProvider::FrameButtonDisplayType type) {
switch (type) {
case chrome::FrameButtonDisplayType::kMinimize:
case views::NavButtonProvider::FrameButtonDisplayType::kMinimize:
return minimize_button();
case chrome::FrameButtonDisplayType::kMaximize:
case views::NavButtonProvider::FrameButtonDisplayType::kMaximize:
return maximize_button();
case chrome::FrameButtonDisplayType::kRestore:
case views::NavButtonProvider::FrameButtonDisplayType::kRestore:
return restore_button();
case chrome::FrameButtonDisplayType::kClose:
case views::NavButtonProvider::FrameButtonDisplayType::kClose:
return close_button();
default:
NOTREACHED();
......
......@@ -6,6 +6,7 @@
#define CHROME_BROWSER_UI_VIEWS_FRAME_DESKTOP_LINUX_BROWSER_FRAME_VIEW_H_
#include "chrome/browser/ui/views/frame/opaque_browser_frame_view.h"
#include "ui/views/linux_ui/nav_button_provider.h"
// A specialization of OpaqueBrowserFrameView that is also able to
// render frame buttons using GTK.
......@@ -38,7 +39,8 @@ class DesktopLinuxBrowserFrameView : public OpaqueBrowserFrameView {
// Returns one of |{minimize,maximize,restore,close}_button_|
// corresponding to |type|.
views::Button* GetButtonFromDisplayType(chrome::FrameButtonDisplayType type);
views::Button* GetButtonFromDisplayType(
views::NavButtonProvider::FrameButtonDisplayType type);
std::unique_ptr<views::NavButtonProvider> nav_button_provider_;
......
......@@ -11,9 +11,10 @@ DesktopLinuxBrowserFrameViewLayout::DesktopLinuxBrowserFrameViewLayout(
: nav_button_provider_(nav_button_provider) {}
int DesktopLinuxBrowserFrameViewLayout::CaptionButtonY(
chrome::FrameButtonDisplayType button_id,
views::FrameButton button_id,
bool restored) const {
gfx::Insets insets = nav_button_provider_->GetNavButtonMargin(button_id);
auto button_type = GetButtonDisplayType(button_id);
gfx::Insets insets = nav_button_provider_->GetNavButtonMargin(button_type);
return insets.top() + FrameTopThickness(!delegate_->IsMaximized());
}
......@@ -44,3 +45,21 @@ int DesktopLinuxBrowserFrameViewLayout::GetWindowCaptionSpacing(
spacing += nav_button_provider_->GetInterNavButtonSpacing();
return spacing;
}
views::NavButtonProvider::FrameButtonDisplayType
DesktopLinuxBrowserFrameViewLayout::GetButtonDisplayType(
views::FrameButton button_id) const {
switch (button_id) {
case views::FrameButton::kMinimize:
return views::NavButtonProvider::FrameButtonDisplayType::kMinimize;
case views::FrameButton::kMaximize:
return delegate_->IsMaximized()
? views::NavButtonProvider::FrameButtonDisplayType::kRestore
: views::NavButtonProvider::FrameButtonDisplayType::kMaximize;
case views::FrameButton::kClose:
return views::NavButtonProvider::FrameButtonDisplayType::kClose;
default:
NOTREACHED();
return views::NavButtonProvider::FrameButtonDisplayType::kClose;
}
}
......@@ -6,6 +6,7 @@
#define CHROME_BROWSER_UI_VIEWS_FRAME_DESKTOP_LINUX_BROWSER_FRAME_VIEW_LAYOUT_H_
#include "chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.h"
#include "ui/views/linux_ui/nav_button_provider.h"
// A specialization of OpaqueBrowserFrameViewLayout that is also able
// to layout frame buttons that were rendered by GTK.
......@@ -16,7 +17,7 @@ class DesktopLinuxBrowserFrameViewLayout : public OpaqueBrowserFrameViewLayout {
protected:
// OpaqueBrowserFrameViewLayout:
int CaptionButtonY(chrome::FrameButtonDisplayType button_id,
int CaptionButtonY(views::FrameButton button_id,
bool restored) const override;
TopAreaPadding GetTopAreaPadding(bool has_leading_buttons,
bool has_trailing_buttons) const override;
......@@ -25,6 +26,11 @@ class DesktopLinuxBrowserFrameViewLayout : public OpaqueBrowserFrameViewLayout {
bool is_leading_button) const override;
private:
// Converts a FrameButton to a FrameButtonDisplayType, taking into
// consideration the maximized state of the browser window.
views::NavButtonProvider::FrameButtonDisplayType GetButtonDisplayType(
views::FrameButton button_id) const;
views::NavButtonProvider* nav_button_provider_;
DISALLOW_COPY_AND_ASSIGN(DesktopLinuxBrowserFrameViewLayout);
......
......@@ -79,14 +79,14 @@ class TestNavButtonProvider : public views::NavButtonProvider {
ASSERT_EQ(false, maximized); // This only tests the restored state.
}
gfx::ImageSkia GetImage(chrome::FrameButtonDisplayType type,
gfx::ImageSkia GetImage(views::NavButtonProvider::FrameButtonDisplayType type,
views::Button::ButtonState state) const override {
switch (type) {
case chrome::FrameButtonDisplayType::kClose:
case views::NavButtonProvider::FrameButtonDisplayType::kClose:
return GetTestImageForSize(kCloseButtonSize);
case chrome::FrameButtonDisplayType::kMaximize:
case views::NavButtonProvider::FrameButtonDisplayType::kMaximize:
return GetTestImageForSize(kMaximizeButtonSize);
case chrome::FrameButtonDisplayType::kMinimize:
case views::NavButtonProvider::FrameButtonDisplayType::kMinimize:
return GetTestImageForSize(kMinimizeButtonSize);
default:
NOTREACHED();
......@@ -95,13 +95,13 @@ class TestNavButtonProvider : public views::NavButtonProvider {
}
gfx::Insets GetNavButtonMargin(
chrome::FrameButtonDisplayType type) const override {
views::NavButtonProvider::FrameButtonDisplayType type) const override {
switch (type) {
case chrome::FrameButtonDisplayType::kClose:
case views::NavButtonProvider::FrameButtonDisplayType::kClose:
return kCloseButtonMargin;
case chrome::FrameButtonDisplayType::kMaximize:
case views::NavButtonProvider::FrameButtonDisplayType::kMaximize:
return kMaximizeButtonMargin;
case chrome::FrameButtonDisplayType::kMinimize:
case views::NavButtonProvider::FrameButtonDisplayType::kMinimize:
return kMinimizeButtonMargin;
default:
NOTREACHED();
......@@ -160,10 +160,10 @@ class DesktopLinuxBrowserFrameViewLayoutTest : public ChromeViewsTestBase {
void ResetNativeNavButtonImagesFromButtonProvider() {
std::vector<views::ImageButton*> buttons{close_button_, maximize_button_,
minimize_button_};
std::vector<chrome::FrameButtonDisplayType> button_types{
chrome::FrameButtonDisplayType::kClose,
chrome::FrameButtonDisplayType::kMaximize,
chrome::FrameButtonDisplayType::kMinimize};
std::vector<views::NavButtonProvider::FrameButtonDisplayType> button_types{
views::NavButtonProvider::FrameButtonDisplayType::kClose,
views::NavButtonProvider::FrameButtonDisplayType::kMaximize,
views::NavButtonProvider::FrameButtonDisplayType::kMinimize};
for (size_t i = 0; i < buttons.size(); i++) {
for (views::Button::ButtonState state :
{views::Button::STATE_NORMAL, views ::Button::STATE_HOVERED,
......
......@@ -180,9 +180,8 @@ int OpaqueBrowserFrameViewLayout::DefaultCaptionButtonY(bool restored) const {
: views::NonClientFrameView::kFrameShadowThickness;
}
int OpaqueBrowserFrameViewLayout::CaptionButtonY(
chrome::FrameButtonDisplayType button_id,
bool restored) const {
int OpaqueBrowserFrameViewLayout::CaptionButtonY(views::FrameButton button_id,
bool restored) const {
return DefaultCaptionButtonY(restored);
}
......@@ -200,24 +199,6 @@ gfx::Rect OpaqueBrowserFrameViewLayout::CalculateClientAreaBounds(
std::max(0, height - top_height - border_thickness));
}
chrome::FrameButtonDisplayType
OpaqueBrowserFrameViewLayout::GetButtonDisplayType(
views::FrameButton button_id) const {
switch (button_id) {
case views::FrameButton::kMinimize:
return chrome::FrameButtonDisplayType::kMinimize;
case views::FrameButton::kMaximize:
return delegate_->IsMaximized()
? chrome::FrameButtonDisplayType::kRestore
: chrome::FrameButtonDisplayType::kMaximize;
case views::FrameButton::kClose:
return chrome::FrameButtonDisplayType::kClose;
default:
NOTREACHED();
return chrome::FrameButtonDisplayType::kClose;
}
}
int OpaqueBrowserFrameViewLayout::GetWindowCaptionSpacing(
views::FrameButton button_id,
bool leading_spacing,
......@@ -422,7 +403,7 @@ void OpaqueBrowserFrameViewLayout::SetBoundsForButton(
views::FrameButton button_id,
views::Button* button,
ButtonAlignment alignment) {
const int caption_y = CaptionButtonY(GetButtonDisplayType(button_id), false);
const int caption_y = CaptionButtonY(button_id, false);
// There should always be the same number of non-shadow pixels visible to the
// side of the caption buttons. In maximized mode we extend buttons to the
......
......@@ -8,7 +8,6 @@
#include <vector>
#include "base/macros.h"
#include "chrome/browser/ui/frame_button_display_types.h"
#include "chrome/browser/ui/views/frame/opaque_browser_frame_view.h"
#include "ui/views/layout/layout_manager.h"
#include "ui/views/window/frame_buttons.h"
......@@ -84,8 +83,7 @@ class OpaqueBrowserFrameViewLayout : public views::LayoutManager {
// Returns the y-coordinate of button |button_id|. If |restored| is true,
// acts as if the window is restored regardless of the real mode.
virtual int CaptionButtonY(chrome::FrameButtonDisplayType button_id,
bool restored) const;
virtual int CaptionButtonY(views::FrameButton button_id, bool restored) const;
// Returns the thickness of the top 3D edge of the window frame. If
// |restored| is true, acts as if the window is restored regardless of the
......@@ -104,11 +102,6 @@ class OpaqueBrowserFrameViewLayout : public views::LayoutManager {
// Returns the bounds of the client area for the specified view size.
gfx::Rect CalculateClientAreaBounds(int width, int height) const;
// Converts a FrameButton to a FrameButtonDisplayType, taking into
// consideration the maximized state of the browser window.
chrome::FrameButtonDisplayType GetButtonDisplayType(
views::FrameButton button_id) const;
// Returns the margin around button |button_id|. If |leading_spacing| is
// true, returns the left margin (in RTL), otherwise returns the right margin
// (in RTL). Extra margin may be added if |is_leading_button| is true.
......
......@@ -22,6 +22,18 @@ namespace views {
class NavButtonProvider {
public:
// This enum is similar to views::FrameButton, except it partitions
// kMaximize and kRestore. This is useful for when we want to be
// explicit about which buttons we want drawn, without having to
// implicitly determine if we should use kMaximize or kRestore
// depending on the browser window's maximized/restored state.
enum class FrameButtonDisplayType {
kMinimize,
kMaximize,
kRestore,
kClose,
};
virtual ~NavButtonProvider() {}
// Redraws all images and updates all size state. |top_area_height|
......@@ -33,14 +45,15 @@ class NavButtonProvider {
bool active) = 0;
// Gets the cached button image corresponding to |type| and |state|.
virtual gfx::ImageSkia GetImage(chrome::FrameButtonDisplayType type,
views::Button::ButtonState state) const = 0;
virtual gfx::ImageSkia GetImage(
views::NavButtonProvider::FrameButtonDisplayType type,
views::Button::ButtonState state) const = 0;
// Gets the external margin around each button. The left inset
// represents the leading margin, and the right inset represents the
// trailing margin.
virtual gfx::Insets GetNavButtonMargin(
chrome::FrameButtonDisplayType type) const = 0;
views::NavButtonProvider::FrameButtonDisplayType type) const = 0;
// Gets the internal spacing (padding + border) of the top area.
// The left inset represents the leading spacing, and the right
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment