1 // Aseprite
2 // Copyright (C) 2001-2017  David Capello
3 //
4 // This program is distributed under the terms of
5 // the End-User License Agreement for Aseprite.
6 
7 #ifndef APP_APP_MENUS_H_INCLUDED
8 #define APP_APP_MENUS_H_INCLUDED
9 #pragma once
10 
11 #include "app/i18n/xml_translator.h"
12 #include "app/ui/key.h"
13 #include "app/widget_type_mismatch.h"
14 #include "base/disable_copying.h"
15 #include "base/unique_ptr.h"
16 #include "obs/connection.h"
17 #include "ui/base.h"
18 #include "ui/menu.h"
19 
20 class TiXmlElement;
21 class TiXmlHandle;
22 
23 namespace she {
24   class Menu;
25   class Shortcut;
26 }
27 
28 namespace app {
29   class Command;
30   class Params;
31 
32   using namespace ui;
33 
34   // Class to handle/get/reload available menus in gui.xml file.
35   class AppMenus {
36     AppMenus();
37     DISABLE_COPYING(AppMenus);
38 
39   public:
40     static AppMenus* instance();
41 
42     ~AppMenus();
43 
44     void reload();
45     void initTheme();
46 
47     // Updates the menu of recent files.
48     void rebuildRecentList(); // workaround for https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=213773
49 
getRootMenu()50     Menu* getRootMenu() { return m_rootMenu; }
getRecentListMenuitem()51     MenuItem* getRecentListMenuitem() { return m_recentListMenuitem; }
getTabPopupMenu()52     Menu* getTabPopupMenu() { return m_tabPopupMenu; }
getDocumentTabPopupMenu()53     Menu* getDocumentTabPopupMenu() { return m_documentTabPopupMenu; }
getLayerPopupMenu()54     Menu* getLayerPopupMenu() { return m_layerPopupMenu; }
getFramePopupMenu()55     Menu* getFramePopupMenu() { return m_framePopupMenu; }
getCelPopupMenu()56     Menu* getCelPopupMenu() { return m_celPopupMenu; }
getCelMovementPopupMenu()57     Menu* getCelMovementPopupMenu() { return m_celMovementPopupMenu; }
getFrameTagPopupMenu()58     Menu* getFrameTagPopupMenu() { return m_frameTagPopupMenu; }
getSlicePopupMenu()59     Menu* getSlicePopupMenu() { return m_slicePopupMenu; }
getPalettePopupMenu()60     Menu* getPalettePopupMenu() { return m_palettePopupMenu; }
getInkPopupMenu()61     Menu* getInkPopupMenu() { return m_inkPopupMenu; }
62 
63     void applyShortcutToMenuitemsWithCommand(Command* command, const Params& params,
64                                              const KeyPtr& key);
65     void syncNativeMenuItemKeyShortcuts();
66 
67   private:
68     Menu* loadMenuById(TiXmlHandle& handle, const char *id);
69     Menu* convertXmlelemToMenu(TiXmlElement* elem);
70     Widget* convertXmlelemToMenuitem(TiXmlElement* elem);
71     Widget* createInvalidVersionMenuitem();
72     void applyShortcutToMenuitemsWithCommand(Menu* menu, Command* command, const Params& params,
73                                              const KeyPtr& key);
74     void syncNativeMenuItemKeyShortcuts(Menu* menu);
75     void updateMenusList();
76     void createNativeMenus();
77     void createNativeSubmenus(she::Menu* osMenu, const ui::Menu* uiMenu);
78 
79     base::UniquePtr<Menu> m_rootMenu;
80     MenuItem* m_recentListMenuitem;
81     MenuItem* m_helpMenuitem;
82     base::UniquePtr<Menu> m_tabPopupMenu;
83     base::UniquePtr<Menu> m_documentTabPopupMenu;
84     base::UniquePtr<Menu> m_layerPopupMenu;
85     base::UniquePtr<Menu> m_framePopupMenu;
86     base::UniquePtr<Menu> m_celPopupMenu;
87     base::UniquePtr<Menu> m_celMovementPopupMenu;
88     base::UniquePtr<Menu> m_frameTagPopupMenu;
89     base::UniquePtr<Menu> m_slicePopupMenu;
90     base::UniquePtr<Menu> m_palettePopupMenu;
91     base::UniquePtr<Menu> m_inkPopupMenu;
92     obs::scoped_connection m_recentFilesConn;
93     std::vector<Menu*> m_menus;
94     she::Menu* m_osMenu;
95     XmlTranslator m_xmlTranslator;
96   };
97 
98   she::Shortcut get_os_shortcut_from_key(const Key* key);
99 
100 } // namespace app
101 
102 #endif
103