diff --git a/AIDevGallery/Controls/ModelPicker/ModelOrApiPicker.xaml b/AIDevGallery/Controls/ModelPicker/ModelOrApiPicker.xaml
index 2f601e71..6b6fdcf8 100644
--- a/AIDevGallery/Controls/ModelPicker/ModelOrApiPicker.xaml
+++ b/AIDevGallery/Controls/ModelPicker/ModelOrApiPicker.xaml
@@ -195,7 +195,7 @@
Style="{StaticResource AccentButtonStyle}">
-
+
diff --git a/AIDevGallery/Controls/ModelPicker/ModelPickerViews/OnnxPickerView.xaml b/AIDevGallery/Controls/ModelPicker/ModelPickerViews/OnnxPickerView.xaml
index 837cefe0..a201b1fc 100644
--- a/AIDevGallery/Controls/ModelPicker/ModelPickerViews/OnnxPickerView.xaml
+++ b/AIDevGallery/Controls/ModelPicker/ModelPickerViews/OnnxPickerView.xaml
@@ -224,82 +224,93 @@
-
-
+ ItemsSource="{x:Bind DownloadableModels, Mode=OneWay}"
+ SelectionChanged="DownloadableModelSelectionItemsView_SelectionChanged"
+ SelectionMode="Single">
+
-
-
+
+
-
-
- 0,0,14,0
- 286
- 18
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
+
+
-
-
-
-
+
+
-
-
-
-
-
-
-
+
+
+
+
+
-
-
-
-
+
+
+
+
-
-
+
+
DownloadableModelSelectionItemsView.DeselectAll());
+ }
+ }
+
+ private void DownloadableModelSelectionItemsView_SelectionChanged(ItemsView sender, ItemsViewSelectionChangedEventArgs args)
+ {
+ if (sender.SelectedItem is DownloadableModel model)
+ {
+ OnSelectedModelChanged(this, model.GetModelDetails());
+ DispatcherQueue.TryEnqueue(() => ModelSelectionItemsView.DeselectAll());
}
}
@@ -159,6 +174,16 @@ public override void SelectModel(ModelDetails? modelDetails)
{
DispatcherQueue.TryEnqueue(() => ModelSelectionItemsView.DeselectAll());
}
+
+ var downloadableModel = DownloadableModels.FirstOrDefault(m => m.ModelDetails.Id == modelDetails.Id);
+ if (downloadableModel != null)
+ {
+ DispatcherQueue.TryEnqueue(() => DownloadableModelSelectionItemsView.Select(DownloadableModels.IndexOf(downloadableModel)));
+ }
+ else
+ {
+ DispatcherQueue.TryEnqueue(() => DownloadableModelSelectionItemsView.DeselectAll());
+ }
}
else
{
diff --git a/AIDevGallery/Controls/SampleContainer.xaml b/AIDevGallery/Controls/SampleContainer.xaml
index 6883666f..c2879485 100644
--- a/AIDevGallery/Controls/SampleContainer.xaml
+++ b/AIDevGallery/Controls/SampleContainer.xaml
@@ -55,7 +55,7 @@
IsClosable="False"
IsIconVisible="False"
IsOpen="True"
- Message="To enable this sample, download the required models."
+ Message="To enable this sample, use the modelpicker to download the required models."
Severity="Informational"
Visibility="Collapsed" />
? models, Wi
this.Visibility = Visibility.Visible;
if (!LoadSampleMetadata(sample, models, winMlSampleOptions))
{
+ VisualStateManager.GoToState(this, "SampleLoaded", true);
return;
}
@@ -439,6 +440,11 @@ private void UserControl_ActualThemeChanged(FrameworkElement sender, object args
RenderCode();
}
+ public void SetNoModelStatus()
+ {
+ VisualStateManager.GoToState(this, "Disabled", true);
+ }
+
public void ShowCode()
{
RenderCodeTabs();
diff --git a/AIDevGallery/Helpers/SamplesHelper.cs b/AIDevGallery/Helpers/SamplesHelper.cs
index 41373856..b164e1a1 100644
--- a/AIDevGallery/Helpers/SamplesHelper.cs
+++ b/AIDevGallery/Helpers/SamplesHelper.cs
@@ -345,10 +345,12 @@ string GetValueOrNull(string? value, string ifNull)
var realCachedModel = App.ModelCache.GetCachedModel(selectedModelDetails.Url);
if (realCachedModel == null)
{
- return null;
+ cachedModel = new(selectedModelDetails.Id, "Need Download", selectedModelDetails.Url, selectedModelDetails.Size, selectedModelDetails.HardwareAccelerators.FirstOrDefault(), winMlSampleOptions);
+ }
+ else
+ {
+ cachedModel = new(selectedModelDetails.Id, realCachedModel.Path, realCachedModel.Details.Url, realCachedModel.ModelSize, selectedModelDetails.HardwareAccelerators.FirstOrDefault(), winMlSampleOptions);
}
-
- cachedModel = new(selectedModelDetails.Id, realCachedModel.Path, realCachedModel.Details.Url, realCachedModel.ModelSize, selectedModelDetails.HardwareAccelerators.FirstOrDefault(), winMlSampleOptions);
}
var cachedSampleItem = App.FindSampleItemById(cachedModel.Id);
@@ -374,10 +376,12 @@ string GetValueOrNull(string? value, string ifNull)
var realCachedModel = App.ModelCache.GetCachedModel(selectedModelDetails2.Url);
if (realCachedModel == null)
{
- return null;
+ cachedModel = new(selectedModelDetails2.Id, "Need Download", selectedModelDetails2.Url, selectedModelDetails2.Size, selectedModelDetails2.HardwareAccelerators.FirstOrDefault(), winMlSampleOptions);
+ }
+ else
+ {
+ cachedModel = new(selectedModelDetails2.Id, realCachedModel.Path, realCachedModel.Url, realCachedModel.ModelSize, selectedModelDetails2.HardwareAccelerators.FirstOrDefault(), winMlSampleOptions);
}
-
- cachedModel = new(selectedModelDetails2.Id, realCachedModel.Path, realCachedModel.Url, realCachedModel.ModelSize, selectedModelDetails2.HardwareAccelerators.FirstOrDefault(), winMlSampleOptions);
}
var model2Type = sample.Model2Types.Any(cachedSampleItem.Contains)
diff --git a/AIDevGallery/Pages/Scenarios/ScenarioPage.xaml b/AIDevGallery/Pages/Scenarios/ScenarioPage.xaml
index 6f604816..d20f5d8e 100644
--- a/AIDevGallery/Pages/Scenarios/ScenarioPage.xaml
+++ b/AIDevGallery/Pages/Scenarios/ScenarioPage.xaml
@@ -47,7 +47,40 @@
To="0"
Duration="0:0:0.1" />
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -156,8 +189,6 @@
-
selectedModel
}
else
{
+ var selectedModel = selectedModels.FirstOrDefault(m => m != null);
+ if (selectedModel != null && !App.ModelCache.IsModelCached(selectedModel.Url))
+ {
+ SampleContainer.SetNoModelStatus();
+ }
+
SampleContainer.ShowFooter = false;
LoadSample(viableSamples[0]);
+
+ if (selectedModel != null && !App.ModelCache.IsModelCached(selectedModel.Url))
+ {
+ CodeToggle.IsChecked = true;
+ HandleCodePane();
+ }
}
}
diff --git a/AIDevGallery/ProjectGenerator/Generator.cs b/AIDevGallery/ProjectGenerator/Generator.cs
index 926becac..e1a02b15 100644
--- a/AIDevGallery/ProjectGenerator/Generator.cs
+++ b/AIDevGallery/ProjectGenerator/Generator.cs
@@ -72,8 +72,14 @@ internal async Task GenerateAsync(Sample sample, Dictionary())
- .Where(models.ContainsKey);
+ if (models == null)
+ {
+ throw new ArgumentNullException(nameof(models), "Models dictionary cannot be null.");
+ }
+
+ var modelTypes = sample.Model1Types
+ .Concat(sample.Model2Types ?? Enumerable.Empty())
+ .Where(models.ContainsKey);
if (copyModelLocally)
{
@@ -380,29 +386,44 @@ internal static async Task AskGenerateAndOpenAsync(Sample sample, IEnumerable cm.Value.ModelSize);
- if (totalSize != 0)
+ var radioButtons = new RadioButtons();
+ var cacheModel = cachedModels.FirstOrDefault();
+
+ if (cacheModel.Value.Path != "Need Download")
{
- var radioButtons = new RadioButtons();
radioButtons.Items.Add(new RadioButton
{
Content = "Reference model from model cache",
IsChecked = true
});
+ }
+ else
+ {
+ radioButtons.Items.Add(new RadioButton
+ {
+ Content = "Reference model from cache. (The sample will not run because the model has not been downloaded)",
+ IsChecked = true
+ });
+ }
- copyRadioButton = new RadioButton
+ if (cacheModel.Value.Path != "Need Download")
+ {
+ var totalSize = cachedModels.Sum(cm => cm.Value.ModelSize);
+ if (totalSize != 0)
{
- Content = new TextBlock()
+ copyRadioButton = new RadioButton
{
- Text = $"Copy model({AppUtils.FileSizeToString(totalSize)}) to project directory"
- }
- };
-
- radioButtons.Items.Add(copyRadioButton);
-
- contentStackPanel.Children.Add(radioButtons);
+ Content = new TextBlock()
+ {
+ Text = $"Copy model({AppUtils.FileSizeToString(totalSize)}) to project directory"
+ }
+ };
+ radioButtons.Items.Add(copyRadioButton);
+ }
}
+ contentStackPanel.Children.Add(radioButtons);
+
ContentDialog exportDialog = new ContentDialog()
{
Title = "Export Visual Studio project",
diff --git a/AIDevGallery/ViewModels/DownloadableModel.cs b/AIDevGallery/ViewModels/DownloadableModel.cs
index 316485ca..d77f3fcc 100644
--- a/AIDevGallery/ViewModels/DownloadableModel.cs
+++ b/AIDevGallery/ViewModels/DownloadableModel.cs
@@ -77,6 +77,11 @@ public DownloadableModel(ModelDownload download)
{
}
+ public ModelDetails GetModelDetails()
+ {
+ return ModelDetails;
+ }
+
public void StartDownload()
{
ModelDownload ??= App.ModelDownloadQueue.AddModel(ModelDetails);