diff --git a/src/Uno.Templates/content/unoapp/.template.config/Assets/Features.MeadowSupport.svg b/src/Uno.Templates/content/unoapp/.template.config/Assets/Features.MeadowSupport.svg new file mode 100644 index 000000000..814e9d48d --- /dev/null +++ b/src/Uno.Templates/content/unoapp/.template.config/Assets/Features.MeadowSupport.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/Uno.Templates/content/unoapp/.template.config/TemplateWizard.json b/src/Uno.Templates/content/unoapp/.template.config/TemplateWizard.json index 30efedcdd..79c410edf 100644 --- a/src/Uno.Templates/content/unoapp/.template.config/TemplateWizard.json +++ b/src/Uno.Templates/content/unoapp/.template.config/TemplateWizard.json @@ -75,6 +75,7 @@ "logging": "none", "markup": "xaml", "mediaElement": "false", + "meadowSupport": "false", "navigation": "blank", "platforms": "android|ios|maccatalyst|wasm|windows|desktop", "rider": "true", @@ -113,6 +114,7 @@ "logging": "default", "markup": "xaml", "mediaElement": "false", + "meadowSupport": "false", "navigation": "regions", "platforms": "android|ios|maccatalyst|wasm|windows|desktop", "rider": "true", @@ -198,7 +200,7 @@ { "Title": "", "SectionType": "MultiSelect", - "SymbolIds": [ "toolkit", "mauiEmbedding", "server", "wasmMultiThreading", "wasmPwaManifest", "vscode", "enableDeveloperMode", "mediaElement" ] + "SymbolIds": [ "toolkit", "mauiEmbedding", "server", "wasmMultiThreading", "wasmPwaManifest", "vscode", "enableDeveloperMode", "mediaElement", "meadowSupport" ] } ], "Framework": [ @@ -561,6 +563,9 @@ "mediaElement": { "Icon": "/Assets/Features.MediaElement.svg" }, + "meadowSupport": { + "Icon": "/Assets/Features.MeadowSupport.svg" + }, "wasmPwaManifest": { "Icon": "/Assets/Features.Wasm.svg", "Requires": { @@ -648,7 +653,8 @@ "themeService", "continuousIntegration", "isCustomized", - "mediaElement" + "mediaElement", + "meadowSupport" ], "PackagesToUpdate": [ { diff --git a/src/Uno.Templates/content/unoapp/.template.config/dotnetcli.host.json b/src/Uno.Templates/content/unoapp/.template.config/dotnetcli.host.json index 5fd916978..b2d9d6e98 100644 --- a/src/Uno.Templates/content/unoapp/.template.config/dotnetcli.host.json +++ b/src/Uno.Templates/content/unoapp/.template.config/dotnetcli.host.json @@ -97,6 +97,10 @@ "longName": "media-element", "shortName": "media" }, + "meadowSupport": { + "longName": "meadow-support", + "shortName": "meadow" + }, "skipRestore": { "longName": "skip-restore", "shortName": "skip" diff --git a/src/Uno.Templates/content/unoapp/.template.config/template.json b/src/Uno.Templates/content/unoapp/.template.config/template.json index 512706a1f..01259e670 100644 --- a/src/Uno.Templates/content/unoapp/.template.config/template.json +++ b/src/Uno.Templates/content/unoapp/.template.config/template.json @@ -726,6 +726,13 @@ "datatype": "bool", "defaultValue": "true" }, + "meadowSupport": { + "displayName": "Meadow Support", + "description": "Includes a support for Meadow by Wilderness Labs", + "type": "parameter", + "datatype": "bool", + "defaultValue": "false" + }, "mauiEmbedding": { "displayName": ".NET MAUI Embedding", "description": "Configures application to embed .NET MAUI controls", @@ -1106,6 +1113,11 @@ "datatype": "bool", "value": "(platforms == wasm && server)" }, + "useMeadowAndCsharpMarkup": { + "type": "computed", + "datatype": "bool", + "value": "(useCsharpMarkup && meadowSupport)" + }, "useWinAppSdk": { "type": "computed", "datatype": "bool", @@ -3191,6 +3203,12 @@ "exclude": [ "MyExtensionsApp.1/Styles/ColorPaletteOverride.json" ] + }, + { + "condition": "(!meadowSupport)", + "exclude": [ + "MyExtensionsApp.1/UnoMeadowApplication.cs" + ] } ] } diff --git a/src/Uno.Templates/content/unoapp/MyExtensionsApp.1/App.blank.cs b/src/Uno.Templates/content/unoapp/MyExtensionsApp.1/App.blank.cs index 613277ef7..79019ff91 100644 --- a/src/Uno.Templates/content/unoapp/MyExtensionsApp.1/App.blank.cs +++ b/src/Uno.Templates/content/unoapp/MyExtensionsApp.1/App.blank.cs @@ -3,11 +3,18 @@ using System; using Microsoft.Extensions.Logging; #endif +#if (meadowSupport) +using Meadow; +#endif using Uno.Resizetizer; namespace MyExtensionsApp._1; +#if (meadowSupport) +public partial class App : UnoMeadowDesktopApplication +#else public partial class App : Application +#endif { /// /// Initializes the singleton application object. This is the first line of authored code @@ -20,6 +27,24 @@ public App() protected Window? MainWindow { get; private set; } +#if (meadowSupport) + public override Task MeadowInitialize() + { + var r = Resolver.Services.Get(); + + if (r == null) + { + Resolver.Log.Info("IMeadowDevice is null"); + } + else + { + Resolver.Log.Info($"IMeadowDevice is {r.GetType().Name}"); + } + + return Task.CompletedTask; + + } +#endif protected override void OnLaunched(LaunchActivatedEventArgs args) { #if useCsharpMarkup @@ -49,6 +74,10 @@ protected override void OnLaunched(LaunchActivatedEventArgs args) #endif #endif MainWindow = new Window(); + +#if (meadowSupport) + LoadMeadowOS(); +#endif //-:cnd:noEmit #if DEBUG MainWindow.UseStudio(); diff --git a/src/Uno.Templates/content/unoapp/MyExtensionsApp.1/App.recommended.cs b/src/Uno.Templates/content/unoapp/MyExtensionsApp.1/App.recommended.cs index cef48a9ae..d26832977 100644 --- a/src/Uno.Templates/content/unoapp/MyExtensionsApp.1/App.recommended.cs +++ b/src/Uno.Templates/content/unoapp/MyExtensionsApp.1/App.recommended.cs @@ -1,9 +1,16 @@ +//+:cnd:noEmit using Uno.Resizetizer; +#if (meadowSupport) +using Meadow; +#endif -//-:cnd:noEmit namespace MyExtensionsApp._1; +#if (meadowSupport) +public partial class App : UnoMeadowDesktopApplication +#else public partial class App : Application +#endif { /// /// Initializes the singleton application object. This is the first line of authored code @@ -17,6 +24,26 @@ public App() protected Window? MainWindow { get; private set; } protected IHost? Host { get; private set; } + +#if (meadowSupport) + public override Task MeadowInitialize() + { + var r = Resolver.Services.Get(); + + if (r == null) + { + Resolver.Log.Info("IMeadowDevice is null"); + } + else + { + Resolver.Log.Info($"IMeadowDevice is {r.GetType().Name}"); + } + + return Task.CompletedTask; + + } +#endif + //+:cnd:noEmit #if useFrameNav protected override void OnLaunched(LaunchActivatedEventArgs args) @@ -196,6 +223,10 @@ protected async override void OnLaunched(LaunchActivatedEventArgs args) ); MainWindow = builder.Window; + +#if (meadowSupport) + LoadMeadowOS(); +#endif //-:cnd:noEmit #if DEBUG MainWindow.UseStudio(); diff --git a/src/Uno.Templates/content/unoapp/MyExtensionsApp.1/App.xaml b/src/Uno.Templates/content/unoapp/MyExtensionsApp.1/App.xaml index 480403525..4a65d547e 100644 --- a/src/Uno.Templates/content/unoapp/MyExtensionsApp.1/App.xaml +++ b/src/Uno.Templates/content/unoapp/MyExtensionsApp.1/App.xaml @@ -1,14 +1,31 @@ - + + + + + + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:local="using:MyExtensionsApp._1"> - + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:local="using:MyExtensionsApp._1"$useThemesResourceNamespace$> + + + + + - + + @@ -55,7 +72,15 @@ + + + - + + + + + + diff --git a/src/Uno.Templates/content/unoapp/MyExtensionsApp.1/MyExtensionsApp.1.csproj b/src/Uno.Templates/content/unoapp/MyExtensionsApp.1/MyExtensionsApp.1.csproj index 0936fad3a..7a1f7c106 100644 --- a/src/Uno.Templates/content/unoapp/MyExtensionsApp.1/MyExtensionsApp.1.csproj +++ b/src/Uno.Templates/content/unoapp/MyExtensionsApp.1/MyExtensionsApp.1.csproj @@ -129,4 +129,11 @@ + + + + + + + diff --git a/src/Uno.Templates/content/unoapp/MyExtensionsApp.1/UnoMeadowApplication.cs b/src/Uno.Templates/content/unoapp/MyExtensionsApp.1/UnoMeadowApplication.cs new file mode 100644 index 000000000..1722dbc14 --- /dev/null +++ b/src/Uno.Templates/content/unoapp/MyExtensionsApp.1/UnoMeadowApplication.cs @@ -0,0 +1,84 @@ +using Meadow; +using Microsoft.UI.Dispatching; + +namespace MyExtensionsApp._1; + +public class UnoMeadowDesktopApplication: UnoMeadowApplication +{ + +} + + +public class UnoMeadowApplication : Application, IApp + where T : class, IMeadowDevice +{ + public CancellationToken CancellationToken => throw new NotImplementedException(); + + public static T Device => Resolver.Services.Get() as T; + + /// + public Dictionary Settings { get; } = new(); + + /// + public void InvokeOnMainThread(Action action, object? state = null) + { + var dispatcherQueue = DispatcherQueue.GetForCurrentThread(); + dispatcherQueue.TryEnqueue(() => action(state)); + } + + /// + public virtual Task OnError(Exception e) + { + return Task.CompletedTask; + } + + /// + public virtual Task OnShutdown() + { + return Task.CompletedTask; + } + + /// + public virtual void OnUpdate(Version newVersion, out bool approveUpdate) + { + approveUpdate = true; + } + + /// + public virtual void OnUpdateComplete(Version oldVersion, out bool rollbackUpdate) + { + rollbackUpdate = false; + } + + public virtual Task MeadowRun() + { + return Task.CompletedTask; + } + + public virtual Task MeadowInitialize() + { + return Task.CompletedTask; + } + + Task IApp.Run() + { + return MeadowRun(); + } + + Task IApp.Initialize() + { + return MeadowInitialize(); + } + + public void LoadMeadowOS() + { + new Thread((o) => + { + _ = MeadowOS.Start(this); + }) + { + IsBackground = true + } + .Start(); + } +}