blob: afdf1bd8772fd45243c92bc89099d7a674bb78aa [file] [log] [blame]
// Copyright 2023 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_TOOLBAR_OVERFLOW_BUTTON_H_
#define CHROME_BROWSER_UI_VIEWS_TOOLBAR_OVERFLOW_BUTTON_H_
#include "chrome/browser/ui/views/toolbar/toolbar_button.h"
#include "ui/base/metadata/metadata_header_macros.h"
#include "ui/views/controls/button/menu_button_controller.h"
#include "ui/views/controls/menu/menu_runner.h"
// A chevron button that indicates some toolbar elements have overflowed due to
// browser window being smaller than usual. Left press on it displays a drop
// down list of overflowed elements.
class OverflowButton : public ToolbarButton {
public:
METADATA_HEADER(OverflowButton);
using CreateMenuModelCallback =
base::RepeatingCallback<std::unique_ptr<ui::SimpleMenuModel>()>;
OverflowButton();
OverflowButton(const OverflowButton&) = delete;
OverflowButton& operator=(const OverflowButton&) = delete;
~OverflowButton() override;
// Triggered by left press.
void RunMenu();
void set_create_menu_model_callback(CreateMenuModelCallback callback) {
create_menu_model_callback_ = std::move(callback);
}
const ui::SimpleMenuModel* menu_model_for_testing() const {
return menu_model_.get();
}
private:
base::RepeatingCallback<std::unique_ptr<ui::SimpleMenuModel>()>
create_menu_model_callback_;
// The menu of overflowed elements.
std::unique_ptr<ui::SimpleMenuModel> menu_model_;
std::unique_ptr<views::MenuRunner> menu_runner_;
raw_ptr<views::MenuButtonController> menu_button_controller_;
};
#endif // CHROME_BROWSER_UI_VIEWS_TOOLBAR_OVERFLOW_BUTTON_H_