Skip to content

Commit 3c394b0

Browse files
committed
Handle split view commands enabled state with SideBySide
fix brave/brave-browser#46492
1 parent 87a2405 commit 3c394b0

File tree

4 files changed

+148
-8
lines changed

4 files changed

+148
-8
lines changed

browser/ui/brave_browser_command_controller.cc

Lines changed: 82 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,11 @@
3636
#include "chrome/browser/ui/browser_command_controller.h"
3737
#include "chrome/browser/ui/browser_commands.h"
3838
#include "chrome/browser/ui/browser_window/public/browser_window_features.h"
39+
#include "chrome/browser/ui/tabs/split_tab_visual_data.h"
3940
#include "chrome/browser/ui/tabs/tab_change_type.h"
4041
#include "chrome/browser/ui/tabs/tab_strip_model.h"
4142
#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
43+
#include "chrome/browser/ui/ui_features.h"
4244
#include "chrome/common/pref_names.h"
4345
#include "components/prefs/pref_service.h"
4446
#include "components/sync/base/command_line_switches.h"
@@ -136,6 +138,40 @@ void BraveBrowserCommandController::OnTabStripModelChanged(
136138
selection.active_tab_changed()) {
137139
UpdateCommandForSplitView();
138140
}
141+
142+
if (base::FeatureList::IsEnabled(features::kSideBySide) &&
143+
browser_->is_type_normal() && selection.active_tab_changed()) {
144+
UpdateCommandForSplitViewWithSideBySide();
145+
}
146+
}
147+
148+
void BraveBrowserCommandController::OnSplitTabCreated(
149+
std::vector<std::pair<tabs::TabInterface*, int>> tabs,
150+
split_tabs::SplitTabId split_id,
151+
SplitTabAddReason reason,
152+
split_tabs::SplitTabVisualData visual_data) {
153+
UpdateCommandForSplitViewWithSideBySide();
154+
}
155+
156+
void BraveBrowserCommandController::OnSplitTabRemoved(
157+
std::vector<std::pair<tabs::TabInterface*, int>> tabs,
158+
split_tabs::SplitTabId split_id,
159+
SplitTabRemoveReason reason) {
160+
UpdateCommandForSplitViewWithSideBySide();
161+
}
162+
163+
void BraveBrowserCommandController::OnSplitTabVisualsChanged(
164+
split_tabs::SplitTabId split_id,
165+
split_tabs::SplitTabVisualData old_visual_data,
166+
split_tabs::SplitTabVisualData new_visual_data) {
167+
UpdateCommandForSplitViewWithSideBySide();
168+
}
169+
170+
void BraveBrowserCommandController::OnSplitTabContentsUpdated(
171+
split_tabs::SplitTabId split_id,
172+
std::vector<std::pair<tabs::TabInterface*, int>> prev_tabs,
173+
std::vector<std::pair<tabs::TabInterface*, int>> new_tabs) {
174+
UpdateCommandForSplitViewWithSideBySide();
139175
}
140176

141177
void BraveBrowserCommandController::OnTabGroupChanged(
@@ -466,6 +502,20 @@ void BraveBrowserCommandController::UpdateCommandForSplitView() {
466502
}
467503
}
468504

505+
void BraveBrowserCommandController::UpdateCommandForSplitViewWithSideBySide() {
506+
UpdateCommandEnabled(
507+
IDC_NEW_SPLIT_VIEW,
508+
brave::CanOpenNewSplitTabsWithSideBySide(base::to_address(browser_)));
509+
UpdateCommandEnabled(IDC_TILE_TABS, brave::CanSplitTabsWithSideBySide(
510+
base::to_address(browser_)));
511+
512+
const auto is_split_tab = brave::IsSplitTabs(base::to_address(browser_));
513+
for (auto command_enabled_when_tab_is_split :
514+
{IDC_BREAK_TILE, IDC_SWAP_SPLIT_VIEW}) {
515+
UpdateCommandEnabled(command_enabled_when_tab_is_split, is_split_tab);
516+
}
517+
}
518+
469519
void BraveBrowserCommandController::UpdateCommandForBraveSync() {
470520
UpdateCommandEnabled(IDC_SHOW_BRAVE_SYNC, true);
471521
}
@@ -687,18 +737,42 @@ bool BraveBrowserCommandController::ExecuteBraveCommandWithDisposition(
687737
case IDC_WINDOW_BRING_ALL_TABS:
688738
brave::BringAllTabs(&*browser_);
689739
break;
690-
case IDC_NEW_SPLIT_VIEW:
691-
brave::NewSplitViewForTab(&*browser_);
740+
case IDC_NEW_SPLIT_VIEW: {
741+
if (tabs::features::IsBraveSplitViewEnabled()) {
742+
brave::NewSplitViewForTab(&*browser_);
743+
} else {
744+
CHECK(base::FeatureList::IsEnabled(features::kSideBySide));
745+
brave::SplitTabsWithSideBySide(base::to_address(browser_));
746+
}
692747
break;
693-
case IDC_TILE_TABS:
694-
brave::TileTabs(&*browser_);
748+
}
749+
case IDC_TILE_TABS: {
750+
if (tabs::features::IsBraveSplitViewEnabled()) {
751+
brave::TileTabs(&*browser_);
752+
} else {
753+
CHECK(base::FeatureList::IsEnabled(features::kSideBySide));
754+
brave::NewSplitTabsForTabWithSideBySide(base::to_address(browser_));
755+
}
695756
break;
696-
case IDC_BREAK_TILE:
697-
brave::BreakTiles(&*browser_);
757+
}
758+
case IDC_BREAK_TILE: {
759+
if (tabs::features::IsBraveSplitViewEnabled()) {
760+
brave::BreakTiles(&*browser_);
761+
} else {
762+
CHECK(base::FeatureList::IsEnabled(features::kSideBySide));
763+
brave::RemoveSplitWithSideBySide(base::to_address(browser_));
764+
}
698765
break;
699-
case IDC_SWAP_SPLIT_VIEW:
700-
brave::SwapTabsInTile(&*browser_);
766+
}
767+
case IDC_SWAP_SPLIT_VIEW: {
768+
if (tabs::features::IsBraveSplitViewEnabled()) {
769+
brave::SwapTabsInTile(&*browser_);
770+
} else {
771+
CHECK(base::FeatureList::IsEnabled(features::kSideBySide));
772+
brave::SwapTabsInSplitWithSideBySide(base::to_address(browser_));
773+
}
701774
break;
775+
}
702776
default:
703777
LOG(WARNING) << "Received Unimplemented Command: " << id;
704778
break;

browser/ui/brave_browser_command_controller.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
#include <optional>
1010
#include <string>
11+
#include <utility>
12+
#include <vector>
1113

1214
#include "base/memory/raw_ref.h"
1315
#include "base/scoped_observation.h"
@@ -65,6 +67,21 @@ class BraveBrowserCommandController : public chrome::BrowserCommandController,
6567
const TabStripModelChange& change,
6668
const TabStripSelectionChange& selection) override;
6769
void OnTabGroupChanged(const TabGroupChange& change) override;
70+
void OnSplitTabCreated(std::vector<std::pair<tabs::TabInterface*, int>> tabs,
71+
split_tabs::SplitTabId split_id,
72+
SplitTabAddReason reason,
73+
split_tabs::SplitTabVisualData visual_data) override;
74+
void OnSplitTabRemoved(std::vector<std::pair<tabs::TabInterface*, int>> tabs,
75+
split_tabs::SplitTabId split_id,
76+
SplitTabRemoveReason reason) override;
77+
void OnSplitTabVisualsChanged(
78+
split_tabs::SplitTabId split_id,
79+
split_tabs::SplitTabVisualData old_visual_data,
80+
split_tabs::SplitTabVisualData new_visual_data) override;
81+
void OnSplitTabContentsUpdated(
82+
split_tabs::SplitTabId split_id,
83+
std::vector<std::pair<tabs::TabInterface*, int>> prev_tabs,
84+
std::vector<std::pair<tabs::TabInterface*, int>> new_tabs) override;
6885

