xref: /MusicPlayer2/MusicPlayer2/MenuMgr.h (revision 800a68ca4bdb8c4896c14aa157f6b72b26c482d9)
1 #pragma once
2 #include "IconMgr.h"
3 
4 class MenuMgr
5 {
6 public:
7     MenuMgr();
8     virtual ~MenuMgr();
9 
10     HBITMAP GetMenuBitmapHandle(IconMgr::IconType icon_type);
11     const CBitmap* GetMenuBitmap(IconMgr::IconType icon_type);
12 private:
13     std::map<HICON, CBitmap> m_icon_bitmap_map;
14 
15 public:
16     enum MenuType
17     {
18         MainPopupMenu,                      // 主窗口(弹出菜单ver)(shift+右键)
19         MainMenu,                           // 主窗口
20         MainFileMenu,                       // 主窗口->子菜单"文件"
21         MainPlayCtrlMenu,                   // 主窗口->子菜单"播放控制"
22         MainPlayCtrlRepeatModeMenu,         // 主窗口->子菜单"播放控制"->子菜单"循环模式"
23         MainPlayCtrlAbRepeatMenu,           // 主窗口->子菜单"播放控制"->子菜单"AB重复"
24         MainPlaylistMenu,                   // 主窗口->子菜单"播放列表"
25         MainPlaylistAddMenu,                // 主窗口->子菜单"播放列表"->子菜单"添加"          播放列表工具栏->添加(0)
26         MainPlaylistDelMenu,                // 主窗口->子菜单"播放列表"->子菜单"删除"          播放列表工具栏->删除(1)
27         MainPlaylistSortMenu,               // 主窗口->子菜单"播放列表"->子菜单"排序方式"      播放列表工具栏->排序(2)
28         MainPlaylistDispModeMenu,           // 主窗口->子菜单"播放列表"->子菜单"播放列表显示方式"
29         MainLyricMenu,                      // 主窗口->子菜单"歌词"
30         MainLrcChConvMenu,                  // 主窗口->子菜单"歌词"->子菜单"繁简转换"
31         MainLrcInnerLrcMenu,                // 主窗口->子菜单"歌词"->子菜单"内嵌歌词"
32         MainViewMenu,                       // 主窗口->子菜单"视图"
33         MainViewSwitchUiMenu,               // 主窗口->子菜单"视图"->子菜单"切换界面"
34         MainToolMenu,                       // 主窗口->子菜单"工具"
35         MainToolCreateShortcutMenu,         // 主窗口->子菜单"工具"->子菜单"创建快捷方式"
36         MainToolAlbumCoverMenu,             // 主窗口->子菜单"工具"->子菜单"专辑封面"
37         MainToolDelCurPlayingMenu,          // 主窗口->子菜单"工具"->子菜单"删除正在播放的曲目"
38         MainHelpMenu,                       // 主窗口->子菜单"帮助"
39 
40         PlaylistToolBarMenu,                // 播放列表工具栏(弹出菜单)
41         PlaylistToolBarListMenu,            // 播放列表工具栏->列表(3)
42         PlaylistToolBarEditMenu,            // 播放列表工具栏->编辑(4)
43         PlaylistToolBarFolderMenu,          // 播放列表工具栏->文件夹(5)
44 
45         MainAreaMenu,                       // 主界面区域菜单
46         MainAreaLrcMenu,                    // 主界面歌词区域菜单(与MainLyricMenu共用翻译)
47         MainAreaPlaylistBtnMenu,            // 主界面播放列表按钮
48         DlrcMenu,                           // 桌面歌词窗口
49         DlrcDefMenu,                        // 桌面歌词窗口->子菜单"预设方案"
50         RecentFolderPlaylistMenu,           // MenuEditCtrl控件(最近播放文件夹/播放列表)
51         PlaylistMenu,                       // 播放列表菜单
52         RateMenu,                           // "分级"菜单
53         AddToPlaylistMenu,                  // "添加到播放列表"菜单
54 
55         MiniAreaMenu,                       // 迷你模式区域菜单
56         MiniModeSwitchUiMenu,               // 迷你模式切换界面菜单
57         NotifyMenu,                         // 系统托盘图标
58 
59         LibSetPathMenu,                     // 媒体库文件夹标签页菜单
60         LibPlaylistMenu,                    // 媒体库播放列表标签页菜单
61         LibLeftMenu,                        // 媒体库左侧菜单
62         LibRightMenu,                       // 媒体库右侧菜单
63         LibPlaylistRightMenu,               // 媒体库播放列表右侧菜单
64         LibFolderExploreMenu,               // 媒体库中文件夹浏览左侧菜单
65         UiLibLeftMenu,                      // UI中媒体库列表菜单
66         UiRecentPlayedMenu,                 // UI中最近播放列表菜单
67         UiMyFavouriteMenu,                  // UI中“我喜欢的音乐”菜单
68 
69         LibPlaylistSortMenu,                // 媒体库播放列表排序菜单
70         LibFolderSortMenu,                  // 媒体库文件夹排序菜单
71 
72         LeMenu,                             // 歌词编辑对话框->窗口菜单
73         LeFileMenu,                         // 歌词编辑对话框->窗口菜单->子菜单"文件"
74         LeEditMenu,                         // 歌词编辑对话框->窗口菜单->子菜单"编辑"
75         LeEditChConvMenu,                   // 歌词编辑对话框->窗口菜单->子菜单"编辑"->子菜单"繁简转换"
76         LeEditTagDislocMenu,                // 歌词编辑对话框->窗口菜单->子菜单"编辑"->子菜单"时间标签错位"
77         LeEditTranslateFormatConvertMenu,   // 歌词编辑对话框->窗口菜单->子菜单"编辑"->子菜单"翻译格式转换"
78         LePlayCtrlMenu,                     // 歌词编辑对话框->窗口菜单->子菜单"播放控制"
79 
80         FcListMenu,                         // 转换格式对话框->列表控件
81         LdListMenu,                         // 歌词下载对话框->列表控件
82         OptDlrcDefStyleMenu,                // 选项设置->歌词设置->预设方案按钮
83         OptDlrcModDefStyleMenu,             // 选项设置->歌词设置->预设方案按钮菜单->子菜单"修改预设方案"
84         PropertyAdvMenu,                    // 属性对话框->高级标签信息标签页->列表控件
85         PropertyCoverMenu,                  // 属性对话框->专辑封面标签页
86 
87         FindListMenu,                       // 查找-查找列表右键菜单
88 
89         MenuMax // 菜单数量
90     };
91     // 目前只支持更新为关联到命令的普通菜单项(默认构造表示分隔符)
92     struct MenuItem
93     {
94         UINT id{ NULL };
95         IconMgr::IconType icon_type{ IconMgr::IT_NO_ICON };
96         wstring text;
97     };
98     // 更新菜单项
99     void UpdateMenu(MenuType menu_type, const vector<MenuItem>& items);
100     // 获取菜单句柄
101     HMENU GetSafeHmenu(MenuType menu_type);
102     // 获取CMenu指针
103     CMenu* GetMenu(MenuType menu_type);
104     // 获取菜单在 <language>.ini 中的键名字符串
105     static const wchar_t* GetMenuNameStr(MenuType menu_type);
106 
107 private:
108     class MenuBase;
109     MenuBase& GetMenuBase(MenuType menu_type);
110     void CreateMenu(MenuBase& menu_base);
111 private:
112     std::unique_ptr<MenuBase> m_menus[MenuMax];
113 };
114 
115