Skip to content

Commit a3ac17c

Browse files
committed
Improve Pin Multiple
1 parent a8f585b commit a3ac17c

File tree

9 files changed

+129
-68
lines changed

9 files changed

+129
-68
lines changed

StringConv/I18n/GuiStrings.Designer.cs

Lines changed: 28 additions & 19 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

StringConv/I18n/GuiStrings.resx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,11 +133,11 @@
133133
<data name="DataEncoding" xml:space="preserve">
134134
<value>Data Encoding</value>
135135
</data>
136-
<data name="Delete" xml:space="preserve">
137-
<value>Delete</value>
136+
<data name="Pin" xml:space="preserve">
137+
<value>Pin</value>
138138
</data>
139-
<data name="Fix" xml:space="preserve">
140-
<value>Fix</value>
139+
<data name="PinSelected" xml:space="preserve">
140+
<value>Pin Selected</value>
141141
</data>
142142
<data name="Hash" xml:space="preserve">
143143
<value>Hash</value>
@@ -157,6 +157,9 @@
157157
<data name="Python3ByteString" xml:space="preserve">
158158
<value>Python3 Byte String</value>
159159
</data>
160+
<data name="Remove" xml:space="preserve">
161+
<value>Remove</value>
162+
</data>
160163
<data name="SourceURL" xml:space="preserve">
161164
<value>Source Url</value>
162165
</data>

StringConv/I18n/GuiStrings.zh-Hans.resx

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@
133133
<value>字符编码</value>
134134
</data>
135135
<data name="Clear" xml:space="preserve">
136-
<value>清除</value>
136+
<value>清空</value>
137137
</data>
138138
<data name="CodeSnippets" xml:space="preserve">
139139
<value>代码片段</value>
@@ -153,12 +153,12 @@
153153
<data name="DataEncoding" xml:space="preserve">
154154
<value>数据编码</value>
155155
</data>
156-
<data name="Delete" xml:space="preserve">
157-
<value>删除</value>
158-
</data>
159-
<data name="Fix" xml:space="preserve">
156+
<data name="Pin" xml:space="preserve">
160157
<value>固定</value>
161158
</data>
159+
<data name="PinSelected" xml:space="preserve">
160+
<value>固定所选</value>
161+
</data>
162162
<data name="Hash" xml:space="preserve">
163163
<value>哈希</value>
164164
</data>
@@ -177,6 +177,9 @@
177177
<data name="Python3ByteString" xml:space="preserve">
178178
<value>Python3 字节数组</value>
179179
</data>
180+
<data name="Remove" xml:space="preserve">
181+
<value>移除</value>
182+
</data>
180183
<data name="SourceURL" xml:space="preserve">
181184
<value>开源网址</value>
182185
</data>

StringConv/I18n/MsgStrings.Designer.cs

Lines changed: 13 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

StringConv/I18n/MsgStrings.resx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,12 +103,15 @@
103103
<data name="ConverterCleared" xml:space="preserve">
104104
<value>All converters cleared.</value>
105105
</data>
106-
<data name="ConverterFixed" xml:space="preserve">
107-
<value>Converter fixed: {0}</value>
106+
<data name="ConverterPinned" xml:space="preserve">
107+
<value>Converter pinned: {0}</value>
108108
</data>
109109
<data name="ConverterRemoved" xml:space="preserve">
110110
<value>Converter removed: {0}</value>
111111
</data>
112+
<data name="ConvertersPinned" xml:space="preserve">
113+
<value>{0} converters pinned: {1}</value>
114+
</data>
112115
<data name="CopyError" xml:space="preserve">
113116
<value>Copy error: {0}</value>
114117
</data>

StringConv/I18n/MsgStrings.zh-Hans.resx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,12 +123,15 @@
123123
<data name="ConverterCleared" xml:space="preserve">
124124
<value>已清空所有转换器。</value>
125125
</data>
126-
<data name="ConverterFixed" xml:space="preserve">
126+
<data name="ConverterPinned" xml:space="preserve">
127127
<value>已固定转换器:{0}</value>
128128
</data>
129129
<data name="ConverterRemoved" xml:space="preserve">
130130
<value>已删除转换器:{0}</value>
131131
</data>
132+
<data name="ConvertersPinned" xml:space="preserve">
133+
<value>已固定{0}个转换器:{1}</value>
134+
</data>
132135
<data name="CopyError" xml:space="preserve">
133136
<value>复制错误:{0}</value>
134137
</data>

