Skip to content

Commit 896a856

Browse files
committed
Changes Language selection UI
- Groups languages into two groups - Sort them by localized language name - Remove unneeded looping when no languages selected
1 parent 714ce45 commit 896a856

File tree

8 files changed

+215
-245
lines changed

8 files changed

+215
-245
lines changed

src/modules/poweraccent/PowerAccent.Core/Languages.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ public static string[] GetDefaultLetterKey(LetterKey letter, Language[] langs)
6161
return GetDefaultLetterKeyALL(letter);
6262
}
6363

64+
if (langs.Length == 0)
65+
{
66+
return Array.Empty<string>();
67+
}
68+
6469
var characters = new List<string>();
6570
foreach (var lang in langs)
6671
{

src/modules/poweraccent/PowerAccent.Core/Services/SettingsService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ private void ReadSettings()
6767
_keyboardListener.UpdateExcludedApps(ExcludedApps);
6868

6969
SelectedLang = settings.Properties.SelectedLang.Value
70-
.Split(',')
70+
.Split(',', StringSplitOptions.RemoveEmptyEntries)
7171
.Select(lang => Enum.TryParse(lang, out Language selectedLangValue) ? selectedLangValue : Language.SPECIAL)
7272
.ToArray();
7373

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// Copyright (c) Microsoft Corporation
2+
// The Microsoft Corporation licenses this file to you under the MIT license.
3+
// See the LICENSE file in the project root for more information.
4+
5+
using System.Collections.Generic;
6+
7+
namespace Microsoft.PowerToys.Settings.UI.Library
8+
{
9+
public class PowerAccentLanguageGroupModel : List<PowerAccentLanguageModel>
10+
{
11+
public PowerAccentLanguageGroupModel(List<PowerAccentLanguageModel> languages, string group)
12+
: base(languages)
13+
{
14+
this.Group = group;
15+
}
16+
17+
public string Group { get; init; }
18+
}
19+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// Copyright (c) Microsoft Corporation
2+
// The Microsoft Corporation licenses this file to you under the MIT license.
3+
// See the LICENSE file in the project root for more information.
4+
5+
namespace Microsoft.PowerToys.Settings.UI.Library
6+
{
7+
public record PowerAccentLanguageModel(string LanguageCode, string LanguageResourceID, string GroupResourceID)
8+
{
9+
public string Language { get; set; }
10+
}
11+
}

src/settings-ui/Settings.UI/SettingsXAML/Views/PowerAccentPage.xaml

Lines changed: 37 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,16 @@
77
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
88
xmlns:tkcontrols="using:CommunityToolkit.WinUI.Controls"
99
xmlns:ui="using:CommunityToolkit.WinUI"
10+
xmlns:Lib="using:Microsoft.PowerToys.Settings.UI.Library"
1011
AutomationProperties.LandmarkType="Main"
1112
mc:Ignorable="d">
12-
13+
<Page.Resources>
14+
<CollectionViewSource x:Name="LanguagesCustomViewSource" IsSourceGrouped="True" Source="{x:Bind ViewModel.LanguageGroups, Mode=OneWay}" />
15+
<DataTemplate x:Key="LanguageViewTemplate" x:DataType="Lib:PowerAccentLanguageModel">
16+
<TextBlock Text="{x:Bind Language}" />
17+
</DataTemplate>
18+
</Page.Resources>
19+
1320
<controls:SettingsPageControl
1421
x:Uid="QuickAccent"
1522
IsTabStop="False"
@@ -75,6 +82,9 @@
7582
ScrollViewer.VerticalScrollBarVisibility="Visible"
7683
ScrollViewer.VerticalScrollMode="Enabled"
7784
SelectionChanged="QuickAccent_SelectedLanguage_SelectionChanged"
85+
ItemsSource="{x:Bind LanguagesCustomViewSource.View, Mode=OneWay}"
86+
ItemTemplate="{StaticResource LanguageViewTemplate}"
87+
Loaded="QuickAccent_Language_Select_Loaded"
7888
SelectionMode="Multiple">
7989
<ListView.ItemsPanel>
8090
<ItemsPanelTemplate>
@@ -92,9 +102,22 @@
92102
<ListViewItemPresenter
93103
HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
94104
VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
105+
CheckBoxCornerRadius="{ThemeResource ControlCornerRadius}"
95106
CheckBoxBorderBrush="{ThemeResource CheckBoxBorderThemeBrush}"
96-
CheckBoxBrush="{ThemeResource CheckBoxBackgroundThemeBrush}"
97-
CheckBrush="{ThemeResource CheckBoxForegroundUnchecked}"
107+
CheckBoxPointerOverBorderBrush="{ThemeResource CheckBoxPointerOverBorderThemeBrush}"
108+
CheckBoxPressedBorderBrush="{ThemeResource CheckBoxPressedBorderThemeBrush}"
109+
CheckBoxDisabledBorderBrush="{ThemeResource CheckBoxDisabledBorderThemeBrush}"
110+
CheckBoxBrush="{ThemeResource CheckBoxCheckBackgroundFillUnchecked}"
111+
CheckBoxPointerOverBrush="{ThemeResource CheckBoxCheckBackgroundFillUncheckedPointerOver}"
112+
CheckBoxPressedBrush="{ThemeResource CheckBoxCheckBackgroundFillUncheckedPressed}"
113+
CheckBoxDisabledBrush="{ThemeResource CheckBoxCheckBackgroundFillUncheckedDisabled}"
114+
CheckBoxSelectedBrush="{ThemeResource CheckBoxCheckBackgroundFillChecked}"
115+
CheckBoxSelectedPointerOverBrush="{ThemeResource CheckBoxCheckBackgroundFillCheckedPointerOver}"
116+
CheckBoxSelectedPressedBrush="{ThemeResource CheckBoxCheckBackgroundFillCheckedPressed}"
117+
CheckBoxSelectedDisabledBrush="{ThemeResource CheckBoxCheckBackgroundFillCheckedDisabled}"
118+
CheckBrush="{ThemeResource CheckBoxCheckGlyphForegroundChecked}"
119+
CheckPressedBrush="{ThemeResource CheckBoxCheckGlyphForegroundUncheckedPressed}"
120+
CheckDisabledBrush="{ThemeResource CheckBoxCheckGlyphForegroundCheckedDisabled}"
98121
CheckMode="Inline"
99122
ContentMargin="{TemplateBinding Padding}"
100123
ContentTransitions="{TemplateBinding ContentTransitions}"
@@ -119,127 +142,17 @@
119142
</Setter>
120143
</Style>
121144
</ListView.ItemContainerStyle>
122-
<!-- These should be in the same order as the array items in PowerAccentViewModel.cs -->
123-
<ListViewItem>
124-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Special" />
125-
</ListViewItem>
126-
<ListViewItem>
127-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Bulgarian" />
128-
</ListViewItem>
129-
<ListViewItem>
130-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Catalan" />
131-
</ListViewItem>
132-
<ListViewItem>
133-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Crimean" />
134-
</ListViewItem>
135-
<ListViewItem>
136-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Currency" />
137-
</ListViewItem>
138-
<ListViewItem>
139-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Croatian" />
140-
</ListViewItem>
141-
<ListViewItem>
142-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Czech" />
143-
</ListViewItem>
144-
<ListViewItem>
145-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Danish" />
146-
</ListViewItem>
147-
<ListViewItem>
148-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Gaeilge" />
149-
</ListViewItem>
150-
<ListViewItem>
151-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Gaidhlig" />
152-
</ListViewItem>
153-
<ListViewItem>
154-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Dutch" />
155-
</ListViewItem>
156-
<ListViewItem>
157-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Greek" />
158-
</ListViewItem>
159-
<ListViewItem>
160-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Estonian" />
161-
</ListViewItem>
162-
<ListViewItem>
163-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Esperanto" />
164-
</ListViewItem>
165-
<ListViewItem>
166-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Finnish" />
167-
</ListViewItem>
168-
<ListViewItem>
169-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_French" />
170-
</ListViewItem>
171-
<ListViewItem>
172-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_German" />
173-
</ListViewItem>
174-
<ListViewItem>
175-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Hebrew" />
176-
</ListViewItem>
177-
<ListViewItem>
178-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Hungarian" />
179-
</ListViewItem>
180-
<ListViewItem>
181-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Icelandic" />
182-
</ListViewItem>
183-
<ListViewItem>
184-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_IPA" />
185-
</ListViewItem>
186-
<ListViewItem>
187-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Italian" />
188-
</ListViewItem>
189-
<ListViewItem>
190-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Kurdish" />
191-
</ListViewItem>
192-
<ListViewItem>
193-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Lithuanian" />
194-
</ListViewItem>
195-
<ListViewItem>
196-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Macedonian" />
197-
</ListViewItem>
198-
<ListViewItem>
199-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Maori" />
200-
</ListViewItem>
201-
<ListViewItem>
202-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Norwegian" />
203-
</ListViewItem>
204-
<ListViewItem>
205-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Pinyin" />
206-
</ListViewItem>
207-
<ListViewItem>
208-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Polish" />
209-
</ListViewItem>
210-
<ListViewItem>
211-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Portuguese" />
212-
</ListViewItem>
213-
<ListViewItem>
214-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Romanian" />
215-
</ListViewItem>
216-
<ListViewItem>
217-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Romanization" />
218-
</ListViewItem>
219-
<ListViewItem>
220-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Slovak" />
221-
</ListViewItem>
222-
<ListViewItem>
223-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Slovenian" />
224-
</ListViewItem>
225-
<ListViewItem>
226-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Spanish" />
227-
</ListViewItem>
228-
<ListViewItem>
229-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Serbian" />
230-
</ListViewItem>
231-
<ListViewItem>
232-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Serbian_Cyrillic" />
233-
</ListViewItem>
234-
<ListViewItem>
235-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Swedish" />
236-
</ListViewItem>
237-
<ListViewItem>
238-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Turkish" />
239-
</ListViewItem>
240-
<ListViewItem>
241-
<TextBlock x:Uid="QuickAccent_SelectedLanguage_Welsh" />
242-
</ListViewItem>
145+
<ListView.GroupStyle>
146+
<GroupStyle>
147+
<GroupStyle.HeaderTemplate>
148+
<DataTemplate x:DataType="Lib:PowerAccentLanguageGroupModel">
149+
<Border AutomationProperties.AccessibilityView="Raw">
150+
<TextBlock Text="{x:Bind Group}" Style="{ThemeResource SubtitleTextBlockStyle}" AutomationProperties.AccessibilityView="Raw"/>
151+
</Border>
152+
</DataTemplate>
153+
</GroupStyle.HeaderTemplate>
154+
</GroupStyle>
155+
</ListView.GroupStyle>
243156
</ListView>
244157
</tkcontrols:SettingsCard>
245158
</tkcontrols:SettingsExpander.Items>

src/settings-ui/Settings.UI/SettingsXAML/Views/PowerAccentPage.xaml.cs

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,25 +31,12 @@ public void RefreshEnabledState()
3131

3232
private void InitializeControlsStates()
3333
{
34-
SetListViewSelected();
3534
SetCheckBoxStatus();
3635
}
3736

38-
private void SetListViewSelected()
39-
{
40-
foreach (var languageIndex in ViewModel.SelectedLangIndexes)
41-
{
42-
var item = this.QuickAccent_Language_Select.Items.ElementAtOrDefault(languageIndex);
43-
if (item != null)
44-
{
45-
this.QuickAccent_Language_Select.SelectedItems.Add(item);
46-
}
47-
}
48-
}
49-
5037
private void SetCheckBoxStatus()
5138
{
52-
if (ViewModel.SelectedLangIndexes.Length == 0)
39+
if (ViewModel.SelectedLanguageOptions.Length == 0)
5340
{
5441
this.QuickAccent_SelectedLanguage_All.IsChecked = false;
5542
this.QuickAccent_SelectedLanguage_All.IsThreeState = false;
@@ -79,10 +66,20 @@ private void QuickAccent_SelectedLanguage_UnselectAll(object sender, RoutedEvent
7966
private void QuickAccent_SelectedLanguage_SelectionChanged(object sender, SelectionChangedEventArgs e)
8067
{
8168
var listView = sender as ListView;
82-
var indexes = listView.SelectedItems.Select(listView.Items.IndexOf).ToArray();
83-
ViewModel.SelectedLangIndexes = indexes;
69+
70+
ViewModel.SelectedLanguageOptions = listView.SelectedItems
71+
.Select(item => item as PowerAccentLanguageModel)
72+
.ToArray();
8473

8574
SetCheckBoxStatus();
8675
}
76+
77+
private void QuickAccent_Language_Select_Loaded(object sender, RoutedEventArgs e)
78+
{
79+
foreach (var languageOption in ViewModel.SelectedLanguageOptions)
80+
{
81+
this.QuickAccent_Language_Select.SelectedItems.Add(languageOption);
82+
}
83+
}
8784
}
8885
}

0 commit comments

Comments
 (0)