Added Mac OS 9 inspired theme.

This commit is contained in:
2025-11-16 18:59:23 +00:00
parent c1c6e427c2
commit ac460cb050
7 changed files with 223 additions and 51 deletions

View File

@@ -1,29 +1,31 @@
using System.Collections.Generic;
using System.Linq;
using Uno.Extensions.Toolkit;
using System.Threading.Tasks;
using Marechai.App.Services;
using Uno.Extensions.Toolkit;
namespace Marechai.App.Presentation.ViewModels;
public partial class SettingsViewModel : ObservableObject
{
private readonly IColorThemeService _colorThemeService;
private readonly IStringLocalizer _localizer;
private readonly IThemeService _themeService;
private readonly IColorThemeService _colorThemeService;
[ObservableProperty]
private List<ThemeOption> _availableThemes = new();
[ObservableProperty]
private ThemeOption _selectedTheme;
[ObservableProperty]
private List<ColorThemeOption> _availableColorThemes = new();
[ObservableProperty]
private List<ThemeOption> _availableThemes = new();
[ObservableProperty]
private ColorThemeOption _selectedColorTheme;
public SettingsViewModel(IStringLocalizer localizer, IThemeService themeService, IColorThemeService colorThemeService)
[ObservableProperty]
private ThemeOption _selectedTheme;
public SettingsViewModel(IStringLocalizer localizer, IThemeService themeService,
IColorThemeService colorThemeService)
{
_localizer = localizer;
_themeService = themeService;
@@ -37,7 +39,9 @@ public partial class SettingsViewModel : ObservableObject
_ = InitializeThemeServiceAsync();
}
private async System.Threading.Tasks.Task InitializeThemeServiceAsync()
public string Title { get; }
private async Task InitializeThemeServiceAsync()
{
try
{
@@ -52,23 +56,46 @@ public partial class SettingsViewModel : ObservableObject
}
}
public string Title { get; }
private void InitializeOptions()
{
// Initialize Light/Dark/System Themes
AvailableThemes = new List<ThemeOption>
{
new() { Theme = AppTheme.Light, DisplayName = _localizer["LightTheme"] },
new() { Theme = AppTheme.Dark, DisplayName = _localizer["DarkTheme"] },
new() { Theme = AppTheme.System, DisplayName = _localizer["SystemTheme"] }
new()
{
Theme = AppTheme.Light,
DisplayName = _localizer["LightTheme"]
},
new()
{
Theme = AppTheme.Dark,
DisplayName = _localizer["DarkTheme"]
},
new()
{
Theme = AppTheme.System,
DisplayName = _localizer["SystemTheme"]
}
};
// Initialize Color Themes
AvailableColorThemes = new List<ColorThemeOption>
{
new() { ThemeName = "Default", DisplayName = _localizer["DefaultColorTheme"] },
new() { ThemeName = "Windows311", DisplayName = _localizer["Windows311Theme"] }
new()
{
ThemeName = "Default",
DisplayName = _localizer["DefaultColorTheme"]
},
new()
{
ThemeName = "Windows311",
DisplayName = _localizer["Windows311Theme"]
},
new()
{
ThemeName = "MacOS9",
DisplayName = _localizer["MacOS9Theme"]
}
};
// Try to load saved preferences
@@ -80,39 +107,33 @@ public partial class SettingsViewModel : ObservableObject
try
{
// Load current theme from ThemeService
var currentTheme = _themeService.Theme;
SelectedTheme = AvailableThemes.FirstOrDefault(t => t.Theme == currentTheme)
?? AvailableThemes.FirstOrDefault(t => t.Theme == AppTheme.System)
?? AvailableThemes.First();
AppTheme currentTheme = _themeService.Theme;
SelectedTheme = AvailableThemes.FirstOrDefault(t => t.Theme == currentTheme) ??
AvailableThemes.FirstOrDefault(t => t.Theme == AppTheme.System) ?? AvailableThemes.First();
// Load current color theme
var currentColorTheme = _colorThemeService.CurrentColorTheme;
SelectedColorTheme = AvailableColorThemes.FirstOrDefault(t => t.ThemeName == currentColorTheme)
?? AvailableColorThemes.First();
string currentColorTheme = _colorThemeService.CurrentColorTheme;
SelectedColorTheme = AvailableColorThemes.FirstOrDefault(t => t.ThemeName == currentColorTheme) ??
AvailableColorThemes.First();
}
catch
{
// If loading fails, use defaults
SelectedTheme = AvailableThemes.FirstOrDefault(t => t.Theme == AppTheme.System)
?? AvailableThemes.First();
SelectedTheme = AvailableThemes.FirstOrDefault(t => t.Theme == AppTheme.System) ?? AvailableThemes.First();
SelectedColorTheme = AvailableColorThemes.First();
}
}
partial void OnSelectedThemeChanged(ThemeOption value)
{
if (value != null)
{
ApplyTheme(value);
}
if(value != null) ApplyTheme(value);
}
partial void OnSelectedColorThemeChanged(ColorThemeOption value)
{
if (value != null)
{
ApplyColorTheme(value);
}
if(value != null) ApplyColorTheme(value);
}
private async void ApplyTheme(ThemeOption theme)

View File

@@ -33,7 +33,8 @@ public class ColorThemeService : IColorThemeService
public IReadOnlyList<string> AvailableColorThemes => new List<string>
{
DEFAULT_THEME,
"Windows311"
"Windows311",
"MacOS9"
};
public void SetThemeService(IThemeService themeService)
@@ -74,7 +75,7 @@ public class ColorThemeService : IColorThemeService
// Store the existing merged dictionaries (except color overrides)
var existingDictionaries = app.Resources.MergedDictionaries
.Where(d => d.Source?.OriginalString?.Contains("ColorPaletteOverride") != true)
.Where(d => d.Source?.OriginalString?.Contains("ColorPalette") != true)
.ToList();
// Clear all merged dictionaries
@@ -85,14 +86,24 @@ public class ColorThemeService : IColorThemeService
// Add the new color theme if not default
if(themeName != DEFAULT_THEME)
{
string themeFile = themeName switch
{
"Windows311" => "ms-appx:///Styles/Win311ColorPalette.xaml",
"MacOS9" => "ms-appx:///Styles/MacOS9ColorPalette.xaml",
_ => null
};
if(themeFile != null)
{
var newDictionary = new ResourceDictionary
{
Source = new Uri("ms-appx:///Styles/ColorPaletteOverride.xaml")
Source = new Uri(themeFile)
};
app.Resources.MergedDictionaries.Add(newDictionary);
}
}
// Force UI refresh by toggling the theme temporarily
ForceThemeRefresh();

View File

@@ -200,6 +200,9 @@
<data name="Windows311Theme" xml:space="preserve">
<value>Windows 3.11</value>
</data>
<data name="MacOS9Theme" xml:space="preserve">
<value>Mac OS 9</value>
</data>
<data name="SettingsPage_BrightnessThemeSelector.Header" xml:space="preserve">
<value>Brightness</value>
</data>

View File

@@ -200,6 +200,9 @@
<data name="Windows311Theme" xml:space="preserve">
<value>Windows 3.11</value>
</data>
<data name="MacOS9Theme" xml:space="preserve">
<value>Mac OS 9</value>
</data>
<data name="SettingsPage_BrightnessThemeSelector.Header" xml:space="preserve">
<value>Brillo</value>
</data>

View File

@@ -200,6 +200,9 @@
<data name="Windows311Theme" xml:space="preserve">
<value>Windows 3.11</value>
</data>
<data name="MacOS9Theme" xml:space="preserve">
<value>Mac OS 9</value>
</data>
<data name="SettingsPage_BrightnessThemeSelector.Header" xml:space="preserve">
<value>Luminosité</value>
</data>

View File

@@ -200,6 +200,9 @@
<data name="Windows311Theme" xml:space="preserve">
<value>Windows 3.11</value>
</data>
<data name="MacOS9Theme" xml:space="preserve">
<value>Mac OS 9</value>
</data>
<data name="SettingsPage_BrightnessThemeSelector.Header" xml:space="preserve">
<value>Brilho</value>
</data>

View File

@@ -0,0 +1,128 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- Mac OS 9 Platinum Theme -->
<!-- Black text on white/platinum backgrounds throughout -->
<!-- System Accent - Mac OS 9 Purple -->
<Color x:Key="SystemAccentColor">#5856D6</Color>
<Color x:Key="SystemAccentColorLight1">#7776E8</Color>
<Color x:Key="SystemAccentColorLight2">#9695F0</Color>
<Color x:Key="SystemAccentColorLight3">#B5B4F8</Color>
<Color x:Key="SystemAccentColorDark1">#4443B5</Color>
<Color x:Key="SystemAccentColorDark2">#333294</Color>
<Color x:Key="SystemAccentColorDark3">#222173</Color>
<!-- ALL TEXT - BLACK -->
<SolidColorBrush x:Key="TextFillColorPrimaryBrush" Color="#000000" />
<SolidColorBrush x:Key="TextFillColorSecondaryBrush" Color="#000000" />
<SolidColorBrush x:Key="TextFillColorTertiaryBrush" Color="#000000" />
<SolidColorBrush x:Key="TextFillColorDisabledBrush" Color="#999999" />
<SolidColorBrush x:Key="TextControlForeground" Color="#000000" />
<SolidColorBrush x:Key="TextControlForegroundPointerOver" Color="#000000" />
<SolidColorBrush x:Key="TextControlForegroundFocused" Color="#000000" />
<SolidColorBrush x:Key="TextControlForegroundDisabled" Color="#999999" />
<SolidColorBrush x:Key="TextControlPlaceholderForeground" Color="#666666" />
<SolidColorBrush x:Key="TextControlPlaceholderForegroundPointerOver" Color="#666666" />
<SolidColorBrush x:Key="TextControlPlaceholderForegroundFocused" Color="#666666" />
<SolidColorBrush x:Key="TextControlHeaderForeground" Color="#000000" />
<!-- Button Text -->
<SolidColorBrush x:Key="ButtonForeground" Color="#000000" />
<SolidColorBrush x:Key="ButtonForegroundPointerOver" Color="#000000" />
<SolidColorBrush x:Key="ButtonForegroundPressed" Color="#000000" />
<SolidColorBrush x:Key="ButtonForegroundDisabled" Color="#999999" />
<!-- ComboBox Text -->
<SolidColorBrush x:Key="ComboBoxForeground" Color="#000000" />
<SolidColorBrush x:Key="ComboBoxForegroundPointerOver" Color="#000000" />
<SolidColorBrush x:Key="ComboBoxForegroundPressed" Color="#000000" />
<SolidColorBrush x:Key="ComboBoxForegroundFocused" Color="#000000" />
<SolidColorBrush x:Key="ComboBoxForegroundDisabled" Color="#999999" />
<!-- Navigation and List Text -->
<SolidColorBrush x:Key="NavigationViewItemForeground" Color="#000000" />
<SolidColorBrush x:Key="NavigationViewItemForegroundPointerOver" Color="#000000" />
<SolidColorBrush x:Key="NavigationViewItemForegroundPressed" Color="#000000" />
<SolidColorBrush x:Key="ListViewItemForeground" Color="#000000" />
<SolidColorBrush x:Key="ListViewItemForegroundPointerOver" Color="#000000" />
<SolidColorBrush x:Key="ListViewItemForegroundSelected" Color="#FFFFFF" />
<!-- System Control Foreground -->
<SolidColorBrush x:Key="SystemControlForegroundBaseHighBrush" Color="#000000" />
<SolidColorBrush x:Key="SystemControlForegroundBaseMediumBrush" Color="#000000" />
<SolidColorBrush x:Key="SystemControlForegroundBaseMediumHighBrush" Color="#000000" />
<SolidColorBrush x:Key="SystemControlForegroundBaseMediumLowBrush" Color="#000000" />
<SolidColorBrush x:Key="SystemControlForegroundBaseLowBrush" Color="#000000" />
<!-- System Colors -->
<SolidColorBrush x:Key="SystemBaseMediumColor" Color="#000000" />
<SolidColorBrush x:Key="SystemBaseHighColor" Color="#000000" />
<SolidColorBrush x:Key="SystemBaseMediumHighColor" Color="#000000" />
<SolidColorBrush x:Key="SystemBaseMediumLowColor" Color="#000000" />
<SolidColorBrush x:Key="SystemBaseLowColor" Color="#000000" />
<!-- Backgrounds - Mac OS 9 Platinum Gray -->
<SolidColorBrush x:Key="ApplicationPageBackgroundThemeBrush" Color="#CCCCCC" />
<SolidColorBrush x:Key="LayerFillColorDefaultBrush" Color="#DDDDDD" />
<SolidColorBrush x:Key="LayerFillColorAltBrush" Color="#D0D0D0" />
<SolidColorBrush x:Key="CardBackgroundFillColorDefaultBrush" Color="#DDDDDD" />
<SolidColorBrush x:Key="CardBackgroundFillColorSecondaryBrush" Color="#D0D0D0" />
<SolidColorBrush x:Key="SurfaceFillColorDefaultBrush" Color="#DDDDDD" />
<SolidColorBrush x:Key="ControlFillColorDefaultBrush" Color="#DDDDDD" />
<SolidColorBrush x:Key="ControlFillColorSecondaryBrush" Color="#D8D8D8" />
<SolidColorBrush x:Key="ControlFillColorTertiaryBrush" Color="#D0D0D0" />
<SolidColorBrush x:Key="ControlFillColorDisabledBrush" Color="#C8C8C8" />
<SolidColorBrush x:Key="SubtleFillColorTransparentBrush" Color="Transparent" />
<SolidColorBrush x:Key="SubtleFillColorSecondaryBrush" Color="#D0D0D0" />
<SolidColorBrush x:Key="SubtleFillColorTertiaryBrush" Color="#C8C8C8" />
<!-- Button Backgrounds -->
<SolidColorBrush x:Key="ButtonBackground" Color="#DDDDDD" />
<SolidColorBrush x:Key="ButtonBackgroundPointerOver" Color="#E8E8E8" />
<SolidColorBrush x:Key="ButtonBackgroundPressed" Color="#C8C8C8" />
<SolidColorBrush x:Key="ButtonBackgroundDisabled" Color="#D0D0D0" />
<!-- TextBox Backgrounds - White inputs on gray windows -->
<SolidColorBrush x:Key="TextControlBackground" Color="#FFFFFF" />
<SolidColorBrush x:Key="TextControlBackgroundPointerOver" Color="#FFFFFF" />
<SolidColorBrush x:Key="TextControlBackgroundFocused" Color="#FFFFFF" />
<SolidColorBrush x:Key="TextControlBackgroundDisabled" Color="#E0E0E0" />
<!-- ComboBox Backgrounds -->
<SolidColorBrush x:Key="ComboBoxBackground" Color="#DDDDDD" />
<SolidColorBrush x:Key="ComboBoxBackgroundPointerOver" Color="#E8E8E8" />
<SolidColorBrush x:Key="ComboBoxBackgroundPressed" Color="#C8C8C8" />
<SolidColorBrush x:Key="ComboBoxBackgroundFocused" Color="#DDDDDD" />
<SolidColorBrush x:Key="ComboBoxBackgroundDisabled" Color="#D0D0D0" />
<!-- Navigation Backgrounds - Platinum Gray -->
<SolidColorBrush x:Key="NavigationViewDefaultPaneBackground" Color="#D8D8D8" />
<SolidColorBrush x:Key="NavigationViewTopPaneBackground" Color="#D8D8D8" />
<SolidColorBrush x:Key="NavigationViewExpandedPaneBackground" Color="#D8D8D8" />
<!-- List Backgrounds - Platinum Gray -->
<SolidColorBrush x:Key="ListViewItemBackground" Color="#DDDDDD" />
<SolidColorBrush x:Key="ListViewItemBackgroundPointerOver" Color="#E8E8E8" />
<SolidColorBrush x:Key="ListViewItemBackgroundPressed" Color="#C8C8C8" />
<SolidColorBrush x:Key="ListViewItemBackgroundSelected" Color="#5856D6" />
<SolidColorBrush x:Key="ListViewItemBackgroundSelectedPointerOver" Color="#6D6BE8" />
<!-- Borders -->
<SolidColorBrush x:Key="CardStrokeColorDefaultBrush" Color="#999999" />
<SolidColorBrush x:Key="ControlStrokeColorDefaultBrush" Color="#999999" />
<SolidColorBrush x:Key="ControlStrokeColorSecondaryBrush" Color="#AAAAAA" />
<SolidColorBrush x:Key="DividerStrokeColorDefaultBrush" Color="#CCCCCC" />
<SolidColorBrush x:Key="TextControlBorderBrush" Color="#999999" />
<SolidColorBrush x:Key="TextControlBorderBrushPointerOver" Color="#777777" />
<SolidColorBrush x:Key="TextControlBorderBrushFocused" Color="#5856D6" />
<SolidColorBrush x:Key="ComboBoxBorderBrush" Color="#999999" />
<SolidColorBrush x:Key="ComboBoxBorderBrushPointerOver" Color="#777777" />
<SolidColorBrush x:Key="ComboBoxBorderBrushPressed" Color="#5856D6" />
<!-- Accent Colors -->
<SolidColorBrush x:Key="AccentFillColorDefaultBrush" Color="#5856D6" />
<SolidColorBrush x:Key="AccentFillColorSecondaryBrush" Color="#6D6BE8" />
<SolidColorBrush x:Key="AccentFillColorTertiaryBrush" Color="#8280F0" />
</ResourceDictionary>