blob: cb37c8fcbd99ae76647813cb50a91ed54f0b15d6 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/tabs/tab_strip_model_selection_state.h"
#include "base/check.h"
namespace tabs {
TabStripModelSelectionState::TabStripModelSelectionState()
: TabStripModelSelectionState({}, nullptr, nullptr) {}
TabStripModelSelectionState::TabStripModelSelectionState(
std::unordered_set<raw_ptr<TabInterface>> selected_tabs,
raw_ptr<TabInterface> active_tab,
raw_ptr<TabInterface> anchor_tab)
: selected_tabs_(std::move(selected_tabs)),
active_tab_(active_tab),
anchor_tab_(anchor_tab) {}
TabStripModelSelectionState::~TabStripModelSelectionState() = default;
bool TabStripModelSelectionState::operator==(
const TabStripModelSelectionState& other) const {
return selected_tabs_ == other.selected_tabs_ &&
active_tab_ == other.active_tab_ && anchor_tab_ == other.anchor_tab_;
}
bool TabStripModelSelectionState::IsSelected(TabInterface* tab) const {
return selected_tabs_.contains(tab);
}
void TabStripModelSelectionState::AddTabToSelection(TabInterface* tab) {
if (tab) {
selected_tabs_.insert(tab);
}
}
void TabStripModelSelectionState::RemoveTabFromSelection(TabInterface* tab) {
selected_tabs_.erase(tab);
}
void TabStripModelSelectionState::SetActiveTab(TabInterface* tab) {
active_tab_ = tab;
if (tab) {
AddTabToSelection(tab);
}
}
void TabStripModelSelectionState::SetAnchorTab(TabInterface* tab) {
anchor_tab_ = tab;
if (tab) {
AddTabToSelection(tab);
}
}
bool TabStripModelSelectionState::AppendTabsToSelection(
std::unordered_set<TabInterface*> tabs) {
bool selection_changed = false;
for (TabInterface* tab : tabs) {
if (!IsSelected(tab)) {
selection_changed = true;
AddTabToSelection(tab);
}
}
return selection_changed;
}
void TabStripModelSelectionState::SetSelectedTabs(
std::unordered_set<TabInterface*> tabs,
TabInterface* active_tab,
TabInterface* anchor_tab) {
selected_tabs_.clear();
for (TabInterface* tab : tabs) {
selected_tabs_.insert(tab);
}
if (active_tab) {
CHECK(IsSelected(active_tab));
active_tab_ = active_tab;
} else {
active_tab_ = selected_tabs_.empty() ? nullptr : *selected_tabs_.begin();
}
if (anchor_tab) {
CHECK(IsSelected(anchor_tab));
anchor_tab_ = anchor_tab;
} else {
anchor_tab_ = selected_tabs_.empty() ? nullptr : *selected_tabs_.begin();
}
CHECK(Valid());
}
bool TabStripModelSelectionState::Valid() {
if (selected_tabs_.empty()) {
return active_tab_ == nullptr && anchor_tab_ == nullptr;
}
return active_tab_ && anchor_tab_ && IsSelected(active_tab_) &&
IsSelected(anchor_tab_);
}
} // namespace tabs