using System; using System.Collections.Concurrent; using System.Collections.Generic; using Avalonia.Media.Imaging; using Avalonia.Platform; using PolyTrader.Core.Modularity; namespace PolyTrader.App.Avalonia.Shell { /// /// Löst die toolkit-neutralen -Schlüssel gegen die /// Avalonia-Bildressourcen auf. Gegenstück zum gleichnamigen Helfer der WinForms-Shell – /// dieselben Schlüssel, dieselben PNG-Dateien, sodass Core und Module unverändert bleiben. /// public static class ViewIcons { /// Symbol-Schlüssel → Dateiname in Resources/ (als Avalonia-Asset eingebettet). private static readonly Dictionary FileByKey = new() { ["start"] = "dashboard.png", ["dashboard"] = "token_quantifier.png", ["settings"] = "setting_tools.png", ["terminal"] = "error_log.png", ["jobs"] = "system_time.png", ["accounting"] = "coins_in_hand.png", ["copytrading"] = "cross_reference.png", ["resolutionfarming"] = "file_start_workflow.png", ["supervisor"] = "emotion_batman.png", }; /// Standard-Symbolschlüssel je View-ID – identisch zur WinForms-Shell. private static readonly Dictionary DefaultKeyByViewId = new() { [AvaloniaUiHost.StartViewId] = "start", ["core.dashboard"] = "dashboard", ["core.settings"] = "settings", ["core.terminal"] = "terminal", ["core.jobs"] = "jobs", ["accounting.main"] = "accounting", ["copytrading.main"] = "copytrading", ["resolutionfarming.main"] = "resolutionfarming", ["supervisor.main"] = "supervisor", }; private static readonly ConcurrentDictionary Cache = new(); /// Bild zum Schlüssel, oder null (kein Symbol / Datei fehlt). public static Bitmap? Resolve(string? iconKey) { if (iconKey == null || !FileByKey.TryGetValue(iconKey, out var file)) return null; return Cache.GetOrAdd(iconKey, _ => { try { var uri = new Uri($"avares://PolyTrader.App.Avalonia/Assets/{file}"); using var stream = AssetLoader.Open(uri); return new Bitmap(stream); } catch { // Ein fehlendes Symbol darf die Oberflaeche nie aufhalten – Menueeintrag bleibt Text-only. return null; } }); } /// Setzt bei allen registrierten Views den Standard-Symbolschlüssel, falls noch keiner gesetzt ist. public static void AssignDefaults(IModuleUiHost uiHost) { foreach (var view in uiHost.Views) if (view.IconKey == null && DefaultKeyByViewId.TryGetValue(view.Id, out var key)) view.IconKey = key; } } }