-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathMainWindow.Views.cs
More file actions
286 lines (248 loc) · 13.6 KB
/
Copy pathMainWindow.Views.cs
File metadata and controls
286 lines (248 loc) · 13.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
namespace UltimateKtv
{
public partial class MainWindow
{
// Toggle visibility of quick input panels
private void ShowQuickInputPanels(bool show)
{
var vis = show ? Visibility.Visible : Visibility.Collapsed;
if (SearchStyleBtnPanel != null) SearchStyleBtnPanel.Visibility = vis;
if (show)
{
// Collapse language filters when OPENING search panels (ID/Search)
if (LanguageSecondFilterGrid != null) LanguageSecondFilterGrid.Visibility = Visibility.Collapsed;
if (LanguageWordCountFilterGrid != null) LanguageWordCountFilterGrid.Visibility = Visibility.Collapsed;
if (_filterButtons != null)
{
foreach (var btn in _filterButtons) btn.Visibility = Visibility.Collapsed;
}
// Youtube mode collapses the char grid and results list, but shows the thumbnail grid
if (SearchInputGrid != null)
SearchInputGrid.Visibility = (_searchMode == SearchMode.Youtube || _currentQuickMethod == QuickMethod.Keyboard) ? Visibility.Collapsed : Visibility.Visible;
if (SearchSymbolPanel != null) SearchSymbolPanel.Visibility = Visibility.Visible;
bool useYoutubeGrid = (_searchMode == SearchMode.Youtube && _currentQuickMethod != QuickMethod.YoutubeHistory);
if (YoutubeThumbnailGrid != null)
YoutubeThumbnailGrid.Visibility = useYoutubeGrid ? Visibility.Visible : Visibility.Collapsed;
if (QuickResultsContainer != null)
QuickResultsContainer.Visibility = Visibility.Visible;
// Hide language grid when in quick search
if (LanguageSongListGrid != null) LanguageSongListGrid.Visibility = Visibility.Collapsed;
// Important: Collapse the main singer/song grid area in YouTube mode to give space for Row 4
if (SingerSongContentGrid != null)
SingerSongContentGrid.Visibility = (_searchMode == SearchMode.Youtube) ? Visibility.Collapsed : Visibility.Visible;
}
else
{
if (SearchInputGrid != null) SearchInputGrid.Visibility = Visibility.Collapsed;
if (SearchSymbolPanel != null) SearchSymbolPanel.Visibility = Visibility.Collapsed;
if (YoutubeThumbnailGrid != null) YoutubeThumbnailGrid.Visibility = Visibility.Collapsed;
if (QuickResultsContainer != null) QuickResultsContainer.Visibility = Visibility.Collapsed;
if (QuickSongListGrid != null) QuickSongListGrid.Visibility = Visibility.Collapsed;
if (QuickSongCountText != null) QuickSongCountText.Visibility = Visibility.Collapsed;
// Restore the main singer/song grid area visibility when leaving quick search
if (SingerSongContentGrid != null)
SingerSongContentGrid.Visibility = Visibility.Visible;
}
}
// Toggle visibility of singer mode panels (SingerGrid/SongListGrid)
private void ShowSingerPanels(bool show)
{
var vis = show ? Visibility.Visible : Visibility.Collapsed;
if (SingerGrid != null) SingerGrid.Visibility = vis;
if (VisualSingerGrid != null) VisualSingerGrid.Visibility = vis;
if (SongListGrid != null) SongListGrid.Visibility = vis;
if (LanguageSongListGrid != null) LanguageSongListGrid.Visibility = Visibility.Collapsed;
_isLanguageMode = false;
if (show)
{
ShowSingerGrid(); // Ensure correct internal visibility
// Set focus to the active grid for keyboard/mouse wheel support
if (IsVisualSingerStyleEffective && VisualSingerGrid != null) VisualSingerGrid.Focus();
else if (SingerGrid != null) SingerGrid.Focus();
if (YoutubeThumbnailGrid != null) YoutubeThumbnailGrid.Visibility = Visibility.Collapsed;
if (SingerSongContentGrid != null) SingerSongContentGrid.Visibility = Visibility.Visible;
}
}
/// <summary>
/// Shows the singer grid and hides the song list
/// </summary>
private void ShowSingerGrid()
{
if (IsVisualSingerStyleEffective)
{
if (VisualSingerGrid != null) VisualSingerGrid.Visibility = Visibility.Visible;
if (SingerGrid != null) SingerGrid.Visibility = Visibility.Collapsed;
}
else
{
if (VisualSingerGrid != null) VisualSingerGrid.Visibility = Visibility.Collapsed;
if (SingerGrid != null) SingerGrid.Visibility = Visibility.Visible;
}
if (SongListGrid != null) SongListGrid.Visibility = Visibility.Collapsed;
}
#region Main View Navigation Button Handlers
private void FuncBtnBySinger_Click(object sender, RoutedEventArgs e)
{
AppLogger.Log("User action: Navigate to Singer view");
SingerPhotoManager.CurrentSubFolder = "SingerAvatar";
ShowSingerPanels(true);
ShowQuickInputPanels(false);
SetupFilterButtons(MainFilterMode.Singer);
// Trigger the first filter button by default
if (_filterButtons.Any() && _filterButtons[0].IsVisible) MaleSingerFilter_Click(null!, null!);
}
private void FuncBtnByInput_Click(object sender, RoutedEventArgs e)
{
AppLogger.Log("User action: Navigate to Quick Input view");
// Enter quick input search mode
ShowQuickInputPanels(true);
ShowSingerPanels(false);
// On first entry, initialize to the default state.
// On subsequent entries, the previous state is already preserved.
if (!_isQuickSearchInitialized)
{
SetQuickMethod(QuickMethod.Bopomofo, BopomofoListBtn!);
}
// Refresh the UI state immediately (grid visibilities etc)
UpdateSearchWords(false);
}
private void FuncBtnByNum_Click(object sender, RoutedEventArgs e)
{
// Set mode and radio state BEFORE showing panels to ensure ShowQuickInputPanels logic is correct
if (SongRadio != null) SongRadio.IsChecked = true;
_searchMode = SearchMode.Song;
AppLogger.Log("User action: Navigate to Song ID view");
// Show the quick input panels and hide the singer grid.
ShowQuickInputPanels(true);
ShowSingerPanels(false);
// Set the quick search method specifically to SongId.
SetQuickMethod(QuickMethod.SongId, SongIdListBtn!);
}
private void FuncBtnByFav_Click(object sender, RoutedEventArgs e)
{
AppLogger.Log("User action: Navigate to Favorites view");
SingerPhotoManager.CurrentSubFolder = "FavoriteUser";
ShowSingerPanels(false);
ShowQuickInputPanels(false);
if (LanguageSongListGrid != null) LanguageSongListGrid.Visibility = Visibility.Collapsed;
// Enable top buttons like singer mode
SetupFilterButtons(MainFilterMode.Singer);
LoadFavoriteUsers();
}
private void FuncBtnByNew_Click(object sender, RoutedEventArgs e)
{
AppLogger.Log("User action: Navigate to New Songs view");
ShowSingerPanels(false);
ShowQuickInputPanels(false);
if (LanguageSongListGrid != null) LanguageSongListGrid.Visibility = Visibility.Collapsed;
SetupFilterButtons(MainFilterMode.NewSong);
// Trigger the first filter button by default
if (_filterButtons.Any() && _filterButtons[0].IsVisible) NewSongFilter_Click(sender, new RoutedEventArgs());
}
private void FuncBtnByRank_Click(object sender, RoutedEventArgs e)
{
AppLogger.Log("User action: Navigate to Ranking view");
ShowSingerPanels(false);
ShowQuickInputPanels(false);
if (LanguageSongListGrid != null) LanguageSongListGrid.Visibility = Visibility.Collapsed;
SetupFilterButtons(MainFilterMode.Ranking);
// Trigger the first filter button by default
if (_filterButtons.Any() && _filterButtons[0].IsVisible) RankingFilter_Click(sender, new RoutedEventArgs());
}
#endregion
/// <summary>
/// Configures the top 7 filter buttons based on the selected mode.
/// </summary>
private void SetupFilterButtons(MainFilterMode mode)
{
// Clear existing handlers and hide all buttons first
foreach (var btn in _filterButtons)
{
// A simple way to remove previous anonymous handlers is to nullify the event.
// This is safe as long as we are the only ones adding/removing handlers this way.
btn.Click -= MaleSingerFilter_Click;
btn.Click -= FemaleSingerFilter_Click;
btn.Click -= GroupSingerFilter_Click;
btn.Click -= ForeignMaleSingerFilter_Click;
btn.Click -= ForeignFemaleSingerFilter_Click;
btn.Click -= ForeignGroupSingerFilter_Click;
btn.Click -= OtherSingerFilter_Click;
btn.Click -= NewSongFilter_Click;
btn.Click -= RankingFilter_Click;
btn.Click -= GenerationFilter_Click;
btn.Click -= LanguageFilter_Click;
btn.Visibility = Visibility.Collapsed;
// Reset button appearance (clear any active highlight if we use it later)
btn.FontWeight = FontWeights.Normal;
btn.ClearValue(Button.BackgroundProperty);
btn.ClearValue(Button.ForegroundProperty);
btn.ClearValue(Button.BorderBrushProperty);
}
// Hide extra Language filter rows by default
if (LanguageSecondFilterGrid != null) LanguageSecondFilterGrid.Visibility = Visibility.Collapsed;
if (LanguageWordCountFilterGrid != null) LanguageWordCountFilterGrid.Visibility = Visibility.Collapsed;
switch (mode)
{
case MainFilterMode.Singer:
var singerFilters = new[] { "男歌手", "女歌手", "團體", "外國男", "外國女", "外國團", "其他" };
var singerActions = new RoutedEventHandler[] { MaleSingerFilter_Click, FemaleSingerFilter_Click, GroupSingerFilter_Click, ForeignMaleSingerFilter_Click, ForeignFemaleSingerFilter_Click, ForeignGroupSingerFilter_Click, OtherSingerFilter_Click };
for (int i = 0; i < singerFilters.Length; i++)
{
_filterButtons[i].Content = singerFilters[i];
_filterButtons[i].Click += singerActions[i];
_filterButtons[i].Visibility = Visibility.Visible;
}
break;
case MainFilterMode.NewSong:
var newSongLangs = new[] { "國語", "台語", "英語", "日語", "其它" };
for (int i = 0; i < newSongLangs.Length; i++)
{
_filterButtons[i].Content = newSongLangs[i];
_filterButtons[i].Tag = newSongLangs[i];
_filterButtons[i].Click += NewSongFilter_Click;
_filterButtons[i].Visibility = Visibility.Visible;
}
break;
case MainFilterMode.Ranking:
SetupRankingButtons();
break;
case MainFilterMode.Language:
// Show extra filter rows in Language mode
if (LanguageSecondFilterGrid != null) LanguageSecondFilterGrid.Visibility = Visibility.Visible;
if (LanguageWordCountFilterGrid != null) LanguageWordCountFilterGrid.Visibility = Visibility.Visible;
var langList = new[] { "國語", "台語", "英語", "日語", "粵語", "兒歌", "其他" };
for (int i = 0; i < langList.Length && i < _filterButtons.Count; i++)
{
_filterButtons[i].Content = langList[i];
_filterButtons[i].Tag = langList[i];
_filterButtons[i].Click += LanguageFilter_Click;
_filterButtons[i].Visibility = Visibility.Visible;
}
break;
}
}
/// <summary>
/// Sets up the filter buttons for the Ranking view.
/// </summary>
private void SetupRankingButtons()
{
var rankingFilters = new[] { "國語-單曲", "台語-單曲", "國語-合唱", "台語-合唱", "其它" };
int buttonIndex = 0;
// Add Ranking filters
for (int i = 0; i < rankingFilters.Length; i++)
{
if (buttonIndex >= _filterButtons.Count) break;
_filterButtons[buttonIndex].Content = rankingFilters[i];
_filterButtons[buttonIndex].Tag = rankingFilters[i];
_filterButtons[buttonIndex].Click += RankingFilter_Click;
_filterButtons[buttonIndex].Visibility = Visibility.Visible;
buttonIndex++;
}
}
}
}