xref: /MusicPlayer2/MusicPlayer2/MediaLibSettingDlg.cpp (revision ac0c31680483227be80b46042789f37098b63cf2)
1 // MediaLibSettingDlg.cpp: 实现文件
2 //
3 
4 #include "stdafx.h"
5 #include "MusicPlayer2.h"
6 #include "MediaLibSettingDlg.h"
7 #include "MusicPlayerCmdHelper.h"
8 #include "CleanupRangeDlg.h"
9 #include "SongDataManager.h"
10 #include "COSUPlayerHelper.h"
11 #include "FilePathHelper.h"
12 
13 
14 // CMediaLibSettingDlg 对话框
15 
IMPLEMENT_DYNAMIC(CMediaLibSettingDlg,CTabDlg)16 IMPLEMENT_DYNAMIC(CMediaLibSettingDlg, CTabDlg)
17 
18 CMediaLibSettingDlg::CMediaLibSettingDlg(CWnd* pParent /*=nullptr*/)
19     : CTabDlg(IDD_MEDIA_LIB_SETTING_DIALOG, pParent)
20 {
21 
22 }
23 
~CMediaLibSettingDlg()24 CMediaLibSettingDlg::~CMediaLibSettingDlg()
25 {
26 }
27 
ShowDataSizeInfo()28 void CMediaLibSettingDlg::ShowDataSizeInfo()
29 {
30     wstring info;
31     if (m_data_size < 1024)
32         info = theApp.m_str_table.LoadTextFormat(L"TXT_OPT_MEDIA_LIB_CURRENT_DATA_FILE_SIZE_BYTE", { m_data_size });
33     else if (m_data_size < 1024 * 1024)
34     {
35         std::wstringstream wss;
36         wss << std::fixed << std::setprecision(2) << static_cast<float>(m_data_size) / 1024.0f;
37         info = theApp.m_str_table.LoadTextFormat(L"TXT_OPT_MEDIA_LIB_CURRENT_DATA_FILE_SIZE_KB", { m_data_size, wss.str() });
38     }
39     else
40     {
41         std::wstringstream wss;
42         wss << std::fixed << std::setprecision(2) << static_cast<float>(m_data_size) / 1024.0f / 1024.0f;
43         info = theApp.m_str_table.LoadTextFormat(L"TXT_OPT_MEDIA_LIB_CURRENT_DATA_FILE_SIZE_MB", { m_data_size, wss.str() });
44     }
45     SetDlgItemText(IDC_SIZE_STATIC, info.c_str());
46 }
47 
InitializeControls()48 bool CMediaLibSettingDlg::InitializeControls()
49 {
50     wstring temp;
51     temp = theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_MEDIA_LIB_OPT");
52     SetDlgItemTextW(IDC_TXT_OPT_MEDIA_LIB_MEDIA_LIB_OPT_STATIC, temp.c_str());
53     temp = theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_DISABLE_DEL");
54     SetDlgItemTextW(IDC_DISABLE_DELETE_FROM_DISK_CHECK, temp.c_str());
55     temp = theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_USE_CLASSIFY_OTHER");
56     SetDlgItemTextW(IDC_CLASSIFY_OTHER_CHECK, temp.c_str());
57     temp = theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_TOO_SHORT_SEC");
58     SetDlgItemTextW(IDC_TXT_OPT_MEDIA_LIB_TOO_SHORT_SEC_STATIC, temp.c_str());
59     // IDC_FILE_TOO_SHORT_SEC_EDIT
60     temp = theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_ARTIST_SPLIT_EXT_SEL");
61     SetDlgItemTextW(IDC_TXT_OPT_MEDIA_LIB_ARTIST_SPLIT_EXT_SEL_STATIC, temp.c_str());
62     // IDC_ARTIST_SPLIT_EXT_EDIT
63     temp = theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_MEDIA_LIB_UPDATE_OPT");
64     SetDlgItemTextW(IDC_TXT_OPT_MEDIA_LIB_MEDIA_LIB_UPDATE_OPT_STATIC, temp.c_str());
65     temp = theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_REMOVE_FILE_NOT_EXIST");
66     SetDlgItemTextW(IDC_REMOVE_FILE_NOT_EXIST_WHEN_UPDATE_CHECK, temp.c_str());
67     temp = theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_IGNORE_TOO_SHORT");
68     SetDlgItemTextW(IDC_IGNORE_TOO_SHORT_CHECK, temp.c_str());
69     temp = theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_AUTO_UPDATE_WHEN_STARTUP");
70     SetDlgItemTextW(IDC_UPDATE_MEDIA_LIB_CHK, temp.c_str());
71     temp = theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_FORCE_RELOAD");
72     SetDlgItemTextW(IDC_REFRESH_MEDIA_LIB_BUTTON, temp.c_str());
73     temp = theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_MEDIA_LIB_DIR");
74     SetDlgItemTextW(IDC_TXT_OPT_MEDIA_LIB_MEDIA_LIB_DIR_STATIC, temp.c_str());
75     // IDC_DIR_LIST
76     temp = theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_MEDIA_LIB_DIR_ADD");
77     SetDlgItemTextW(IDC_ADD_BUTTON, temp.c_str());
78     temp = theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_MEDIA_LIB_DIR_DEL");
79     SetDlgItemTextW(IDC_DELETE_BUTTON, temp.c_str());
80     temp = theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_MEDIA_LIB_DISP_TAB");
81     SetDlgItemTextW(IDC_TXT_OPT_MEDIA_LIB_MEDIA_LIB_DISP_TAB_STATIC, temp.c_str());
82     temp = theApp.m_str_table.LoadText(L"TXT_ARTIST");
83     SetDlgItemTextW(IDC_ARTIST_CHECK, temp.c_str());
84     temp = theApp.m_str_table.LoadText(L"TXT_ALBUM");
85     SetDlgItemTextW(IDC_ALBUM_CHECK, temp.c_str());
86     temp = theApp.m_str_table.LoadText(L"TXT_GENRE");
87     SetDlgItemTextW(IDC_GENRE_CHECK, temp.c_str());
88     temp = theApp.m_str_table.LoadText(L"TXT_YEAR");
89     SetDlgItemTextW(IDC_YEAR_CHECK, temp.c_str());
90     temp = theApp.m_str_table.LoadText(L"TXT_FILE_TYPE");
91     SetDlgItemTextW(IDC_FILE_TYPE_CHECK, temp.c_str());
92     temp = theApp.m_str_table.LoadText(L"TXT_BITRATE");
93     SetDlgItemTextW(IDC_BITRATE_CHECK, temp.c_str());
94     temp = theApp.m_str_table.LoadText(L"TXT_RATING");
95     SetDlgItemTextW(IDC_RATING_CHECK, temp.c_str());
96     temp = theApp.m_str_table.LoadText(L"TXT_ALL_TRACKS");
97     SetDlgItemTextW(IDC_ALL_CHECK, temp.c_str());
98     temp = theApp.m_str_table.LoadText(L"TXT_RECENT_PLAYED");
99     SetDlgItemTextW(IDC_RECENT_CHECK, temp.c_str());
100     temp = theApp.m_str_table.LoadText(L"TXT_FOLDER_EXPLORE");
101     SetDlgItemTextW(IDC_FOLDER_EXPLORE_CHECK, temp.c_str());
102     temp = theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_PLAYLIST_OPT");
103     SetDlgItemTextW(IDC_TXT_OPT_MEDIA_LIB_PLAYLIST_OPT_STATIC, temp.c_str());
104     temp = theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_DISABLE_DRAG_SORT");
105     SetDlgItemTextW(IDC_DISABLE_DRAGE_SORT_CHECK, temp.c_str());
106     temp = theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_INS_BEGIN");
107     SetDlgItemTextW(IDC_INSERT_BEGIN_CHECK, temp.c_str());
108     temp = theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_FLOAT_PLAYLIST_BY_DEFAULT");
109     SetDlgItemTextW(IDC_FLOAT_PLAYLIST_BY_DEFAULT_CHECK, temp.c_str());
110     temp = theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_FLOAT_PLAYLIST_FOLLOW_MAIN_WND");
111     SetDlgItemTextW(IDC_FLOAT_PLAYLIST_FOLLOW_MAIN_WND_CHECK, temp.c_str());
112     temp = theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_SHOW_TOOLTIP");
113     SetDlgItemTextW(IDC_SHOW_PLAYLIST_TOOLTIP_CHECK, temp.c_str());
114     temp = theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_PLAYLIST_DISPLAY_MODE");
115     SetDlgItemTextW(IDC_TXT_OPT_MEDIA_LIB_PLAYLIST_DISPLAY_MODE_STATIC, temp.c_str());
116     // IDC_PLAYLIST_DISPLAY_MODE_OMBO
117     temp = theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_PLAYLIST_ITEM_HEIGHT");
118     SetDlgItemTextW(IDC_TXT_OPT_MEDIA_LIB_PLAYLIST_ITEM_HEIGHT_STATIC, temp.c_str());
119     // IDC_PLAYLIST_ITEM_HEIGHT_EDIT
120     temp = theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_RECENT_PLAY");
121     SetDlgItemTextW(IDC_TXT_OPT_MEDIA_LIB_RECENT_PLAY_STATIC, temp.c_str());
122     temp = theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_RECENT_PLAY_RANGE_SEL");
123     SetDlgItemTextW(IDC_TXT_OPT_MEDIA_LIB_RECENT_PLAY_RANGE_SEL_STATIC, temp.c_str());
124     // IDC_RECENT_PLAYED_RANGE_OMBO
125     temp = theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_RECENT_PLAY_CLEAR");
126     SetDlgItemTextW(IDC_CLEAR_RECENT_PLAYED_LIST_BTN, temp.c_str());
127     temp = theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_CLEAN_MEDIA_LIB");
128     SetDlgItemTextW(IDC_TXT_OPT_MEDIA_LIB_CLEAN_MEDIA_LIB_STATIC, temp.c_str());
129     // IDC_SIZE_STATIC
130     temp = theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_DATA_FILE_CLEAN");
131     SetDlgItemTextW(IDC_CLEAN_DATA_FILE_BUTTON, temp.c_str());
132     temp = theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_TAG_EDIT");
133     SetDlgItemTextW(IDC_TXT_OPT_MEDIA_LIB_TAG_EDIT_STATIC, temp.c_str());
134     temp = theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_TAG_ID3V2_WRITE_TYPE");
135     SetDlgItemTextW(IDC_TXT_OPT_MEDIA_LIB_TAG_ID3V2_WRITE_TYPE_STATIC, temp.c_str());
136     // IDC_ID3V2_TYPE_COMBO
137     temp = theApp.m_str_table.LoadText(L"TXT_OPT_LAST_FM");
138     SetDlgItemTextW(IDC_TXT_OPT_LAST_FM_STATIC, temp.c_str());
139     temp = theApp.m_str_table.LoadText(L"TXT_OPT_LAST_FM_ENABLE");
140     SetDlgItemTextW(IDC_ENABLE_LASTFM, temp.c_str());
141     // IDC_LASTFM_STATUS
142     temp = theApp.m_str_table.LoadText(L"TXT_OPT_LAST_FM_USE_HTTPS");
143     SetDlgItemTextW(IDC_LASTFM_ENABLE_HTTPS, temp.c_str());
144     temp = theApp.m_str_table.LoadText(L"TXT_OPT_LAST_FM_LOGIN");
145     SetDlgItemTextW(IDC_LASTFM_LOGIN, temp.c_str());
146     temp = theApp.m_str_table.LoadText(L"TXT_OPT_LAST_FM_UPLOAD_NOW_PLAYING");
147     SetDlgItemTextW(IDC_LASTFM_ENABLE_NOWPLAYING, temp.c_str());
148     temp = theApp.m_str_table.LoadText(L"TXT_OPT_LAST_FM_CACHE_CONDITION");
149     SetDlgItemTextW(IDC_TXT_OPT_LAST_FM_CACHE_CONDITION_STATIC, temp.c_str());
150     temp = theApp.m_str_table.LoadText(L"TXT_OPT_LAST_FM_CACHE_CONDITION_PERCENT");
151     SetDlgItemTextW(IDC_TXT_OPT_LAST_FM_CACHE_CONDITION_PERCENT_STATIC, temp.c_str());
152     // IDC_LASTFM_LEAST_PERDUR
153     temp = theApp.m_str_table.LoadText(L"TXT_OPT_LAST_FM_CACHE_CONDITION_DURATION");
154     SetDlgItemTextW(IDC_TXT_OPT_LAST_FM_CACHE_CONDITION_DURATION_STATIC, temp.c_str());
155     // IDC_LASTFM_LEAST_DUR
156     // IDC_LASTFM_CACHE_STATUS
157     temp = theApp.m_str_table.LoadText(L"TXT_OPT_LAST_FM_CACHE_UPLOAD");
158     SetDlgItemTextW(IDC_LASTFM_UPLOAD_CACHE, temp.c_str());
159     temp = theApp.m_str_table.LoadText(L"TXT_OPT_LAST_FM_UPLOAD_WHEN_REACH_THRESHOLD");
160     SetDlgItemTextW(IDC_LASTFM_AUTO_SCROBBLE, temp.c_str());
161     temp = theApp.m_str_table.LoadText(L"TXT_OPT_LAST_FM_AUTO_UPLOAD_THRESHOLD");
162     SetDlgItemTextW(IDC_TXT_OPT_LAST_FM_AUTO_UPLOAD_THRESHOLD_STATIC, temp.c_str());
163     // IDC_LASTFM_AUTO_SCROBBLE_MIN
164 
165     RepositionTextBasedControls({
166         { CtrlTextInfo::C0, IDC_UPDATE_MEDIA_LIB_CHK },
167         { CtrlTextInfo::R1, IDC_REFRESH_MEDIA_LIB_BUTTON, CtrlTextInfo::W32 }
168         });
169     RepositionTextBasedControls({
170         { CtrlTextInfo::C0, IDC_DIR_LIST },
171         { CtrlTextInfo::R1, IDC_ADD_BUTTON, CtrlTextInfo::W32 },
172         { CtrlTextInfo::R1, IDC_DELETE_BUTTON, CtrlTextInfo::W32 }
173         });
174     RepositionTextBasedControls({
175         { CtrlTextInfo::R1, IDC_CLEAR_RECENT_PLAYED_LIST_BTN, CtrlTextInfo::W32 }
176         });
177     RepositionTextBasedControls({
178         { CtrlTextInfo::C0, IDC_SIZE_STATIC },
179         { CtrlTextInfo::R1, IDC_CLEAN_DATA_FILE_BUTTON, CtrlTextInfo::W32 }
180         });
181     RepositionTextBasedControls({
182         { CtrlTextInfo::C0, IDC_LASTFM_ENABLE_HTTPS },
183         { CtrlTextInfo::C0, IDC_LASTFM_ENABLE_NOWPLAYING },
184         { CtrlTextInfo::R1, IDC_LASTFM_LOGIN, CtrlTextInfo::W32 }
185         });
186     RepositionTextBasedControls({
187         { CtrlTextInfo::R1, IDC_LASTFM_UPLOAD_CACHE, CtrlTextInfo::W32 }
188         });
189     return true;
190 }
191 
DoDataExchange(CDataExchange * pDX)192 void CMediaLibSettingDlg::DoDataExchange(CDataExchange* pDX)
193 {
194     CTabDlg::DoDataExchange(pDX);
195     DDX_Control(pDX, IDC_DIR_LIST, m_dir_list_ctrl);
196     DDX_Control(pDX, IDC_PLAYLIST_DISPLAY_MODE_OMBO, m_playlist_display_mode_combo);
197     DDX_Control(pDX, IDC_RECENT_PLAYED_RANGE_OMBO, m_recent_played_range_combo);
198     DDX_Control(pDX, IDC_FILE_TOO_SHORT_SEC_EDIT, m_file_too_short_sec_edit);
199     DDX_Control(pDX, IDC_ID3V2_TYPE_COMBO, m_id3v2_type_combo);
200     DDX_Control(pDX, IDC_ENABLE_LASTFM, m_enable_lastfm);
201     DDX_Control(pDX, IDC_LASTFM_STATUS, m_lastfm_status);
202     DDX_Control(pDX, IDC_LASTFM_LOGIN, m_lastfm_login);
203     DDX_Control(pDX, IDC_LASTFM_LEAST_PERDUR, m_lastfm_least_perdur);
204     DDX_Control(pDX, IDC_LASTFM_LEAST_DUR, m_lastfm_least_dur);
205     DDX_Control(pDX, IDC_LASTFM_AUTO_SCROBBLE, m_lastfm_auto_scrobble);
206     DDX_Control(pDX, IDC_LASTFM_AUTO_SCROBBLE_MIN, m_lastfm_auto_scrobble_min);
207     DDX_Control(pDX, IDC_LASTFM_CACHE_STATUS, m_lastfm_cache_status);
208     DDX_Control(pDX, IDC_LASTFM_UPLOAD_CACHE, m_lastfm_upload_cache);
209     DDX_Control(pDX, IDC_LASTFM_ENABLE_HTTPS, m_lastfm_enable_https);
210     DDX_Control(pDX, IDC_LASTFM_ENABLE_NOWPLAYING, m_lastfm_enable_nowplaying);
211     DDX_Control(pDX, IDC_PLAYLIST_ITEM_HEIGHT_EDIT, m_playlist_item_height_edit);
212     DDX_Control(pDX, IDC_ARTIST_SPLIT_EXT_EDIT, m_artist_split_ext_edit);
213 }
214 
GetDataFromUi()215 void CMediaLibSettingDlg::GetDataFromUi()
216 {
217     m_data.disable_delete_from_disk = (IsDlgButtonChecked(IDC_DISABLE_DELETE_FROM_DISK_CHECK) != 0);
218     m_data.hide_only_one_classification = (IsDlgButtonChecked(IDC_CLASSIFY_OTHER_CHECK) != 0);
219     m_data.file_too_short_sec = m_file_too_short_sec_edit.GetValue();
220 
221     m_data.remove_file_not_exist_when_update = (IsDlgButtonChecked(IDC_REMOVE_FILE_NOT_EXIST_WHEN_UPDATE_CHECK) != 0);
222     m_data.ignore_too_short_when_update = (IsDlgButtonChecked(IDC_IGNORE_TOO_SHORT_CHECK) != 0);
223     m_data.update_media_lib_when_start_up = (IsDlgButtonChecked(IDC_UPDATE_MEDIA_LIB_CHK) != 0);
224 
225     m_data.display_item = 0;
226     if (IsDlgButtonChecked(IDC_ARTIST_CHECK))
227         m_data.display_item |= MLDI_ARTIST;
228     if (IsDlgButtonChecked(IDC_ALBUM_CHECK))
229         m_data.display_item |= MLDI_ALBUM;
230     if (IsDlgButtonChecked(IDC_GENRE_CHECK))
231         m_data.display_item |= MLDI_GENRE;
232     if (IsDlgButtonChecked(IDC_YEAR_CHECK))
233         m_data.display_item |= MLDI_YEAR;
234     if (IsDlgButtonChecked(IDC_FILE_TYPE_CHECK))
235         m_data.display_item |= MLDI_TYPE;
236     if (IsDlgButtonChecked(IDC_BITRATE_CHECK))
237         m_data.display_item |= MLDI_BITRATE;
238     if (IsDlgButtonChecked(IDC_RATING_CHECK))
239         m_data.display_item |= MLDI_RATING;
240     if (IsDlgButtonChecked(IDC_ALL_CHECK))
241         m_data.display_item |= MLDI_ALL;
242     if (IsDlgButtonChecked(IDC_RECENT_CHECK))
243         m_data.display_item |= MLDI_RECENT;
244     if (IsDlgButtonChecked(IDC_FOLDER_EXPLORE_CHECK))
245         m_data.display_item |= MLDI_FOLDER_EXPLORE;
246 
247     m_data.disable_drag_sort = (IsDlgButtonChecked(IDC_DISABLE_DRAGE_SORT_CHECK) != 0);
248     m_data.insert_begin_of_playlist = (IsDlgButtonChecked(IDC_INSERT_BEGIN_CHECK) != 0);
249     m_data.playlist_btn_for_float_playlist = (IsDlgButtonChecked(IDC_FLOAT_PLAYLIST_BY_DEFAULT_CHECK) != 0);
250     m_data.float_playlist_follow_main_wnd = (IsDlgButtonChecked(IDC_FLOAT_PLAYLIST_FOLLOW_MAIN_WND_CHECK) != 0);
251     m_data.show_playlist_tooltip = (IsDlgButtonChecked(IDC_SHOW_PLAYLIST_TOOLTIP_CHECK) != 0);
252     m_data.display_format = static_cast<DisplayFormat>(m_playlist_display_mode_combo.GetCurSel());
253     m_data.playlist_item_height = m_playlist_item_height_edit.GetValue();
254     m_data.recent_played_range = static_cast<RecentPlayedRange>(m_recent_played_range_combo.GetCurSel());
255 
256     int cur_index = m_id3v2_type_combo.GetCurSel();
257     m_data.write_id3_v2_3 = (cur_index == 0);
258 
259     m_data.lastfm_least_perdur = m_lastfm_least_perdur.GetValue();
260     m_data.lastfm_least_dur = m_lastfm_least_dur.GetValue();
261     m_data.lastfm_auto_scrobble_min = m_lastfm_auto_scrobble_min.GetValue();
262 }
263 
264 // void CMediaLibSettingDlg::ApplyDataToUi()
265 // {
266 // }
267 
BEGIN_MESSAGE_MAP(CMediaLibSettingDlg,CTabDlg)268 BEGIN_MESSAGE_MAP(CMediaLibSettingDlg, CTabDlg)
269     ON_WM_TIMER()
270     ON_BN_CLICKED(IDC_ADD_BUTTON, &CMediaLibSettingDlg::OnBnClickedAddButton)
271     ON_BN_CLICKED(IDC_DELETE_BUTTON, &CMediaLibSettingDlg::OnBnClickedDeleteButton)
272     ON_BN_CLICKED(IDC_CLEAN_DATA_FILE_BUTTON, &CMediaLibSettingDlg::OnBnClickedCleanDataFileButton)
273     ON_BN_CLICKED(IDC_CLEAR_RECENT_PLAYED_LIST_BTN, &CMediaLibSettingDlg::OnBnClickedClearRecentPlayedListBtn)
274     ON_BN_CLICKED(IDC_REFRESH_MEDIA_LIB_BUTTON, &CMediaLibSettingDlg::OnBnClickedRefreshMediaLibButton)
275     ON_BN_CLICKED(IDC_ENABLE_LASTFM, &CMediaLibSettingDlg::OnBnClickedEnableLastfm)
276     ON_BN_CLICKED(IDC_LASTFM_LOGIN, &CMediaLibSettingDlg::OnBnClickedLastfmLogin)
277     ON_BN_CLICKED(IDC_LASTFM_AUTO_SCROBBLE, &CMediaLibSettingDlg::OnBnClickedLastfmAutoScrobble)
278     ON_BN_CLICKED(IDC_LASTFM_UPLOAD_CACHE, &CMediaLibSettingDlg::OnBnClickedLastfmUploadCache)
279     ON_BN_CLICKED(IDC_LASTFM_ENABLE_HTTPS, &CMediaLibSettingDlg::OnBnClickedLastfmEnableHttps)
280     ON_BN_CLICKED(IDC_LASTFM_ENABLE_NOWPLAYING, &CMediaLibSettingDlg::OnBnClickedLastfmEnableNowplaying)
281     ON_MESSAGE(WM_EDIT_BROWSE_CHANGED, &CMediaLibSettingDlg::OnEditBrowseChanged)
282 END_MESSAGE_MAP()
283 
284 
285 // CMediaLibSettingDlg 消息处理程序
286 
287 
288 BOOL CMediaLibSettingDlg::OnInitDialog()
289 {
290     CTabDlg::OnInitDialog();
291 
292     // TODO:  在此添加额外的初始化
293     m_data_size = CCommon::GetFileSize(theApp.m_song_data_path);
294     ShowDataSizeInfo();
295 
296     CheckDlgButton(IDC_CLASSIFY_OTHER_CHECK, m_data.hide_only_one_classification);
297     CheckDlgButton(IDC_UPDATE_MEDIA_LIB_CHK, m_data.update_media_lib_when_start_up);
298     CheckDlgButton(IDC_DISABLE_DRAGE_SORT_CHECK, m_data.disable_drag_sort);
299     CheckDlgButton(IDC_DISABLE_DELETE_FROM_DISK_CHECK, m_data.disable_delete_from_disk);
300     CheckDlgButton(IDC_REMOVE_FILE_NOT_EXIST_WHEN_UPDATE_CHECK, m_data.remove_file_not_exist_when_update);
301 
302     m_artist_split_ext_edit.SetWindowTextW(CCommon::MergeStringList(m_data.artist_split_ext).c_str());
303     m_artist_split_ext_edit.SetEditBrowseMode(CBrowseEdit::EditBrowseMode::LIST2);
304     m_artist_split_ext_edit.SetPopupDlgTitle(theApp.m_str_table.LoadText(L"TITLE_BROWSE_EDIT_SET_MULTI_ARTIST_SPLIT_EXT"));
305     m_artist_split_ext_edit.SetReadOnly(true);  // 没有异常处理故禁用手动编辑(应当使用弹出窗口)
306 
307     for (const auto& str : m_data.media_folders)
308         m_dir_list_ctrl.AddString(str.c_str());
309     m_dir_list_ctrl.SetMouseWheelEnable(false);
310 
311     wstring tip_str;
312     m_toolTip.Create(this);
313     m_toolTip.SetMaxTipWidth(theApp.DPI(300));
314     tip_str = theApp.m_str_table.LoadText(L"TIP_OPT_MEDIA_LIB_DATA_FILE_CLEAN");
315     m_toolTip.AddTool(GetDlgItem(IDC_CLEAN_DATA_FILE_BUTTON), tip_str.c_str());
316     tip_str = theApp.m_str_table.LoadText(L"TIP_OPT_MEDIA_LIB_AUTO_UPDATE_WHEN_STARTUP");
317     m_toolTip.AddTool(GetDlgItem(IDC_UPDATE_MEDIA_LIB_CHK), tip_str.c_str());
318     tip_str = theApp.m_str_table.LoadText(L"TIP_OPT_MEDIA_LIB_ARTIST_SPLIT_EXT");
319     m_toolTip.AddTool(&m_artist_split_ext_edit, tip_str.c_str());
320 
321     m_playlist_display_mode_combo.AddString(theApp.m_str_table.LoadText(L"TXT_FILE_NAME").c_str());
322     m_playlist_display_mode_combo.AddString(theApp.m_str_table.LoadText(L"TXT_TITLE").c_str());
323     m_playlist_display_mode_combo.AddString((theApp.m_str_table.LoadText(L"TXT_ARTIST") + L" - " + theApp.m_str_table.LoadText(L"TXT_TITLE")).c_str());
324     m_playlist_display_mode_combo.AddString((theApp.m_str_table.LoadText(L"TXT_TITLE") + L" - " + theApp.m_str_table.LoadText(L"TXT_ARTIST")).c_str());
325     m_playlist_display_mode_combo.SetCurSel(static_cast<int>(m_data.display_format));
326 
327     m_recent_played_range_combo.AddString(theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_RECENT_PLAY_RANGE_ALL").c_str());
328     m_recent_played_range_combo.AddString(theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_RECENT_PLAY_RANGE_TODAY").c_str());
329     m_recent_played_range_combo.AddString(theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_RECENT_PLAY_RANGE_LAST_THREE_DAYS").c_str());
330     m_recent_played_range_combo.AddString(theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_RECENT_PLAY_RANGE_LAST_WEEK").c_str());
331     m_recent_played_range_combo.AddString(theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_RECENT_PLAY_RANGE_LAST_MONTH").c_str());
332     m_recent_played_range_combo.AddString(theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_RECENT_PLAY_RANGE_LAST_HALF_YEAR").c_str());
333     m_recent_played_range_combo.AddString(theApp.m_str_table.LoadText(L"TXT_OPT_MEDIA_LIB_RECENT_PLAY_RANGE_LAST_YEAR").c_str());
334     m_recent_played_range_combo.SetCurSel(static_cast<int>(m_data.recent_played_range));
335 
336     CheckDlgButton(IDC_INSERT_BEGIN_CHECK, m_data.insert_begin_of_playlist);
337     CheckDlgButton(IDC_IGNORE_TOO_SHORT_CHECK, m_data.ignore_too_short_when_update);
338     CheckDlgButton(IDC_FLOAT_PLAYLIST_BY_DEFAULT_CHECK, m_data.playlist_btn_for_float_playlist);
339     CheckDlgButton(IDC_FLOAT_PLAYLIST_FOLLOW_MAIN_WND_CHECK, m_data.float_playlist_follow_main_wnd);
340     CheckDlgButton(IDC_SHOW_PLAYLIST_TOOLTIP_CHECK, m_data.show_playlist_tooltip);
341 
342     CheckDlgButton(IDC_ARTIST_CHECK, m_data.display_item & MLDI_ARTIST);
343     CheckDlgButton(IDC_ALBUM_CHECK, m_data.display_item & MLDI_ALBUM);
344     CheckDlgButton(IDC_GENRE_CHECK, m_data.display_item & MLDI_GENRE);
345     CheckDlgButton(IDC_YEAR_CHECK, m_data.display_item & MLDI_YEAR);
346     CheckDlgButton(IDC_FILE_TYPE_CHECK, m_data.display_item & MLDI_TYPE);
347     CheckDlgButton(IDC_BITRATE_CHECK, m_data.display_item & MLDI_BITRATE);
348     CheckDlgButton(IDC_RATING_CHECK, m_data.display_item & MLDI_RATING);
349     CheckDlgButton(IDC_ALL_CHECK, m_data.display_item & MLDI_ALL);
350     CheckDlgButton(IDC_RECENT_CHECK, m_data.display_item & MLDI_RECENT);
351     CheckDlgButton(IDC_FOLDER_EXPLORE_CHECK, m_data.display_item & MLDI_FOLDER_EXPLORE);
352 
353     m_id3v2_type_combo.AddString(L"ID3v2.3");
354     m_id3v2_type_combo.AddString(L"ID3v2.4");
355     int cur_index = m_data.write_id3_v2_3 ? 0 : 1;
356     m_id3v2_type_combo.SetCurSel(cur_index);
357 
358     SetButtonIcon(IDC_REFRESH_MEDIA_LIB_BUTTON, IconMgr::IconType::IT_Refresh);
359 
360     m_lastfm_least_perdur.SetRange(10, 90, 10);
361     m_lastfm_least_perdur.SetValue(m_data.lastfm_least_perdur);
362     m_lastfm_least_dur.SetRange(10, 240, 10);
363     m_lastfm_least_dur.SetValue(m_data.lastfm_least_dur);
364     m_lastfm_auto_scrobble_min.SetRange(1, 50);
365     m_lastfm_auto_scrobble_min.SetValue(m_data.lastfm_auto_scrobble_min);
366 
367     m_playlist_item_height_edit.SetRange(MIN_PLAYLIST_ITEM_HEIGHT, MAX_PLAYLIST_ITEM_HEIGHT);
368     m_playlist_item_height_edit.SetValue(m_data.playlist_item_height);
369     m_file_too_short_sec_edit.SetRange(1, 60, 10);
370     m_file_too_short_sec_edit.SetValue(m_data.file_too_short_sec);
371 
372     //设置控件不响应鼠标滚轮消息
373     m_playlist_display_mode_combo.SetMouseWheelEnable(false);
374     m_recent_played_range_combo.SetMouseWheelEnable(false);
375     m_id3v2_type_combo.SetMouseWheelEnable(false);
376     m_lastfm_least_perdur.SetMouseWheelEnable(false);
377     m_lastfm_least_dur.SetMouseWheelEnable(false);
378     m_lastfm_auto_scrobble_min.SetMouseWheelEnable(false);
379     m_playlist_item_height_edit.SetMouseWheelEnable(false);
380     m_file_too_short_sec_edit.SetMouseWheelEnable(false);
381 
382     UpdateLastFMStatus();
383     SetTimer(TIMER_1_SEC, 1000, NULL);
384 
385     return TRUE;  // return TRUE unless you set the focus to a control
386                   // 异常: OCX 属性页应返回 FALSE
387 }
388 
389 
OnBnClickedAddButton()390 void CMediaLibSettingDlg::OnBnClickedAddButton()
391 {
392     // TODO: 在此添加控件通知处理程序代码
393     CFolderPickerDialog dlg;
394     if (dlg.DoModal() == IDOK)
395     {
396         CString dir_str = dlg.GetPathName();
397         if (!CCommon::IsItemInVector(m_data.media_folders, wstring(dir_str)))
398         {
399             m_data.media_folders.push_back(wstring(dir_str));
400             m_dir_list_ctrl.AddString(dir_str);
401         }
402     }
403 }
404 
405 
OnBnClickedDeleteButton()406 void CMediaLibSettingDlg::OnBnClickedDeleteButton()
407 {
408     // TODO: 在此添加控件通知处理程序代码
409     int index = m_dir_list_ctrl.GetCurSel();
410     if (index >= 0 && index < static_cast<int>(m_data.media_folders.size()))
411     {
412         m_data.media_folders.erase(m_data.media_folders.begin() + index);
413         m_dir_list_ctrl.DeleteItem(index);
414     }
415 }
416 
417 
OnBnClickedCleanDataFileButton()418 void CMediaLibSettingDlg::OnBnClickedCleanDataFileButton()
419 {
420     // TODO: 在此添加控件通知处理程序代码
421 
422     wstring osu_floder{};
423     for (const auto& item : theApp.m_media_lib_setting_data.media_folders)
424         if (COSUPlayerHelper::IsOsuFolder(item))
425             osu_floder = item;
426     CCleanupRangeDlg dlg;
427     dlg.SetCleanFileNonMainInOsuEnable(!osu_floder.empty());
428     if (dlg.DoModal() == IDOK)
429     {
430         CWaitCursor wait_cursor;	//显示等待光标
431         int clear_cnt{};
432         if (dlg.IsCleanFileNotExist())  // 0
433         {
434             clear_cnt += CMusicPlayerCmdHelper::CleanUpSongData();
435         }
436         if (dlg.IsCleanFileNotInMediaLibDir())  // 1
437         {
438             clear_cnt += CMusicPlayerCmdHelper::CleanUpSongData([&](const SongInfo& song)
439                 {
440                     for (const auto& dir : m_data.media_folders)
441                     {
442                         if (song.file_path.find(dir) == 0)
443                         {
444                             return false;
445                         }
446                     }
447                     return true;
448                 });
449         }
450         if (dlg.IsCleanFileWrong())     // 2
451         {
452             clear_cnt += CMusicPlayerCmdHelper::CleanUpSongData([&](const SongInfo& song)
453                 {
454                     bool length_is_zero = (song.length().isZero() && CFilePathHelper(song.file_path).GetFileExtension() != L"cue");
455                     bool path_invalid = (!CCommon::IsPath(song.file_path) || song.file_path.back() == L'/' || song.file_path.back() == L'\\');
456                     bool time_error = (song.length() == Time(25197, 8, 489));   // 这是个旧错误,我媒体库里有大量来自osu!的0时长的RIFF WAV被记录为这个时长
457                     return length_is_zero || path_invalid || time_error;
458                 });
459         }
460         if (dlg.IsCleanFileTooShort())  // 3
461         {
462             clear_cnt += CMusicPlayerCmdHelper::CleanUpSongData([&](const SongInfo& song)
463                 {
464                     return song.length().toInt() < m_data.file_too_short_sec * 1000;
465                 });
466         }
467         if (dlg.IsCleanFileNonMainInOsu())  // 4
468         {
469             vector<wstring> osu_songs;
470             COSUPlayerHelper::GetOSUAudioFiles(osu_floder, osu_songs);
471             clear_cnt += CMusicPlayerCmdHelper::CleanUpSongData([&](const SongInfo& song)
472                 {
473                     if (song.file_path.find(osu_floder) == wstring::npos) return false; // 跳过不在osu!目录的条目
474                     return !CCommon::IsItemInVector(osu_songs, song.file_path);     // 清除非主要曲目的文件
475                 });
476         }
477         if (clear_cnt > 0)
478         {
479             theApp.SaveSongData();		//清理后将数据写入文件
480             theApp.UpdateUiMeidaLibItems();     //更新UI中的媒体库显示
481         }
482 
483         size_t data_size = CCommon::GetFileSize(theApp.m_song_data_path);	 //清理后数据文件的大小
484         int size_reduced = m_data_size - data_size;		//清理后数据文件减少的字节数
485         if (size_reduced < 0) size_reduced = 0;
486         wstring info = theApp.m_str_table.LoadTextFormat(L"MSG_OPT_MEDIA_LIB_DATA_FILE_CLEAR_COMPLETE", { clear_cnt, size_reduced });
487         MessageBox(info.c_str(), NULL, MB_ICONINFORMATION);
488         m_data_size = data_size;
489         ShowDataSizeInfo();
490     }
491 }
492 
493 
PreTranslateMessage(MSG * pMsg)494 BOOL CMediaLibSettingDlg::PreTranslateMessage(MSG* pMsg)
495 {
496     // TODO: 在此添加专用代码和/或调用基类
497     if (pMsg->message == WM_MOUSEMOVE)
498         m_toolTip.RelayEvent(pMsg);
499 
500     return CTabDlg::PreTranslateMessage(pMsg);
501 }
502 
503 
OnBnClickedClearRecentPlayedListBtn()504 void CMediaLibSettingDlg::OnBnClickedClearRecentPlayedListBtn()
505 {
506     // TODO: 在此添加控件通知处理程序代码
507 
508     //清除歌曲的上次播放时间
509     const wstring& info = theApp.m_str_table.LoadText(L"MSG_OPT_MEDIA_LIB_RECENT_PLAY_CLEAR_INQUIRY");
510     if (MessageBox(info.c_str(), NULL, MB_ICONINFORMATION | MB_YESNO) == IDYES)
511     {
512         CSongDataManager::GetInstance().ClearLastPlayedTime();
513         ::SendMessage(AfxGetMainWnd()->GetSafeHwnd(), WM_RECENT_PLAYED_LIST_CLEARED, 0, 0);
514     }
515 }
516 
517 
OnOK()518 void CMediaLibSettingDlg::OnOK()
519 {
520     // TODO: 在此添加专用代码和/或调用基类
521 
522     CTabDlg::OnOK();
523 }
524 
525 
OnBnClickedRefreshMediaLibButton()526 void CMediaLibSettingDlg::OnBnClickedRefreshMediaLibButton()
527 {
528     // TODO: 在此添加控件通知处理程序代码
529     if (theApp.IsMeidaLibUpdating())
530     {
531         const wstring& info = theApp.m_str_table.LoadText(L"MSG_OPT_MEDIA_LIB_UPDATING_INFO");
532         MessageBox(info.c_str(), nullptr, MB_ICONINFORMATION | MB_OK);
533     }
534     else
535     {
536         const wstring& info = theApp.m_str_table.LoadText(L"MSG_FORCE_UPDATE_MEDIA_LIB_INQUIRY");
537         if (MessageBox(info.c_str(), nullptr, MB_ICONQUESTION | MB_YESNO) == IDYES)
538         {
539             theApp.StartUpdateMediaLib(true);  // 刷新媒体库按钮强制重新获取所有元数据
540         }
541     }
542 }
543 
544 
OnBnClickedEnableLastfm()545 void CMediaLibSettingDlg::OnBnClickedEnableLastfm() {
546     m_data.enable_lastfm = (m_enable_lastfm.GetCheck() != 0);
547     UpdateLastFMStatus();
548 }
549 
550 
OnBnClickedLastfmLogin()551 void CMediaLibSettingDlg::OnBnClickedLastfmLogin() {
552     wstring token = theApp.m_lastfm.GetToken();
553     wstring url = theApp.m_lastfm.GetRequestAuthorizationUrl(token);
554     if (!token.empty() && !url.empty())
555     {
556         ShellExecuteW(nullptr, L"open", url.c_str(), nullptr, nullptr, SW_SHOW);
557         const wstring& info = theApp.m_str_table.LoadText(L"MSG_OPT_LAST_FM_LOGIN_PROMPT");
558         if (MessageBoxW(info.c_str(), NULL, MB_ICONINFORMATION | MB_OKCANCEL) == IDOK)
559         {
560             if (theApp.m_lastfm.GetSession(token))
561             {
562                 UpdateLastFMStatus();
563                 theApp.SaveLastFMData();
564                 return;
565             }
566         }
567     }
568     const wstring& info = theApp.m_str_table.LoadText(L"MSG_OPT_LAST_FM_LOGIN_FAILED");
569     MessageBoxW(info.c_str(), NULL, MB_ICONERROR | MB_OK);
570     return;
571 }
572 
UpdateLastFMStatus()573 void CMediaLibSettingDlg::UpdateLastFMStatus() {
574     m_enable_lastfm.SetCheck(m_data.enable_lastfm);
575     bool has_key = theApp.m_lastfm.HasSessionKey();
576     wstring status_str;
577     if (has_key)
578         status_str = theApp.m_str_table.LoadTextFormat(L"TXT_OPT_LAST_FM_STATUS_LOGIN_LOGGED", { theApp.m_lastfm.UserName() });
579     else
580         status_str = theApp.m_str_table.LoadText(L"TXT_OPT_LAST_FM_STATUS_LOGIN_REQUIRED");
581     m_lastfm_status.SetWindowTextW(status_str.c_str());
582     bool login_enabled = m_data.enable_lastfm && !has_key;
583     m_lastfm_login.EnableWindow(login_enabled);
584     m_lastfm_least_perdur.EnableWindow(m_data.enable_lastfm);
585     m_lastfm_least_dur.EnableWindow(m_data.enable_lastfm);
586     m_lastfm_auto_scrobble.EnableWindow(m_data.enable_lastfm);
587     m_lastfm_auto_scrobble.SetCheck(m_data.lastfm_auto_scrobble);
588     m_lastfm_auto_scrobble_min.EnableWindow(m_data.enable_lastfm && m_data.lastfm_auto_scrobble);
589     m_lastfm_enable_https.EnableWindow(m_data.enable_lastfm);
590     m_lastfm_enable_https.SetCheck(m_data.lastfm_enable_https);
591     m_lastfm_enable_nowplaying.EnableWindow(m_data.enable_lastfm);
592     m_lastfm_enable_nowplaying.SetCheck(m_data.lastfm_enable_nowplaying);
593     UpdateLastFMCacheStatus();
594 }
595 
596 
OnBnClickedLastfmAutoScrobble()597 void CMediaLibSettingDlg::OnBnClickedLastfmAutoScrobble() {
598     m_data.lastfm_auto_scrobble = (m_lastfm_auto_scrobble.GetCheck() != 0);
599     UpdateLastFMStatus();
600 }
601 
OnTimer(UINT_PTR nIDEvent)602 void CMediaLibSettingDlg::OnTimer(UINT_PTR nIDEvent) {
603     if (nIDEvent == TIMER_1_SEC) {
604         UpdateLastFMCacheStatus();
605     }
606 }
607 
UpdateLastFMCacheStatus()608 void CMediaLibSettingDlg::UpdateLastFMCacheStatus() {
609     size_t count = theApp.m_lastfm.CachedCount();
610     wstring status_str = theApp.m_str_table.LoadTextFormat(L"TXT_OPT_LAST_FM_CACHE_STATUS", { count });
611     m_lastfm_cache_status.SetWindowTextW(status_str.c_str());
612     m_lastfm_upload_cache.EnableWindow(m_data.enable_lastfm && count > 0);
613 }
614 
615 
OnBnClickedLastfmUploadCache()616 void CMediaLibSettingDlg::OnBnClickedLastfmUploadCache() {
617     theApp.LastFMScrobble();
618 }
619 
620 
OnBnClickedLastfmEnableHttps()621 void CMediaLibSettingDlg::OnBnClickedLastfmEnableHttps() {
622     m_data.lastfm_enable_https = (m_lastfm_enable_https.GetCheck() != 0);
623 }
624 
625 
OnBnClickedLastfmEnableNowplaying()626 void CMediaLibSettingDlg::OnBnClickedLastfmEnableNowplaying() {
627     m_data.lastfm_enable_nowplaying = (m_lastfm_enable_nowplaying.GetCheck() != 0);
628 }
629 
630 
OnEditBrowseChanged(WPARAM wParam,LPARAM lParam)631 afx_msg LRESULT CMediaLibSettingDlg::OnEditBrowseChanged(WPARAM wParam, LPARAM lParam)
632 {
633     CBrowseEdit* pEdit = (CBrowseEdit*)lParam;
634     if (pEdit == &m_artist_split_ext_edit)
635     {
636         CString temp;
637         m_artist_split_ext_edit.GetWindowTextW(temp);
638         CCommon::SplitStringList(m_data.artist_split_ext, wstring(temp));
639     }
640     return 0;
641 }
642 
643