menu_delegate.h 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // Copyright (c) 2014 GitHub, Inc.
  2. // Use of this source code is governed by the MIT license that can be
  3. // found in the LICENSE file.
  4. #ifndef ELECTRON_SHELL_BROWSER_UI_VIEWS_MENU_DELEGATE_H_
  5. #define ELECTRON_SHELL_BROWSER_UI_VIEWS_MENU_DELEGATE_H_
  6. #include <memory>
  7. #include "base/observer_list.h"
  8. #include "shell/browser/ui/electron_menu_model.h"
  9. #include "ui/views/controls/menu/menu_delegate.h"
  10. namespace views {
  11. class MenuRunner;
  12. class Button;
  13. } // namespace views
  14. namespace electron {
  15. class MenuBar;
  16. class MenuDelegate : public views::MenuDelegate {
  17. public:
  18. explicit MenuDelegate(MenuBar* menu_bar);
  19. ~MenuDelegate() override;
  20. // disable copy
  21. MenuDelegate(const MenuDelegate&) = delete;
  22. MenuDelegate& operator=(const MenuDelegate&) = delete;
  23. void RunMenu(ElectronMenuModel* model,
  24. views::Button* button,
  25. ui::MenuSourceType source_type);
  26. class Observer {
  27. public:
  28. virtual void OnBeforeExecuteCommand() = 0;
  29. virtual void OnMenuClosed() = 0;
  30. };
  31. void AddObserver(Observer* obs) { observers_.AddObserver(obs); }
  32. void RemoveObserver(const Observer* obs) { observers_.RemoveObserver(obs); }
  33. protected:
  34. // views::MenuDelegate:
  35. void ExecuteCommand(int id) override;
  36. void ExecuteCommand(int id, int mouse_event_flags) override;
  37. bool IsTriggerableEvent(views::MenuItemView* source,
  38. const ui::Event& e) override;
  39. bool GetAccelerator(int id, ui::Accelerator* accelerator) const override;
  40. std::u16string GetLabel(int id) const override;
  41. const gfx::FontList* GetLabelFontList(int id) const override;
  42. absl::optional<SkColor> GetLabelColor(int id) const override;
  43. bool IsCommandEnabled(int id) const override;
  44. bool IsCommandVisible(int id) const override;
  45. bool IsItemChecked(int id) const override;
  46. void WillShowMenu(views::MenuItemView* menu) override;
  47. void WillHideMenu(views::MenuItemView* menu) override;
  48. void OnMenuClosed(views::MenuItemView* menu) override;
  49. views::MenuItemView* GetSiblingMenu(views::MenuItemView* menu,
  50. const gfx::Point& screen_point,
  51. views::MenuAnchorPosition* anchor,
  52. bool* has_mnemonics,
  53. views::MenuButton** button) override;
  54. private:
  55. MenuBar* menu_bar_;
  56. int id_ = -1;
  57. std::unique_ptr<views::MenuDelegate> adapter_;
  58. std::unique_ptr<views::MenuRunner> menu_runner_;
  59. // The menu button to switch to.
  60. views::MenuButton* button_to_open_ = nullptr;
  61. bool hold_first_switch_ = false;
  62. base::ObserverList<Observer>::Unchecked observers_;
  63. };
  64. } // namespace electron
  65. #endif // ELECTRON_SHELL_BROWSER_UI_VIEWS_MENU_DELEGATE_H_