StringConv/Models/Settings/AppSettings.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ namespace StringConv.Models.Settings;
44

55
internal sealed class AppSettings
66
{
7-
public List<int> FixedConverterIndices { get; set; } = [];
7+
public List<int> PinnedConverterIndices { get; set; } = [];
88
}

StringConv/ViewModels/MainViewModel.cs

Lines changed: 51 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,13 @@ internal partial class MainViewModel : ViewModelBase
3131
[ObservableProperty]
3232
private List<StringConverter> converters = StringConverterProvider.Converters;
3333
[ObservableProperty]
34-
[NotifyCanExecuteChangedFor(nameof(AddCommand))]
34+
[NotifyCanExecuteChangedFor(nameof(PinCommand))]
3535
private StringConverter selectedConverter;
3636
[ObservableProperty]
37-
private ObservableCollection<ConverterViewModel> converterViewModels = [];
37+
[NotifyCanExecuteChangedFor(nameof(PinMultipleCommand))]
38+
private ObservableCollection<object> selectedConverters = [];
39+
[ObservableProperty]
40+
private ObservableCollection<ConverterViewModel> pinnedConverterViewModels = [];
3841
[ObservableProperty]
3942
private ObservableCollection<ConverterCategoryViewModel> converterCategories = [];
4043

@@ -47,16 +50,16 @@ public MainViewModel(IShowDialogService showDialogService, ISettingsService sett
4750
_settingsService = settingsService;
4851
WeakReferenceMessenger.Default.Register<StatusMessage>(this, (_, m) => Message = m);
4952

50-
ConfigureFixedConverters();
53+
ConfigurePinnedConverters();
5154
ConfigureCategories();
5255
}
5356

5457
public MainViewModel() : this(null, null) { }
5558