6986
private:
7087
friend class ::BraveAppMenuBrowserTest;
@@ -110,6 +127,10 @@ class BraveBrowserCommandController : public chrome::BrowserCommandController,
110127
void UpdateCommandsForPin();
111128
void UpdateCommandForSplitView();
112129

130+
// Rename to UpdateCommandForSplitView when we enable
131+
// SideBySide by default.
132+
void UpdateCommandForSplitViewWithSideBySide();
133+
113134
bool ExecuteBraveCommandWithDisposition(int id,
114135
WindowOpenDisposition disposition,
115136
base::TimeTicks time_stamp);

browser/ui/browser_commands.cc

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1182,4 +1182,40 @@ void SwapTabsInTile(Browser* browser) {
11821182
/*select_after_move*/ false);
11831183
}
11841184

1185+
bool CanOpenNewSplitTabsWithSideBySide(Browser* browser) {
1186+
return false;
1187+
}
1188+
1189+
void NewSplitTabsForTabWithSideBySide(Browser* browser) {}
1190+
1191+
bool CanSplitTabsWithSideBySide(Browser* browser) {
1192+
return false;
1193+
}
1194+
1195+
void SplitTabsWithSideBySide(Browser* browser) {}
1196+
1197+
bool IsSplitTabs(Browser* browser) {
1198+
return false;
1199+
}
1200+
1201+
void RemoveSplitWithSideBySide(Browser* browser) {
1202+
auto* tab_strip_model = browser->tab_strip_model();
1203+
auto active_index = tab_strip_model->active_index();
1204+
CHECK_NE(active_index == TabStripModel::kNoTab, active_index);
1205+
1206+
auto split_id = tab_strip_model->GetSplitForTab(active_index);
1207+
CHECK(split_id.has_value());
1208+
tab_strip_model->RemoveSplit(*split_id);
1209+
}
1210+
1211+
void SwapTabsInSplitWithSideBySide(Browser* browser) {
1212+
auto* tab_strip_model = browser->tab_strip_model();
1213+
auto active_index = tab_strip_model->active_index();
1214+
CHECK_NE(active_index == TabStripModel::kNoTab, active_index);
1215+
1216+
auto split_id = tab_strip_model->GetSplitForTab(active_index);
1217+
CHECK(split_id.has_value());
1218+
tab_strip_model->SwapTabsInSplit(*split_id);
1219+
}
1220+
11851221
} // namespace brave

browser/ui/browser_commands.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,15 @@ bool IsTabsTiled(Browser* browser, const std::vector<int>& indices = {});
129129
bool CanTileTabs(Browser* browser, const std::vector<int>& indices = {});
130130
void SwapTabsInTile(Browser* browser);
131131

132+
// Split view API with SideBySide.
133+
bool CanOpenNewSplitTabsWithSideBySide(Browser* browser);
134+
void NewSplitTabsForTabWithSideBySide(Browser* browser);
135+
bool CanSplitTabsWithSideBySide(Browser* browser);
136+
void SplitTabsWithSideBySide(Browser* browser);
137+
bool IsSplitTabs(Browser* browser);
138+
void RemoveSplitWithSideBySide(Browser* browser);
139+
void SwapTabsInSplitWithSideBySide(Browser* browser);
140+
132141
} // namespace brave
133142

134143
#endif // BRAVE_BROWSER_UI_BROWSER_COMMANDS_H_

0 commit comments

Comments
 (0)