1616using System . Linq ;
1717using System . Threading . Tasks ;
1818using Windows . ApplicationModel . DataTransfer ;
19- using Windows . Storage . Pickers ;
2019
2120namespace AIDevGallery . Controls . ModelPickerViews ;
2221internal sealed partial class OnnxPickerView : BaseModelPickerView
2322{
24- private List < ModelDetails > Models { get ; set ; } = new ( ) ;
25- private List < ModelType > ? ModelTypes { get ; set ; }
23+ private List < ModelDetails > models = [ ] ;
24+ private List < ModelType > ? modelTypes ;
25+
2626 public ModelDetails ? Selected { get ; private set ; }
2727
2828 private ObservableCollection < AvailableModel > AvailableModels { get ; } = [ ] ;
@@ -38,48 +38,47 @@ public OnnxPickerView()
3838
3939 public override Task Load ( List < ModelType > types )
4040 {
41- ModelTypes = types ;
41+ modelTypes = types ;
42+
43+ ResetAndLoadModelList ( ) ;
4244
4345 if ( types . Contains ( ModelType . LanguageModels ) )
4446 {
4547 AddHFModelButton . Visibility = Visibility . Visible ;
4648 }
4749
4850 // local models supported for types
49- // TODO: check which models support it
50- if ( types . Contains ( ModelType . LanguageModels ) || true )
51+ if ( types . Contains ( ModelType . LanguageModels ) || models . IsModelsDetailsListUploadCompatible ( ) )
5152 {
5253 AddLocalModelButton . Visibility = Visibility . Visible ;
5354 }
5455
55- ResetAndLoadModelList ( ) ;
56-
5756 return Task . CompletedTask ;
5857 }
5958
6059 private void ResetAndLoadModelList ( )
6160 {
62- Models . Clear ( ) ;
61+ models . Clear ( ) ;
6362 AvailableModels . Clear ( ) ;
6463 DownloadableModels . Clear ( ) ;
6564 UnavailableModels . Clear ( ) ;
6665
67- if ( ModelTypes == null || ModelTypes . Count == 0 )
66+ if ( modelTypes == null || modelTypes . Count == 0 )
6867 {
6968 return ;
7069 }
7170
72- foreach ( ModelType type in ModelTypes )
71+ foreach ( ModelType type in modelTypes )
7372 {
74- Models . AddRange ( ModelDetailsHelper . GetModelDetailsForModelType ( type ) ) ;
73+ models . AddRange ( ModelDetailsHelper . GetModelDetailsForModelType ( type ) ) ;
7574 }
7675
77- if ( Models == null || Models . Count == 0 )
76+ if ( models == null || models . Count == 0 )
7877 {
7978 return ;
8079 }
8180
82- foreach ( var model in Models )
81+ foreach ( var model in models )
8382 {
8483 if ( ! model . IsOnnxModel ( ) )
8584 {
@@ -155,7 +154,7 @@ private void ResetAndLoadModelList()
155154
156155 private void CacheStore_ModelsChanged ( ModelCacheStore sender )
157156 {
158- ResetAndLoadModelList ( ) ;
157+ DispatcherQueue . TryEnqueue ( ResetAndLoadModelList ) ;
159158 }
160159
161160 private void ModelSelectionView_SelectionChanged ( object sender , SelectionChangedEventArgs e )
@@ -269,6 +268,7 @@ private async void DeleteModel_Click(object sender, RoutedEventArgs e)
269268 if ( result == ContentDialogResult . Primary )
270269 {
271270 await App . ModelCache . DeleteModelFromCache ( details . Url ) ;
271+ ResetAndLoadModelList ( ) ;
272272 }
273273 }
274274 }
@@ -375,129 +375,20 @@ private void AddHFModelView_CloseRequested(object sender)
375375
376376 private async void AddLocalModelButton_Click ( object sender , RoutedEventArgs e )
377377 {
378- var hwnd = WinRT . Interop . WindowNative . GetWindowHandle ( App . MainWindow ) ;
379- var picker = new FolderPicker ( ) ;
380- picker . FileTypeFilter . Add ( "*" ) ;
381- WinRT . Interop . InitializeWithWindow . Initialize ( picker , hwnd ) ;
382- var folder = await picker . PickSingleFolderAsync ( ) ;
383-
384- if ( folder != null )
378+ if ( modelTypes == null )
385379 {
386- var files = Directory . GetFiles ( folder . Path ) ;
387- var config = files . Where ( r => Path . GetFileName ( r ) == "genai_config.json" ) . FirstOrDefault ( ) ;
388-
389- if ( string . IsNullOrEmpty ( config ) || App . ModelCache . Models . Any ( m => m . Path == folder . Path ) )
390- {
391- var message = string . IsNullOrEmpty ( config ) ?
392- "The folder does not contain a model you can add. Ensure \" genai_config.json\" is present in the selected directory" :
393- "This model is already added" ;
394-
395- ContentDialog confirmFolderDialog = new ( )
396- {
397- Title = "Can't add model" ,
398- Content = message ,
399- XamlRoot = this . Content . XamlRoot ,
400- CloseButtonText = "OK"
401- } ;
402-
403- await confirmFolderDialog . ShowAsync ( ) ;
404- return ;
405- }
406-
407- HardwareAccelerator accelerator = HardwareAccelerator . CPU ;
408-
409- try
410- {
411- string configContents = string . Empty ;
412- configContents = await File . ReadAllTextAsync ( config ) ;
413- accelerator = UserAddedModelUtilsTemp . GetHardwareAcceleratorFromConfig ( configContents ) ;
414- }
415- catch ( Exception ex )
416- {
417- ContentDialog confirmFolderDialog = new ( )
418- {
419- Title = "Can't read genai_config.json" ,
420- Content = ex . Message ,
421- XamlRoot = this . Content . XamlRoot ,
422- CloseButtonText = "OK"
423- } ;
424-
425- await confirmFolderDialog . ShowAsync ( ) ;
426- return ;
427- }
428-
429- var nameTextBox = new TextBox ( )
430- {
431- Text = Path . GetFileName ( folder . Path ) ,
432- Width = 300 ,
433- HorizontalAlignment = HorizontalAlignment . Left ,
434- Margin = new Thickness ( 0 , 0 , 0 , 10 ) ,
435- Header = "Model name"
436- } ;
437-
438- ContentDialog nameModelDialog = new ( )
439- {
440- Title = "Add model" ,
441- Content = new StackPanel ( )
442- {
443- Orientation = Orientation . Vertical ,
444- Spacing = 8 ,
445- Children =
446- {
447- new TextBlock ( )
448- {
449- Text = $ "Adding ONNX model from \n \" { folder . Path } \" ",
450- TextWrapping = TextWrapping . WrapWholeWords
451- } ,
452- nameTextBox
453- }
454- } ,
455- XamlRoot = this . Content . XamlRoot ,
456- CloseButtonText = "Cancel" ,
457- PrimaryButtonText = "Add" ,
458- DefaultButton = ContentDialogButton . Primary ,
459- Style = Application . Current . Resources [ "DefaultContentDialogStyle" ] as Style
460- } ;
461-
462- string modelName = nameTextBox . Text ;
463-
464- nameTextBox . TextChanged += ( s , e ) =>
465- {
466- if ( string . IsNullOrEmpty ( nameTextBox . Text ) )
467- {
468- nameModelDialog . IsPrimaryButtonEnabled = false ;
469- }
470- else
471- {
472- modelName = nameTextBox . Text ;
473- nameModelDialog . IsPrimaryButtonEnabled = true ;
474- }
475- } ;
476-
477- var result = await nameModelDialog . ShowAsync ( ) ;
478- if ( result != ContentDialogResult . Primary )
479- {
480- return ;
481- }
482-
483- DirectoryInfo dirInfo = new DirectoryInfo ( folder . Path ) ;
484- long dirSize = await Task . Run ( ( ) => dirInfo . EnumerateFiles ( "*" , SearchOption . AllDirectories ) . Sum ( file => file . Length ) ) ;
485-
486- var details = new ModelDetails ( )
487- {
488- Id = "useradded-local-languagemodel-" + Guid . NewGuid ( ) . ToString ( ) ,
489- Name = modelName ,
490- Url = $ "local-file:///{ folder . Path } ",
491- Description = "Localy added GenAI Model" ,
492- HardwareAccelerators = [ accelerator ] ,
493- IsUserAdded = true ,
494- PromptTemplate = ModelDetailsHelper . GetTemplateFromName ( folder . Path ) ,
495- Size = dirSize ,
496- ReadmeUrl = null ,
497- License = "unknown"
498- } ;
380+ return ;
381+ }
499382
500- await App . ModelCache . AddLocalModelToCache ( details , folder . Path ) ;
383+ if ( modelTypes . Contains ( ModelType . LanguageModels ) )
384+ {
385+ await UserAddedModelUtil . OpenAddLanguageModelFlow ( Content . XamlRoot ) ;
386+ }
387+ else
388+ {
389+ await UserAddedModelUtil . OpenAddModelFlow ( Content . XamlRoot , modelTypes ) ;
501390 }
391+
392+ ResetAndLoadModelList ( ) ;
502393 }
503394}
0 commit comments