Commit 6a1f6124 authored by Charlene Yan's avatar Charlene Yan Committed by Commit Bot

[Tab Groups] Initial work for collapse.

This CL includes the following:
- data plumbing for the collapsed boolean
- logic for showing collapsed based on the flag
- updating the tab bounds if collapsed

Change-Id: Iadcba24738eab795945134a8b77b98076fe59491
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2159931
Commit-Queue: Charlene Yan <cyan@chromium.org>
Reviewed-by: default avatarConnie Wan <connily@chromium.org>
Cr-Commit-Position: refs/heads/master@{#769063}
parent 966e2e36
...@@ -347,6 +347,14 @@ void BrowserTabStripController::MoveGroup(const tab_groups::TabGroupId& group, ...@@ -347,6 +347,14 @@ void BrowserTabStripController::MoveGroup(const tab_groups::TabGroupId& group,
model_->MoveGroupTo(group, final_index); model_->MoveGroupTo(group, final_index);
} }
void BrowserTabStripController::ToggleTabGroupCollapsedState(
const tab_groups::TabGroupId group) {
tab_groups::TabGroupVisualData new_data(GetGroupTitle(group),
GetGroupColorId(group),
!GetGroupCollapsedState(group));
model_->group_model()->GetTabGroup(group)->SetVisualData(new_data, true);
}
void BrowserTabStripController::ShowContextMenuForTab( void BrowserTabStripController::ShowContextMenuForTab(
Tab* tab, Tab* tab,
const gfx::Point& p, const gfx::Point& p,
...@@ -466,6 +474,15 @@ tab_groups::TabGroupColorId BrowserTabStripController::GetGroupColorId( ...@@ -466,6 +474,15 @@ tab_groups::TabGroupColorId BrowserTabStripController::GetGroupColorId(
return model_->group_model()->GetTabGroup(group)->visual_data()->color(); return model_->group_model()->GetTabGroup(group)->visual_data()->color();
} }
bool BrowserTabStripController::GetGroupCollapsedState(
const tab_groups::TabGroupId& group) const {
return model_->group_model()->ContainsTabGroup(group) &&
model_->group_model()
->GetTabGroup(group)
->visual_data()
->is_collapsed();
}
void BrowserTabStripController::SetVisualDataForGroup( void BrowserTabStripController::SetVisualDataForGroup(
const tab_groups::TabGroupId& group, const tab_groups::TabGroupId& group,
const tab_groups::TabGroupVisualData& visual_data) { const tab_groups::TabGroupVisualData& visual_data) {
......
...@@ -75,6 +75,8 @@ class BrowserTabStripController : public TabStripController, ...@@ -75,6 +75,8 @@ class BrowserTabStripController : public TabStripController,
void RemoveTabFromGroup(int model_index) override; void RemoveTabFromGroup(int model_index) override;
void MoveTab(int start_index, int final_index) override; void MoveTab(int start_index, int final_index) override;
void MoveGroup(const tab_groups::TabGroupId& group, int final_index) override; void MoveGroup(const tab_groups::TabGroupId& group, int final_index) override;
void ToggleTabGroupCollapsedState(
const tab_groups::TabGroupId group) override;
void ShowContextMenuForTab(Tab* tab, void ShowContextMenuForTab(Tab* tab,
const gfx::Point& p, const gfx::Point& p,
ui::MenuSourceType source_type) override; ui::MenuSourceType source_type) override;
...@@ -92,6 +94,9 @@ class BrowserTabStripController : public TabStripController, ...@@ -92,6 +94,9 @@ class BrowserTabStripController : public TabStripController,
const tab_groups::TabGroupId& group_id) const override; const tab_groups::TabGroupId& group_id) const override;
tab_groups::TabGroupColorId GetGroupColorId( tab_groups::TabGroupColorId GetGroupColorId(
const tab_groups::TabGroupId& group_id) const override; const tab_groups::TabGroupId& group_id) const override;
bool GetGroupCollapsedState(
const tab_groups::TabGroupId& group) const override;
void SetVisualDataForGroup( void SetVisualDataForGroup(
const tab_groups::TabGroupId& group, const tab_groups::TabGroupId& group,
const tab_groups::TabGroupVisualData& visual_data) override; const tab_groups::TabGroupVisualData& visual_data) override;
......
...@@ -52,6 +52,13 @@ void FakeBaseTabStripController::MoveTab(int from_index, int to_index) { ...@@ -52,6 +52,13 @@ void FakeBaseTabStripController::MoveTab(int from_index, int to_index) {
void FakeBaseTabStripController::MoveGroup(const tab_groups::TabGroupId& group, void FakeBaseTabStripController::MoveGroup(const tab_groups::TabGroupId& group,
int to_index) {} int to_index) {}
void FakeBaseTabStripController::ToggleTabGroupCollapsedState(
const tab_groups::TabGroupId group) {
fake_group_data_ = tab_groups::TabGroupVisualData(
fake_group_data_.title(), fake_group_data_.color(),
!fake_group_data_.is_collapsed());
}
void FakeBaseTabStripController::RemoveTab(int index) { void FakeBaseTabStripController::RemoveTab(int index) {
num_tabs_--; num_tabs_--;
// RemoveTabAt() expects the controller state to have been updated already. // RemoveTabAt() expects the controller state to have been updated already.
...@@ -82,6 +89,11 @@ tab_groups::TabGroupColorId FakeBaseTabStripController::GetGroupColorId( ...@@ -82,6 +89,11 @@ tab_groups::TabGroupColorId FakeBaseTabStripController::GetGroupColorId(
return fake_group_data_.color(); return fake_group_data_.color();
} }
bool FakeBaseTabStripController::GetGroupCollapsedState(
const tab_groups::TabGroupId& group) const {
return fake_group_data_.is_collapsed();
}
void FakeBaseTabStripController::SetVisualDataForGroup( void FakeBaseTabStripController::SetVisualDataForGroup(
const tab_groups::TabGroupId& group, const tab_groups::TabGroupId& group,
const tab_groups::TabGroupVisualData& visual_data) { const tab_groups::TabGroupVisualData& visual_data) {
......
...@@ -48,6 +48,8 @@ class FakeBaseTabStripController : public TabStripController { ...@@ -48,6 +48,8 @@ class FakeBaseTabStripController : public TabStripController {
void CloseTab(int index) override; void CloseTab(int index) override;
void MoveTab(int from_index, int to_index) override; void MoveTab(int from_index, int to_index) override;
void MoveGroup(const tab_groups::TabGroupId&, int to_index) override; void MoveGroup(const tab_groups::TabGroupId&, int to_index) override;
void ToggleTabGroupCollapsedState(
const tab_groups::TabGroupId group) override;
void ShowContextMenuForTab(Tab* tab, void ShowContextMenuForTab(Tab* tab,
const gfx::Point& p, const gfx::Point& p,
ui::MenuSourceType source_type) override; ui::MenuSourceType source_type) override;
...@@ -65,6 +67,8 @@ class FakeBaseTabStripController : public TabStripController { ...@@ -65,6 +67,8 @@ class FakeBaseTabStripController : public TabStripController {
const tab_groups::TabGroupId& group_id) const override; const tab_groups::TabGroupId& group_id) const override;
tab_groups::TabGroupColorId GetGroupColorId( tab_groups::TabGroupColorId GetGroupColorId(
const tab_groups::TabGroupId& group_id) const override; const tab_groups::TabGroupId& group_id) const override;
bool GetGroupCollapsedState(
const tab_groups::TabGroupId& group) const override;
void SetVisualDataForGroup( void SetVisualDataForGroup(
const tab_groups::TabGroupId& group, const tab_groups::TabGroupId& group,
const tab_groups::TabGroupVisualData& visual_data) override; const tab_groups::TabGroupVisualData& visual_data) override;
......
...@@ -7,10 +7,12 @@ ...@@ -7,10 +7,12 @@
#include <memory> #include <memory>
#include <utility> #include <utility>
#include "base/feature_list.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "build/build_config.h" #include "build/build_config.h"
#include "chrome/browser/ui/layout_constants.h" #include "chrome/browser/ui/layout_constants.h"
#include "chrome/browser/ui/tabs/tab_style.h" #include "chrome/browser/ui/tabs/tab_style.h"
#include "chrome/browser/ui/ui_features.h"
#include "chrome/browser/ui/views/tabs/tab_controller.h" #include "chrome/browser/ui/views/tabs/tab_controller.h"
#include "chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.h" #include "chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.h"
#include "chrome/browser/ui/views/tabs/tab_group_underline.h" #include "chrome/browser/ui/views/tabs/tab_group_underline.h"
...@@ -152,10 +154,19 @@ bool TabGroupHeader::OnMouseDragged(const ui::MouseEvent& event) { ...@@ -152,10 +154,19 @@ bool TabGroupHeader::OnMouseDragged(const ui::MouseEvent& event) {
} }
void TabGroupHeader::OnMouseReleased(const ui::MouseEvent& event) { void TabGroupHeader::OnMouseReleased(const ui::MouseEvent& event) {
if (!dragging() && !editor_bubble_tracker_.is_open()) { if (base::FeatureList::IsEnabled(features::kTabGroupsCollapse)) {
// The collapse feature changes the left click behavior from showing the
// editor bubble to toggling the collapsed state of the group.
if (event.IsLeftMouseButton() && !dragging())
tab_strip_->controller()->ToggleTabGroupCollapsedState(group().value());
} else if (!dragging() && !editor_bubble_tracker_.is_open()) {
// (TODO): Delete this else statement once collapse launches since
// ShowContextMenuForViewImpl() will handle spawning the bubble on right
// clicks.
editor_bubble_tracker_.Opened(TabGroupEditorBubbleView::Show( editor_bubble_tracker_.Opened(TabGroupEditorBubbleView::Show(
tab_strip_->controller()->GetBrowser(), group().value(), this)); tab_strip_->controller()->GetBrowser(), group().value(), this));
} }
tab_strip_->EndDrag(END_DRAG_COMPLETE); tab_strip_->EndDrag(END_DRAG_COMPLETE);
} }
......
...@@ -98,6 +98,9 @@ class TabStripController { ...@@ -98,6 +98,9 @@ class TabStripController {
virtual void MoveGroup(const tab_groups::TabGroupId& group, virtual void MoveGroup(const tab_groups::TabGroupId& group,
int final_index) = 0; int final_index) = 0;
virtual void ToggleTabGroupCollapsedState(
const tab_groups::TabGroupId group) = 0;
// Shows a context menu for the tab at the specified point in screen coords. // Shows a context menu for the tab at the specified point in screen coords.
virtual void ShowContextMenuForTab(Tab* tab, virtual void ShowContextMenuForTab(Tab* tab,
const gfx::Point& p, const gfx::Point& p,
...@@ -149,6 +152,9 @@ class TabStripController { ...@@ -149,6 +152,9 @@ class TabStripController {
virtual tab_groups::TabGroupColorId GetGroupColorId( virtual tab_groups::TabGroupColorId GetGroupColorId(
const tab_groups::TabGroupId& group) const = 0; const tab_groups::TabGroupId& group) const = 0;
virtual bool GetGroupCollapsedState(
const tab_groups::TabGroupId& group) const = 0;
// Sets the title and color ID of the given |group|. // Sets the title and color ID of the given |group|.
virtual void SetVisualDataForGroup( virtual void SetVisualDataForGroup(
const tab_groups::TabGroupId& group, const tab_groups::TabGroupId& group,
......
...@@ -152,10 +152,12 @@ std::vector<gfx::Rect> CalculateTabBounds( ...@@ -152,10 +152,12 @@ std::vector<gfx::Rect> CalculateTabBounds(
int next_x = 0; int next_x = 0;
std::vector<gfx::Rect> bounds; std::vector<gfx::Rect> bounds;
for (const TabWidthConstraints& tab : tabs) { for (const TabWidthConstraints& tab : tabs) {
const int tab_width = tab_sizer.CalculateTabWidth(tab); const int tab_width =
tab.IsCollapsed() ? 0 : tab_sizer.CalculateTabWidth(tab);
bounds.push_back( bounds.push_back(
gfx::Rect(next_x, 0, tab_width, layout_constants.tab_height)); gfx::Rect(next_x, 0, tab_width, layout_constants.tab_height));
next_x += tab_width - layout_constants.tab_overlap; if (!tab.IsCollapsed())
next_x += tab_width - layout_constants.tab_overlap;
} }
const base::Optional<int> calculated_extra_space = const base::Optional<int> calculated_extra_space =
......
...@@ -341,8 +341,18 @@ std::vector<gfx::Rect> TabStripLayoutHelper::CalculateIdealBounds( ...@@ -341,8 +341,18 @@ std::vector<gfx::Rect> TabStripLayoutHelper::CalculateIdealBounds(
TabAnimationState ideal_animation_state = TabAnimationState ideal_animation_state =
TabAnimationState::ForIdealTabState(open, pinned, active, 0); TabAnimationState::ForIdealTabState(open, pinned, active, 0);
TabSizeInfo size_info = slots_[i].view->GetTabSizeInfo(); TabSizeInfo size_info = slots_[i].view->GetTabSizeInfo();
base::Optional<tab_groups::TabGroupId> id = slots_[i].view->group();
// The slot can only be collapsed if it is a tab and in a collapsed group.
// If the slot is indeed a tab and in a group, check the collapsed state of
// the group to determine if it is collapsed.
bool slot_is_collapsed_tab =
(slots_[i].type == ViewType::kTab && id.has_value())
? controller_->GetGroupCollapsedState(id.value())
: false;
tab_widths.push_back(TabWidthConstraints(ideal_animation_state, tab_widths.push_back(TabWidthConstraints(ideal_animation_state,
layout_constants, size_info)); layout_constants, size_info,
slot_is_collapsed_tab));
} }
return CalculateTabBounds(layout_constants, tab_widths, tabstrip_width, return CalculateTabBounds(layout_constants, tab_widths, tabstrip_width,
......
...@@ -10,10 +10,12 @@ ...@@ -10,10 +10,12 @@
TabWidthConstraints::TabWidthConstraints( TabWidthConstraints::TabWidthConstraints(
const TabAnimationState& state, const TabAnimationState& state,
const TabLayoutConstants& layout_constants, const TabLayoutConstants& layout_constants,
const TabSizeInfo& size_info) const TabSizeInfo& size_info,
bool is_collapsed)
: state_(state), : state_(state),
layout_constants_(layout_constants), layout_constants_(layout_constants),
size_info_(size_info) {} size_info_(size_info),
is_collapsed_(is_collapsed) {}
float TabWidthConstraints::GetMinimumWidth() const { float TabWidthConstraints::GetMinimumWidth() const {
const float min_width = gfx::Tween::FloatValueBetween( const float min_width = gfx::Tween::FloatValueBetween(
......
...@@ -15,7 +15,8 @@ class TabWidthConstraints { ...@@ -15,7 +15,8 @@ class TabWidthConstraints {
public: public:
TabWidthConstraints(const TabAnimationState& state, TabWidthConstraints(const TabAnimationState& state,
const TabLayoutConstants& layout_constants, const TabLayoutConstants& layout_constants,
const TabSizeInfo& size_info); const TabSizeInfo& size_info,
bool is_collapsed = false);
// The smallest width this tab should ever have. // The smallest width this tab should ever have.
float GetMinimumWidth() const; float GetMinimumWidth() const;
...@@ -29,6 +30,8 @@ class TabWidthConstraints { ...@@ -29,6 +30,8 @@ class TabWidthConstraints {
// The width this tab would like to have, if space is available. // The width this tab would like to have, if space is available.
float GetPreferredWidth() const; float GetPreferredWidth() const;
bool IsCollapsed() const { return is_collapsed_; }
private: private:
// All widths are affected by pinnedness and activeness in the same way. // All widths are affected by pinnedness and activeness in the same way.
float TransformForPinnednessAndOpenness(float width) const; float TransformForPinnednessAndOpenness(float width) const;
...@@ -36,6 +39,8 @@ class TabWidthConstraints { ...@@ -36,6 +39,8 @@ class TabWidthConstraints {
TabAnimationState state_; TabAnimationState state_;
TabLayoutConstants layout_constants_; TabLayoutConstants layout_constants_;
TabSizeInfo size_info_; TabSizeInfo size_info_;
bool is_collapsed_;
}; };
#endif // CHROME_BROWSER_UI_VIEWS_TABS_TAB_WIDTH_CONSTRAINTS_H_ #endif // CHROME_BROWSER_UI_VIEWS_TABS_TAB_WIDTH_CONSTRAINTS_H_
...@@ -12,14 +12,19 @@ ...@@ -12,14 +12,19 @@
namespace tab_groups { namespace tab_groups {
TabGroupVisualData::TabGroupVisualData() TabGroupVisualData::TabGroupVisualData()
: TabGroupVisualData(base::string16(), TabGroupColorId::kGrey) {} : TabGroupVisualData(base::string16(), TabGroupColorId::kGrey, false) {}
TabGroupVisualData::TabGroupVisualData(base::string16 title, TabGroupVisualData::TabGroupVisualData(base::string16 title,
tab_groups::TabGroupColorId color) tab_groups::TabGroupColorId color,
: title_(std::move(title)), color_(color) {} bool is_collapsed)
: title_(std::move(title)), color_(color), is_collapsed_(is_collapsed) {}
TabGroupVisualData::TabGroupVisualData(base::string16 title, uint32_t color_int) TabGroupVisualData::TabGroupVisualData(base::string16 title,
: title_(std::move(title)), color_(TabGroupColorId::kGrey) { uint32_t color_int,
bool is_collapsed)
: title_(std::move(title)),
color_(TabGroupColorId::kGrey),
is_collapsed_(is_collapsed) {
auto color_id = static_cast<tab_groups::TabGroupColorId>(color_int); auto color_id = static_cast<tab_groups::TabGroupColorId>(color_int);
if (base::Contains(tab_groups::GetTabGroupColorLabelMap(), color_id)) if (base::Contains(tab_groups::GetTabGroupColorLabelMap(), color_id))
color_ = color_id; color_ = color_id;
......
...@@ -19,8 +19,12 @@ class COMPONENT_EXPORT(TAB_GROUPS) TabGroupVisualData { ...@@ -19,8 +19,12 @@ class COMPONENT_EXPORT(TAB_GROUPS) TabGroupVisualData {
public: public:
// Construct a TabGroupVisualData with placeholder name and random color. // Construct a TabGroupVisualData with placeholder name and random color.
TabGroupVisualData(); TabGroupVisualData();
TabGroupVisualData(base::string16 title, tab_groups::TabGroupColorId color); TabGroupVisualData(base::string16 title,
TabGroupVisualData(base::string16 title, uint32_t color_int); tab_groups::TabGroupColorId color,
bool is_collapsed = false);
TabGroupVisualData(base::string16 title,
uint32_t color_int,
bool is_collapsed = false);
TabGroupVisualData(const TabGroupVisualData& other) = default; TabGroupVisualData(const TabGroupVisualData& other) = default;
TabGroupVisualData(TabGroupVisualData&& other) = default; TabGroupVisualData(TabGroupVisualData&& other) = default;
...@@ -30,6 +34,7 @@ class COMPONENT_EXPORT(TAB_GROUPS) TabGroupVisualData { ...@@ -30,6 +34,7 @@ class COMPONENT_EXPORT(TAB_GROUPS) TabGroupVisualData {
const base::string16& title() const { return title_; } const base::string16& title() const { return title_; }
const tab_groups::TabGroupColorId& color() const { return color_; } const tab_groups::TabGroupColorId& color() const { return color_; }
bool is_collapsed() const { return is_collapsed_; }
// Checks whether two instances are visually equivalent. // Checks whether two instances are visually equivalent.
bool operator==(const TabGroupVisualData& other) const { bool operator==(const TabGroupVisualData& other) const {
...@@ -42,6 +47,7 @@ class COMPONENT_EXPORT(TAB_GROUPS) TabGroupVisualData { ...@@ -42,6 +47,7 @@ class COMPONENT_EXPORT(TAB_GROUPS) TabGroupVisualData {
private: private:
base::string16 title_; base::string16 title_;
tab_groups::TabGroupColorId color_; tab_groups::TabGroupColorId color_;
bool is_collapsed_;
}; };
} // namespace tab_groups } // namespace tab_groups
......
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