blob: 2c041ef3a131471dd633b6488fa6889e99c0d266 [file] [log] [blame]
// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_VIEWS_TABS_TAB_STRIP_LAYOUT_H_
#define CHROME_BROWSER_UI_VIEWS_TABS_TAB_STRIP_LAYOUT_H_
#include <optional>
#include <vector>
#include "chrome/browser/ui/views/tabs/tab_strip_layout_types.h"
#include "chrome/browser/ui/views/tabs/tab_width_constraints.h"
namespace gfx {
class Rect;
}
// Determines the size of each tab given information on the overall amount
// of space available relative to how much the tabs could use.
class TabSizer {
public:
TabSizer(LayoutDomain domain, float space_fraction_available);
TabSizer(const TabSizer&) = default;
TabSizer& operator=(const TabSizer&) = default;
int CalculateTabWidth(const TabWidthConstraints& tab) const;
// Returns true iff it's OK for this tab to be one pixel wider than
// CalculateTabWidth(`tab`).
bool TabAcceptsExtraSpace(const TabWidthConstraints& tab) const;
bool IsAlreadyPreferredWidth() const;
LayoutDomain domain() { return domain_; }
private:
LayoutDomain domain_;
// The proportion of space requirements we can fulfill within the layout
// domain we're in.
float space_fraction_available_;
};
// Contains the information needed to freeze the width of each tab.
struct TabWidthOverride {
TabSizer sizer;
// The number of pixels of extra width that should be distributed.
int extra_space;
};
// Calculates and returns the bounds of the tabs. `width` is the available
// width to use for tab layout. This never sizes the tabs smaller then the
// minimum widths in TabSizeInfo, and as a result the calculated bounds may go
// beyond `width`.
std::pair<std::vector<gfx::Rect>, LayoutDomain> CalculateTabBounds(
const std::vector<TabWidthConstraints>& tabs,
std::optional<int> width);
#endif // CHROME_BROWSER_UI_VIEWS_TABS_TAB_STRIP_LAYOUT_H_