diff --git a/Daybreak.Shared/Converters/ThemeJsonConverter.cs b/Daybreak.Shared/Converters/ThemeJsonConverter.cs index 4c4c61e4..a5125bf3 100644 --- a/Daybreak.Shared/Converters/ThemeJsonConverter.cs +++ b/Daybreak.Shared/Converters/ThemeJsonConverter.cs @@ -1,4 +1,4 @@ -using Daybreak.Shared.Models; +using Daybreak.Shared.Models.Themes; using Daybreak.Shared.Services.Themes; using Newtonsoft.Json; diff --git a/Daybreak.Shared/Models/ScreenshotEntry.cs b/Daybreak.Shared/Models/ScreenshotEntry.cs index 75233eac..a91a1720 100644 --- a/Daybreak.Shared/Models/ScreenshotEntry.cs +++ b/Daybreak.Shared/Models/ScreenshotEntry.cs @@ -1,5 +1,5 @@ using Daybreak.Shared.Models.ColorPalette; -using static Daybreak.Shared.Models.Theme; +using static Daybreak.Shared.Models.Themes.Theme; namespace Daybreak.Shared.Models; diff --git a/Daybreak.Shared/Models/Themes/EmbedBackground.cs b/Daybreak.Shared/Models/Themes/EmbedBackground.cs new file mode 100644 index 00000000..121abe92 --- /dev/null +++ b/Daybreak.Shared/Models/Themes/EmbedBackground.cs @@ -0,0 +1,7 @@ +namespace Daybreak.Shared.Models.Themes; + +public sealed class EmbedBackground(string embedCode) + : IAppBackground +{ + public string EmbedCode { get; } = embedCode; +} diff --git a/Daybreak.Shared/Models/Themes/IAppBackground.cs b/Daybreak.Shared/Models/Themes/IAppBackground.cs new file mode 100644 index 00000000..ad6ffd05 --- /dev/null +++ b/Daybreak.Shared/Models/Themes/IAppBackground.cs @@ -0,0 +1,9 @@ +namespace Daybreak.Shared.Models.Themes; + +/// +/// Tells the app how to display the background. +/// Implemented in and +/// +public interface IAppBackground +{ +} diff --git a/Daybreak.Shared/Models/Themes/StaticBackground.cs b/Daybreak.Shared/Models/Themes/StaticBackground.cs new file mode 100644 index 00000000..f65314e5 --- /dev/null +++ b/Daybreak.Shared/Models/Themes/StaticBackground.cs @@ -0,0 +1,7 @@ +namespace Daybreak.Shared.Models.Themes; + +public sealed class StaticBackground(string backdropImage) + : IAppBackground +{ + public string BackdropImage { get; } = backdropImage; +} diff --git a/Daybreak.Shared/Models/Theme.cs b/Daybreak.Shared/Models/Themes/Theme.cs similarity index 70% rename from Daybreak.Shared/Models/Theme.cs rename to Daybreak.Shared/Models/Themes/Theme.cs index 3037986c..4769c13b 100644 --- a/Daybreak.Shared/Models/Theme.cs +++ b/Daybreak.Shared/Models/Themes/Theme.cs @@ -2,9 +2,14 @@ using Daybreak.Shared.Models.ColorPalette; using Newtonsoft.Json; -namespace Daybreak.Shared.Models; +namespace Daybreak.Shared.Models.Themes; [JsonConverter(typeof(ThemeJsonConverter))] -public class Theme(string name, AccentColor accentColor, string backdrop, Theme.LightDarkMode mode, string filter) +public class Theme( + string name, + AccentColor accentColor, + IAppBackground background, + Theme.LightDarkMode mode, + string filter) { public enum LightDarkMode { @@ -15,7 +20,7 @@ public class Theme(string name, AccentColor accentColor, string backdrop, Theme. public string Name { get; init; } = name; public AccentColor AccentColor { get; internal set; } = accentColor; - public string Backdrop { get; internal set; } = backdrop; + public IAppBackground Background { get; internal set; } = background; public LightDarkMode Mode { get; internal set; } = mode; public string Filter { get; internal set; } = filter; diff --git a/Daybreak.Shared/Services/Themes/GameScreenshotsTheme.cs b/Daybreak.Shared/Services/Themes/GameScreenshotsTheme.cs index fe0ff57c..7cd2307c 100644 --- a/Daybreak.Shared/Services/Themes/GameScreenshotsTheme.cs +++ b/Daybreak.Shared/Services/Themes/GameScreenshotsTheme.cs @@ -1,5 +1,5 @@ -using Daybreak.Shared.Models; -using Daybreak.Shared.Models.ColorPalette; +using Daybreak.Shared.Models.ColorPalette; +using Daybreak.Shared.Models.Themes; using Daybreak.Shared.Services.Screenshots; using System.Windows.Extensions.Services; @@ -12,7 +12,7 @@ namespace Daybreak.Shared.Services.Themes; public sealed class GameScreenshotsTheme( IThemeManager themeManager, IScreenshotService screenshotService) - : Theme(ThemeName, AccentColor.Orange, string.Empty, LightDarkMode.SystemSynchronized, string.Empty), IApplicationLifetimeService + : Theme(ThemeName, AccentColor.Orange, new StaticBackground(string.Empty), LightDarkMode.SystemSynchronized, string.Empty), IApplicationLifetimeService { public const string ThemeName = "Dynamic Screenshots"; @@ -37,7 +37,7 @@ public sealed class GameScreenshotsTheme( } this.AccentColor = entry.AccentColor; - this.Backdrop = entry.FilePath; + this.Background = new StaticBackground(entry.FilePath); this.Mode = entry.LightDarkMode; this.Filter = entry.LightDarkMode is LightDarkMode.Light ? "blur(3px) brightness(1.3) sepia(0.2) saturate(1.2)" diff --git a/Daybreak.Shared/Services/Themes/IThemeManager.cs b/Daybreak.Shared/Services/Themes/IThemeManager.cs index 3028b69e..f09b7223 100644 --- a/Daybreak.Shared/Services/Themes/IThemeManager.cs +++ b/Daybreak.Shared/Services/Themes/IThemeManager.cs @@ -1,5 +1,5 @@ -using Daybreak.Shared.Models; -using Daybreak.Shared.Models.ColorPalette; +using Daybreak.Shared.Models.ColorPalette; +using Daybreak.Shared.Models.Themes; namespace Daybreak.Shared.Services.Themes; public interface IThemeManager @@ -12,7 +12,8 @@ public interface IThemeManager string AccentBaseColorHex { get; } string NeutralBaseColorHex { get; } float BaseLayerLuminance { get; } - string BackdropImage { get; } + string? BackdropImage { get; } + string? BackdropEmbed { get; } double UIScale { get; } double XXSmallFontSize { get; } double XSmallFontSize { get; } diff --git a/Daybreak.Shared/Services/Themes/IThemeProducer.cs b/Daybreak.Shared/Services/Themes/IThemeProducer.cs index 95248dd2..4c496eb8 100644 --- a/Daybreak.Shared/Services/Themes/IThemeProducer.cs +++ b/Daybreak.Shared/Services/Themes/IThemeProducer.cs @@ -1,4 +1,4 @@ -using Daybreak.Shared.Models; +using Daybreak.Shared.Models.Themes; namespace Daybreak.Shared.Services.Themes; public interface IThemeProducer diff --git a/Daybreak/Attributes/DaybreakThemeOptionsAttribute.cs b/Daybreak/Attributes/DaybreakThemeOptionsAttribute.cs index 58afe0e4..2aee07de 100644 --- a/Daybreak/Attributes/DaybreakThemeOptionsAttribute.cs +++ b/Daybreak/Attributes/DaybreakThemeOptionsAttribute.cs @@ -1,5 +1,5 @@ using Daybreak.Shared.Attributes; -using Daybreak.Shared.Models; +using Daybreak.Shared.Models.Themes; namespace Daybreak.Attributes; public sealed class DaybreakThemeOptionsAttribute : OptionValuesFactoryAttribute diff --git a/Daybreak/Configuration/Options/ThemeOptions.cs b/Daybreak/Configuration/Options/ThemeOptions.cs index faf1328f..1502dfcd 100644 --- a/Daybreak/Configuration/Options/ThemeOptions.cs +++ b/Daybreak/Configuration/Options/ThemeOptions.cs @@ -1,6 +1,6 @@ using Daybreak.Attributes; using Daybreak.Shared.Attributes; -using Daybreak.Shared.Models; +using Daybreak.Shared.Models.Themes; using Daybreak.Themes; namespace Daybreak.Configuration.Options; diff --git a/Daybreak/Configuration/ProjectConfiguration.cs b/Daybreak/Configuration/ProjectConfiguration.cs index 052293d9..552df60b 100644 --- a/Daybreak/Configuration/ProjectConfiguration.cs +++ b/Daybreak/Configuration/ProjectConfiguration.cs @@ -447,12 +447,10 @@ public class ProjectConfiguration : PluginConfigurationBase public override void RegisterThemes(IThemeProducer themeProducer) { themeProducer.ThrowIfNull(); - foreach (var theme in CoreThemes.Themes) - { - themeProducer.RegisterTheme(theme); - } - - foreach (var theme in HeroThemes.Themes) + var themes = CoreThemes.Themes + .Concat(HeroThemes.Themes) + .Concat(LiveThemes.Themes); + foreach (var theme in themes) { themeProducer.RegisterTheme(theme); } diff --git a/Daybreak/Launch/SplashWindow.xaml.cs b/Daybreak/Launch/SplashWindow.xaml.cs index d828b8bd..a498b49b 100644 --- a/Daybreak/Launch/SplashWindow.xaml.cs +++ b/Daybreak/Launch/SplashWindow.xaml.cs @@ -1,6 +1,7 @@ using Daybreak.Configuration.Options; using Daybreak.Shared.Models; using Daybreak.Shared.Models.ColorPalette; +using Daybreak.Shared.Models.Themes; using Daybreak.Themes; using Microsoft.Extensions.Options; using System.ComponentModel; diff --git a/Daybreak/Services/Screenshots/ScreenshotService.cs b/Daybreak/Services/Screenshots/ScreenshotService.cs index 667f041a..6485a4f6 100644 --- a/Daybreak/Services/Screenshots/ScreenshotService.cs +++ b/Daybreak/Services/Screenshots/ScreenshotService.cs @@ -4,7 +4,7 @@ using System.IO; using Daybreak.Shared.Models; using Daybreak.Shared.Models.ColorPalette; using Daybreak.Shared.Services.Screenshots; -using static Daybreak.Shared.Models.Theme; +using static Daybreak.Shared.Models.Themes.Theme; namespace Daybreak.Services.Screenshots; diff --git a/Daybreak/Services/Themes/BlazorThemeInteropService.cs b/Daybreak/Services/Themes/BlazorThemeInteropService.cs index 613b91b5..ea27c93e 100644 --- a/Daybreak/Services/Themes/BlazorThemeInteropService.cs +++ b/Daybreak/Services/Themes/BlazorThemeInteropService.cs @@ -1,6 +1,6 @@ using Daybreak.Configuration.Options; -using Daybreak.Shared.Models; using Daybreak.Shared.Models.ColorPalette; +using Daybreak.Shared.Models.Themes; using Daybreak.Shared.Services.Options; using Daybreak.Shared.Services.Themes; using Daybreak.Themes; @@ -39,7 +39,8 @@ public class BlazorThemeInteropService( public BackgroundColor NeutralBaseColor { get; private set; } = BackgroundColor.Gray40; public string AccentBaseColorHex { get; private set; } = string.Empty; public string NeutralBaseColorHex { get; private set; } = string.Empty; - public string BackdropImage { get; private set; } = string.Empty; + public string? BackdropImage { get; private set; } + public string? BackdropEmbed { get; private set; } public float BaseLayerLuminance { get; private set; } = 0.0f; public double UIScale { get; private set; } = 1.0; public double XXSmallFontSize { get; private set; } = XXSmallFontSizeValue; @@ -83,7 +84,8 @@ public class BlazorThemeInteropService( var backgroundColor = lightMode ? BackgroundColor.Gray40 : BackgroundColor.Gray210; var baseLayerLuminance = lightMode ? 0.98f : 0.23f; this.CurrentTheme = theme; - this.BackdropImage = theme.Backdrop; + this.BackdropImage = theme.Background is StaticBackground staticBackground ? staticBackground.BackdropImage : default; + this.BackdropEmbed = theme.Background is EmbedBackground embeddedBackground ? embeddedBackground.EmbedCode : default; this.IsLightMode = lightMode; this.AccentBaseColor = accentColor; this.AccentBaseColorHex = accentColor.Hex; diff --git a/Daybreak/Themes/CoreThemes.cs b/Daybreak/Themes/CoreThemes.cs index 87a9efe2..6cf244dd 100644 --- a/Daybreak/Themes/CoreThemes.cs +++ b/Daybreak/Themes/CoreThemes.cs @@ -1,22 +1,21 @@ -using Daybreak.Shared.Models; -using Daybreak.Shared.Models.ColorPalette; -using static Daybreak.Shared.Models.Theme; +using Daybreak.Shared.Models.ColorPalette; +using Daybreak.Shared.Models.Themes; +using static Daybreak.Shared.Models.Themes.Theme; namespace Daybreak.Themes; public static class CoreThemes { - public static readonly Theme Daybreak = new("Daybreak", AccentColor.Yellow, "img/backdrops/daybreak.png", LightDarkMode.Light, string.Empty); - public static readonly Theme Nightfall = new("Nightfall", AccentColor.DarkGreen, "img/backdrops/nightfall.png", LightDarkMode.Dark, string.Empty); - public static readonly Theme WhiteMantle = new("White Mantle", AccentColor.Red, "img/backdrops/whitemantle.png", LightDarkMode.Dark, string.Empty); - public static readonly Theme ShiningBlade = new("Shining Blade", AccentColor.DarkGreen, "img/backdrops/shiningblade.png", LightDarkMode.Dark, string.Empty); - public static readonly Theme Jade = new("Jade", AccentColor.LightTeal, "img/backdrops/jade.png", LightDarkMode.Light, string.Empty); - public static readonly Theme HarbingerOfTheDeceiver = new("Harbinger of the Deceiver", AccentColor.DarkPurple, "img/backdrops/harbinger.png", LightDarkMode.Dark, string.Empty); + public static readonly Theme Daybreak = new("Daybreak", AccentColor.Yellow, new StaticBackground("img/backdrops/daybreak.png"), LightDarkMode.Light, string.Empty); + public static readonly Theme Nightfall = new("Nightfall", AccentColor.DarkGreen, new StaticBackground("img/backdrops/nightfall.png"), LightDarkMode.Dark, string.Empty); + public static readonly Theme WhiteMantle = new("White Mantle", AccentColor.Red, new StaticBackground("img/backdrops/whitemantle.png"), LightDarkMode.Dark, string.Empty); + public static readonly Theme ShiningBlade = new("Shining Blade", AccentColor.DarkGreen, new StaticBackground("img/backdrops/shiningblade.png"), LightDarkMode.Dark, string.Empty); + public static readonly Theme Jade = new("Jade", AccentColor.LightTeal, new StaticBackground("img/backdrops/jade.png"), LightDarkMode.Light, string.Empty); public static readonly IReadOnlyList Themes = [ Daybreak, Nightfall, WhiteMantle, ShiningBlade, - Jade + Jade, ]; } diff --git a/Daybreak/Themes/EmbeddedBackgrounds.cs b/Daybreak/Themes/EmbeddedBackgrounds.cs new file mode 100644 index 00000000..a041d3b6 --- /dev/null +++ b/Daybreak/Themes/EmbeddedBackgrounds.cs @@ -0,0 +1,6 @@ +namespace Daybreak.Themes; + +public static class EmbeddedBackgrounds +{ + public const string EyeOfTheNorth = @""; +} diff --git a/Daybreak/Themes/HeroThemes.cs b/Daybreak/Themes/HeroThemes.cs index 916f5cd1..8a1e310e 100644 --- a/Daybreak/Themes/HeroThemes.cs +++ b/Daybreak/Themes/HeroThemes.cs @@ -1,15 +1,15 @@ -using Daybreak.Shared.Models; -using Daybreak.Shared.Models.ColorPalette; -using static Daybreak.Shared.Models.Theme; +using Daybreak.Shared.Models.ColorPalette; +using Daybreak.Shared.Models.Themes; +using static Daybreak.Shared.Models.Themes.Theme; namespace Daybreak.Themes; public static class HeroThemes { - public static readonly Theme Abaddon = new("Abaddon", AccentColor.OrangeLight, "img/backdrops/abaddon.png", LightDarkMode.Dark, string.Empty); - public static readonly Theme Gwen = new("Gwen", AccentColor.Purple, "img/backdrops/gwen2.png", LightDarkMode.Dark, string.Empty); - public static readonly Theme ZeiRi = new("Zei Ri", AccentColor.DarkTeal, "img/backdrops/zei-ri.png", LightDarkMode.Light, string.Empty); - public static readonly Theme Livia = new("Livia", AccentColor.DarkRed, "img/backdrops/livia.png", LightDarkMode.Light, string.Empty); - public static readonly Theme Razah = new("Razah", AccentColor.LightBlue, "img/backdrops/razah.png", LightDarkMode.Light, string.Empty); + public static readonly Theme Abaddon = new("Abaddon", AccentColor.OrangeLight, new StaticBackground("img/backdrops/abaddon.png"), LightDarkMode.Dark, string.Empty); + public static readonly Theme Gwen = new("Gwen", AccentColor.Purple, new StaticBackground("img/backdrops/gwen.png"), LightDarkMode.Dark, string.Empty); + public static readonly Theme ZeiRi = new("Zei Ri", AccentColor.DarkTeal, new StaticBackground("img/backdrops/zei-ri.png"), LightDarkMode.Light, string.Empty); + public static readonly Theme Livia = new("Livia", AccentColor.DarkRed, new StaticBackground("img/backdrops/livia.png"), LightDarkMode.Light, string.Empty); + public static readonly Theme Razah = new("Razah", AccentColor.LightBlue, new StaticBackground("img/backdrops/razah.png"), LightDarkMode.Light, string.Empty); public static readonly IReadOnlyList Themes = [ Abaddon, diff --git a/Daybreak/Themes/LiveThemes.cs b/Daybreak/Themes/LiveThemes.cs new file mode 100644 index 00000000..3f11f977 --- /dev/null +++ b/Daybreak/Themes/LiveThemes.cs @@ -0,0 +1,14 @@ +using Daybreak.Shared.Models.ColorPalette; +using Daybreak.Shared.Models.Themes; +using static Daybreak.Shared.Models.Themes.Theme; + +namespace Daybreak.Themes; + +public static class LiveThemes +{ + public static readonly Theme EotN = new("Eye of the North", AccentColor.LightBlue, new EmbedBackground(EmbeddedBackgrounds.EyeOfTheNorth), LightDarkMode.Light, string.Empty); + + public static readonly IReadOnlyList Themes = [ + EotN, + ]; +} diff --git a/Daybreak/Views/App.razor b/Daybreak/Views/App.razor index 3f85e35f..7b845817 100644 --- a/Daybreak/Views/App.razor +++ b/Daybreak/Views/App.razor @@ -5,8 +5,7 @@ BaseLayerLuminance="@this.ViewModel.BaseLayerLuminace"> $"--accent-{c.Name.ToString().ToLower()}: {c.Hex}")))"> + @if (!string.IsNullOrWhiteSpace(this.ViewModel.BackdropEmbed)) + { + + @((MarkupString)this.ViewModel.BackdropEmbed) + + }