56-
private void ConfigureFixedConverters()
59+
private void ConfigurePinnedConverters()
5760
{
58-
ConverterViewModels.Clear();
59-
foreach (int index in _settingsService.Settings.FixedConverterIndices)
61+
PinnedConverterViewModels.Clear();
62+
foreach (int index in _settingsService.Settings.PinnedConverterIndices)
6063
{
6164
if (index >= 0 && index < Converters.Count)
6265
{
@@ -65,7 +68,7 @@ private void ConfigureFixedConverters()
6568
{
6669
ConverterViewModel cvm = new(converter);
6770
cvm.TextChanged += OnConverterTextChanged;
68-
ConverterViewModels.Add(cvm);
71+
PinnedConverterViewModels.Add(cvm);
6972
}
7073
}
7174
}
@@ -104,7 +107,7 @@ private void OnConverterTextChanged(object sender, byte[] data)
104107
if (data == null)
105108
return;
106109
InputData = data;
107-
foreach (ConverterViewModel cvm in ConverterViewModels)
110+
foreach (ConverterViewModel cvm in PinnedConverterViewModels)
108111
{
109112
if (cvm != sender)
110113
{
@@ -158,39 +161,62 @@ private void UpdateCopyText()
158161
}
159162
}
160163

161-
[RelayCommand(CanExecute = nameof(CanAdd))]
162-
private void Add()
164+
[RelayCommand(CanExecute = nameof(CanPin))]
165+
private void Pin()
163166
{
164167
int index = Converters.IndexOf(SelectedConverter);
165-
if (index >= 0 && !_settingsService.Settings.FixedConverterIndices.Contains(index))
168+
if (index >= 0 && SelectedConverter.CanConvert && !_settingsService.Settings.PinnedConverterIndices.Contains(index))
166169
{
167-
_settingsService.Settings.FixedConverterIndices.Add(index);
170+
_settingsService.Settings.PinnedConverterIndices.Add(index);
168171
ConverterViewModel cvm = new(SelectedConverter);
169172
cvm.TextChanged += OnConverterTextChanged;
170-
ConverterViewModels.Add(cvm);
171-
WeakReferenceMessenger.Default.Send(new StatusMessage(string.Format(MsgStrings.ConverterFixed, SelectedConverter.Name)));
173+
PinnedConverterViewModels.Add(cvm);
174+
WeakReferenceMessenger.Default.Send(new StatusMessage(string.Format(MsgStrings.ConverterPinned, SelectedConverter.Name)));
172175
cvm.UpdateToString(InputData);
173176
}
174177
}
175178

179+
[RelayCommand(CanExecute = nameof(CanPinMultiple))]
180+
private void PinMultiple()
181+
{
182+
List<string> pinnedNames = [];
183+
foreach (StringConverter converter in SelectedConverters.OfType<StringConverter>())
184+
{
185+
int index = Converters.IndexOf(converter);
186+
if (index >= 0 && converter.CanConvert && !_settingsService.Settings.PinnedConverterIndices.Contains(index))
187+
{
188+
_settingsService.Settings.PinnedConverterIndices.Add(index);
189+
ConverterViewModel cvm = new(converter);
190+
cvm.TextChanged += OnConverterTextChanged;
191+
PinnedConverterViewModels.Add(cvm);
192+
pinnedNames.Add(converter.Name);
193+
cvm.UpdateToString(InputData);
194+
}
195+
}
196+
if (pinnedNames.Count > 0)
197+
{
198+
WeakReferenceMessenger.Default.Send(new StatusMessage(string.Format(MsgStrings.ConvertersPinned, pinnedNames.Count, string.Join(", ", pinnedNames))));
199+
}
200+
}
201+
176202
[RelayCommand]
177-
private void Delete(ConverterViewModel cvm)
203+
private void Remove(ConverterViewModel cvm)
178204
{
179205
int index = Converters.IndexOf(cvm.Converter);
180-
if (index >= 0 && _settingsService.Settings.FixedConverterIndices.Contains(index))
206+
if (index >= 0 && _settingsService.Settings.PinnedConverterIndices.Contains(index))
181207
{
182-
_settingsService.Settings.FixedConverterIndices.Remove(index);
208+
_settingsService.Settings.PinnedConverterIndices.Remove(index);
183209
cvm.TextChanged -= OnConverterTextChanged;
184-
ConverterViewModels.Remove(cvm);
210+
PinnedConverterViewModels.Remove(cvm);
185211
WeakReferenceMessenger.Default.Send(new StatusMessage(string.Format(MsgStrings.ConverterRemoved, cvm.Converter.Name)));
186212
}
187213
}
188214

189215
[RelayCommand]
190216
private void Clear()
191217
{
192-
ConverterViewModels.Clear();
193-
_settingsService.Settings.FixedConverterIndices.Clear();
218+
PinnedConverterViewModels.Clear();
219+
_settingsService.Settings.PinnedConverterIndices.Clear();
194220
WeakReferenceMessenger.Default.Send(new StatusMessage(string.Format(MsgStrings.ConverterCleared)));
195221
}
196222

@@ -221,8 +247,11 @@ private async Task ShowAboutAsync(Window window)
221247
[MethodImpl(MethodImplOptions.AggressiveInlining)]
222248
private static char GetHexChar(int value) => (char)(value < 10 ? '0' + value : 'A' + value - 10);
223249

224-
private bool CanAdd => SelectedConverter?.CanConvert == true &&
225-
!_settingsService.Settings.FixedConverterIndices.Contains(Converters.IndexOf(SelectedConverter));
250+
private bool CanPin => SelectedConverter?.CanConvert == true &&
251+
!_settingsService.Settings.PinnedConverterIndices.Contains(Converters.IndexOf(SelectedConverter));
252+
253+
private bool CanPinMultiple => SelectedConverters.OfType<StringConverter>()?.Any(c => c.CanConvert &&
254+
!_settingsService.Settings.PinnedConverterIndices.Contains(Converters.IndexOf(c))) == true;
226255

227256
partial void OnSelectedConverterChanged(StringConverter value)
228257
{

0 commit comments

Comments
 (0)