using System; using System.Collections.Generic; using System.Linq; using LanMontainDesktop.ComponentSystem.Extensions; namespace LanMontainDesktop.ComponentSystem; public sealed class ComponentRegistry { private readonly Dictionary _definitions; public ComponentRegistry(IEnumerable definitions) { _definitions = definitions .Where(d => !string.IsNullOrWhiteSpace(d.Id)) .GroupBy(d => d.Id, StringComparer.OrdinalIgnoreCase) .ToDictionary(g => g.Key, g => g.Last(), StringComparer.OrdinalIgnoreCase); } public static ComponentRegistry CreateDefault() { var builtIn = new[] { new DesktopComponentDefinition( BuiltInComponentIds.Clock, "Clock", "Clock", "Status", MinWidthCells: 3, MinHeightCells: 1, AllowStatusBarPlacement: true, AllowDesktopPlacement: false), new DesktopComponentDefinition( BuiltInComponentIds.DesktopClock, "Clock", "Clock", "Clock", MinWidthCells: 2, MinHeightCells: 2, AllowStatusBarPlacement: false, AllowDesktopPlacement: true), new DesktopComponentDefinition( BuiltInComponentIds.DesktopWeatherClock, "Weather Clock", "Clock", "Clock", MinWidthCells: 2, MinHeightCells: 1, AllowStatusBarPlacement: false, AllowDesktopPlacement: true), new DesktopComponentDefinition( BuiltInComponentIds.DesktopTimer, "Timer", "Timer", "Clock", MinWidthCells: 2, MinHeightCells: 2, AllowStatusBarPlacement: false, AllowDesktopPlacement: true), new DesktopComponentDefinition( BuiltInComponentIds.DesktopWeather, "Weather", "WeatherSunny", "Weather", MinWidthCells: 2, MinHeightCells: 2, AllowStatusBarPlacement: false, AllowDesktopPlacement: true), new DesktopComponentDefinition( BuiltInComponentIds.DesktopHourlyWeather, "Hourly Weather", "WeatherSunny", "Weather", MinWidthCells: 4, MinHeightCells: 2, AllowStatusBarPlacement: false, AllowDesktopPlacement: true), new DesktopComponentDefinition( BuiltInComponentIds.DesktopMultiDayWeather, "Multi-day Weather", "WeatherSunny", "Weather", MinWidthCells: 4, MinHeightCells: 2, AllowStatusBarPlacement: false, AllowDesktopPlacement: true), new DesktopComponentDefinition( BuiltInComponentIds.DesktopExtendedWeather, "Extended Weather", "WeatherSunny", "Weather", MinWidthCells: 4, MinHeightCells: 4, AllowStatusBarPlacement: false, AllowDesktopPlacement: true), new DesktopComponentDefinition( BuiltInComponentIds.DesktopClassSchedule, "Class Schedule", "CalendarDate", "Date", MinWidthCells: 2, MinHeightCells: 4, AllowStatusBarPlacement: false, AllowDesktopPlacement: true, ResizeMode: DesktopComponentResizeMode.Free), new DesktopComponentDefinition( BuiltInComponentIds.DesktopMusicControl, "Music Control", "Play", "Media", MinWidthCells: 4, MinHeightCells: 2, AllowStatusBarPlacement: false, AllowDesktopPlacement: true), new DesktopComponentDefinition( BuiltInComponentIds.DesktopAudioRecorder, "Recorder", "MicOn", "Media", MinWidthCells: 2, MinHeightCells: 2, AllowStatusBarPlacement: false, AllowDesktopPlacement: true), new DesktopComponentDefinition( BuiltInComponentIds.DesktopDailyPoetry, "Daily Poetry", "Book", "Info", MinWidthCells: 4, MinHeightCells: 2, AllowStatusBarPlacement: false, AllowDesktopPlacement: true), new DesktopComponentDefinition( BuiltInComponentIds.DesktopDailyArtwork, "Daily Artwork", "Image", "Info", MinWidthCells: 4, MinHeightCells: 2, AllowStatusBarPlacement: false, AllowDesktopPlacement: true), new DesktopComponentDefinition( BuiltInComponentIds.DesktopWhiteboard, "Blackboard Portrait", "Edit", "Board", MinWidthCells: 2, MinHeightCells: 4, AllowStatusBarPlacement: false, AllowDesktopPlacement: true, ResizeMode: DesktopComponentResizeMode.Free), new DesktopComponentDefinition( BuiltInComponentIds.DesktopBlackboardLandscape, "Blackboard Landscape", "Edit", "Board", MinWidthCells: 4, MinHeightCells: 2, AllowStatusBarPlacement: false, AllowDesktopPlacement: true, ResizeMode: DesktopComponentResizeMode.Free), new DesktopComponentDefinition( BuiltInComponentIds.Date, "Calendar", "Calendar", "Date", MinWidthCells: 4, MinHeightCells: 2, AllowStatusBarPlacement: false, AllowDesktopPlacement: true), new DesktopComponentDefinition( BuiltInComponentIds.MonthCalendar, "Month Calendar", "CalendarMonth", "Date", MinWidthCells: 2, MinHeightCells: 2, AllowStatusBarPlacement: false, AllowDesktopPlacement: true), new DesktopComponentDefinition( BuiltInComponentIds.LunarCalendar, "Lunar Calendar", "Calendar", "Date", MinWidthCells: 2, MinHeightCells: 2, AllowStatusBarPlacement: false, AllowDesktopPlacement: true), new DesktopComponentDefinition( BuiltInComponentIds.HolidayCalendar, "Holiday Countdown", "Calendar", "Date", MinWidthCells: 2, MinHeightCells: 2, AllowStatusBarPlacement: false, AllowDesktopPlacement: true) }; return new ComponentRegistry(builtIn); } public ComponentRegistry RegisterExtensions(IEnumerable providers) { var merged = _definitions.Values.ToList(); foreach (var provider in providers) { var externalDefinitions = provider.GetComponents(); if (externalDefinitions is null) { continue; } merged.AddRange(externalDefinitions); } return new ComponentRegistry(merged); } public bool TryGetDefinition(string componentId, out DesktopComponentDefinition definition) { return _definitions.TryGetValue(componentId, out definition!); } public bool IsKnownComponent(string componentId) { return _definitions.ContainsKey(componentId); } public bool AllowsStatusBarPlacement(string componentId) { return _definitions.TryGetValue(componentId, out var definition) && definition.AllowStatusBarPlacement; } public IReadOnlyList GetAll() { return _definitions.Values.OrderBy(d => d.Category).ThenBy(d => d.DisplayName).ToList(); } }