@@ -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