From 4bcddcff3fc0915c1bf1c9ff4f5ecba14c120f82 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Wed, 12 Apr 2023 15:29:19 +0300 Subject: [PATCH 01/36] Add StyleBuilder as a new app --- UraniumUI.sln | 13 +- .../UraniumUI.StyleBuilder/App.xaml | 16 + .../UraniumUI.StyleBuilder/App.xaml.cs | 12 + .../UraniumUI.StyleBuilder/AppShell.xaml | 14 + .../UraniumUI.StyleBuilder/AppShell.xaml.cs | 9 + .../UraniumUI.StyleBuilder/MainPage.xaml | 13 + .../UraniumUI.StyleBuilder/MainPage.xaml.cs | 11 + .../UraniumUI.StyleBuilder/MauiProgram.cs | 27 + .../Platforms/Android/AndroidManifest.xml | 6 + .../Platforms/Android/MainActivity.cs | 9 + .../Platforms/Android/MainApplication.cs | 14 + .../Android/Resources/values/colors.xml | 6 + .../Platforms/MacCatalyst/AppDelegate.cs | 8 + .../Platforms/MacCatalyst/Info.plist | 30 + .../Platforms/MacCatalyst/Program.cs | 14 + .../Platforms/Tizen/Main.cs | 16 + .../Platforms/Tizen/tizen-manifest.xml | 15 + .../Platforms/Windows/App.xaml | 8 + .../Platforms/Windows/App.xaml.cs | 23 + .../Platforms/Windows/Package.appxmanifest | 43 + .../Platforms/Windows/app.manifest | 15 + .../Platforms/iOS/AppDelegate.cs | 8 + .../Platforms/iOS/Info.plist | 32 + .../Platforms/iOS/Program.cs | 14 + .../Properties/launchSettings.json | 8 + .../Resources/AppIcon/appicon.svg | 1894 +++++++++++++++++ .../Resources/AppIcon/appiconfg.svg | 1 + .../Resources/Fonts/OpenSans-Regular.ttf | Bin 0 -> 107152 bytes .../Resources/Fonts/OpenSans-Semibold.ttf | Bin 0 -> 111048 bytes .../Resources/Images/dotnet_bot.svg | 93 + .../Resources/Raw/AboutAssets.txt | 15 + .../Resources/Splash/splash.svg | 8 + .../Resources/Styles/Colors.xaml | 121 ++ .../Resources/Styles/Styles.xaml | 393 ++++ .../UraniumUI.StyleBuilder.csproj | 58 + .../UraniumUI.StyleBuilder.sln | 27 + 36 files changed, 2993 insertions(+), 1 deletion(-) create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/App.xaml create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/App.xaml.cs create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/AppShell.xaml create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/AppShell.xaml.cs create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml.cs create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MauiProgram.cs create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Android/AndroidManifest.xml create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Android/MainActivity.cs create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Android/MainApplication.cs create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Android/Resources/values/colors.xml create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/MacCatalyst/AppDelegate.cs create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/MacCatalyst/Info.plist create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/MacCatalyst/Program.cs create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Tizen/Main.cs create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Tizen/tizen-manifest.xml create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Windows/App.xaml create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Windows/App.xaml.cs create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Windows/Package.appxmanifest create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Windows/app.manifest create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/iOS/AppDelegate.cs create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/iOS/Info.plist create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/iOS/Program.cs create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Properties/launchSettings.json create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/AppIcon/appicon.svg create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/AppIcon/appiconfg.svg create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/Fonts/OpenSans-Regular.ttf create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/Fonts/OpenSans-Semibold.ttf create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/Images/dotnet_bot.svg create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/Raw/AboutAssets.txt create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/Splash/splash.svg create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/Styles/Colors.xaml create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/Styles/Styles.xaml create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder.csproj create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder.sln diff --git a/UraniumUI.sln b/UraniumUI.sln index e820668e..03579688 100644 --- a/UraniumUI.sln +++ b/UraniumUI.sln @@ -31,7 +31,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UraniumUI.Validations.DataA EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UraniumUI.Dialogs.CommunityToolkit", "src\UraniumUI.Dialogs.CommunityToolkit\UraniumUI.Dialogs.CommunityToolkit.csproj", "{C7CC898A-8047-4D39-A8DE-44A80E99445F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UraniumUI.Dialogs.Mopups", "src\UraniumUI.Dialogs.Mopups\UraniumUI.Dialogs.Mopups.csproj", "{3AD9C27A-3227-463A-81F4-8AA5FF4DB542}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UraniumUI.Dialogs.Mopups", "src\UraniumUI.Dialogs.Mopups\UraniumUI.Dialogs.Mopups.csproj", "{3AD9C27A-3227-463A-81F4-8AA5FF4DB542}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{6BE23582-8CCA-4D14-ADDD-5AC46E9EE2C7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UraniumUI.StyleBuilder", "tools\UraniumUI.StyleBuilder\UraniumUI.StyleBuilder\UraniumUI.StyleBuilder.csproj", "{E145C258-2D96-49ED-88DB-191DF1B32899}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -89,6 +93,12 @@ Global {3AD9C27A-3227-463A-81F4-8AA5FF4DB542}.Debug|Any CPU.Build.0 = Debug|Any CPU {3AD9C27A-3227-463A-81F4-8AA5FF4DB542}.Release|Any CPU.ActiveCfg = Release|Any CPU {3AD9C27A-3227-463A-81F4-8AA5FF4DB542}.Release|Any CPU.Build.0 = Release|Any CPU + {E145C258-2D96-49ED-88DB-191DF1B32899}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E145C258-2D96-49ED-88DB-191DF1B32899}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E145C258-2D96-49ED-88DB-191DF1B32899}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {E145C258-2D96-49ED-88DB-191DF1B32899}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E145C258-2D96-49ED-88DB-191DF1B32899}.Release|Any CPU.Build.0 = Release|Any CPU + {E145C258-2D96-49ED-88DB-191DF1B32899}.Release|Any CPU.Deploy.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -105,6 +115,7 @@ Global {67A0CB34-D871-47BB-A9E0-80CA328BA144} = {32493E5D-A757-4289-A168-DA0E8DDE9B29} {C7CC898A-8047-4D39-A8DE-44A80E99445F} = {32493E5D-A757-4289-A168-DA0E8DDE9B29} {3AD9C27A-3227-463A-81F4-8AA5FF4DB542} = {32493E5D-A757-4289-A168-DA0E8DDE9B29} + {E145C258-2D96-49ED-88DB-191DF1B32899} = {6BE23582-8CCA-4D14-ADDD-5AC46E9EE2C7} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {31946918-5DA1-40D1-8BD7-6834BB21D0FF} diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/App.xaml b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/App.xaml new file mode 100644 index 00000000..e85b1384 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/App.xaml @@ -0,0 +1,16 @@ + + + + + + + + + + + + diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/App.xaml.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/App.xaml.cs new file mode 100644 index 00000000..3b0a67ff --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/App.xaml.cs @@ -0,0 +1,12 @@ +using UraniumUI.Material.Resources; + +namespace UraniumUI.StyleBuilder; +public partial class App : Application +{ + public App() + { + InitializeComponent(); + + MainPage = new AppShell(); + } +} diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/AppShell.xaml b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/AppShell.xaml new file mode 100644 index 00000000..f9c3355d --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/AppShell.xaml @@ -0,0 +1,14 @@ + + + + + + diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/AppShell.xaml.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/AppShell.xaml.cs new file mode 100644 index 00000000..d18195b9 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/AppShell.xaml.cs @@ -0,0 +1,9 @@ +namespace UraniumUI.StyleBuilder; + +public partial class AppShell : Shell +{ + public AppShell() + { + InitializeComponent(); + } +} diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml new file mode 100644 index 00000000..6cebaa7f --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml.cs new file mode 100644 index 00000000..19880a2b --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml.cs @@ -0,0 +1,11 @@ +using InputKit.Shared.Controls; +using UraniumUI.Pages; + +namespace UraniumUI.StyleBuilder; +public partial class MainPage +{ + public MainPage() + { + InitializeComponent(); + } +} \ No newline at end of file diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MauiProgram.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MauiProgram.cs new file mode 100644 index 00000000..4ec13077 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MauiProgram.cs @@ -0,0 +1,27 @@ +using InputKit.Shared.Controls; +using Mopups.Hosting; +using UraniumUI; + +namespace UraniumUI.StyleBuilder; +public static class MauiProgram +{ + public static MauiApp CreateMauiApp() + { + var builder = MauiApp.CreateBuilder(); + builder + .UseMauiApp() + .ConfigureMopups() + .UseUraniumUI() + .UseUraniumUIMaterial() + .ConfigureFonts(fonts => + { + fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); + fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold"); + + fonts.AddMaterialIconFonts(); + }); + + builder.Services.AddMopupsDialogs(); + return builder.Build(); + } +} diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Android/AndroidManifest.xml b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Android/AndroidManifest.xml new file mode 100644 index 00000000..e9937ad7 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Android/AndroidManifest.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Android/MainActivity.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Android/MainActivity.cs new file mode 100644 index 00000000..112e5c28 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Android/MainActivity.cs @@ -0,0 +1,9 @@ +using Android.App; +using Android.Content.PM; +using Android.OS; + +namespace UraniumUI.StyleBuilder; +[Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)] +public class MainActivity : MauiAppCompatActivity +{ +} diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Android/MainApplication.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Android/MainApplication.cs new file mode 100644 index 00000000..013d3869 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Android/MainApplication.cs @@ -0,0 +1,14 @@ +using Android.App; +using Android.Runtime; + +namespace UraniumUI.StyleBuilder; +[Application] +public class MainApplication : MauiApplication +{ + public MainApplication(IntPtr handle, JniHandleOwnership ownership) + : base(handle, ownership) + { + } + + protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); +} diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Android/Resources/values/colors.xml b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Android/Resources/values/colors.xml new file mode 100644 index 00000000..cf3aaea6 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Android/Resources/values/colors.xml @@ -0,0 +1,6 @@ + + + #52D681 + #00AD7C + #52D681 + \ No newline at end of file diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/MacCatalyst/AppDelegate.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/MacCatalyst/AppDelegate.cs new file mode 100644 index 00000000..39032c86 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/MacCatalyst/AppDelegate.cs @@ -0,0 +1,8 @@ +using Foundation; + +namespace UraniumUI.StyleBuilder; +[Register("AppDelegate")] +public class AppDelegate : MauiUIApplicationDelegate +{ + protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); +} diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/MacCatalyst/Info.plist b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/MacCatalyst/Info.plist new file mode 100644 index 00000000..c96dd0a2 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/MacCatalyst/Info.plist @@ -0,0 +1,30 @@ + + + + + UIDeviceFamily + + 1 + 2 + + UIRequiredDeviceCapabilities + + arm64 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + XSAppIconAssets + Assets.xcassets/appicon.appiconset + + diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/MacCatalyst/Program.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/MacCatalyst/Program.cs new file mode 100644 index 00000000..68844835 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/MacCatalyst/Program.cs @@ -0,0 +1,14 @@ +using ObjCRuntime; +using UIKit; + +namespace UraniumUI.StyleBuilder; +public class Program +{ + // This is the main entry point of the application. + static void Main(string[] args) + { + // if you want to use a different Application Delegate class from "AppDelegate" + // you can specify it here. + UIApplication.Main(args, null, typeof(AppDelegate)); + } +} diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Tizen/Main.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Tizen/Main.cs new file mode 100644 index 00000000..b2ab8fae --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Tizen/Main.cs @@ -0,0 +1,16 @@ +using Microsoft.Maui; +using Microsoft.Maui.Hosting; +using System; + +namespace UraniumUI.StyleBuilder; + +internal class Program : MauiApplication +{ + protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); + + static void Main(string[] args) + { + var app = new Program(); + app.Run(args); + } +} diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Tizen/tizen-manifest.xml b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Tizen/tizen-manifest.xml new file mode 100644 index 00000000..46807e6e --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Tizen/tizen-manifest.xml @@ -0,0 +1,15 @@ + + + + + + maui-appicon-placeholder + + + + + http://tizen.org/privilege/internet + + + + \ No newline at end of file diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Windows/App.xaml b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Windows/App.xaml new file mode 100644 index 00000000..5f615dfc --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Windows/App.xaml @@ -0,0 +1,8 @@ + + + diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Windows/App.xaml.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Windows/App.xaml.cs new file mode 100644 index 00000000..9e411b20 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Windows/App.xaml.cs @@ -0,0 +1,23 @@ +using Microsoft.UI.Xaml; + +// To learn more about WinUI, the WinUI project structure, +// and more about our project templates, see: http://aka.ms/winui-project-info. + +namespace UraniumUI.StyleBuilder.WinUI; +/// +/// Provides application-specific behavior to supplement the default Application class. +/// +public partial class App : MauiWinUIApplication +{ + /// + /// Initializes the singleton application object. This is the first line of authored code + /// executed, and as such is the logical equivalent of main() or WinMain(). + /// + public App() + { + this.InitializeComponent(); + } + + protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); +} + diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Windows/Package.appxmanifest b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Windows/Package.appxmanifest new file mode 100644 index 00000000..2bcb11ed --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Windows/Package.appxmanifest @@ -0,0 +1,43 @@ + + + + + + + $placeholder$ + User Name + $placeholder$.png + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Windows/app.manifest b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Windows/app.manifest new file mode 100644 index 00000000..beecc095 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/Windows/app.manifest @@ -0,0 +1,15 @@ + + + + + + + + true/PM + PerMonitorV2, PerMonitor + + + diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/iOS/AppDelegate.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/iOS/AppDelegate.cs new file mode 100644 index 00000000..39032c86 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/iOS/AppDelegate.cs @@ -0,0 +1,8 @@ +using Foundation; + +namespace UraniumUI.StyleBuilder; +[Register("AppDelegate")] +public class AppDelegate : MauiUIApplicationDelegate +{ + protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); +} diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/iOS/Info.plist b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/iOS/Info.plist new file mode 100644 index 00000000..0004a4fd --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/iOS/Info.plist @@ -0,0 +1,32 @@ + + + + + LSRequiresIPhoneOS + + UIDeviceFamily + + 1 + 2 + + UIRequiredDeviceCapabilities + + arm64 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + XSAppIconAssets + Assets.xcassets/appicon.appiconset + + diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/iOS/Program.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/iOS/Program.cs new file mode 100644 index 00000000..68844835 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Platforms/iOS/Program.cs @@ -0,0 +1,14 @@ +using ObjCRuntime; +using UIKit; + +namespace UraniumUI.StyleBuilder; +public class Program +{ + // This is the main entry point of the application. + static void Main(string[] args) + { + // if you want to use a different Application Delegate class from "AppDelegate" + // you can specify it here. + UIApplication.Main(args, null, typeof(AppDelegate)); + } +} diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Properties/launchSettings.json b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Properties/launchSettings.json new file mode 100644 index 00000000..edf8aadc --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Properties/launchSettings.json @@ -0,0 +1,8 @@ +{ + "profiles": { + "Windows Machine": { + "commandName": "MsixPackage", + "nativeDebugging": false + } + } +} \ No newline at end of file diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/AppIcon/appicon.svg b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/AppIcon/appicon.svg new file mode 100644 index 00000000..2d2530c9 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/AppIcon/appicon.svg @@ -0,0 +1,1894 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/AppIcon/appiconfg.svg b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/AppIcon/appiconfg.svg new file mode 100644 index 00000000..649cde45 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/AppIcon/appiconfg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/Fonts/OpenSans-Regular.ttf b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/Fonts/OpenSans-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6cbaf4b89861a4b103c332ba7e4ad8c1211a3e5e GIT binary patch literal 107152 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 VIzmv%$fF0;mm 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 C5j>{= literal 0 HcmV?d00001 diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/Fonts/OpenSans-Semibold.ttf b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/Fonts/OpenSans-Semibold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..554d68ad702badfc7f294b30881b0d0fb878b541 GIT binary patch literal 111048 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.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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/Raw/AboutAssets.txt b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/Raw/AboutAssets.txt new file mode 100644 index 00000000..15d62448 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/Raw/AboutAssets.txt @@ -0,0 +1,15 @@ +Any raw assets you want to be deployed with your application can be placed in +this directory (and child directories). Deployment of the asset to your application +is automatically handled by the following `MauiAsset` Build Action within your `.csproj`. + + + +These files will be deployed with you package and will be accessible using Essentials: + + async Task LoadMauiAsset() + { + using var stream = await FileSystem.OpenAppPackageFileAsync("AboutAssets.txt"); + using var reader = new StreamReader(stream); + + var contents = reader.ReadToEnd(); + } diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/Splash/splash.svg b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/Splash/splash.svg new file mode 100644 index 00000000..21dfb25f --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/Splash/splash.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/Styles/Colors.xaml b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/Styles/Colors.xaml new file mode 100644 index 00000000..55e80ba7 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/Styles/Colors.xaml @@ -0,0 +1,121 @@ + + + + + #52D681 + #FFFFFF + #baefcd + #176031 + + #B5FF7D + #2C3639 + #e1ffcb + #3F4E4F + + #FDDB3A + #2C3639 + #786301 + #fef1b0 + + #F6F4E6 + #3F4E4F + #E7E0EC + #49454E + + #FFFBFE + #1C1B1F + + #B3261E + #F9DEDC + #FFFFFF + #370B1E + + #79747E + #C4C7C5 + #000000 + + #313033 + #F4EFF4 + + #52D681 + #000000 + + + #a8eac0 + #1c783d + #1a6c37 + #baefcd + + #daffbe + #52be00 + #193900 + #e1ffcb + + #feed9d + #9a7f02 + #8b7301 + #fef1b0 + + #2C3639 + #F6F4E6 + #49454F + #DCD7C9 + + #1C1B1F + #E6E1E5 + + #F2B8B5 + #8C1D18 + #601410 + #F9DEDC + + #938F99 + #444746 + #000000 + + #E6E1E5 + #313033 + #6750A4 + #000000 + + #ba919191 + #80919191 + + + White + Black + #E1E1E1 + #C8C8C8 + #ACACAC + #919191 + #6E6E6E + #404040 + #212121 + #141414 + + + + + + + + + + + + + + + #F7B548 + #FFD590 + #FFE5B9 + #28C2D1 + #7BDDEF + #C3F2F4 + #3E8EED + #72ACF1 + #A7CBF6 + + \ No newline at end of file diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/Styles/Styles.xaml b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/Styles/Styles.xaml new file mode 100644 index 00000000..fd96ee4c --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Resources/Styles/Styles.xaml @@ -0,0 +1,393 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder.csproj b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder.csproj new file mode 100644 index 00000000..5f16de79 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder.csproj @@ -0,0 +1,58 @@ + + + + net7.0-maccatalyst + $(TargetFrameworks);net7.0-windows10.0.19041.0 + + + Exe + UraniumUI.StyleBuilder + true + true + enable + $(DefineConstants);CommunityToolkit + + + UraniumUI.StyleBuilder + + + com.companyname.uraniumui.stylebuilder + 8f7b22c0-348d-47c1-bc45-9eb2acdfc3a5 + + + 1.0 + 1 + + 11.0 + 13.1 + 21.0 + 10.0.17763.0 + 10.0.17763.0 + 6.5 + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder.sln b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder.sln new file mode 100644 index 00000000..4aee0a74 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder.sln @@ -0,0 +1,27 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31611.283 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UraniumUI.StyleBuilder", "UraniumUI.StyleBuilder.csproj", "{D7381940-951A-4308-929B-C8A5C7648C23}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D7381940-951A-4308-929B-C8A5C7648C23}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D7381940-951A-4308-929B-C8A5C7648C23}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D7381940-951A-4308-929B-C8A5C7648C23}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {D7381940-951A-4308-929B-C8A5C7648C23}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D7381940-951A-4308-929B-C8A5C7648C23}.Release|Any CPU.Build.0 = Release|Any CPU + {D7381940-951A-4308-929B-C8A5C7648C23}.Release|Any CPU.Deploy.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {61F7FB11-1E47-470C-91E2-47F8143E1572} + EndGlobalSection +EndGlobal From 25b4bbab512e289d2b8e66c15942e288b16f4e49 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Wed, 12 Apr 2023 15:50:45 +0300 Subject: [PATCH 02/36] Convert local references & add ReactiveUI --- .../UraniumUI.StyleBuilder/FodyWeavers.xml | 3 +++ .../UraniumUI.StyleBuilder/UraniumUI.StyleBuilder.csproj | 9 ++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/FodyWeavers.xml diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/FodyWeavers.xml b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/FodyWeavers.xml new file mode 100644 index 00000000..63fc1484 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder.csproj b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder.csproj index 5f16de79..52a18189 100644 --- a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder.csproj +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder.csproj @@ -50,9 +50,12 @@ - - - + + + + + + From 2f43eeab39a1e1f362b858719e97d3dfb8959748 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Wed, 12 Apr 2023 23:11:41 +0300 Subject: [PATCH 03/36] Add Initial Color editor --- .../UraniumUI.StyleBuilder/App.xaml | 4 + .../UraniumUI.StyleBuilder/App.xaml.cs | 4 +- .../UraniumUI.StyleBuilder/AppShell.xaml | 1 - .../ColorPairEditorView.xaml | 36 ++++++ .../ColorPairEditorView.xaml.cs | 54 ++++++++ .../Controls/ColorEditPopupPage.cs | 95 ++++++++++++++ .../Controls/ColorEditor.cs | 56 +++++++++ .../Controls/SliderColorPicker.cs | 88 +++++++++++++ .../Converters/ColorHexConverter.cs | 48 ++++++++ .../Converters/ToSurfaceColorConverter.cs | 33 +++++ .../UraniumUI.StyleBuilder/MainPage.xaml | 75 ++++++++++- .../UraniumUI.StyleBuilder/MainPage.xaml.cs | 3 +- .../MainPageViewModel.cs | 116 ++++++++++++++++++ .../UraniumUI.StyleBuilder/MauiProgram.cs | 14 ++- .../StyleManager/ColorPalette.cs | 84 +++++++++++++ .../StyleManager/Xml.cs | 55 +++++++++ .../UraniumUI.StyleBuilder.csproj | 9 ++ 17 files changed, 763 insertions(+), 12 deletions(-) create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/ColorPairEditorView.xaml create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/ColorPairEditorView.xaml.cs create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Controls/ColorEditPopupPage.cs create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Controls/ColorEditor.cs create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Controls/SliderColorPicker.cs create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Converters/ColorHexConverter.cs create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Converters/ToSurfaceColorConverter.cs create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPageViewModel.cs create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/StyleManager/ColorPalette.cs create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/StyleManager/Xml.cs diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/App.xaml b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/App.xaml index e85b1384..5fdf914c 100644 --- a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/App.xaml +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/App.xaml @@ -2,6 +2,7 @@ @@ -10,7 +11,10 @@ + + + diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/App.xaml.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/App.xaml.cs index 3b0a67ff..c54c10bf 100644 --- a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/App.xaml.cs +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/App.xaml.cs @@ -3,10 +3,10 @@ namespace UraniumUI.StyleBuilder; public partial class App : Application { - public App() + public App(AppShell shell) { InitializeComponent(); - MainPage = new AppShell(); + MainPage = shell; } } diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/AppShell.xaml b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/AppShell.xaml index f9c3355d..cba66764 100644 --- a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/AppShell.xaml +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/AppShell.xaml @@ -7,7 +7,6 @@ Shell.FlyoutBehavior="Disabled"> diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/ColorPairEditorView.xaml b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/ColorPairEditorView.xaml new file mode 100644 index 00000000..370c5fc6 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/ColorPairEditorView.xaml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/ColorPairEditorView.xaml.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/ColorPairEditorView.xaml.cs new file mode 100644 index 00000000..94e38103 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/ColorPairEditorView.xaml.cs @@ -0,0 +1,54 @@ +using System.Windows.Input; +using UraniumUI.StyleBuilder.Converters; + +namespace UraniumUI.StyleBuilder; + +public partial class ColorPairEditorView : ContentView +{ + public ColorPairEditorView() + { + InitializeComponent(); + } + + public string EditingColorBinding { get => (string)GetValue(EditingColorBindingProperty); set => SetValue(EditingColorBindingProperty, value); } + + public static readonly BindableProperty EditingColorBindingProperty = BindableProperty.Create( + nameof(EditingColorBinding), + typeof(string), + typeof(ColorPairEditorView), + defaultValue: string.Empty, + propertyChanged: (bindable, oldValue, newValue) => + { + if (bindable is ColorPairEditorView editor && newValue is string bindingPath) + { + var propertyName = bindingPath.Split('.').Last(); + editor.primarySquare.SetBinding(ContentView.BackgroundColorProperty, bindingPath); + editor.primarySquare.CommandParameter = bindingPath; + editor.primaryLabel.SetBinding(Label.TextColorProperty, bindingPath, converter: new ToSurfaceColorConverter()); + editor.primaryLabel.Text = propertyName; + + var onPropertyName = "On" + propertyName.Split('.').Last(); + var onBindingPath = bindingPath.Replace(propertyName, onPropertyName); + + editor.onSquare.SetBinding(ContentView.BackgroundColorProperty, bindingPath); + editor.onSquare.CommandParameter = onBindingPath; + editor.onLabel.SetBinding(Label.TextColorProperty, onBindingPath); + editor.onLabel.Text = onPropertyName; + } + }); + + public ICommand EditCommand { get => (ICommand)GetValue(EditCommandProperty); set => SetValue(EditCommandProperty, value); } + public static readonly BindableProperty EditCommandProperty = BindableProperty.Create( + nameof(EditCommand), + typeof(ICommand), + typeof(ColorPairEditorView), + defaultValue: null, + propertyChanged: (bindable, oldValue, newValue) => + { + if (bindable is ColorPairEditorView editor && newValue is ICommand command) + { + editor.primarySquare.TappedCommand = command; + editor.onSquare.TappedCommand = command; + } + }); +} \ No newline at end of file diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Controls/ColorEditPopupPage.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Controls/ColorEditPopupPage.cs new file mode 100644 index 00000000..b226b9bc --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Controls/ColorEditPopupPage.cs @@ -0,0 +1,95 @@ +using Mopups.Pages; +using Mopups.Services; +using UraniumUI.Resources; + +namespace UraniumUI.StyleBuilder.Controls; +public class ColorEditPopupPage : PopupPage +{ + public ColorEditPopupPage(object source, string bindingPath) + { + this.BindingContext = source; + this.BackgroundColor = Colors.Black.WithAlpha(0.6f); + this.WidthRequest = 500; + var grid = new Grid + { + ColumnDefinitions = + { + new ColumnDefinition(GridLength.Auto), + new ColumnDefinition(GridLength.Star), + }, + }; + + var colorPreviewBox = new BoxView + { + HeightRequest = 200, + WidthRequest = 200, + HorizontalOptions = LayoutOptions.Center, + StyleClass = new[] { "Elevation1" } + }; + + colorPreviewBox.SetBinding(BoxView.ColorProperty, bindingPath); + + var colorEditor = new ColorEditor + { + HorizontalOptions = LayoutOptions.Center, + }; + + colorEditor.SetBinding(ColorEditor.ColorProperty, bindingPath); + + grid.Add(new VerticalStackLayout + { + Padding = 20, + Children = + { + colorPreviewBox, + colorEditor + } + }); + + var sliderColorPicker = new SliderColorPicker() + { + VerticalOptions = LayoutOptions.Center, + }; + + sliderColorPicker.SetBinding(SliderColorPicker.ColorProperty, bindingPath); + + grid.Add(sliderColorPicker, column: 1); + + var rootStackLayout = new VerticalStackLayout + { + Padding = 10, + Children = + { + new Label + { + Text = bindingPath.Split('.').Last(), + HorizontalOptions = LayoutOptions.Center, + }, + new BoxView + { + StyleClass = new []{ "Divider" } + }, + grid, + new Button + { + StyleClass = new []{ "TextButton" }, + Text = "OK", + Command = new Command(() => + { + MopupService.Instance.PopAsync(); + }) + } + } + }; + + rootStackLayout.HorizontalOptions = LayoutOptions.Center; + rootStackLayout.VerticalOptions = LayoutOptions.Center; + rootStackLayout.WidthRequest = 560; + rootStackLayout.SetAppThemeColor( + StackLayout.BackgroundColorProperty, + ColorResource.GetColor("Surface"), + ColorResource.GetColor("SurfaceDark")); + + this.Content = rootStackLayout; + } +} diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Controls/ColorEditor.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Controls/ColorEditor.cs new file mode 100644 index 00000000..30c5ba8b --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Controls/ColorEditor.cs @@ -0,0 +1,56 @@ +using DynamicData.Binding; +using System.Reactive.Disposables; +using System.Reactive.Linq; + +namespace UraniumUI.StyleBuilder.Controls; +public class ColorEditor : Plainer.Maui.Controls.EntryView +{ + private CancellationTokenSource cts = new CancellationTokenSource(); + public ColorEditor() + { + this.TextChanged += ColorEditor_TextChanged; + } + + private void ColorEditor_TextChanged(object sender, TextChangedEventArgs e) + { + UpdateColorFromText(); + } + + public Color Color { get => (Color)GetValue(ColorProperty); set => SetValue(ColorProperty, value); } + + public static readonly BindableProperty ColorProperty = BindableProperty.Create( + nameof(Color), + typeof(Color), + typeof(ColorEditor), + defaultValue: Colors.Transparent, + defaultBindingMode: BindingMode.TwoWay, + propertyChanged: (bindable, oldValue, newValue) => + { + if (bindable is ColorEditor colorEditor && newValue is Color newColor && oldValue != newValue) + { + colorEditor.UpdateTextFromColor(); + } + }); + + protected void UpdateTextFromColor() + { + if (IsFocused) + { + return; + } + + var newHex = Color.ToHex(); + if (Text != newHex) + { + Text = newHex; + } + } + + protected void UpdateColorFromText() + { + if (Color.TryParse(Text, out var color) && color != Color) + { + Color = color; + } + } +} diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Controls/SliderColorPicker.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Controls/SliderColorPicker.cs new file mode 100644 index 00000000..33dce068 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Controls/SliderColorPicker.cs @@ -0,0 +1,88 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace UraniumUI.StyleBuilder.Controls +{ + public class SliderColorPicker : VerticalStackLayout + { + private Slider sliderRed = new Slider + { + ThumbColor = Colors.Red, + MinimumTrackColor = Colors.Red, + }; + private Slider sliderGreen = new Slider + { + ThumbColor = Colors.Green, + MinimumTrackColor = Colors.Green, + }; + private Slider sliderBlue = new Slider + { + ThumbColor = Colors.Blue, + MinimumTrackColor = Colors.Blue, + }; + + private bool initialized; + public SliderColorPicker() + { + Children.Add(sliderRed); + Children.Add(sliderGreen); + Children.Add(sliderBlue); + + sliderGreen.ValueChanged += Slider_ValueChanged; + sliderRed.ValueChanged += Slider_ValueChanged; + sliderBlue.ValueChanged += Slider_ValueChanged; + } + + private void Slider_ValueChanged(object sender, ValueChangedEventArgs e) + { + UpdateFromSliders(); + } + + protected void UpdateFromColor() + { + initialized = false; + + if ((float)sliderRed.Value != Color.Red) + sliderRed.Value = Color.Red; + if ((float)sliderGreen.Value != Color.Green) + sliderGreen.Value = Color.Green; + if ((float)sliderBlue.Value != Color.Blue) + sliderBlue.Value = Color.Blue; + + initialized = true; + } + + protected void UpdateFromSliders() + { + if (!initialized) + { + return; + } + + var newColor = new Color((float)sliderRed.Value, (float)sliderGreen.Value, (float)sliderBlue.Value); + if (newColor.Red != Color.Red || newColor.Blue != Color.Blue || newColor.Green != Color.Green) + { + Color = newColor; + } + } + + public Color Color { get => (Color)GetValue(ColorProperty); set => SetValue(ColorProperty, value); } + + public static readonly BindableProperty ColorProperty = BindableProperty.Create( + nameof(Color), + typeof(Color), + typeof(SliderColorPicker), + defaultValue: Colors.Transparent, + defaultBindingMode: BindingMode.TwoWay, + propertyChanged: (bindable, oldValue, newValue) => + { + if (bindable is SliderColorPicker colorEditor && newValue is Color newColor) + { + colorEditor.UpdateFromColor(); + } + }); + } +} diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Converters/ColorHexConverter.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Converters/ColorHexConverter.cs new file mode 100644 index 00000000..a5d958d1 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Converters/ColorHexConverter.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace UraniumUI.StyleBuilder.Converters; +public class ColorHexConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (targetType != typeof(string)) + { + throw new InvalidOperationException("targetType must be string"); + } + + if (value is Color color) + { + return color.ToHex(); + } + else + { + throw new InvalidOperationException("targetType must be Color"); + } + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + if (targetType != typeof(Color)) + { + throw new InvalidOperationException("targetType must be Color"); + } + + if (value is string hex) + { + //if (Color.TryParse(hex, out )) + //{ + + //} + return Color.FromArgb(hex); + } + else + { + throw new InvalidOperationException("targetType must be Color"); + } + } +} \ No newline at end of file diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Converters/ToSurfaceColorConverter.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Converters/ToSurfaceColorConverter.cs new file mode 100644 index 00000000..3e0a2ac5 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Converters/ToSurfaceColorConverter.cs @@ -0,0 +1,33 @@ +using InputKit.Shared.Helpers; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace UraniumUI.StyleBuilder.Converters; +public class ToSurfaceColorConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (targetType != typeof(Color)) + { + throw new InvalidOperationException("targetType must be Color!"); + } + + if (value is Color color) + { + return color.ToSurfaceColor(); + } + else + { + throw new InvalidOperationException("value must be Color!"); + } + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml index 6cebaa7f..1725bd04 100644 --- a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml @@ -3,11 +3,74 @@ xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:uranium="http://schemas.enisn-projects.io/dotnet/maui/uraniumui" xmlns:material="http://schemas.enisn-projects.io/dotnet/maui/uraniumui/material" + xmlns:plain="clr-namespace:Plainer.Maui.Controls;assembly=Plainer.Maui" + xmlns:controls="clr-namespace:UraniumUI.StyleBuilder.Controls" + xmlns:cp="clr-namespace:Maui.ColorPicker;assembly=Maui.ColorPicker" x:Class="UraniumUI.StyleBuilder.MainPage" - xmlns:local="clr-namespace:UraniumUI.StyleBuilder"> - - - - + Title="{Binding ColorStyleManager.Path}" + xmlns:local="clr-namespace:UraniumUI.StyleBuilder" + x:DataType="local:MainPageViewModel"> + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml.cs index 19880a2b..0970341a 100644 --- a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml.cs +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml.cs @@ -4,8 +4,9 @@ namespace UraniumUI.StyleBuilder; public partial class MainPage { - public MainPage() + public MainPage(MainPageViewModel viewModel) { InitializeComponent(); + BindingContext = viewModel; } } \ No newline at end of file diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPageViewModel.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPageViewModel.cs new file mode 100644 index 00000000..4be52693 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPageViewModel.cs @@ -0,0 +1,116 @@ +using CommunityToolkit.Maui.Storage; +using DotNurse.Injector.Attributes; +using DynamicData.Binding; +using Mopups.Services; +using ReactiveUI; +using ReactiveUI.Fody.Helpers; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reactive; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Input; +using System.Xml.Serialization; +using UraniumUI.Dialogs; +using UraniumUI.StyleBuilder.Controls; +using UraniumUI.StyleBuilder.StyleManager; + +namespace UraniumUI.StyleBuilder; + +public class MainPageViewModel : ReactiveObject +{ + public ColorStyleManager ColorStyleManager { get; } + + protected IDialogService Dialog { get; } + + public ColorPalette Colors => ColorStyleManager?.Palette; + + public MainPageViewModel(ColorStyleManager colorStyleManager, IDialogService dialog) + { + NewCommand = new Command(NewAsync); + OpenCommand = new Command(OpenAsync); + NotifyContextChanged(); + EditColorCommand = new Command(EditColorAsync); + ColorStyleManager = colorStyleManager; + Dialog = dialog; + } + + private void NotifyContextChanged() + { + if (ColorStyleManager != null) + { + this.RaisePropertyChanged(nameof(Colors)); + } + SaveCommand = new Command(SaveAsync, () => Colors != null); + SaveAsCommand = new Command(SaveAsAsync, () => Colors != null); + } + + public ICommand NewCommand { get; } + public ICommand OpenCommand { get; } + [Reactive] public ICommand SaveCommand { get; private set; } + [Reactive] public ICommand SaveAsCommand { get; private set; } + public ICommand EditColorCommand { get; private set; } + + protected virtual async void NewAsync() + { + if (ColorStyleManager.IsLoaded) + { + if (!await Dialog.ConfirmAsync("Creating new!", "Unsaved Data will be lost if you continue", "Continue")) + { + return; + } + } + + await ColorStyleManager.CreateNewAsync(); + + NotifyContextChanged(); + } + + protected virtual async void OpenAsync() + { + var fileResult = await FilePicker.Default.PickAsync(new PickOptions + { + FileTypes = new StyleResourceFileType(), + PickerTitle = "Pick an xml file" + }); + + if (fileResult == null) + { + return; + } + + await ColorStyleManager.LoadAsync(fileResult.FullPath); + + NotifyContextChanged(); + } + + protected virtual async void SaveAsync() + { + if (string.IsNullOrEmpty(ColorStyleManager.Path)) + { + SaveAsAsync(); + return; + } + + await ColorStyleManager.SaveAsync(ColorStyleManager.Path); + } + + protected virtual async void SaveAsAsync() + { + await ColorStyleManager.SaveAsAsync(); + } + + protected virtual async void EditColorAsync(object parameter) + { + await MopupService.Instance.PushAsync(new ColorEditPopupPage(this, parameter?.ToString())); + } + + public class StyleResourceFileType : FilePickerFileType + { + protected override IEnumerable GetPlatformFileType(DevicePlatform platform) + { + yield return "xaml"; + } + } +} \ No newline at end of file diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MauiProgram.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MauiProgram.cs index 4ec13077..61eebc6f 100644 --- a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MauiProgram.cs +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MauiProgram.cs @@ -1,6 +1,6 @@ -using InputKit.Shared.Controls; +using CommunityToolkit.Maui; +using DotNurse.Injector; using Mopups.Hosting; -using UraniumUI; namespace UraniumUI.StyleBuilder; public static class MauiProgram @@ -13,6 +13,7 @@ public static MauiApp CreateMauiApp() .ConfigureMopups() .UseUraniumUI() .UseUraniumUIMaterial() + .UseMauiCommunityToolkit() .ConfigureFonts(fonts => { fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); @@ -22,6 +23,15 @@ public static MauiApp CreateMauiApp() }); builder.Services.AddMopupsDialogs(); + + var thisAssembly = typeof(MauiProgram).Assembly; + + builder.Services.AddServicesFrom( + type => typeof(Page).IsAssignableFrom(type) || type.Name.EndsWith("ViewModel"), + ServiceLifetime.Transient, + options => options.Assembly = thisAssembly) + .AddServicesByAttributes(); + return builder.Build(); } } diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/StyleManager/ColorPalette.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/StyleManager/ColorPalette.cs new file mode 100644 index 00000000..4ac4f896 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/StyleManager/ColorPalette.cs @@ -0,0 +1,84 @@ +using ReactiveUI; +using ReactiveUI.Fody.Helpers; +using System.Reflection; + +namespace UraniumUI.StyleBuilder.StyleManager; + +public class ColorPalette : ReactiveObject +{ + public ColorPalette(bool withDefaultValues = true) + { + if (withDefaultValues) + { + foreach (var property in GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)) + { + if (App.Current.Resources.TryGetValue(property.Name, out object valueObj) && valueObj is Color color) + { + property.SetValue(this, color); + } + } + } + } + + public ColorPalette(Xml.ResourceDictionary dict) + { + foreach (var property in GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)) + { + var colorNode = dict.Colors.FirstOrDefault(x => x.Key == property.Name); + if (colorNode != null) + { + property.SetValue(this, Color.FromArgb(colorNode.Text)); + } + } + } + + [Reactive] public Color Primary { get; set; } + [Reactive] public Color OnPrimary { get; set; } + [Reactive] public Color PrimaryContainer { get; set; } + [Reactive] public Color OnPrimaryContainer { get; set; } + [Reactive] public Color Secondary { get; set; } + [Reactive] public Color OnSecondary { get; set; } + [Reactive] public Color SecondaryContainer { get; set; } + [Reactive] public Color Tertiary { get; set; } + [Reactive] public Color OnTertiary { get; set; } + [Reactive] public Color TertiaryContainer { get; set; } + [Reactive] public Color OnTertiaryContainer { get; set; } + [Reactive] public Color Surface { get; set; } + [Reactive] public Color OnSurface { get; set; } + [Reactive] public Color SurfaceVariant { get; set; } + [Reactive] public Color OnSurfaceVariant { get; set; } + [Reactive] public Color Background { get; set; } + [Reactive] public Color OnBackground { get; set; } + [Reactive] public Color Error { get; set; } + [Reactive] public Color OnError { get; set; } + [Reactive] public Color ErrorContainer { get; set; } + [Reactive] public Color OnErrorContainer { get; set; } + [Reactive] public Color Outline { get; set; } + [Reactive] public Color OutlineVariant { get; set; } + [Reactive] public Color Shadow { get; set; } + + [Reactive] public Color PrimaryDark { get; set; } + [Reactive] public Color OnPrimaryDark { get; set; } + [Reactive] public Color PrimaryContainerDark { get; set; } + [Reactive] public Color OnPrimaryContainerDark { get; set; } + [Reactive] public Color SecondaryDark { get; set; } + [Reactive] public Color OnSecondaryDark { get; set; } + [Reactive] public Color SecondaryContainerDark { get; set; } + [Reactive] public Color TertiaryDark { get; set; } + [Reactive] public Color OnTertiaryDark { get; set; } + [Reactive] public Color TertiaryContainerDark { get; set; } + [Reactive] public Color OnTertiaryContainerDark { get; set; } + [Reactive] public Color SurfaceDark { get; set; } + [Reactive] public Color OnSurfaceDark { get; set; } + [Reactive] public Color SurfaceVariantDark { get; set; } + [Reactive] public Color OnSurfaceVariantDark { get; set; } + [Reactive] public Color BackgroundDark { get; set; } + [Reactive] public Color OnBackgroundDark { get; set; } + [Reactive] public Color ErrorDark { get; set; } + [Reactive] public Color OnErrorDark { get; set; } + [Reactive] public Color ErrorContainerDark { get; set; } + [Reactive] public Color OnErrorContainerDark { get; set; } + [Reactive] public Color OutlineDark { get; set; } + [Reactive] public Color OutlineVariantDark { get; set; } + [Reactive] public Color ShadowDark { get; set; } +} diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/StyleManager/Xml.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/StyleManager/Xml.cs new file mode 100644 index 00000000..91fb4917 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/StyleManager/Xml.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Serialization; + +namespace UraniumUI.StyleBuilder.StyleManager; + +public static class Xml +{ + + [XmlRoot(ElementName = "Color", Namespace = "http://schemas.microsoft.com/dotnet/2021/maui")] + public class Color + { + + [XmlAttribute(AttributeName = "Key", Namespace = "http://schemas.microsoft.com/winfx/2009/xaml")] + public string Key { get; set; } + + [XmlText] + public string Text { get; set; } + } + + [XmlRoot(ElementName = "SolidColorBrush", Namespace = "http://schemas.microsoft.com/dotnet/2021/maui")] + public class SolidColorBrush + { + + [XmlAttribute(AttributeName = "Key", Namespace = "http://schemas.microsoft.com/winfx/2009/xaml")] + public string Key { get; set; } + + [XmlAttribute(AttributeName = "Color", Namespace = "")] + public string Color { get; set; } + } + + [XmlRoot(ElementName = "ResourceDictionary", Namespace = "http://schemas.microsoft.com/dotnet/2021/maui")] + public class ResourceDictionary + { + + [XmlElement(ElementName = "Color", Namespace = "http://schemas.microsoft.com/dotnet/2021/maui")] + public List Colors { get; set; } + + [XmlElement(ElementName = "SolidColorBrush", Namespace = "http://schemas.microsoft.com/dotnet/2021/maui")] + public List SolidColorBrushes { get; set; } + + [XmlAttribute(AttributeName = "xmlns", Namespace = "")] + public string Xmlns { get; set; } + + [XmlAttribute(AttributeName = "x", Namespace = "http://www.w3.org/2000/xmlns/")] + public string X { get; set; } + + [XmlText] + public string Text { get; set; } + } + +} diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder.csproj b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder.csproj index 52a18189..ebcfb608 100644 --- a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder.csproj +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder.csproj @@ -56,6 +56,15 @@ + + + + + + + + MSBuild:Compile + From 3b4ebb48e75897f855575cad514d3439c0092ea9 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Wed, 12 Apr 2023 23:11:45 +0300 Subject: [PATCH 04/36] Create ColorStyleManager.cs --- .../StyleManager/ColorStyleManager.cs | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/StyleManager/ColorStyleManager.cs diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/StyleManager/ColorStyleManager.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/StyleManager/ColorStyleManager.cs new file mode 100644 index 00000000..9f9c51fe --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/StyleManager/ColorStyleManager.cs @@ -0,0 +1,77 @@ +using DotNurse.Injector.Attributes; +using ReactiveUI; +using ReactiveUI.Fody.Helpers; +using System.Reflection; +using System.Text; +using System.Xml; +using System.Xml.Serialization; + +namespace UraniumUI.StyleBuilder.StyleManager; + +[RegisterAs(typeof(ColorStyleManager), ServiceLifetime.Singleton)] +public partial class ColorStyleManager : ReactiveObject +{ + protected Xml.ResourceDictionary XmlNode { get; set; } + + [Reactive] public ColorPalette Palette { get; protected set; } + + [Reactive] public string Path { get; set; } + + public bool IsLoaded => XmlNode != null; + + public async Task LoadAsync(string path) + { + var serializer = new XmlSerializer(typeof(Xml.ResourceDictionary)); + using (StringReader reader = new StringReader(await File.ReadAllTextAsync(path))) + { + XmlNode = (Xml.ResourceDictionary)serializer.Deserialize(reader); + } + + Path = path; + + Palette = new ColorPalette(XmlNode); + } + + public async Task SaveAsync(string path) + { + using (TextWriter sw = new StreamWriter(path ?? Path, false, Encoding.UTF8)) //Set encoding + { + var serializer = new XmlSerializer(typeof(Xml.ResourceDictionary)); + serializer.Serialize(sw, XmlNode); + + await sw.WriteAsync(XamlCompileDecleration); + } + } + + public async Task SaveAsAsync() + { + using (var stream = new MemoryStream()) + { + var serializer = new XmlSerializer(typeof(Xml.ResourceDictionary)); + serializer.Serialize(stream, XmlNode); + + await CommunityToolkit.Maui.Storage.FileSaver.Default.SaveAsync( + initialPath: System.IO.Path.GetDirectoryName(Path), + "Colors.xaml", stream, CancellationToken.None); + } + } + + public async Task CreateNewAsync() + { + Path = null; + Palette = new ColorPalette(withDefaultValues: true); + XmlNode = new Xml.ResourceDictionary() + { + Colors = Palette.GetType() + .GetProperties(BindingFlags.Public | BindingFlags.Instance) + .Where(x => x.PropertyType == typeof(Color)) + .Select(x => new Xml.Color + { + Key = x.Name, + Text = (x.GetValue(Palette) as Color).ToHex(), + }).ToList() + }; + } + + const string XamlCompileDecleration = "\n"; +} From 65afd55aadd1559e3f000212d4b4e88bacd65f3c Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Thu, 13 Apr 2023 00:06:41 +0300 Subject: [PATCH 05/36] Update ColorPalette.cs --- .../UraniumUI.StyleBuilder/StyleManager/ColorPalette.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/StyleManager/ColorPalette.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/StyleManager/ColorPalette.cs index 4ac4f896..bcf8d212 100644 --- a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/StyleManager/ColorPalette.cs +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/StyleManager/ColorPalette.cs @@ -39,6 +39,7 @@ public ColorPalette(Xml.ResourceDictionary dict) [Reactive] public Color Secondary { get; set; } [Reactive] public Color OnSecondary { get; set; } [Reactive] public Color SecondaryContainer { get; set; } + [Reactive] public Color OnSecondaryContainer { get; set; } [Reactive] public Color Tertiary { get; set; } [Reactive] public Color OnTertiary { get; set; } [Reactive] public Color TertiaryContainer { get; set; } @@ -64,6 +65,7 @@ public ColorPalette(Xml.ResourceDictionary dict) [Reactive] public Color SecondaryDark { get; set; } [Reactive] public Color OnSecondaryDark { get; set; } [Reactive] public Color SecondaryContainerDark { get; set; } + [Reactive] public Color OnSecondaryContainerDark { get; set; } [Reactive] public Color TertiaryDark { get; set; } [Reactive] public Color OnTertiaryDark { get; set; } [Reactive] public Color TertiaryContainerDark { get; set; } From a876c6ed3476ee8ebf2dbf569a3a1068ac785242 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Thu, 13 Apr 2023 22:01:15 +0300 Subject: [PATCH 06/36] Add Tab support for color resources --- .../UraniumUI.StyleBuilder/MainPage.xaml | 113 ++++++++++++------ .../MainPageViewModel.cs | 94 ++++++++------- .../ViewModels/ColorsEditorViewModel.cs | 65 ++++++++++ .../ViewModels/ISavable.cs | 15 +++ 4 files changed, 206 insertions(+), 81 deletions(-) create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/ViewModels/ColorsEditorViewModel.cs create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/ViewModels/ISavable.cs diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml index 1725bd04..6a237926 100644 --- a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml @@ -6,9 +6,10 @@ xmlns:plain="clr-namespace:Plainer.Maui.Controls;assembly=Plainer.Maui" xmlns:controls="clr-namespace:UraniumUI.StyleBuilder.Controls" xmlns:cp="clr-namespace:Maui.ColorPicker;assembly=Maui.ColorPicker" + xmlns:vm="clr-namespace:UraniumUI.StyleBuilder.ViewModels" x:Class="UraniumUI.StyleBuilder.MainPage" - Title="{Binding ColorStyleManager.Path}" xmlns:local="clr-namespace:UraniumUI.StyleBuilder" + x:Name="page" x:DataType="local:MainPageViewModel"> @@ -21,53 +22,87 @@ - - - + + + diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPageViewModel.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPageViewModel.cs index 4be52693..cfe92df8 100644 --- a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPageViewModel.cs +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPageViewModel.cs @@ -1,70 +1,77 @@ -using CommunityToolkit.Maui.Storage; -using DotNurse.Injector.Attributes; +using DynamicData; using DynamicData.Binding; -using Mopups.Services; using ReactiveUI; using ReactiveUI.Fody.Helpers; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reactive; -using System.Text; -using System.Threading.Tasks; +using System.Collections.ObjectModel; +using System.Reactive.Linq; using System.Windows.Input; -using System.Xml.Serialization; using UraniumUI.Dialogs; -using UraniumUI.StyleBuilder.Controls; using UraniumUI.StyleBuilder.StyleManager; +using UraniumUI.StyleBuilder.ViewModels; namespace UraniumUI.StyleBuilder; public class MainPageViewModel : ReactiveObject { - public ColorStyleManager ColorStyleManager { get; } + private readonly IServiceProvider serviceProvider; protected IDialogService Dialog { get; } - public ColorPalette Colors => ColorStyleManager?.Palette; + public ObservableCollection Items { get; } = new ObservableCollection(); - public MainPageViewModel(ColorStyleManager colorStyleManager, IDialogService dialog) + [Reactive] public ISavable CurrentItem { get; set; } + + [ObservableAsProperty] public bool CanSave { get; } + + public MainPageViewModel(IDialogService dialog, IServiceProvider serviceProvider) { NewCommand = new Command(NewAsync); OpenCommand = new Command(OpenAsync); - NotifyContextChanged(); - EditColorCommand = new Command(EditColorAsync); - ColorStyleManager = colorStyleManager; + CloseCommand = ReactiveCommand.CreateFromTask(CloseAsync); + Dialog = dialog; + this.serviceProvider = serviceProvider; + + this.WhenAnyValue(x => x.CurrentItem) + .Select(x => x != null) + .ToPropertyEx(this, x => x.CanSave); + + this.WhenAnyValue(x => x.CanSave) + .Subscribe((_) => NotifyContextChanged()); } private void NotifyContextChanged() { - if (ColorStyleManager != null) - { - this.RaisePropertyChanged(nameof(Colors)); - } - SaveCommand = new Command(SaveAsync, () => Colors != null); - SaveAsCommand = new Command(SaveAsAsync, () => Colors != null); + SaveCommand = new Command(SaveAsync, () => CurrentItem != null); + SaveAsCommand = new Command(SaveAsAsync, () => CurrentItem != null); } public ICommand NewCommand { get; } public ICommand OpenCommand { get; } + public ICommand CloseCommand { get; } [Reactive] public ICommand SaveCommand { get; private set; } [Reactive] public ICommand SaveAsCommand { get; private set; } - public ICommand EditColorCommand { get; private set; } protected virtual async void NewAsync() { - if (ColorStyleManager.IsLoaded) + var result = await Dialog.DisplayRadioButtonPromptAsync( + "Create New", + new[] { "Colors", "Styles" }); + + if (result == null) { - if (!await Dialog.ConfirmAsync("Creating new!", "Unsaved Data will be lost if you continue", "Continue")) - { - return; - } + return; } - await ColorStyleManager.CreateNewAsync(); + if (result == "Colors") + { + var colorsEditorViewModel = serviceProvider.GetRequiredService(); - NotifyContextChanged(); + await colorsEditorViewModel.NewAsync(); + + Items.Add(colorsEditorViewModel); + CurrentItem = colorsEditorViewModel; + } } protected virtual async void OpenAsync() @@ -80,30 +87,33 @@ protected virtual async void OpenAsync() return; } - await ColorStyleManager.LoadAsync(fileResult.FullPath); + var colorsEditorViewModel = serviceProvider.GetRequiredService(); + + await colorsEditorViewModel.LoadAsync(fileResult.FullPath); + Items.Add(colorsEditorViewModel); + CurrentItem = colorsEditorViewModel; NotifyContextChanged(); } protected virtual async void SaveAsync() { - if (string.IsNullOrEmpty(ColorStyleManager.Path)) - { - SaveAsAsync(); - return; - } - - await ColorStyleManager.SaveAsync(ColorStyleManager.Path); + CurrentItem?.SaveAsync(); } protected virtual async void SaveAsAsync() { - await ColorStyleManager.SaveAsAsync(); + CurrentItem?.SaveAsAsync(); } - protected virtual async void EditColorAsync(object parameter) + protected virtual Task CloseAsync(object data) { - await MopupService.Instance.PushAsync(new ColorEditPopupPage(this, parameter?.ToString())); + if (data is ISavable item) + { + Items.Remove(item); + } + + return Task.CompletedTask; } public class StyleResourceFileType : FilePickerFileType diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/ViewModels/ColorsEditorViewModel.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/ViewModels/ColorsEditorViewModel.cs new file mode 100644 index 00000000..e2d8e108 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/ViewModels/ColorsEditorViewModel.cs @@ -0,0 +1,65 @@ +using Mopups.Services; +using ReactiveUI; +using ReactiveUI.Fody.Helpers; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Input; +using UraniumUI.Dialogs; +using UraniumUI.StyleBuilder.Controls; +using UraniumUI.StyleBuilder.StyleManager; + +namespace UraniumUI.StyleBuilder.ViewModels; +public class ColorsEditorViewModel : ReactiveObject, ISavable +{ + public ColorStyleManager ColorStyleManager { get; } + protected IDialogService Dialog { get; } + + public ColorPalette Colors => ColorStyleManager?.Palette; + + [Reactive] public string Title { get; protected set; } + + public ColorsEditorViewModel(ColorStyleManager colorStyleManager, IDialogService dialog) + { + ColorStyleManager = colorStyleManager; + Dialog = dialog; + EditColorCommand = new Command(EditColorAsync); + } + public ICommand EditColorCommand { get; private set; } + + protected virtual async void EditColorAsync(object parameter) + { + await MopupService.Instance.PushAsync(new ColorEditPopupPage(this, parameter?.ToString())); + } + + public async Task NewAsync() + { + await ColorStyleManager.CreateNewAsync(); + } + + public async Task LoadAsync(string path) + { + await ColorStyleManager.LoadAsync(path); + Title = path; + } + + public async Task SaveAsync() + { + if (string.IsNullOrEmpty(ColorStyleManager.Path)) + { + SaveAsAsync(); + return; + } + + await ColorStyleManager.SaveAsync(ColorStyleManager.Path); + } + + public async Task SaveAsAsync() + { + await ColorStyleManager.SaveAsAsync(); + } + + public override string ToString() => Title ?? "New Colors.xaml"; +} \ No newline at end of file diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/ViewModels/ISavable.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/ViewModels/ISavable.cs new file mode 100644 index 00000000..09df1605 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/ViewModels/ISavable.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace UraniumUI.StyleBuilder.ViewModels; +public interface ISavable +{ + Task SaveAsync(); + + Task SaveAsAsync(); + + string Title { get; } +} From 1d8cfd2e887d7c0ea2a8c27d9d2b33fb6b1a01bd Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Fri, 14 Apr 2023 01:10:52 +0300 Subject: [PATCH 07/36] Add editor per viewmodel --- .../UraniumUI.StyleBuilder/App.xaml | 3 + .../UraniumUI.StyleBuilder/MainPage.xaml | 155 +++++++++--------- .../UraniumUI.StyleBuilder/MainPage.xaml.cs | 1 + .../UraniumUI.StyleBuilder/MauiProgram.cs | 8 + .../Templating/DataTemplateOptions.cs | 14 ++ .../Templating/GenericDataTemplateSelector.cs | 26 +++ .../UraniumUI.StyleBuilder.csproj | 3 + .../Views/ColorsEditorView.xaml | 56 +++++++ .../Views/ColorsEditorView.xaml.cs | 9 + .../Views/EditorTabItem.cs | 28 ++++ 10 files changed, 228 insertions(+), 75 deletions(-) create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Templating/DataTemplateOptions.cs create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Templating/GenericDataTemplateSelector.cs create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Views/ColorsEditorView.xaml create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Views/ColorsEditorView.xaml.cs create mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Views/EditorTabItem.cs diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/App.xaml b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/App.xaml index 5fdf914c..da1a60c5 100644 --- a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/App.xaml +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/App.xaml @@ -4,6 +4,7 @@ xmlns:local="clr-namespace:UraniumUI.StyleBuilder" xmlns:converters="clr-namespace:UraniumUI.StyleBuilder.Converters" xmlns:material="clr-namespace:UraniumUI.Material.Resources;assembly=UraniumUI.Material" + xmlns:templating="clr-namespace:UraniumUI.StyleBuilder.Templating" x:Class="UraniumUI.StyleBuilder.App"> @@ -15,6 +16,8 @@ + + diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml index 6a237926..110a2fd6 100644 --- a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml @@ -7,9 +7,11 @@ xmlns:controls="clr-namespace:UraniumUI.StyleBuilder.Controls" xmlns:cp="clr-namespace:Maui.ColorPicker;assembly=Maui.ColorPicker" xmlns:vm="clr-namespace:UraniumUI.StyleBuilder.ViewModels" + xmlns:views="clr-namespace:UraniumUI.StyleBuilder.Views" x:Class="UraniumUI.StyleBuilder.MainPage" xmlns:local="clr-namespace:UraniumUI.StyleBuilder" x:Name="page" + Padding="10" x:DataType="local:MainPageViewModel"> @@ -19,93 +21,96 @@ - - - - - - - + + + + + + - - - - - - - - - + - + + + - + + + + + + - - - - - - - - + + + - - - + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml.cs index 0970341a..3ba24451 100644 --- a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml.cs +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml.cs @@ -7,6 +7,7 @@ public partial class MainPage public MainPage(MainPageViewModel viewModel) { InitializeComponent(); + BindingContext = viewModel; } } \ No newline at end of file diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MauiProgram.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MauiProgram.cs index 61eebc6f..1e810d4b 100644 --- a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MauiProgram.cs +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MauiProgram.cs @@ -1,6 +1,9 @@ using CommunityToolkit.Maui; using DotNurse.Injector; using Mopups.Hosting; +using UraniumUI.StyleBuilder.Templating; +using UraniumUI.StyleBuilder.ViewModels; +using UraniumUI.StyleBuilder.Views; namespace UraniumUI.StyleBuilder; public static class MauiProgram @@ -32,6 +35,11 @@ public static MauiApp CreateMauiApp() options => options.Assembly = thisAssembly) .AddServicesByAttributes(); + builder.Services.Configure(options => + { + options.Register(); + }); + return builder.Build(); } } diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Templating/DataTemplateOptions.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Templating/DataTemplateOptions.cs new file mode 100644 index 00000000..e4d28360 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Templating/DataTemplateOptions.cs @@ -0,0 +1,14 @@ +namespace UraniumUI.StyleBuilder.Templating; +public class DataTemplateOptions +{ + public Dictionary DataTemplates { get; } = new(); + + public DataTemplateOptions Register() + where TViewModel : class + where TView : View + { + DataTemplates.Add(typeof(TViewModel), new DataTemplate(typeof(TView))); + + return this; + } +} diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Templating/GenericDataTemplateSelector.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Templating/GenericDataTemplateSelector.cs new file mode 100644 index 00000000..efeba57e --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Templating/GenericDataTemplateSelector.cs @@ -0,0 +1,26 @@ +using Microsoft.Extensions.Options; + +namespace UraniumUI.StyleBuilder.Templating; +public class GenericDataTemplateSelector : DataTemplateSelector +{ + protected override DataTemplate OnSelectTemplate(object item, BindableObject container) + { + var options = UraniumServiceProvider.Current.GetRequiredService>().Value; + + if(options.DataTemplates.TryGetValue(item.GetType(), out var dataTemplate)) + { + return dataTemplate; + } + + throw new InvalidOperationException("DataTemplate not found in DataTemplateOptions"); + +//#if DEBUG +// return new DataTemplate(() => new Label +// { +// Text = "DataTemplate not found in DataTemplateOptions" +// }); +//#else +// throw new InvalidOperationException("DataTemplate not found in DataTemplateOptions"); +//#endif + } +} diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder.csproj b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder.csproj index ebcfb608..6348978f 100644 --- a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder.csproj +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder.csproj @@ -66,5 +66,8 @@ MSBuild:Compile + + MSBuild:Compile + diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Views/ColorsEditorView.xaml b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Views/ColorsEditorView.xaml new file mode 100644 index 00000000..c8bb0e6d --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Views/ColorsEditorView.xaml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Views/ColorsEditorView.xaml.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Views/ColorsEditorView.xaml.cs new file mode 100644 index 00000000..06188360 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Views/ColorsEditorView.xaml.cs @@ -0,0 +1,9 @@ +namespace UraniumUI.StyleBuilder.Views; + +public partial class ColorsEditorView : ScrollView +{ + public ColorsEditorView() + { + InitializeComponent(); + } +} \ No newline at end of file diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Views/EditorTabItem.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Views/EditorTabItem.cs new file mode 100644 index 00000000..eb574f54 --- /dev/null +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Views/EditorTabItem.cs @@ -0,0 +1,28 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UraniumUI.StyleBuilder.Templating; + +namespace UraniumUI.StyleBuilder.Views; +public class EditorTabItem : ContentView +{ + protected readonly DataTemplateOptions dataTemplateOptions; + public EditorTabItem() + { + dataTemplateOptions = UraniumServiceProvider.Current + .GetRequiredService>().Value; + } + + protected override void OnBindingContextChanged() + { + base.OnBindingContextChanged(); + if (dataTemplateOptions.DataTemplates.TryGetValue(BindingContext.GetType(), out var dataTemplate)) + { + this.Content = dataTemplate.CreateContent() as View; + } + } +} From a428185e41104812951fffe1a63bb9b74f32695a Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Fri, 14 Apr 2023 01:43:59 +0300 Subject: [PATCH 08/36] Fix await usage --- .../UraniumUI.StyleBuilder/MainPageViewModel.cs | 4 ++-- .../ViewModels/ColorsEditorViewModel.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPageViewModel.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPageViewModel.cs index cfe92df8..916d84fb 100644 --- a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPageViewModel.cs +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPageViewModel.cs @@ -98,12 +98,12 @@ protected virtual async void OpenAsync() protected virtual async void SaveAsync() { - CurrentItem?.SaveAsync(); + await CurrentItem?.SaveAsync(); } protected virtual async void SaveAsAsync() { - CurrentItem?.SaveAsAsync(); + await CurrentItem?.SaveAsAsync(); } protected virtual Task CloseAsync(object data) diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/ViewModels/ColorsEditorViewModel.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/ViewModels/ColorsEditorViewModel.cs index e2d8e108..ba4a549b 100644 --- a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/ViewModels/ColorsEditorViewModel.cs +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/ViewModels/ColorsEditorViewModel.cs @@ -49,7 +49,7 @@ public async Task SaveAsync() { if (string.IsNullOrEmpty(ColorStyleManager.Path)) { - SaveAsAsync(); + await SaveAsAsync(); return; } From 9090bd27ca016978539bc42d608ee5e7376b7042 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Fri, 14 Apr 2023 01:50:59 +0300 Subject: [PATCH 09/36] Fix saving issue --- .../UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml | 2 +- .../UraniumUI.StyleBuilder/StyleManager/ColorStyleManager.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml index 110a2fd6..15f9c1ad 100644 --- a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml @@ -78,7 +78,7 @@ + CurrentItem="{Binding CurrentItem, Mode=TwoWay}"> diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/StyleManager/ColorStyleManager.cs b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/StyleManager/ColorStyleManager.cs index 9f9c51fe..82c1d278 100644 --- a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/StyleManager/ColorStyleManager.cs +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/StyleManager/ColorStyleManager.cs @@ -8,7 +8,7 @@ namespace UraniumUI.StyleBuilder.StyleManager; -[RegisterAs(typeof(ColorStyleManager), ServiceLifetime.Singleton)] +[RegisterAs(typeof(ColorStyleManager))] public partial class ColorStyleManager : ReactiveObject { protected Xml.ResourceDictionary XmlNode { get; set; } From 73e7418c540b9b4b4623bbd471b3073a4510354b Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Fri, 14 Apr 2023 11:35:38 +0300 Subject: [PATCH 10/36] Memory optimizations --- .../UraniumUI.StyleBuilder/App.xaml | 6 +- .../UraniumUI.StyleBuilder/MainPage.xaml | 67 +++++++++++-------- .../MainPageViewModel.cs | 1 + .../StyleManager/ColorStyleManager.cs | 20 +++++- .../Templating/GenericDataTemplateSelector.cs | 26 ------- .../ViewModels/ColorsEditorViewModel.cs | 13 +++- .../ViewModels/ISavable.cs | 2 +- .../Views/EditorTabItem.cs | 9 +-- 8 files changed, 74 insertions(+), 70 deletions(-) delete mode 100644 tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/Templating/GenericDataTemplateSelector.cs diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/App.xaml b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/App.xaml index da1a60c5..624be593 100644 --- a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/App.xaml +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/App.xaml @@ -4,7 +4,7 @@ xmlns:local="clr-namespace:UraniumUI.StyleBuilder" xmlns:converters="clr-namespace:UraniumUI.StyleBuilder.Converters" xmlns:material="clr-namespace:UraniumUI.Material.Resources;assembly=UraniumUI.Material" - xmlns:templating="clr-namespace:UraniumUI.StyleBuilder.Templating" + xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit" x:Class="UraniumUI.StyleBuilder.App"> @@ -14,10 +14,10 @@ + - - + diff --git a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml index 15f9c1ad..dbfcab83 100644 --- a/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml +++ b/tools/UraniumUI.StyleBuilder/UraniumUI.StyleBuilder/MainPage.xaml @@ -16,6 +16,11 @@ + + + + + @@ -75,42 +80,48 @@ + + +