blob: 4761a6260482e97f95dcac30748273af13c05b0f [file] [log] [blame]
// Copyright 2024 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_collection.h"
#include <cstddef>
#include <memory>
#include <optional>
#include "chrome/browser/ui/tabs/pinned_tab_collection.h"
#include "chrome/browser/ui/tabs/tab_collection.h"
#include "chrome/browser/ui/tabs/tab_collection_storage.h"
#include "chrome/browser/ui/tabs/tab_model.h"
#include "chrome/browser/ui/tabs/unpinned_tab_collection.h"
namespace tabs {
TabStripCollection::TabStripCollection() {
impl_ = std::make_unique<TabCollectionStorage>(*this);
pinned_collection_ = static_cast<PinnedTabCollection*>(
impl_->AddCollection(std::make_unique<PinnedTabCollection>(), 0));
unpinned_collection_ = static_cast<UnpinnedTabCollection*>(
impl_->AddCollection(std::make_unique<UnpinnedTabCollection>(), 1));
pinned_collection_->OnReparented(this);
unpinned_collection_->OnReparented(this);
}
TabStripCollection::~TabStripCollection() = default;
bool TabStripCollection::ContainsTab(TabModel* tab_model) const {
return false;
}
bool TabStripCollection::ContainsTabRecursive(TabModel* tab_model) const {
return pinned_collection_->ContainsTabRecursive(tab_model) ||
unpinned_collection_->ContainsTabRecursive(tab_model);
}
void TabStripCollection::AddTabRecursive(
std::unique_ptr<TabModel> tab_model,
size_t index,
std::optional<tab_groups::TabGroupId> new_group_id,
bool new_pinned_state) {
CHECK(index >= 0 && index <= TabCountRecursive());
if (new_pinned_state) {
CHECK(!new_group_id.has_value());
pinned_collection_->AddTab(std::move(tab_model), index);
} else {
unpinned_collection_->AddTabRecursive(
std::move(tab_model), index - pinned_collection_->TabCountRecursive(),
new_group_id);
}
}
tabs::TabModel* TabStripCollection::GetTabAtIndexRecursive(size_t index) const {
const size_t pinned_count = pinned_collection_->TabCountRecursive();
if (index < pinned_count) {
return pinned_collection_->GetTabAtIndex(index);
} else {
// Adjust the index for the unpinned collection (subtract the count of
// pinned tabs)
const size_t unpinned_index = index - pinned_count;
return unpinned_collection_->GetTabAtIndexRecursive(unpinned_index);
}
}
bool TabStripCollection::ContainsCollection(TabCollection* collection) const {
return impl_->ContainsCollection(collection);
}
std::optional<size_t> TabStripCollection::GetIndexOfTabRecursive(
TabModel* tab_model) const {
// Check if the tab is present in the pinned collection first and return the
// index if it is present.
std::optional<size_t> pinned_index =
pinned_collection_->GetIndexOfTabRecursive(tab_model);
if (pinned_index.has_value()) {
return pinned_index.value();
}
// Check the unpinned tab collection only if the tab is not present in the
// pinned tab collection and return the correct index taking pinned tabs into
// account.
std::optional<size_t> unpinned_index =
unpinned_collection_->GetIndexOfTabRecursive(tab_model);
if (unpinned_index.has_value()) {
return pinned_collection_->TabCountRecursive() + unpinned_index.value();
}
return std::nullopt;
}
std::optional<size_t> TabStripCollection::GetIndexOfCollection(
TabCollection* collection) const {
return impl_->GetIndexOfCollection(collection);
}
std::unique_ptr<TabModel> TabStripCollection::MaybeRemoveTab(
TabModel* tab_model) {
return nullptr;
}
std::unique_ptr<TabCollection> TabStripCollection::MaybeRemoveCollection(
TabCollection* collection) {
return nullptr;
}
size_t TabStripCollection::ChildCount() const {
return impl_->GetChildrenCount();
}
size_t TabStripCollection::TabCountRecursive() const {
return pinned_collection_->TabCountRecursive() +
unpinned_collection_->TabCountRecursive();
}
} // namespace tabs