Commit 559c92b7 authored by Collin Baker's avatar Collin Baker Committed by Commit Bot

Add dialog to edit tab group name and color

The dialog is accessed by clicking on a tab group header. This
preliminary version of the dialog is mainly intended for testing. The
color selection combobox will eventually be replaced with a fancier
color selector.

Change-Id: I7736a0bbeb1af5fb2aaa3b6d3e418008aa72ed11
Bug: 989174
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1717552
Commit-Queue: Collin Baker <collinbaker@chromium.org>
Reviewed-by: default avatarBret Sepulveda <bsep@chromium.org>
Cr-Commit-Position: refs/heads/master@{#683821}
parent 73dceec4
......@@ -3037,6 +3037,8 @@ jumbo_split_static_library("ui") {
"views/tabs/tab_drag_context.h",
"views/tabs/tab_drag_controller.cc",
"views/tabs/tab_drag_controller.h",
"views/tabs/tab_group_editor_bubble_view.cc",
"views/tabs/tab_group_editor_bubble_view.h",
"views/tabs/tab_group_header.cc",
"views/tabs/tab_group_header.h",
"views/tabs/tab_hover_card_bubble_view.cc",
......
......@@ -395,6 +395,12 @@ const TabGroupVisualData* BrowserTabStripController::GetVisualDataForGroup(
return model_->GetVisualDataForGroup(group);
}
void BrowserTabStripController::SetVisualDataForGroup(
TabGroupId group,
TabGroupVisualData visual_data) {
model_->SetVisualDataForGroup(group, visual_data);
}
std::vector<int> BrowserTabStripController::ListTabsInGroup(
TabGroupId group) const {
return model_->ListTabsInGroup(group);
......
......@@ -74,6 +74,8 @@ class BrowserTabStripController : public TabStripController,
void OnStoppedDraggingTabs() override;
const TabGroupVisualData* GetVisualDataForGroup(
TabGroupId group_id) const override;
void SetVisualDataForGroup(TabGroupId group,
TabGroupVisualData visual_data) override;
std::vector<int> ListTabsInGroup(TabGroupId group_id) const override;
bool IsFrameCondensed() const override;
bool HasVisibleBackgroundTabShapes() const override;
......
......@@ -76,6 +76,12 @@ const TabGroupVisualData* FakeBaseTabStripController::GetVisualDataForGroup(
return &fake_group_data_;
}
void FakeBaseTabStripController::SetVisualDataForGroup(
TabGroupId group,
TabGroupVisualData visual_data) {
fake_group_data_ = visual_data;
}
std::vector<int> FakeBaseTabStripController::ListTabsInGroup(
TabGroupId group) const {
std::vector<int> result;
......
......@@ -58,6 +58,8 @@ class FakeBaseTabStripController : public TabStripController {
void OnStoppedDraggingTabs() override;
const TabGroupVisualData* GetVisualDataForGroup(
TabGroupId group_id) const override;
void SetVisualDataForGroup(TabGroupId group,
TabGroupVisualData visual_data) override;
std::vector<int> ListTabsInGroup(TabGroupId group_id) const override;
bool IsFrameCondensed() const override;
bool HasVisibleBackgroundTabShapes() const override;
......
......@@ -182,6 +182,9 @@ class TabController {
virtual const TabGroupVisualData* GetVisualDataForGroup(
TabGroupId group) const = 0;
virtual void SetVisualDataForGroup(TabGroupId group,
TabGroupVisualData visual_data) = 0;
protected:
virtual ~TabController() {}
};
......
// Copyright 2019 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.
#include "chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.h"
#include <memory>
#include <string>
#include <vector>
#include "base/containers/flat_map.h"
#include "base/no_destructor.h"
#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/ui/tabs/tab_group_visual_data.h"
#include "chrome/browser/ui/views/chrome_layout_provider.h"
#include "chrome/browser/ui/views/chrome_typography.h"
#include "chrome/browser/ui/views/tabs/tab_controller.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/base/models/simple_combobox_model.h"
#include "ui/gfx/color_palette.h"
#include "ui/gfx/geometry/insets.h"
#include "ui/views/controls/combobox/combobox.h"
#include "ui/views/controls/label.h"
#include "ui/views/layout/box_layout.h"
#include "ui/views/layout/layout_types.h"
#include "ui/views/view_class_properties.h"
namespace {
// Returns our hard-coded set of colors.
const base::flat_map<std::string, SkColor>& GetColorPickerMap() {
static const base::NoDestructor<base::flat_map<std::string, SkColor>> map(
{{"Blue", gfx::kGoogleBlue600},
{"Red", gfx::kGoogleRed600},
{"Yellow", gfx::kGoogleYellow600},
{"Green", gfx::kGoogleGreen600},
// TODO(crbug.com/989174): add these expanded palette colors to
// ui/gfx/color_palette.h
{"Orange", SkColorSetRGB(0xE8, 0x71, 0x0A)},
{"Pink", SkColorSetRGB(0xE5, 0x25, 0x92)},
{"Purple", SkColorSetRGB(0x93, 0x34, 0xE6)},
{"Cyan", SkColorSetRGB(0x12, 0xB5, 0xCB)}});
return *map;
}
} // namespace
// static
void TabGroupEditorBubbleView::Show(views::View* anchor_view,
TabController* tab_controller,
TabGroupId group) {
BubbleDialogDelegateView::CreateBubble(
new TabGroupEditorBubbleView(anchor_view, tab_controller, group))
->Show();
}
gfx::Size TabGroupEditorBubbleView::CalculatePreferredSize() const {
const int width = ChromeLayoutProvider::Get()->GetDistanceMetric(
DISTANCE_BUBBLE_PREFERRED_WIDTH) -
margins().width();
return gfx::Size(width, GetHeightForWidth(width));
}
base::string16 TabGroupEditorBubbleView::GetWindowTitle() const {
// TODO(crbug.com/989174): remove this and other hardcoded ASCII strings.
return base::ASCIIToUTF16("Customize tab group visuals");
}
bool TabGroupEditorBubbleView::Accept() {
TabGroupVisualData old_data = *tab_controller_->GetVisualDataForGroup(group_);
base::string16 title = title_field_->GetText();
if (title.empty())
title = old_data.title();
const base::string16 color_name =
color_selector_->model()->GetItemAt(color_selector_->GetSelectedIndex());
const SkColor color =
GetColorPickerMap().find(base::UTF16ToASCII(color_name))->second;
TabGroupVisualData new_data(std::move(title), color);
tab_controller_->SetVisualDataForGroup(group_, new_data);
return true;
}
TabGroupEditorBubbleView::TabGroupEditorBubbleView(
views::View* anchor_view,
TabController* tab_controller,
TabGroupId group)
: tab_controller_(tab_controller), group_(group) {
SetAnchorView(anchor_view);
const auto* layout_provider = ChromeLayoutProvider::Get();
// Add the text field for editing the title along with a label above it.
AddChildView(std::make_unique<views::Label>(base::ASCIIToUTF16("New title:"),
views::style::CONTEXT_LABEL,
views::style::STYLE_PRIMARY));
title_field_ = AddChildView(std::make_unique<views::Textfield>());
title_field_->SetDefaultWidthInChars(15);
title_field_->SetProperty(
views::kMarginsKey,
gfx::Insets(0, 0,
layout_provider->GetDistanceMetric(
views::DISTANCE_UNRELATED_CONTROL_VERTICAL),
0));
std::vector<base::string16> color_names;
for (const auto& entry : GetColorPickerMap())
color_names.push_back(base::ASCIIToUTF16(entry.first));
auto combobox_model = std::make_unique<ui::SimpleComboboxModel>(color_names);
// Add the color selector with label above it.
AddChildView(std::make_unique<views::Label>(base::ASCIIToUTF16("New color:"),
views::style::CONTEXT_LABEL,
views::style::STYLE_PRIMARY));
color_selector_ = AddChildView(
std::make_unique<views::Combobox>(std::move(combobox_model)));
// Layout vertically with margin collapsing. This allows us to use spacer
// views with |DISTANCE_UNRELATED_CONTROL_VERTICAL| margins without worrying
// about the default |DISTANCE_RELATED_CONTROL_VERTICAL| spacing.
auto layout = std::make_unique<views::BoxLayout>(
views::BoxLayout::Orientation::kVertical, gfx::Insets(),
layout_provider->GetDistanceMetric(
views::DISTANCE_RELATED_CONTROL_VERTICAL),
true /* collapse_margins_spacing */);
layout->set_cross_axis_alignment(
views::BoxLayout::CrossAxisAlignment::kStart);
SetLayoutManager(std::move(layout));
}
TabGroupEditorBubbleView::~TabGroupEditorBubbleView() = default;
// Copyright 2019 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_VIEWS_TABS_TAB_GROUP_EDITOR_BUBBLE_VIEW_H_
#define CHROME_BROWSER_UI_VIEWS_TABS_TAB_GROUP_EDITOR_BUBBLE_VIEW_H_
#include "base/strings/string16.h"
#include "chrome/browser/ui/tabs/tab_group_id.h"
#include "ui/views/bubble/bubble_dialog_delegate_view.h"
#include "ui/views/controls/textfield/textfield.h"
class TabController;
namespace gfx {
class Size;
}
namespace views {
class Combobox;
}
// A dialog for changing a tab group's visual parameters.
//
// TODO(crbug.com/989174): polish this UI. It is currently sufficient for
// testing, but it is not ready to be launched.
class TabGroupEditorBubbleView : public views::BubbleDialogDelegateView {
public:
static void Show(views::View* anchor_view,
TabController* tab_controller,
TabGroupId group);
// views::BubbleDialogDelegateView:
gfx::Size CalculatePreferredSize() const override;
base::string16 GetWindowTitle() const override;
bool Accept() override;
private:
TabGroupEditorBubbleView(views::View* anchor_view,
TabController* tab_controller,
TabGroupId group);
~TabGroupEditorBubbleView() override;
TabController* const tab_controller_;
const TabGroupId group_;
views::Textfield* title_field_;
// TODO(crbug.com/989174): replace this with a color palette.
views::Combobox* color_selector_;
};
#endif // CHROME_BROWSER_UI_VIEWS_TABS_TAB_GROUP_EDITOR_BUBBLE_VIEW_H_
......@@ -13,6 +13,7 @@
#include "chrome/browser/ui/tabs/tab_style.h"
#include "chrome/browser/ui/views/chrome_layout_provider.h"
#include "chrome/browser/ui/views/tabs/tab_controller.h"
#include "chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.h"
#include "third_party/skia/include/core/SkColor.h"
#include "third_party/skia/include/core/SkPath.h"
#include "ui/gfx/canvas.h"
......@@ -65,3 +66,8 @@ void TabGroupHeader::VisualsChanged() {
title_->SetEnabledColor(color_utils::GetColorWithMaxContrast(data->color()));
title_->SetText(data->title());
}
bool TabGroupHeader::OnMousePressed(const ui::MouseEvent& event) {
TabGroupEditorBubbleView::Show(this, controller_, group_);
return true;
}
......@@ -25,6 +25,9 @@ class TabGroupHeader : public views::View {
// Updates our visual state according to the TabGroupVisualData for our group.
void VisualsChanged();
// views::View:
bool OnMousePressed(const ui::MouseEvent& event) override;
private:
TabController* const controller_;
const TabGroupId group_;
......
......@@ -1871,6 +1871,11 @@ const TabGroupVisualData* TabStrip::GetVisualDataForGroup(
return controller_->GetVisualDataForGroup(group);
}
void TabStrip::SetVisualDataForGroup(TabGroupId group,
TabGroupVisualData visual_data) {
controller_->SetVisualDataForGroup(group, visual_data);
}
///////////////////////////////////////////////////////////////////////////////
// TabStrip, views::AccessiblePaneView overrides:
......
......@@ -281,6 +281,8 @@ class TabStrip : public views::AccessiblePaneView,
float GetHoverOpacityForRadialHighlight() const override;
const TabGroupVisualData* GetVisualDataForGroup(
TabGroupId group) const override;
void SetVisualDataForGroup(TabGroupId group,
TabGroupVisualData visual_data) override;
// MouseWatcherListener:
void MouseMovedOutOfHost() override;
......
......@@ -115,6 +115,9 @@ class TabStripController {
virtual const TabGroupVisualData* GetVisualDataForGroup(
TabGroupId group) const = 0;
virtual void SetVisualDataForGroup(TabGroupId group,
TabGroupVisualData visual_data) = 0;
// Returns the list of tabs in the given |group|.
virtual std::vector<int> ListTabsInGroup(TabGroupId group) const = 0;
......
......@@ -119,11 +119,15 @@ class FakeTabController : public TabController {
return 1.0f;
}
float GetHoverOpacityForRadialHighlight() const override { return 1.0f; }
const TabGroupVisualData* GetVisualDataForGroup(
TabGroupId group) const override {
return nullptr;
}
void SetVisualDataForGroup(TabGroupId group,
TabGroupVisualData visual_data) override {}
void SetTabColors(SkColor bg_color_active,
SkColor fg_color_active,
SkColor bg_color_inactive,
......
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