xref: /MusicPlayer2/MusicPlayer2/CMediaLibDlg.cpp (revision 52587cb860c7f13198ae5554d757ec0756061dfe)
1 // CMediaLibDlg.cpp: 实现文件
2 //
3 
4 #include "stdafx.h"
5 #include "MusicPlayer2.h"
6 #include "CMediaLibDlg.h"
7 #include "MediaLibStatisticsDlg.h"
8 
9 // CMediaLibDlg 对话框
10 
11 int CMediaLibDlg::m_last_tab{};
12 
IMPLEMENT_DYNAMIC(CMediaLibDlg,CBaseDialog)13 IMPLEMENT_DYNAMIC(CMediaLibDlg, CBaseDialog)
14 
15 CMediaLibDlg::CMediaLibDlg(int cur_tab, CWnd* pParent /*=nullptr*/)
16     : CBaseDialog(IDD_MEDIA_LIB_DIALOG, pParent), m_init_tab(cur_tab)
17 {
18 }
19 
~CMediaLibDlg()20 CMediaLibDlg::~CMediaLibDlg()
21 {
22     // 保存设置更改到OnDestroy,因为CMediaLibDlg不会在关闭时被delete析构而是下次打开/程序退出时析构
23 }
24 
SetCurTab(int tab)25 void CMediaLibDlg::SetCurTab(int tab)
26 {
27     m_tab_ctrl.SetCurTab(tab);
28 }
29 
NavigateToItem(const wstring & item)30 bool CMediaLibDlg::NavigateToItem(const wstring& item)
31 {
32     CWnd* pCurTab{ m_tab_ctrl.GetCurrentTab() };
33     CMediaClassifyDlg* media_classfi_dlg = dynamic_cast<CMediaClassifyDlg*>(pCurTab);
34     if (media_classfi_dlg != nullptr)
35     {
36         return media_classfi_dlg->SetLeftListSel(item);
37     }
38 
39     CSetPathDlg* folder_dlg = dynamic_cast<CSetPathDlg*>(pCurTab);
40     if (folder_dlg != nullptr)
41     {
42         return folder_dlg->SetCurSel(item);
43     }
44 
45     CSelectPlaylistDlg* playlist_dlg = dynamic_cast<CSelectPlaylistDlg*>(pCurTab);
46     if (playlist_dlg != nullptr)
47     {
48         return playlist_dlg->SetCurSel(item);
49     }
50 
51     return false;
52 }
53 
GetDialogName() const54 CString CMediaLibDlg::GetDialogName() const
55 {
56     return L"MediaLibDlg";
57 }
58 
InitializeControls()59 bool CMediaLibDlg::InitializeControls()
60 {
61     wstring temp;
62     temp = theApp.m_str_table.LoadText(L"TITLE_LIB");
63     SetWindowTextW(temp.c_str());
64     temp = theApp.m_str_table.LoadText(L"TXT_LIB_MEDIA_LIB_SETTING");
65     SetDlgItemTextW(IDC_MEDIA_LIB_SETTINGS_BTN, temp.c_str());
66     temp = theApp.m_str_table.LoadText(L"TXT_LIB_STATISTICS_INFO");
67     SetDlgItemTextW(IDC_STATISTICS_INFO_BUTTON, temp.c_str());
68     temp = theApp.m_str_table.LoadText(L"TXT_LIB_PLAY_SEL");
69     SetDlgItemTextW(IDC_PLAY_SELECTED, temp.c_str());
70     temp = theApp.m_str_table.LoadText(L"TXT_CLOSE");
71     SetDlgItemTextW(IDCANCEL, temp.c_str());
72 
73     RepositionTextBasedControls({
74         { CtrlTextInfo::L2, IDC_MEDIA_LIB_SETTINGS_BTN, CtrlTextInfo::W32 },
75         { CtrlTextInfo::L1, IDC_STATISTICS_INFO_BUTTON, CtrlTextInfo::W32 },
76         { CtrlTextInfo::R1, IDC_PLAY_SELECTED, CtrlTextInfo::W32 },
77         { CtrlTextInfo::R2, IDCANCEL, CtrlTextInfo::W32 }
78         });
79     return true;
80 }
81 
DoDataExchange(CDataExchange * pDX)82 void CMediaLibDlg::DoDataExchange(CDataExchange* pDX)
83 {
84     CBaseDialog::DoDataExchange(pDX);
85     DDX_Control(pDX, IDC_TAB1, m_tab_ctrl);
86 }
87 
88 
BEGIN_MESSAGE_MAP(CMediaLibDlg,CBaseDialog)89 BEGIN_MESSAGE_MAP(CMediaLibDlg, CBaseDialog)
90     ON_BN_CLICKED(IDC_PLAY_SELECTED, &CMediaLibDlg::OnBnClickedPlaySelected)
91     ON_MESSAGE(WM_PLAY_SELECTED_BTN_ENABLE, &CMediaLibDlg::OnPlaySelectedBtnEnable)
92     ON_BN_CLICKED(IDC_MEDIA_LIB_SETTINGS_BTN, &CMediaLibDlg::OnBnClickedMediaLibSettingsBtn)
93     ON_BN_CLICKED(IDC_STATISTICS_INFO_BUTTON, &CMediaLibDlg::OnBnClickedStatisticsInfoButton)
94     ON_WM_DESTROY()
95 END_MESSAGE_MAP()
96 
97 
98 // CMediaLibDlg 消息处理程序
99 
100 BOOL CMediaLibDlg::OnInitDialog()
101 {
102     CBaseDialog::OnInitDialog();
103 
104     // TODO:  在此添加额外的初始化
105     ModifyStyle(0, WS_CLIPCHILDREN);
106 
107     SetIcon(IconMgr::IconType::IT_Media_Lib, FALSE);
108     SetIcon(IconMgr::IconType::IT_Media_Lib, TRUE);
109 
110     SetButtonIcon(IDC_MEDIA_LIB_SETTINGS_BTN, IconMgr::IconType::IT_Setting);
111     SetButtonIcon(IDC_STATISTICS_INFO_BUTTON, IconMgr::IconType::IT_Info);
112     SetButtonIcon(IDC_PLAY_SELECTED, IconMgr::IconType::IT_Play);
113 
114     // 创建子对话框,因为CMediaLibDlg不会及时析构为避免持续占用大量内存不再使用成员变量存储子窗口窗口类
115     m_path_dlg = new CSetPathDlg();
116     m_playlist_dlg = new CSelectPlaylistDlg();
117     m_artist_dlg = new CMediaClassifyDlg(CMediaClassifier::CT_ARTIST);
118     m_album_dlg = new CMediaClassifyDlg(CMediaClassifier::CT_ALBUM);
119     m_genre_dlg = new CMediaClassifyDlg(CMediaClassifier::CT_GENRE);
120     m_year_dlg = new CMediaClassifyDlg(CMediaClassifier::CT_YEAR);
121     m_type_dlg = new CMediaClassifyDlg(CMediaClassifier::CT_TYPE);
122     m_bitrate_dlg = new CMediaClassifyDlg(CMediaClassifier::CT_BITRATE);
123     m_rating_dlg = new CMediaClassifyDlg(CMediaClassifier::CT_RATING);
124     m_all_media_dlg = new CAllMediaDlg(CAllMediaDlg::DT_ALL_MEDIA);
125     m_recent_media_dlg = new CAllMediaDlg(CAllMediaDlg::DT_RECENT_MEDIA);
126     m_folder_explore_dlg = new CFolderExploreDlg();
127     //文件夹
128     m_path_dlg->Create(IDD_SET_PATH_DIALOG);
129     m_tab_ctrl.AddWindow(m_path_dlg, theApp.m_str_table.LoadText(L"TXT_FOLDER").c_str(), IconMgr::IconType::IT_Folder);
130 
131     //播放列表
132     m_playlist_dlg->Create(IDD_SELECT_PLAYLIST_DIALOG);
133     m_tab_ctrl.AddWindow(m_playlist_dlg, theApp.m_str_table.LoadText(L"TXT_PLAYLIST").c_str(), IconMgr::IconType::IT_Playlist);
134 
135     auto isTabShown = [&](MediaLibDisplayItem tab) {
136         return (theApp.m_media_lib_setting_data.display_item & tab) || (m_tab_show_force & tab);
137     };
138 
139     //艺术家
140     if (isTabShown(MLDI_ARTIST))
141     {
142         m_artist_dlg->Create(IDD_MEDIA_CLASSIFY_DIALOG);
143         m_tab_ctrl.AddWindow(m_artist_dlg, theApp.m_str_table.LoadText(L"TXT_ARTIST").c_str(), IconMgr::IconType::IT_Artist);
144     }
145     //唱片集
146     if (isTabShown(MLDI_ALBUM))
147     {
148         m_album_dlg->Create(IDD_MEDIA_CLASSIFY_DIALOG);
149         m_tab_ctrl.AddWindow(m_album_dlg, theApp.m_str_table.LoadText(L"TXT_ALBUM").c_str(), IconMgr::IconType::IT_Album);
150     }
151     //流派
152     if (isTabShown(MLDI_GENRE))
153     {
154         m_genre_dlg->Create(IDD_MEDIA_CLASSIFY_DIALOG);
155         m_tab_ctrl.AddWindow(m_genre_dlg, theApp.m_str_table.LoadText(L"TXT_GENRE").c_str(), IconMgr::IconType::IT_Genre);
156     }
157     //年份
158     if (isTabShown(MLDI_YEAR))
159     {
160         m_year_dlg->Create(IDD_MEDIA_CLASSIFY_DIALOG);
161         m_tab_ctrl.AddWindow(m_year_dlg, theApp.m_str_table.LoadText(L"TXT_YEAR").c_str(), IconMgr::IconType::IT_Year);
162     }
163     //类型
164     if (isTabShown(MLDI_TYPE))
165     {
166         m_type_dlg->Create(IDD_MEDIA_CLASSIFY_DIALOG);
167         m_tab_ctrl.AddWindow(m_type_dlg, theApp.m_str_table.LoadText(L"TXT_FILE_TYPE").c_str(), IconMgr::IconType::IT_File_Relate);
168     }
169     //比特率
170     if (isTabShown(MLDI_BITRATE))
171     {
172         m_bitrate_dlg->Create(IDD_MEDIA_CLASSIFY_DIALOG);
173         m_tab_ctrl.AddWindow(m_bitrate_dlg, theApp.m_str_table.LoadText(L"TXT_BITRATE").c_str(), IconMgr::IconType::IT_Bitrate);
174     }
175     //分级
176     if (isTabShown(MLDI_RATING))
177     {
178         m_rating_dlg->Create(IDD_MEDIA_CLASSIFY_DIALOG);
179         m_tab_ctrl.AddWindow(m_rating_dlg, theApp.m_str_table.LoadText(L"TXT_RATING").c_str(), IconMgr::IconType::IT_Star);
180     }
181     //所有曲目
182     if (isTabShown(MLDI_ALL))
183     {
184         m_all_media_dlg->Create(IDD_ALL_MEDIA_DIALOG);
185         m_tab_ctrl.AddWindow(m_all_media_dlg, theApp.m_str_table.LoadText(L"TXT_ALL_TRACKS").c_str(), IconMgr::IconType::IT_Media_Lib);
186     }
187     //最近播放
188     if (isTabShown(MLDI_RECENT))
189     {
190         m_recent_media_dlg->Create(IDD_ALL_MEDIA_DIALOG);
191         m_tab_ctrl.AddWindow(m_recent_media_dlg, theApp.m_str_table.LoadText(L"TXT_RECENT_PLAYED").c_str(), IconMgr::IconType::IT_History);
192     }
193     //文件夹浏览
194     if (isTabShown(MLDI_FOLDER_EXPLORE))
195     {
196         m_folder_explore_dlg->Create(IDD_FOLDER_EXPLORE_DIALOG);
197         m_tab_ctrl.AddWindow(m_folder_explore_dlg, theApp.m_str_table.LoadText(L"TXT_FOLDER_EXPLORE").c_str(), IconMgr::IconType::IT_Folder_Explore);
198     }
199 
200     m_tab_ctrl.SetItemSize(CSize(theApp.DPI(60), theApp.DPI(24)));
201     m_tab_ctrl.AdjustTabWindowSize();
202 
203     //如果要显示的标签序号无效,则保持上次的标签
204     m_tab_ctrl.SetCurTab(m_init_tab >= 0 ? m_init_tab : m_last_tab);
205 
206     m_path_dlg->AdjustColumnWidth();
207     m_playlist_dlg->AdjustColumnWidth();
208 
209     CenterWindow(GetParent());
210 
211     return TRUE;  // return TRUE unless you set the focus to a control
212                   // 异常: OCX 属性页应返回 FALSE
213 }
214 
215 
OnBnClickedPlaySelected()216 void CMediaLibDlg::OnBnClickedPlaySelected()
217 {
218     // 调用子窗口的OnOK方法
219     CTabDlg* current_tab = dynamic_cast<CTabDlg*>(m_tab_ctrl.GetCurrentTab());
220     if (current_tab != nullptr)
221         current_tab->OnOK();    // OnOK是虚方法,此处实际上执行的是CTabDlg的最终派生类的OnOK
222 }
223 
224 
OnPlaySelectedBtnEnable(WPARAM wParam,LPARAM lParam)225 afx_msg LRESULT CMediaLibDlg::OnPlaySelectedBtnEnable(WPARAM wParam, LPARAM lParam)
226 {
227     bool enable = (wParam != 0);
228     CWnd* pBtn = GetDlgItem(IDC_PLAY_SELECTED);
229     if (pBtn != nullptr)
230         pBtn->EnableWindow(enable);
231 
232     return 0;
233 }
234 
235 
OnBnClickedMediaLibSettingsBtn()236 void CMediaLibDlg::OnBnClickedMediaLibSettingsBtn()
237 {
238     // TODO: 在此添加控件通知处理程序代码
239     theApp.m_pMainWnd->SendMessage(WM_OPTION_SETTINGS, 4, LPARAM(this));
240 }
241 
242 
OnBnClickedStatisticsInfoButton()243 void CMediaLibDlg::OnBnClickedStatisticsInfoButton()
244 {
245     // TODO: 在此添加控件通知处理程序代码
246     CMediaLibStatisticsDlg dlg;
247     dlg.DoModal();
248 }
249 
250 
OnDestroy()251 void CMediaLibDlg::OnDestroy()
252 {
253     CBaseDialog::OnDestroy();
254 
255     // TODO: 在此处添加消息处理程序代码
256 
257     //窗口关闭时保存选中的标签
258     m_last_tab = m_tab_ctrl.GetCurSel();
259 
260     // 销毁并释放子窗口内存
261     if (m_path_dlg != nullptr) { m_path_dlg->DestroyWindow(); delete m_path_dlg; m_path_dlg = nullptr; }
262     if (m_playlist_dlg != nullptr) { m_playlist_dlg->DestroyWindow(); delete m_playlist_dlg; m_playlist_dlg = nullptr; }
263     if (m_artist_dlg != nullptr) { m_artist_dlg->DestroyWindow(); delete m_artist_dlg; m_artist_dlg = nullptr; }
264     if (m_album_dlg != nullptr) { m_album_dlg->DestroyWindow(); delete m_album_dlg; m_album_dlg = nullptr; }
265     if (m_genre_dlg != nullptr) { m_genre_dlg->DestroyWindow(); delete m_genre_dlg; m_genre_dlg = nullptr; }
266     if (m_year_dlg != nullptr) { m_year_dlg->DestroyWindow(); delete m_year_dlg; m_year_dlg = nullptr; }
267     if (m_type_dlg != nullptr) { m_type_dlg->DestroyWindow(); delete m_type_dlg; m_type_dlg = nullptr; }
268     if (m_bitrate_dlg != nullptr) { m_bitrate_dlg->DestroyWindow(); delete m_bitrate_dlg; m_bitrate_dlg = nullptr; }
269     if (m_rating_dlg != nullptr) { m_rating_dlg->DestroyWindow(); delete m_rating_dlg; m_rating_dlg = nullptr; }
270     if (m_all_media_dlg != nullptr) { m_all_media_dlg->DestroyWindow(); delete m_all_media_dlg; m_all_media_dlg = nullptr; }
271     if (m_recent_media_dlg != nullptr) { m_recent_media_dlg->DestroyWindow(); delete m_recent_media_dlg; m_recent_media_dlg = nullptr; }
272     if (m_folder_explore_dlg != nullptr) { m_folder_explore_dlg->DestroyWindow(); delete m_folder_explore_dlg; m_folder_explore_dlg = nullptr; }
273 }
274 
275 
OnOK()276 void CMediaLibDlg::OnOK()
277 {
278     // TODO: 在此添加专用代码和/或调用基类
279     DestroyWindow();
280     // CDialog::OnOK();
281 }
282 
283 
OnCancel()284 void CMediaLibDlg::OnCancel()
285 {
286     // TODO: 在此添加专用代码和/或调用基类
287     DestroyWindow();
288     // CDialog::OnCancel();
289 }
290