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