#ifndef UI_VIEWS_CONTROLS_MENU_MENU_MODEL_ADAPTER_H_
#define UI_VIEWS_CONTROLS_MENU_MENU_MODEL_ADAPTER_H_
#include <map>
#include <memory>
#include "base/functional/callback.h"
#include "base/functional/callback_helpers.h"
#include "base/memory/raw_ptr.h"
#include "ui/base/models/menu_model_delegate.h"
#include "ui/views/controls/menu/menu_delegate.h"
#include "ui/views/style/typography.h"
namespace ui {
class MenuModel;
}
namespace views {
class MenuItemView;
class VIEWS_EXPORT MenuModelAdapter : public MenuDelegate,
public ui::MenuModelDelegate {
public:
explicit MenuModelAdapter(
ui::MenuModel* menu_model,
base::RepeatingClosure on_menu_closed_callback = base::NullCallback());
MenuModelAdapter(const MenuModelAdapter&) = delete;
MenuModelAdapter& operator=(const MenuModelAdapter&) = delete;
~MenuModelAdapter() override;
virtual void BuildMenu(MenuItemView* menu);
std::unique_ptr<MenuItemView> CreateMenu();
void set_triggerable_event_flags(int triggerable_event_flags) {
triggerable_event_flags_ = triggerable_event_flags;
}
int triggerable_event_flags() const { return triggerable_event_flags_; }
static MenuItemView* AddMenuItemFromModelAt(ui::MenuModel* model,
size_t model_index,
MenuItemView* menu,
size_t menu_index,
int item_id);
static MenuItemView* AppendMenuItemFromModel(ui::MenuModel* model,
size_t model_index,
MenuItemView* menu,
int item_id);
void OnIconChanged(int command_id) override;
void OnMenuStructureChanged() override;
void OnMenuClearingDelegate() override;
protected:
virtual MenuItemView* AppendMenuItem(MenuItemView* menu,
ui::MenuModel* model,
size_t index);
void ExecuteCommand(int id) override;
void ExecuteCommand(int id, int mouse_event_flags) override;
bool IsTriggerableEvent(MenuItemView* source, const ui::Event& e) override;
bool GetAccelerator(int id, ui::Accelerator* accelerator) const override;
std::u16string GetLabel(int id) const override;
const gfx::FontList* GetLabelFontList(int id) const override;
bool IsCommandEnabled(int id) const override;
bool IsCommandVisible(int id) const override;
bool IsItemChecked(int id) const override;
MenuItemView* GetSiblingMenu(MenuItemView* menu,
const gfx::Point& screen_point,
MenuAnchorPosition* anchor,
bool* has_mnemonics,
MenuButton** button) override;
void OnUnhandledOpenSubmenu(MenuItemView* menu, bool is_rtl) override;
void OnUnhandledCloseSubmenu(MenuItemView* menu, bool is_rtl) override;
bool GetTextColor(int command_id,
bool is_minor,
bool is_hovered,
SkColor* override_color) const override;
bool GetBackgroundColor(int command_id,
bool is_hovered,
SkColor* override_color) const override;
void WillShowMenu(MenuItemView* menu) override;
void WillHideMenu(MenuItemView* menu) override;
void OnMenuClosed(MenuItemView* menu) override;
std::optional<SkColor> GetLabelColor(int command_id) const override;
bool IsTearingDown() const override;
private:
void BuildMenuImpl(MenuItemView* menu, ui::MenuModel* model);
raw_ptr<ui::MenuModel, DanglingUntriaged> menu_model_;
raw_ptr<MenuItemView, DanglingUntriaged> menu_ = nullptr;
int triggerable_event_flags_;
std::map<MenuItemView*, raw_ptr<ui::MenuModel, CtnExperimental>> menu_map_;
base::RepeatingClosure on_menu_closed_callback_;
};
}
#endif