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

Relayout browser windows when MD mode changes

BUG=737995,881371

Change-Id: I9a64690248693f9963211587b4bbcc40e1480f97
Reviewed-on: https://chromium-review.googlesource.com/1249826
Commit-Queue: Thomas Anderson <thomasanderson@chromium.org>
Reviewed-by: default avatarRobert Liao <robliao@chromium.org>
Reviewed-by: default avatarPeter Kasting <pkasting@chromium.org>
Cr-Commit-Position: refs/heads/master@{#595275}
parent 24254296
......@@ -26,6 +26,7 @@
#include "chrome/browser/ui/views/frame/top_container_view.h"
#include "chrome/common/chrome_switches.h"
#include "ui/base/hit_test.h"
#include "ui/base/material_design/material_design_controller.h"
#include "ui/events/event_handler.h"
#include "ui/gfx/font_list.h"
#include "ui/native_theme/native_theme_dark_aura.h"
......@@ -56,10 +57,10 @@ BrowserFrame::BrowserFrame(BrowserView* browser_view)
set_is_secondary_widget(false);
// Don't focus anything on creation, selecting a tab will set the focus.
set_focus_on_creation(false);
md_observer_.Add(ui::MaterialDesignController::GetInstance());
}
BrowserFrame::~BrowserFrame() {
}
BrowserFrame::~BrowserFrame() {}
void BrowserFrame::InitBrowserFrame() {
native_browser_frame_ =
......@@ -244,3 +245,9 @@ ui::MenuModel* BrowserFrame::GetSystemMenuModel() {
void BrowserFrame::OnMenuClosed() {
menu_runner_.reset();
}
void BrowserFrame::OnMdModeChanged() {
client_view()->InvalidateLayout();
non_client_view()->InvalidateLayout();
GetRootView()->Layout();
}
......@@ -8,9 +8,11 @@
#include "base/compiler_specific.h"
#include "base/logging.h"
#include "base/macros.h"
#include "base/scoped_observer.h"
#include "build/build_config.h"
#include "chrome/browser/ui/views/frame/browser_non_client_frame_view.h"
#include "content/public/browser/keyboard_event_processing_result.h"
#include "ui/base/material_design/material_design_controller_observer.h"
#include "ui/views/context_menu_controller.h"
#include "ui/views/widget/widget.h"
......@@ -39,9 +41,9 @@ class View;
}
// This is a virtual interface that allows system specific browser frames.
class BrowserFrame
: public views::Widget,
public views::ContextMenuController {
class BrowserFrame : public views::Widget,
public views::ContextMenuController,
public ui::MaterialDesignControllerObserver {
public:
explicit BrowserFrame(BrowserView* browser_view);
~BrowserFrame() override;
......@@ -97,7 +99,7 @@ class BrowserFrame
// Called when BrowserView creates all it's child views.
void OnBrowserViewInitViewsComplete();
// Overridden from views::Widget:
// views::Widget:
views::internal::RootView* CreateRootView() override;
views::NonClientFrameView* CreateNonClientFrameView() override;
bool GetAccelerator(int command_id,
......@@ -107,7 +109,7 @@ class BrowserFrame
void OnNativeWidgetWorkspaceChanged() override;
void OnNativeThemeUpdated(ui::NativeTheme* observed_theme) override;
// Overridden from views::ContextMenuController:
// views::ContextMenuController:
void ShowContextMenuForView(views::View* source,
const gfx::Point& p,
ui::MenuSourceType source_type) override;
......@@ -120,6 +122,10 @@ class BrowserFrame
return native_browser_frame_;
}
protected:
// ui::MaterialDesignControllerObserver:
void OnMdModeChanged() override;
private:
// Callback for MenuRunner.
void OnMenuClosed();
......@@ -145,6 +151,10 @@ class BrowserFrame
std::unique_ptr<ui::EventHandler> browser_command_handler_;
ScopedObserver<ui::MaterialDesignController,
ui::MaterialDesignControllerObserver>
md_observer_{this};
DISALLOW_COPY_AND_ASSIGN(BrowserFrame);
};
......
......@@ -57,7 +57,7 @@ class BrowserRootView : public views::internal::RootView {
BrowserRootView(BrowserView* browser_view, views::Widget* widget);
~BrowserRootView() override;
// Overridden from views::View:
// views::View:
bool GetDropFormats(
int* formats,
std::set<ui::Clipboard::FormatType>* format_types) override;
......
......@@ -14,9 +14,11 @@
#include "base/compiler_specific.h"
#include "base/containers/adapters.h"
#include "base/containers/flat_map.h"
#include "base/macros.h"
#include "base/metrics/histogram_macros.h"
#include "base/metrics/user_metrics.h"
#include "base/no_destructor.h"
#include "base/stl_util.h"
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
......@@ -91,8 +93,6 @@ constexpr int kStackedPadding = 6;
int g_drop_indicator_width = 0;
int g_drop_indicator_height = 0;
TabSizeInfo* g_tab_size_info = nullptr;
// Animation delegate used for any automatic tab movement. Hides the tab if it
// is not fully visible within the tabstrip area, to prevent overflow clipping.
class TabAnimationDelegate : public gfx::AnimationDelegate {
......@@ -154,6 +154,14 @@ void ResetDraggingStateDelegate::AnimationCanceled(
AnimationEnded(animation);
}
base::flat_map<ui::MaterialDesignController::Mode, TabSizeInfo>*
GetTabSizeInfoMap() {
static base::NoDestructor<
base::flat_map<ui::MaterialDesignController::Mode, TabSizeInfo>>
tab_size_info_map;
return tab_size_info_map.get();
}
// If |dest| contains the point |point_in_source| the event handler from |dest|
// is returned. Otherwise returns null.
views::View* ConvertPointToViewAndGetEventHandler(
......@@ -185,17 +193,19 @@ TabDragController::EventSource EventSourceFromEvent(
}
const TabSizeInfo& GetTabSizeInfo() {
if (g_tab_size_info)
return *g_tab_size_info;
g_tab_size_info = new TabSizeInfo;
g_tab_size_info->pinned_tab_width = Tab::GetPinnedWidth();
g_tab_size_info->min_active_width = Tab::GetMinimumActiveWidth();
g_tab_size_info->min_inactive_width = Tab::GetMinimumInactiveWidth();
g_tab_size_info->standard_size =
TabSizeInfo& tab_size_info =
(*GetTabSizeInfoMap())[ui::MaterialDesignController::GetMode()];
if (!tab_size_info.standard_size.IsEmpty())
return tab_size_info;
tab_size_info.pinned_tab_width = Tab::GetPinnedWidth();
tab_size_info.min_active_width = Tab::GetMinimumActiveWidth();
tab_size_info.min_inactive_width = Tab::GetMinimumInactiveWidth();
tab_size_info.standard_size =
gfx::Size(Tab::GetStandardWidth(), GetLayoutConstant(TAB_HEIGHT));
g_tab_size_info->tab_overlap = Tab::GetOverlap();
return *g_tab_size_info;
tab_size_info.tab_overlap = Tab::GetOverlap();
return tab_size_info;
}
int GetStackableTabWidth() {
......@@ -2298,10 +2308,7 @@ bool TabStrip::IsPointInTab(Tab* tab,
// static
void TabStrip::ResetTabSizeInfoForTesting() {
if (g_tab_size_info) {
delete g_tab_size_info;
g_tab_size_info = nullptr;
}
*GetTabSizeInfoMap() = {};
}
Tab* TabStrip::FindTabForEvent(const gfx::Point& point) {
......
......@@ -54,8 +54,7 @@ constexpr base::TimeDelta kDelayTime = base::TimeDelta::FromMilliseconds(1500);
bool BrowserAppMenuButton::g_open_app_immediately_for_testing = false;
BrowserAppMenuButton::BrowserAppMenuButton(ToolbarView* toolbar_view)
: AppMenuButton(toolbar_view),
toolbar_view_(toolbar_view) {
: AppMenuButton(toolbar_view), toolbar_view_(toolbar_view) {
SetInkDropMode(InkDropMode::ON);
SetFocusPainter(nullptr);
SetHorizontalAlignment(gfx::ALIGN_CENTER);
......@@ -73,6 +72,8 @@ BrowserAppMenuButton::BrowserAppMenuButton(ToolbarView* toolbar_view)
const int radii = ChromeLayoutProvider::Get()->GetCornerRadiusMetric(
views::EMPHASIS_MAXIMUM, gfx::Size(size, size));
set_ink_drop_corner_radii(radii, radii);
md_observer_.Add(ui::MaterialDesignController::GetInstance());
}
BrowserAppMenuButton::~BrowserAppMenuButton() {}
......@@ -241,6 +242,11 @@ void BrowserAppMenuButton::SetTrailingMargin(int margin) {
InvalidateLayout();
}
void BrowserAppMenuButton::OnMdModeChanged() {
UpdateIcon(false);
PreferredSizeChanged();
}
void BrowserAppMenuButton::AnimateIconIfPossible(bool with_delay) {
if (!new_icon_ || !should_use_new_icon_ ||
severity_ == AppMenuIconController::Severity::NONE) {
......
......@@ -14,6 +14,7 @@
#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
#include "chrome/browser/ui/toolbar/app_menu_icon_controller.h"
#include "chrome/browser/ui/views/frame/app_menu_button.h"
#include "ui/base/material_design/material_design_controller_observer.h"
#include "ui/views/controls/animated_icon_view.h"
#include "ui/views/view.h"
......@@ -26,7 +27,8 @@ class ToolbarView;
// The app menu button in the main browser window (as opposed to hosted app
// windows, which is implemented in HostedAppMenuButton).
class BrowserAppMenuButton : public AppMenuButton,
public TabStripModelObserver {
public TabStripModelObserver,
public ui::MaterialDesignControllerObserver {
public:
explicit BrowserAppMenuButton(ToolbarView* toolbar_view);
~BrowserAppMenuButton() override;
......@@ -70,6 +72,10 @@ class BrowserAppMenuButton : public AppMenuButton,
// Used only in testing.
static bool g_open_app_immediately_for_testing;
protected:
// ui::MaterialDesignControllerObserver:
void OnMdModeChanged() override;
private:
// Animates the icon if possible. The icon will not animate if the severity
// level is none, |animation_| is nullptr or |should_use_new_icon_| is false.
......@@ -123,6 +129,10 @@ class BrowserAppMenuButton : public AppMenuButton,
// a maximized state to extend to the full window width.
int margin_trailing_ = 0;
ScopedObserver<ui::MaterialDesignController,
ui::MaterialDesignControllerObserver>
md_observer_{this};
// Used to spawn weak pointers for delayed tasks to open the overflow menu.
base::WeakPtrFactory<BrowserAppMenuButton> weak_factory_{this};
......
......@@ -38,7 +38,6 @@ ToolbarButton::ToolbarButton(views::ButtonListener* listener,
model_(std::move(model)),
tab_strip_model_(tab_strip_model),
trigger_menu_on_long_press_(trigger_menu_on_long_press),
layout_insets_(GetLayoutInsets(TOOLBAR_BUTTON)),
show_menu_factory_(this) {
set_has_ink_drop_action_on_click(true);
set_context_menu_controller(this);
......@@ -92,7 +91,9 @@ void ToolbarButton::UpdateHighlightBackgroundAndInsets() {
SetEnabledTextColors(*highlight_color_);
}
gfx::Insets insets = layout_insets_ + gfx::Insets(0, leading_margin_, 0, 0);
gfx::Insets insets = (layout_insets_ ? layout_insets_.value()
: GetLayoutInsets(TOOLBAR_BUTTON)) +
gfx::Insets(0, leading_margin_, 0, 0);
if (highlight_color_)
insets += gfx::Insets(0, ink_drop_large_corner_radius() / 2, 0, 0);
......
......@@ -8,6 +8,7 @@
#include <memory>
#include "base/macros.h"
#include "base/optional.h"
#include "ui/gfx/geometry/point.h"
#include "ui/views/context_menu_controller.h"
#include "ui/views/controls/button/button.h"
......@@ -136,11 +137,11 @@ class ToolbarButton : public views::LabelButton,
// to extend to the full window width.
int leading_margin_ = 0;
// Base layout insets (normally GetLayoutInsets(TOOLBAR_BUTTON)) that are used
// for the button. This is overridable as AvatarToolbarButton uses smaller
// insets to accomodate for a larger avatar avatar icon. |leading_margin_| and
// |ink_drop_large_corner_radius()| are also used to calculate final insets.
gfx::Insets layout_insets_;
// Base layout insets that are used for the button. This is overridable as
// AvatarToolbarButton uses smaller insets to accommodate for a larger avatar
// avatar icon. |leading_margin_| and |ink_drop_large_corner_radius()| are
// also used to calculate final insets.
base::Optional<gfx::Insets> layout_insets_;
// A highlight color is used to signal error states. When set this color is
// used as a base for background, text and ink drops. When not set, uses the
......
......@@ -127,6 +127,7 @@ ToolbarView::ToolbarView(Browser* browser, BrowserView* browser_view)
chrome::AddCommandObserver(browser_, IDC_LOAD_NEW_TAB_PAGE, this);
UpgradeDetector::GetInstance()->AddObserver(this);
md_observer_.Add(ui::MaterialDesignController::GetInstance());
}
ToolbarView::~ToolbarView() {
......@@ -680,6 +681,12 @@ void ToolbarView::RemovePaneFocus() {
location_bar_->SetFullKeyboardAcessibilityMode(false);
}
// ui::MaterialDesignControllerObserver:
void ToolbarView::OnMdModeChanged() {
LoadImages();
PreferredSizeChanged();
}
////////////////////////////////////////////////////////////////////////////////
// ToolbarView, private:
......
......@@ -10,6 +10,7 @@
#include "base/macros.h"
#include "base/observer_list.h"
#include "base/scoped_observer.h"
#include "chrome/browser/command_observer.h"
#include "chrome/browser/ui/toolbar/app_menu_icon_controller.h"
#include "chrome/browser/ui/toolbar/back_forward_menu_model.h"
......@@ -23,6 +24,7 @@
#include "components/translate/core/browser/translate_step.h"
#include "components/translate/core/common/translate_errors.h"
#include "ui/base/accelerators/accelerator.h"
#include "ui/base/material_design/material_design_controller_observer.h"
#include "ui/views/accessible_pane_view.h"
#include "ui/views/controls/button/menu_button.h"
#include "ui/views/controls/button/menu_button_listener.h"
......@@ -62,7 +64,8 @@ class ToolbarView : public views::AccessiblePaneView,
public AppMenuIconController::Delegate,
public UpgradeObserver,
public ToolbarButtonProvider,
public BrowserRootView::DropTarget {
public BrowserRootView::DropTarget,
public ui::MaterialDesignControllerObserver {
public:
// The view class name.
static const char kViewClassName[];
......@@ -175,6 +178,9 @@ class ToolbarView : public views::AccessiblePaneView,
bool SetPaneFocusAndFocusDefault() override;
void RemovePaneFocus() override;
// ui::MaterialDesignControllerObserver:
void OnMdModeChanged() override;
bool is_display_mode_normal() const {
return display_mode_ == DISPLAYMODE_NORMAL;
}
......@@ -250,6 +256,10 @@ class ToolbarView : public views::AccessiblePaneView,
// The display mode used when laying out the toolbar.
const DisplayMode display_mode_;
ScopedObserver<ui::MaterialDesignController,
ui::MaterialDesignControllerObserver>
md_observer_{this};
// Whether this toolbar has been initialized.
bool initialized_ = false;
......
......@@ -42,13 +42,6 @@
namespace ui {
namespace {
base::ObserverList<MaterialDesignControllerObserver>* GetObservers() {
static base::NoDestructor<
base::ObserverList<MaterialDesignControllerObserver>>
observers;
return observers.get();
}
#if defined(OS_CHROMEOS)
// Whether to use touchable UI.
......@@ -173,18 +166,6 @@ MaterialDesignController::Mode MaterialDesignController::GetMode() {
return mode_;
}
// static
void MaterialDesignController::AddObserver(
MaterialDesignControllerObserver* observer) {
GetObservers()->AddObserver(observer);
}
// static
void MaterialDesignController::RemoveObserver(
MaterialDesignControllerObserver* observer) {
GetObservers()->RemoveObserver(observer);
}
// static
bool MaterialDesignController::IsTouchOptimizedUiEnabled() {
return GetMode() == MATERIAL_TOUCH_OPTIMIZED ||
......@@ -226,6 +207,24 @@ void MaterialDesignController::OnTabletModeToggled(bool enabled) {
SetMode(enabled ? MATERIAL_TOUCH_REFRESH : MATERIAL_REFRESH);
}
// static
MaterialDesignController* MaterialDesignController::GetInstance() {
static base::NoDestructor<MaterialDesignController> instance;
return instance.get();
}
void MaterialDesignController::AddObserver(
MaterialDesignControllerObserver* observer) {
observers_.AddObserver(observer);
}
void MaterialDesignController::RemoveObserver(
MaterialDesignControllerObserver* observer) {
observers_.RemoveObserver(observer);
}
MaterialDesignController::MaterialDesignController() = default;
// static
void MaterialDesignController::Uninitialize() {
is_mode_initialized_ = false;
......@@ -236,8 +235,8 @@ void MaterialDesignController::SetMode(MaterialDesignController::Mode mode) {
if (!is_mode_initialized_ || mode_ != mode) {
is_mode_initialized_ = true;
mode_ = mode;
for (auto& observer : *GetObservers())
observer.OnModeChanged();
for (auto& observer : GetInstance()->observers_)
observer.OnMdModeChanged();
}
}
......
......@@ -6,8 +6,14 @@
#define UI_BASE_MATERIAL_DESIGN_MATERIAL_DESIGN_CONTROLLER_H_
#include "base/macros.h"
#include "base/observer_list.h"
#include "ui/base/ui_base_export.h"
namespace base {
template <typename T>
class NoDestructor;
}
namespace ui {
class MaterialDesignControllerObserver;
......@@ -40,10 +46,6 @@ class UI_BASE_EXPORT MaterialDesignController {
// Get the current Mode that should be used by the system.
static Mode GetMode();
static void AddObserver(MaterialDesignControllerObserver* observer);
static void RemoveObserver(MaterialDesignControllerObserver* observer);
// Returns true if the touch-optimized UI material design mode is enabled.
static bool IsTouchOptimizedUiEnabled();
......@@ -61,9 +63,20 @@ class UI_BASE_EXPORT MaterialDesignController {
static bool is_mode_initialized() { return is_mode_initialized_; }
static MaterialDesignController* GetInstance();
void AddObserver(MaterialDesignControllerObserver* observer);
void RemoveObserver(MaterialDesignControllerObserver* observer);
private:
friend class base::NoDestructor<MaterialDesignController>;
friend class test::MaterialDesignControllerTestAPI;
MaterialDesignController();
~MaterialDesignController() = delete;
// Resets the initialization state to uninitialized. To be used by tests to
// allow calling Initialize() more than once.
static void Uninitialize();
......@@ -84,6 +97,8 @@ class UI_BASE_EXPORT MaterialDesignController {
// MATERIAL_TOUCH_REFRESH depending on the tablet state.
static bool is_refresh_dynamic_ui_;
base::ObserverList<MaterialDesignControllerObserver> observers_;
DISALLOW_COPY_AND_ASSIGN(MaterialDesignController);
};
......
......@@ -13,7 +13,7 @@ namespace ui {
class UI_BASE_EXPORT MaterialDesignControllerObserver
: public base::CheckedObserver {
public:
virtual void OnModeChanged() = 0;
virtual void OnMdModeChanged() = 0;
protected:
~MaterialDesignControllerObserver() override {}
......
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