From 5650cb8fd65c48ee31b801cd2271de6dc6fe7197 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Thu, 6 Nov 2025 06:21:35 +0100 Subject: [PATCH] AvaloniaUI --- .../Factories/BasicFactory.cs | 18 +++++++++++++ .../Pilz.UI.AvaloniaUI.Symbols.csproj | 21 +++++++++++++++ Pilz.UI.AvaloniaUI.Symbols/Symbols.cs | 13 ++++++++++ Pilz.UI.AvaloniaUI/Pilz.UI.AvaloniaUI.csproj | 21 +++++++++++++++ Pilz.UI.AvaloniaUI/Symbols/ISymbolFactory.cs | 10 +++++++ Pilz.UI.AvaloniaUI/Symbols/ISymbolProxy.cs | 8 ++++++ Pilz.UI.AvaloniaUI/Symbols/SymbolFactory.cs | 26 +++++++++++++++++++ Pilz.UI.AvaloniaUI/Symbols/SymbolProxy.cs | 11 ++++++++ Pilz.UI/Pilz.UI.csproj | 2 +- Pilz.sln | 20 ++++++++++++++ 10 files changed, 149 insertions(+), 1 deletion(-) create mode 100644 Pilz.UI.AvaloniaUI.Symbols/Factories/BasicFactory.cs create mode 100644 Pilz.UI.AvaloniaUI.Symbols/Pilz.UI.AvaloniaUI.Symbols.csproj create mode 100644 Pilz.UI.AvaloniaUI.Symbols/Symbols.cs create mode 100644 Pilz.UI.AvaloniaUI/Pilz.UI.AvaloniaUI.csproj create mode 100644 Pilz.UI.AvaloniaUI/Symbols/ISymbolFactory.cs create mode 100644 Pilz.UI.AvaloniaUI/Symbols/ISymbolProxy.cs create mode 100644 Pilz.UI.AvaloniaUI/Symbols/SymbolFactory.cs create mode 100644 Pilz.UI.AvaloniaUI/Symbols/SymbolProxy.cs diff --git a/Pilz.UI.AvaloniaUI.Symbols/Factories/BasicFactory.cs b/Pilz.UI.AvaloniaUI.Symbols/Factories/BasicFactory.cs new file mode 100644 index 0000000..fa51cae --- /dev/null +++ b/Pilz.UI.AvaloniaUI.Symbols/Factories/BasicFactory.cs @@ -0,0 +1,18 @@ +using System.Reflection; + +namespace Pilz.UI.AvaloniaUI.Symbols.Factories; + +public class BasicFactory(string baseName) : SymbolFactory where T : Enum +{ + private Assembly? assembly; + + public override Assembly GetImageResourceAssembly() + { + return assembly ??= Assembly.Load(baseName); + } + + public override string GetImageRessourcePath(T svgImage) + { + return $"{baseName}.Files.{svgImage}.svg"; + } +} diff --git a/Pilz.UI.AvaloniaUI.Symbols/Pilz.UI.AvaloniaUI.Symbols.csproj b/Pilz.UI.AvaloniaUI.Symbols/Pilz.UI.AvaloniaUI.Symbols.csproj new file mode 100644 index 0000000..a1b72cf --- /dev/null +++ b/Pilz.UI.AvaloniaUI.Symbols/Pilz.UI.AvaloniaUI.Symbols.csproj @@ -0,0 +1,21 @@ + + + + net8.0 + enable + enable + + + + 1.0.0 + + + + + + + + + + + diff --git a/Pilz.UI.AvaloniaUI.Symbols/Symbols.cs b/Pilz.UI.AvaloniaUI.Symbols/Symbols.cs new file mode 100644 index 0000000..4fb1d76 --- /dev/null +++ b/Pilz.UI.AvaloniaUI.Symbols/Symbols.cs @@ -0,0 +1,13 @@ +using Pilz.SymbolPacks.Sets; +using Pilz.UI.AvaloniaUI.Symbols.Factories; + +namespace Pilz.UI.AvaloniaUI.Symbols; + +public static class Symbols +{ + private static ISymbolFactory? color; + private static ISymbolFactory? fluent; + + public static ISymbolFactory Color => color ??= new BasicFactory("Pilz.SymbolPacks.Color"); + public static ISymbolFactory Fluent => fluent ??= new BasicFactory("Pilz.SymbolPacks.Fluent"); +} diff --git a/Pilz.UI.AvaloniaUI/Pilz.UI.AvaloniaUI.csproj b/Pilz.UI.AvaloniaUI/Pilz.UI.AvaloniaUI.csproj new file mode 100644 index 0000000..59bba67 --- /dev/null +++ b/Pilz.UI.AvaloniaUI/Pilz.UI.AvaloniaUI.csproj @@ -0,0 +1,21 @@ + + + + net8.0 + enable + enable + + + + 1.0.0 + + + + + + + + + + + diff --git a/Pilz.UI.AvaloniaUI/Symbols/ISymbolFactory.cs b/Pilz.UI.AvaloniaUI/Symbols/ISymbolFactory.cs new file mode 100644 index 0000000..ab9a2b5 --- /dev/null +++ b/Pilz.UI.AvaloniaUI/Symbols/ISymbolFactory.cs @@ -0,0 +1,10 @@ +using Avalonia.Media; +using Pilz.UI.Symbols; + +namespace Pilz.UI.AvaloniaUI.Symbols; + +public interface ISymbolFactory : IBaseSymbolFactory +{ + IImage? GetImageSource(TSymbols image); + ISymbolProxy GetImage(TSymbols image); +} \ No newline at end of file diff --git a/Pilz.UI.AvaloniaUI/Symbols/ISymbolProxy.cs b/Pilz.UI.AvaloniaUI/Symbols/ISymbolProxy.cs new file mode 100644 index 0000000..b5b6b73 --- /dev/null +++ b/Pilz.UI.AvaloniaUI/Symbols/ISymbolProxy.cs @@ -0,0 +1,8 @@ +using Avalonia.Media; + +namespace Pilz.UI.AvaloniaUI.Symbols; + +public interface ISymbolProxy +{ + IImage? GetImageSource(); +} diff --git a/Pilz.UI.AvaloniaUI/Symbols/SymbolFactory.cs b/Pilz.UI.AvaloniaUI/Symbols/SymbolFactory.cs new file mode 100644 index 0000000..5b06243 --- /dev/null +++ b/Pilz.UI.AvaloniaUI/Symbols/SymbolFactory.cs @@ -0,0 +1,26 @@ +using Avalonia.Media; +using Avalonia.Svg; +using Pilz.UI.Symbols; + +namespace Pilz.UI.AvaloniaUI.Symbols; + +public abstract class SymbolFactory : BaseSymbolFactory, ISymbolFactory +{ + public IImage? GetImageSource(TSymbols image) + { + using var stream = GetImageRessourceStream(image); + + if (stream is null) + return null; + + return new SvgImage + { + Source = SvgSource.Load(stream), + }; + } + + public ISymbolProxy GetImage(TSymbols image) + { + return new SymbolProxy(this, image); + } +} diff --git a/Pilz.UI.AvaloniaUI/Symbols/SymbolProxy.cs b/Pilz.UI.AvaloniaUI/Symbols/SymbolProxy.cs new file mode 100644 index 0000000..7f822f1 --- /dev/null +++ b/Pilz.UI.AvaloniaUI/Symbols/SymbolProxy.cs @@ -0,0 +1,11 @@ +using Avalonia.Media; + +namespace Pilz.UI.AvaloniaUI.Symbols; + +public class SymbolProxy(SymbolFactory factory, TSymbols image) : ISymbolProxy +{ + public IImage? GetImageSource() + { + return factory.GetImageSource(image); + } +} diff --git a/Pilz.UI/Pilz.UI.csproj b/Pilz.UI/Pilz.UI.csproj index 0db80bf..5d0cf6e 100644 --- a/Pilz.UI/Pilz.UI.csproj +++ b/Pilz.UI/Pilz.UI.csproj @@ -8,7 +8,7 @@ - 3.1.0 + 3.1.1 diff --git a/Pilz.sln b/Pilz.sln index a04d9c0..7d64e6a 100644 --- a/Pilz.sln +++ b/Pilz.sln @@ -53,6 +53,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Pilz.UI", "Pilz.UI\Pilz.UI. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Pilz.Plugins.Advanced.UI.Gtk", "Pilz.Plugins.Advanced.UI.Gtk\Pilz.Plugins.Advanced.UI.Gtk.csproj", "{F9CA6B5C-F14F-418D-9617-6007ED75E82F}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Pilz.UI.AvaloniaUI.Symbols", "Pilz.UI.AvaloniaUI.Symbols\Pilz.UI.AvaloniaUI.Symbols.csproj", "{C425EA21-F478-4FDB-B05D-5AE2A2FE1865}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Pilz.UI.AvaloniaUI", "Pilz.UI.AvaloniaUI\Pilz.UI.AvaloniaUI.csproj", "{919DC195-50C2-48AE-9885-94897B3DC5B4}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -261,6 +265,22 @@ Global {F9CA6B5C-F14F-418D-9617-6007ED75E82F}.Release|Any CPU.Build.0 = Release|Any CPU {F9CA6B5C-F14F-418D-9617-6007ED75E82F}.Release|x86.ActiveCfg = Release|Any CPU {F9CA6B5C-F14F-418D-9617-6007ED75E82F}.Release|x86.Build.0 = Release|Any CPU + {C425EA21-F478-4FDB-B05D-5AE2A2FE1865}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C425EA21-F478-4FDB-B05D-5AE2A2FE1865}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C425EA21-F478-4FDB-B05D-5AE2A2FE1865}.Debug|x86.ActiveCfg = Debug|Any CPU + {C425EA21-F478-4FDB-B05D-5AE2A2FE1865}.Debug|x86.Build.0 = Debug|Any CPU + {C425EA21-F478-4FDB-B05D-5AE2A2FE1865}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C425EA21-F478-4FDB-B05D-5AE2A2FE1865}.Release|Any CPU.Build.0 = Release|Any CPU + {C425EA21-F478-4FDB-B05D-5AE2A2FE1865}.Release|x86.ActiveCfg = Release|Any CPU + {C425EA21-F478-4FDB-B05D-5AE2A2FE1865}.Release|x86.Build.0 = Release|Any CPU + {919DC195-50C2-48AE-9885-94897B3DC5B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {919DC195-50C2-48AE-9885-94897B3DC5B4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {919DC195-50C2-48AE-9885-94897B3DC5B4}.Debug|x86.ActiveCfg = Debug|Any CPU + {919DC195-50C2-48AE-9885-94897B3DC5B4}.Debug|x86.Build.0 = Debug|Any CPU + {919DC195-50C2-48AE-9885-94897B3DC5B4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {919DC195-50C2-48AE-9885-94897B3DC5B4}.Release|Any CPU.Build.0 = Release|Any CPU + {919DC195-50C2-48AE-9885-94897B3DC5B4}.Release|x86.ActiveCfg = Release|Any CPU + {919DC195-50C2-48AE-9885-94897B3DC5B4}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE