#ifndef UI_VIEWS_CONTROLS_MENU_MENU_RUNNER_IMPL_H_
#define UI_VIEWS_CONTROLS_MENU_MENU_RUNNER_IMPL_H_
#include <stdint.h>
#include <memory>
#include <set>
#include <string>
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "ui/base/mojom/menu_source_type.mojom-shared.h"
#include "ui/views/controls/menu/menu_controller_delegate.h"
#include "ui/views/controls/menu/menu_runner_impl_interface.h"
#include "ui/views/views_export.h"
namespace gfx {
class RoundedCornersF;
}
namespace views {
class MenuController;
class MenuDelegate;
class MenuItemView;
namespace test {
class MenuRunnerDestructionTest;
}
namespace internal {
class VIEWS_EXPORT MenuRunnerImpl : public MenuRunnerImplInterface,
public MenuControllerDelegate {
public:
explicit MenuRunnerImpl(std::unique_ptr<MenuItemView> menu);
MenuRunnerImpl(const MenuRunnerImpl&) = delete;
MenuRunnerImpl& operator=(const MenuRunnerImpl&) = delete;
bool IsRunning() const override;
void Release() override;
using MenuRunnerImplInterface::RunMenuAt;
void RunMenuAt(
Widget* parent,
MenuButtonController* button_controller,
const gfx::Rect& bounds,
MenuAnchorPosition anchor,
ui::mojom::MenuSourceType source_type,
int32_t run_types,
gfx::NativeView native_view_for_gestures,
gfx::AcceleratedWidget parent_widget,
std::optional<gfx::RoundedCornersF> corners,
std::optional<std::string> show_menu_host_duration_histogram) override;
void Cancel() override;
base::TimeTicks GetClosingEventTime() const override;
void OnMenuClosed(NotifyType type,
MenuItemView* menu,
int mouse_event_flags) override;
void SiblingMenuCreated(MenuItemView* menu) override;
private:
friend class ::views::test::MenuRunnerDestructionTest;
~MenuRunnerImpl() override;
bool ShouldShowMnemonics(int32_t run_types);
std::unique_ptr<MenuDelegate> empty_delegate_;
std::unique_ptr<MenuItemView> menu_;
std::set<raw_ptr<MenuItemView, SetExperimental>> sibling_menus_;
bool running_ = false;
bool delete_after_run_ = false;
bool for_drop_ = false;
base::WeakPtr<MenuController> controller_;
bool owns_controller_ = false;
base::TimeTicks closing_event_time_;
base::WeakPtrFactory<MenuRunnerImpl> weak_factory_{this};
};
}
}
#endif