blob: 24facab237f3b2bda9392b3641ab2ab1f41c0b0e [file] [log] [blame]
// 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_TABS_TAB_GROUP_MODEL_H_
#define CHROME_BROWSER_UI_TABS_TAB_GROUP_MODEL_H_
#include <stddef.h>
#include <stdint.h>
#include <map>
#include <memory>
#include <vector>
#include "base/optional.h"
class TabGroup;
class TabGroupController;
namespace tab_groups {
enum class TabGroupColorId;
class TabGroupId;
class TabGroupVisualData;
} // namespace tab_groups
// A model for all tab groups with at least one tab in the tabstrip. Keeps a map
// of tab_groups::TabGroupIds and TabGroups and provides an API for maintaining
// it. It is owned and used primarily by TabStripModel, which handles
// tab-to-group correspondences and any groupedness state changes on tabs.
// TabStipModel then notifies TabStrip of any groupedness state changes that
// need to be reflected in the view.
class TabGroupModel {
public:
explicit TabGroupModel(TabGroupController* controller);
~TabGroupModel();
// Registers a tab group and returns the newly registered group. It will
// initially be empty, but the expectation is that at least one tab will be
// added to it immediately.
TabGroup* AddTabGroup(
const tab_groups::TabGroupId& id,
base::Optional<tab_groups::TabGroupVisualData> visual_data);
// Returns whether a tab group with the given |id| exists.
bool ContainsTabGroup(const tab_groups::TabGroupId& id) const;
// Returns the tab group with the given |id|. The group must exist.
TabGroup* GetTabGroup(const tab_groups::TabGroupId& id) const;
// Removes the tab group with the given |id| from the registry. Should be
// called whenever the group becomes empty.
void RemoveTabGroup(const tab_groups::TabGroupId& id);
std::vector<tab_groups::TabGroupId> ListTabGroups() const;
private:
std::map<tab_groups::TabGroupId, std::unique_ptr<TabGroup>> groups_;
TabGroupController* controller_;
// Returns the least-used color in the color set, breaking ties toward the
// first color in the set. Used to initialize a new group's color, which
// should be as distinct from the other groups as possible.
tab_groups::TabGroupColorId GetNextColor() const;
};
#endif // CHROME_BROWSER_UI_TABS_TAB_GROUP_MODEL_H_