diff --git a/Wino.Calendar/Views/AppShell.xaml b/Wino.Calendar/Views/AppShell.xaml
index b7ad51d2..8d01d754 100644
--- a/Wino.Calendar/Views/AppShell.xaml
+++ b/Wino.Calendar/Views/AppShell.xaml
@@ -124,12 +124,12 @@
ItemsSource="{x:Bind ViewModel.DateNavigationHeaderItems}"
SelectedIndex="{x:Bind ViewModel.SelectedDateNavigationHeaderIndex, Mode=OneWay}">
-
+
+ Text="{x:Bind}" />
diff --git a/Wino.Core.Domain/Interfaces/IThemeService.cs b/Wino.Core.Domain/Interfaces/IThemeService.cs
deleted file mode 100644
index 322643af..00000000
--- a/Wino.Core.Domain/Interfaces/IThemeService.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Threading.Tasks;
-using Wino.Core.Domain.Enums;
-using Wino.Core.Domain.Models.Personalization;
-
-namespace Wino.Core.Domain.Interfaces;
-
-public interface IThemeService : IInitializeAsync
-{
- event EventHandler ElementThemeChanged;
- event EventHandler AccentColorChanged;
-
- Task> GetAvailableThemesAsync();
- Task CreateNewCustomThemeAsync(string themeName, string accentColor, byte[] wallpaperData);
- Task> GetCurrentCustomThemesAsync();
- List GetAvailableAccountColors();
- Task ApplyCustomThemeAsync(bool isInitializing);
-
- // Settings
- ApplicationElementTheme RootTheme { get; set; }
- Guid CurrentApplicationThemeId { get; set; }
- string AccentColor { get; set; }
- string GetSystemAccentColorHex();
- bool IsCustomTheme { get; }
-}
diff --git a/Wino.Core.ViewModels/AboutPageViewModel.cs b/Wino.Core.ViewModels/AboutPageViewModel.cs
index 26579f61..2ea69416 100644
--- a/Wino.Core.ViewModels/AboutPageViewModel.cs
+++ b/Wino.Core.ViewModels/AboutPageViewModel.cs
@@ -6,6 +6,7 @@ using Serilog;
using Wino.Core.Domain;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Interfaces;
+using Wino.Core.Domain.Models.Navigation;
namespace Wino.Core.ViewModels;
@@ -47,19 +48,17 @@ public partial class AboutPageViewModel : CoreBaseViewModel
PreferencesService = preferencesService;
}
- [RequiresDynamicCode("AOT")]
- [RequiresUnreferencedCode("AOT")]
- protected override void OnActivated()
+ public override void OnNavigatedTo(NavigationMode mode, object parameters)
{
- base.OnActivated();
+ base.OnNavigatedTo(mode, parameters);
PreferencesService.PreferenceChanged -= PreferencesChanged;
PreferencesService.PreferenceChanged += PreferencesChanged;
}
- protected override void OnDeactivated()
+ public override void OnNavigatedFrom(NavigationMode mode, object parameters)
{
- base.OnDeactivated();
+ base.OnNavigatedFrom(mode, parameters);
PreferencesService.PreferenceChanged -= PreferencesChanged;
}
diff --git a/Wino.Core.ViewModels/PersonalizationPageViewModel.cs b/Wino.Core.ViewModels/PersonalizationPageViewModel.cs
index 50f719a7..b68ec62a 100644
--- a/Wino.Core.ViewModels/PersonalizationPageViewModel.cs
+++ b/Wino.Core.ViewModels/PersonalizationPageViewModel.cs
@@ -9,6 +9,7 @@ using Wino.Core.Domain;
using Wino.Core.Domain.Entities.Mail;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Interfaces;
+using Wino.Core.Domain.Models.Navigation;
using Wino.Core.Domain.Models.Personalization;
using Wino.Core.ViewModels.Data;
@@ -20,7 +21,6 @@ public partial class PersonalizationPageViewModel : CoreBaseViewModel
public IPreferencesService PreferencesService { get; }
private readonly IDialogServiceBase _dialogService;
- private readonly IThemeService _themeService;
private readonly INewThemeService _newThemeService;
private bool isPropChangeDisabled = false;
@@ -147,12 +147,10 @@ public partial class PersonalizationPageViewModel : CoreBaseViewModel
public AsyncRelayCommand CreateCustomThemeCommand { get; set; }
public PersonalizationPageViewModel(IDialogServiceBase dialogService,
IStatePersistanceService statePersistanceService,
- IThemeService themeService,
INewThemeService newThemeService,
IPreferencesService preferencesService)
{
_dialogService = dialogService;
- _themeService = themeService;
_newThemeService = newThemeService;
StatePersistenceService = statePersistanceService;
@@ -193,7 +191,7 @@ public partial class PersonalizationPageViewModel : CoreBaseViewModel
// Add system accent color as last item.
- Colors.Add(new AppColorViewModel(_themeService.GetSystemAccentColorHex(), true));
+ Colors.Add(new AppColorViewModel(_newThemeService.GetSystemAccentColorHex(), true));
}
///
@@ -201,10 +199,10 @@ public partial class PersonalizationPageViewModel : CoreBaseViewModel
///
private void SetInitialValues()
{
- SelectedElementTheme = ElementThemes.Find(a => a.NativeTheme == _themeService.RootTheme);
+ SelectedElementTheme = ElementThemes.Find(a => a.NativeTheme == _newThemeService.RootTheme);
SelectedInfoDisplayMode = PreferencesService.MailItemDisplayMode;
- var currentAccentColor = _themeService.AccentColor;
+ var currentAccentColor = _newThemeService.AccentColor;
bool isWindowsColor = string.IsNullOrEmpty(currentAccentColor);
@@ -228,11 +226,9 @@ public partial class PersonalizationPageViewModel : CoreBaseViewModel
SelectedBackdropType = AvailableBackdropTypes?.FirstOrDefault(x => x.BackdropType == targetBackdropType);
}
- [RequiresDynamicCode("AOT")]
- [RequiresUnreferencedCode("AOT")]
- protected override async void OnActivated()
+ public override async void OnNavigatedTo(NavigationMode mode, object parameters)
{
- base.OnActivated();
+ base.OnNavigatedTo(mode, parameters);
await InitializeSettingsAsync();
}
@@ -241,7 +237,7 @@ public partial class PersonalizationPageViewModel : CoreBaseViewModel
{
Deactivate();
- AppThemes = await _themeService.GetAvailableThemesAsync();
+ AppThemes = await _newThemeService.GetAvailableThemesAsync();
OnPropertyChanged(nameof(AppThemes));
@@ -254,11 +250,11 @@ public partial class PersonalizationPageViewModel : CoreBaseViewModel
PropertyChanged -= PersonalizationSettingsUpdated;
PropertyChanged += PersonalizationSettingsUpdated;
- _themeService.AccentColorChanged -= AccentColorChanged;
- _themeService.ElementThemeChanged -= ElementThemeChanged;
+ _newThemeService.AccentColorChanged -= AccentColorChanged;
+ _newThemeService.ElementThemeChanged -= ElementThemeChanged;
- _themeService.AccentColorChanged += AccentColorChanged;
- _themeService.ElementThemeChanged += ElementThemeChanged;
+ _newThemeService.AccentColorChanged += AccentColorChanged;
+ _newThemeService.ElementThemeChanged += ElementThemeChanged;
}
private void AccentColorChanged(object sender, string e)
@@ -290,8 +286,8 @@ public partial class PersonalizationPageViewModel : CoreBaseViewModel
{
PropertyChanged -= PersonalizationSettingsUpdated;
- _themeService.AccentColorChanged -= AccentColorChanged;
- _themeService.ElementThemeChanged -= ElementThemeChanged;
+ _newThemeService.AccentColorChanged -= AccentColorChanged;
+ _newThemeService.ElementThemeChanged -= ElementThemeChanged;
if (AppThemes != null)
{
@@ -307,7 +303,7 @@ public partial class PersonalizationPageViewModel : CoreBaseViewModel
if (e.PropertyName == nameof(SelectedElementTheme) && SelectedElementTheme != null)
{
- _themeService.RootTheme = SelectedElementTheme.NativeTheme;
+ _newThemeService.RootTheme = SelectedElementTheme.NativeTheme;
}
else if (e.PropertyName == nameof(SelectedAppTheme))
{
@@ -328,7 +324,7 @@ public partial class PersonalizationPageViewModel : CoreBaseViewModel
if (e.PropertyName == nameof(SelectedInfoDisplayMode))
PreferencesService.MailItemDisplayMode = SelectedInfoDisplayMode;
else if (e.PropertyName == nameof(SelectedAppColor))
- _themeService.AccentColor = SelectedAppColor.Hex;
+ _newThemeService.AccentColor = SelectedAppColor.Hex;
}
}
}
diff --git a/Wino.Core.WinUI/BasePage.cs b/Wino.Core.WinUI/BasePage.cs
index f25a7c9c..74b88d62 100644
--- a/Wino.Core.WinUI/BasePage.cs
+++ b/Wino.Core.WinUI/BasePage.cs
@@ -54,8 +54,6 @@ public abstract class BasePage : BasePage where T : CoreBaseViewModel
Debug.WriteLine($"Disposed {GetType().Name}");
}
- [RequiresDynamicCode("AOT")]
- [RequiresUnreferencedCode("AOT")]
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
@@ -64,7 +62,7 @@ public abstract class BasePage : BasePage where T : CoreBaseViewModel
var parameter = e.Parameter;
WeakReferenceMessenger.Default.UnregisterAll(this);
- WeakReferenceMessenger.Default.RegisterAll(this);
+ WeakReferenceMessenger.Default.Register(this);
ViewModel.OnNavigatedTo(mode, parameter);
}
diff --git a/Wino.Core.WinUI/Services/ThemeService.cs b/Wino.Core.WinUI/Services/ThemeService.cs
deleted file mode 100644
index 1eb6e031..00000000
--- a/Wino.Core.WinUI/Services/ThemeService.cs
+++ /dev/null
@@ -1,508 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.IO;
-using System.Linq;
-using System.Runtime.InteropServices.WindowsRuntime;
-using System.Text.Json;
-using System.Threading.Tasks;
-using CommunityToolkit.Mvvm.Messaging;
-using CommunityToolkit.WinUI;
-using CommunityToolkit.WinUI.Helpers;
-using Microsoft.UI.Xaml;
-using Microsoft.UI.Xaml.Markup;
-using Microsoft.UI.Xaml.Media;
-using Windows.Storage;
-using Windows.UI.ViewManagement;
-using Wino.Core.Domain;
-using Wino.Core.Domain.Enums;
-using Wino.Core.Domain.Exceptions;
-using Wino.Core.Domain.Interfaces;
-using Wino.Core.Domain.Models;
-using Wino.Core.Domain.Models.Personalization;
-using Wino.Core.WinUI;
-using Wino.Core.WinUI.Extensions;
-using Wino.Core.WinUI.Interfaces;
-using Wino.Core.WinUI.Models.Personalization;
-using Wino.Core.WinUI.Services;
-using Wino.Messaging.Client.Shell;
-
-namespace Wino.Services;
-
-///
-/// Class providing functionality around switching and restoring theme settings
-///
-public class ThemeService : IThemeService
-{
- public const string CustomThemeFolderName = "CustomThemes";
-
- private static string _micaThemeId = "a160b1b0-2ab8-4e97-a803-f4050f036e25";
- private static string _acrylicThemeId = "fc08e58c-36fd-46e2-a562-26cf277f1467";
- private static string _cloudsThemeId = "3b621cc2-e270-4a76-8477-737917cccda0";
- private static string _forestThemeId = "8bc89b37-a7c5-4049-86e2-de1ae8858dbd";
- private static string _nightyThemeId = "5b65e04e-fd7e-4c2d-8221-068d3e02d23a";
- private static string _snowflakeThemeId = "e143ddde-2e28-4846-9d98-dad63d6505f1";
- private static string _gardenThemeId = "698e4466-f88c-4799-9c61-f0ea1308ed49";
-
- public event EventHandler ElementThemeChanged;
- public event EventHandler AccentColorChanged;
-
- private const string AccentColorKey = nameof(AccentColorKey);
- private const string CurrentApplicationThemeKey = nameof(CurrentApplicationThemeKey);
-
- // Custom theme
- public const string CustomThemeAccentColorKey = nameof(CustomThemeAccentColorKey);
-
- // Keep reference so it does not get optimized/garbage collected
- private readonly UISettings uiSettings = new UISettings();
-
- private readonly IConfigurationService _configurationService;
- private readonly IUnderlyingThemeService _underlyingThemeService;
- private readonly IApplicationResourceManager _applicationResourceManager;
-
- private List preDefinedThemes { get; set; } = new List()
- {
- new SystemAppTheme("Mica", Guid.Parse(_micaThemeId)),
- new SystemAppTheme("Acrylic", Guid.Parse(_acrylicThemeId)),
- new PreDefinedAppTheme("Nighty", Guid.Parse(_nightyThemeId), "#e1b12c", ApplicationElementTheme.Dark),
- new PreDefinedAppTheme("Forest", Guid.Parse(_forestThemeId), "#16a085", ApplicationElementTheme.Dark),
- new PreDefinedAppTheme("Clouds", Guid.Parse(_cloudsThemeId), "#0984e3", ApplicationElementTheme.Light),
- new PreDefinedAppTheme("Snowflake", Guid.Parse(_snowflakeThemeId), "#4a69bd", ApplicationElementTheme.Light),
- new PreDefinedAppTheme("Garden", Guid.Parse(_gardenThemeId), "#05c46b", ApplicationElementTheme.Light),
- };
-
- public ThemeService(IConfigurationService configurationService,
- IUnderlyingThemeService underlyingThemeService,
- IApplicationResourceManager applicationResourceManager)
- {
- _configurationService = configurationService;
- _underlyingThemeService = underlyingThemeService;
- _applicationResourceManager = applicationResourceManager;
- }
-
- ///
- /// Gets or sets (with LocalSettings persistence) the RequestedTheme of the root element.
- ///
- public ApplicationElementTheme RootTheme
- {
- get
- {
- return GetShellRootContent().RequestedTheme.ToWinoElementTheme();
- //if (mainApplicationFrame == null) return ApplicationElementTheme.Default;
-
- //return mainApplicationFrame.RequestedTheme.ToWinoElementTheme();
- }
- set
- {
- GetShellRootContent().RequestedTheme = value.ToWindowsElementTheme();
- // mainApplicationFrame.RequestedTheme = value.ToWindowsElementTheme();
-
- _configurationService.Set(UnderlyingThemeService.SelectedAppThemeKey, value);
-
- UpdateSystemCaptionButtonColors();
-
- // PopupRoot usually needs to react to changes.
- NotifyThemeUpdate();
- }
- }
-
-
- private Guid currentApplicationThemeId;
-
- public Guid CurrentApplicationThemeId
- {
- get { return currentApplicationThemeId; }
- set
- {
- currentApplicationThemeId = value;
-
- _configurationService.Set(CurrentApplicationThemeKey, value);
-
- if (WinoApplication.MainWindow != null)
- {
- WinoApplication.MainWindow.DispatcherQueue.TryEnqueue(async () =>
- {
- await ApplyCustomThemeAsync(false);
- });
- }
- }
- }
-
-
- private string accentColor;
-
- public string AccentColor
- {
- get { return accentColor; }
- set
- {
- accentColor = value;
-
- UpdateAccentColor(value);
-
- _configurationService.Set(AccentColorKey, value);
- AccentColorChanged?.Invoke(this, value);
- }
- }
-
- public bool IsCustomTheme
- {
- get
- {
- return currentApplicationThemeId != Guid.Parse(_micaThemeId) &&
- currentApplicationThemeId != Guid.Parse(_acrylicThemeId);
- }
- }
-
- public FrameworkElement GetShellRootContent() => (WinoApplication.MainWindow as IWinoShellWindow)?.GetRootContent() ?? throw new Exception("No root content found");
-
- private bool isInitialized = false;
-
- public async Task InitializeAsync()
- {
- // Already initialized. There is no need.
- if (isInitialized) return;
-
- RootTheme = _configurationService.Get(UnderlyingThemeService.SelectedAppThemeKey, ApplicationElementTheme.Default);
- AccentColor = _configurationService.Get(AccentColorKey, string.Empty);
-
- // Set the current theme id. Default to Mica.
- currentApplicationThemeId = _configurationService.Get(CurrentApplicationThemeKey, Guid.Parse(_micaThemeId));
-
- await ApplyCustomThemeAsync(true);
-
- // Registering to color changes, thus we notice when user changes theme system wide
- uiSettings.ColorValuesChanged -= UISettingsColorChanged;
- uiSettings.ColorValuesChanged += UISettingsColorChanged;
-
- isInitialized = true;
- }
-
- private void NotifyThemeUpdate()
- {
- if (GetShellRootContent() is not UIElement rootContent) return;
-
- _ = rootContent.DispatcherQueue.EnqueueAsync(() =>
- {
- ElementThemeChanged?.Invoke(this, RootTheme);
- WeakReferenceMessenger.Default.Send(new ApplicationThemeChanged(_underlyingThemeService.IsUnderlyingThemeDark()));
- }, Microsoft.UI.Dispatching.DispatcherQueuePriority.High);
- }
-
- private void UISettingsColorChanged(UISettings sender, object args)
- {
- // TODO: Buggy.
- //GetShellRootContent().DispatcherQueue.TryEnqueue(() =>
- //{
- // UpdateSystemCaptionButtonColors();
- //});
-
- NotifyThemeUpdate();
- }
-
- public void UpdateSystemCaptionButtonColors()
- {
- GetShellRootContent().DispatcherQueue.TryEnqueue(() =>
- {
- Debug.WriteLine("TODO: Updating caption button colors");
-
- // var titleBar = (WinoApplication.MainWindow as IWinoShellWindow).GetTitleBar();
-
- //if (_underlyingThemeService.IsUnderlyingThemeDark())
- //{
- // titleBar.ButtonForegroundColor = Colors.White;
- //}
- //else
- //{
- // titleBar.ButtonForegroundColor = Colors.Black;
- //}
- });
- }
-
- public void UpdateAccentColor(string hex)
- {
- // Change accent color if specified.
- if (!string.IsNullOrEmpty(hex))
- {
- var color = CommunityToolkit.WinUI.Helpers.ColorHelper.ToColor(hex);
- var brush = new SolidColorBrush(color);
-
- if (_applicationResourceManager.ContainsResourceKey("SystemAccentColor"))
- _applicationResourceManager.ReplaceResource("SystemAccentColor", color);
-
- if (_applicationResourceManager.ContainsResourceKey("NavigationViewSelectionIndicatorForeground"))
- _applicationResourceManager.ReplaceResource("NavigationViewSelectionIndicatorForeground", brush);
-
- if (_applicationResourceManager.ContainsResourceKey("SystemControlBackgroundAccentBrush"))
- _applicationResourceManager.ReplaceResource("SystemControlBackgroundAccentBrush", brush);
-
- if (_applicationResourceManager.ContainsResourceKey("SystemColorControlAccentBrush"))
- _applicationResourceManager.ReplaceResource("SystemColorControlAccentBrush", brush);
-
-
- RefreshThemeResource();
- }
- }
-
- private void RefreshThemeResource()
- {
- var mainApplicationFrame = GetShellRootContent();
-
- if (mainApplicationFrame == null) return;
-
- if (mainApplicationFrame.RequestedTheme == ElementTheme.Dark)
- {
- mainApplicationFrame.RequestedTheme = ElementTheme.Light;
- mainApplicationFrame.RequestedTheme = ElementTheme.Dark;
- }
- else if (mainApplicationFrame.RequestedTheme == ElementTheme.Light)
- {
- mainApplicationFrame.RequestedTheme = ElementTheme.Dark;
- mainApplicationFrame.RequestedTheme = ElementTheme.Light;
- }
- else
- {
- var isUnderlyingDark = _underlyingThemeService.IsUnderlyingThemeDark();
-
- mainApplicationFrame.RequestedTheme = isUnderlyingDark ? ElementTheme.Light : ElementTheme.Dark;
- mainApplicationFrame.RequestedTheme = ElementTheme.Default;
- }
- }
-
- public async Task ApplyCustomThemeAsync(bool isInitializing)
- {
- AppThemeBase applyingTheme = null;
-
- var controlThemeList = new List(preDefinedThemes);
-
- // Don't search for custom themes if applying theme is already in pre-defined templates.
- // This is important for startup performance because we won't be loading the custom themes on launch.
-
- bool isApplyingPreDefinedTheme = preDefinedThemes.Exists(a => a.Id == currentApplicationThemeId);
-
- if (isApplyingPreDefinedTheme)
- {
- applyingTheme = preDefinedThemes.Find(a => a.Id == currentApplicationThemeId);
- }
- else
- {
- // User applied custom theme. Load custom themes and find it there.
- // Fallback to Mica if nothing found.
-
- var customThemes = await GetCurrentCustomThemesAsync();
-
- controlThemeList.AddRange(customThemes.Select(a => new CustomAppTheme(a)));
-
- applyingTheme = controlThemeList.Find(a => a.Id == currentApplicationThemeId) ?? preDefinedThemes.First(a => a.Id == Guid.Parse(_micaThemeId));
- }
-
- try
- {
- var existingThemeDictionary = _applicationResourceManager.GetLastResource();
-
- if (existingThemeDictionary != null && existingThemeDictionary.TryGetValue("ThemeName", out object themeNameString))
- {
- var themeName = themeNameString.ToString();
-
- // Applying different theme.
- if (themeName != applyingTheme.ThemeName)
- {
- var resourceDictionaryContent = await applyingTheme.GetThemeResourceDictionaryContentAsync();
-
- var resourceDictionary = XamlReader.Load(resourceDictionaryContent) as ResourceDictionary;
-
- // Custom themes require special attention for background image because
- // they share the same base theme resource dictionary.
-
- if (applyingTheme is CustomAppTheme)
- {
- resourceDictionary["ThemeBackgroundImage"] = $"ms-appdata:///local/{CustomThemeFolderName}/{applyingTheme.Id}.jpg";
- }
-
- _applicationResourceManager.RemoveResource(existingThemeDictionary);
- _applicationResourceManager.AddResource(resourceDictionary);
-
- bool isSystemTheme = applyingTheme is SystemAppTheme || applyingTheme is CustomAppTheme;
-
- if (isSystemTheme)
- {
- // For system themes, set the RootElement theme from saved values.
- // Potential bug: When we set it to system default, theme is not applied when system and
- // app element theme is different :)
-
- var savedElement = _configurationService.Get(UnderlyingThemeService.SelectedAppThemeKey, ApplicationElementTheme.Default);
- RootTheme = savedElement;
-
- // Quickly switch theme to apply theme resource changes.
- RefreshThemeResource();
- }
- else
- RootTheme = applyingTheme.ForceElementTheme;
-
- // Theme has accent color. Override.
- if (!isInitializing)
- {
- AccentColor = applyingTheme.AccentColor;
- }
- }
- else
- UpdateSystemCaptionButtonColors();
- }
- }
- catch (Exception ex)
- {
- Debug.WriteLine($"Apply theme failed -> {ex.Message}");
- }
- }
-
- public async Task> GetAvailableThemesAsync()
- {
- var availableThemes = new List(preDefinedThemes);
-
- var customThemes = await GetCurrentCustomThemesAsync();
-
- availableThemes.AddRange(customThemes.Select(a => new CustomAppTheme(a)));
-
- return availableThemes;
- }
-
- public async Task CreateNewCustomThemeAsync(string themeName, string accentColor, byte[] wallpaperData)
- {
- if (wallpaperData == null || wallpaperData.Length == 0)
- throw new CustomThemeCreationFailedException(Translator.Exception_CustomThemeMissingWallpaper);
-
- if (string.IsNullOrEmpty(themeName))
- throw new CustomThemeCreationFailedException(Translator.Exception_CustomThemeMissingName);
-
- var themes = await GetCurrentCustomThemesAsync();
-
- if (themes.Exists(a => a.Name == themeName))
- throw new CustomThemeCreationFailedException(Translator.Exception_CustomThemeExists);
-
- var newTheme = new CustomThemeMetadata()
- {
- Id = Guid.NewGuid(),
- Name = themeName,
- AccentColorHex = accentColor
- };
-
- // Save wallpaper.
- // Filename would be the same as metadata id, in jpg format.
-
- var themeFolder = await ApplicationData.Current.LocalFolder.CreateFolderAsync(CustomThemeFolderName, CreationCollisionOption.OpenIfExists);
-
- var wallpaperFile = await themeFolder.CreateFileAsync($"{newTheme.Id}.jpg", CreationCollisionOption.ReplaceExisting);
- await FileIO.WriteBytesAsync(wallpaperFile, wallpaperData);
-
- // Generate thumbnail for settings page.
-
- var thumbnail = await wallpaperFile.GetThumbnailAsync(Windows.Storage.FileProperties.ThumbnailMode.PicturesView);
- var thumbnailFile = await themeFolder.CreateFileAsync($"{newTheme.Id}_preview.jpg", CreationCollisionOption.ReplaceExisting);
-
- using (var readerStream = thumbnail.AsStreamForRead())
- {
- byte[] bytes = new byte[readerStream.Length];
-
- await readerStream.ReadExactlyAsync(bytes);
-
- var buffer = bytes.AsBuffer();
-
- await FileIO.WriteBufferAsync(thumbnailFile, buffer);
- }
-
- // Save metadata.
- var metadataFile = await themeFolder.CreateFileAsync($"{newTheme.Id}.json", CreationCollisionOption.ReplaceExisting);
-
- var serialized = JsonSerializer.Serialize(newTheme, DomainModelsJsonContext.Default.CustomThemeMetadata);
- await FileIO.WriteTextAsync(metadataFile, serialized);
-
- return newTheme;
- }
-
- public async Task> GetCurrentCustomThemesAsync()
- {
- var results = new List();
-
- var themeFolder = await ApplicationData.Current.LocalFolder.CreateFolderAsync(CustomThemeFolderName, CreationCollisionOption.OpenIfExists);
-
- var allFiles = await themeFolder.GetFilesAsync();
-
- var themeMetadatas = allFiles.Where(a => a.FileType == ".json");
-
- foreach (var theme in themeMetadatas)
- {
- var metadata = await GetCustomMetadataAsync(theme).ConfigureAwait(false);
-
- if (metadata == null) continue;
-
- results.Add(metadata);
- }
-
- return results;
- }
-
- private async Task GetCustomMetadataAsync(IStorageFile file)
- {
- var fileContent = await FileIO.ReadTextAsync(file);
-
- return JsonSerializer.Deserialize(fileContent, DomainModelsJsonContext.Default.CustomThemeMetadata);
- }
-
- public string GetSystemAccentColorHex()
- => uiSettings.GetColorValue(UIColorType.Accent).ToHex();
-
- public List GetAvailableAccountColors()
- {
- return new List()
- {
- "#e74c3c",
- "#c0392b",
- "#e53935",
- "#d81b60",
-
- // Pinks
- "#e91e63",
- "#ec407a",
- "#ff4081",
-
- // Purples
- "#9b59b6",
- "#8e44ad",
- "#673ab7",
-
- // Blues
- "#3498db",
- "#2980b9",
- "#2196f3",
- "#03a9f4",
- "#00bcd4",
-
- // Teals
- "#009688",
- "#1abc9c",
- "#16a085",
-
- // Greens
- "#2ecc71",
- "#27ae60",
- "#4caf50",
- "#8bc34a",
-
- // Yellows & Oranges
- "#f1c40f",
- "#f39c12",
- "#ff9800",
- "#ff5722",
-
- // Browns
- "#795548",
- "#a0522d",
-
- // Grays
- "#9e9e9e",
- "#607d8b",
- "#34495e",
- "#2c3e50",
- };
- }
-}
diff --git a/Wino.Core.WinUI/Views/ManageAccountsPage.xaml b/Wino.Core.WinUI/Views/ManageAccountsPage.xaml
index f0ee0a97..94905364 100644
--- a/Wino.Core.WinUI/Views/ManageAccountsPage.xaml
+++ b/Wino.Core.WinUI/Views/ManageAccountsPage.xaml
@@ -27,7 +27,7 @@
ItemClicked="BreadItemClicked"
ItemsSource="{x:Bind PageHistory, Mode=OneWay}">
-
+
@@ -35,7 +35,7 @@
Margin="0,0,8,10"
FontWeight="{x:Bind helpers:XamlHelpers.GetFontWeightBySyncState(IsActive), Mode=OneWay}"
Style="{StaticResource TitleTextBlockStyle}"
- Text="{Binding Title, Mode=OneWay}" />
+ Text="{x:Bind Title, Mode=OneWay}" />
diff --git a/Wino.Core.WinUI/Views/SettingsPage.xaml b/Wino.Core.WinUI/Views/SettingsPage.xaml
index eda5449a..4f8a8ba3 100644
--- a/Wino.Core.WinUI/Views/SettingsPage.xaml
+++ b/Wino.Core.WinUI/Views/SettingsPage.xaml
@@ -27,7 +27,7 @@
ItemClicked="BreadItemClicked"
ItemsSource="{x:Bind PageHistory, Mode=OneWay}">
-
+
@@ -35,7 +35,7 @@
Margin="0,0,8,10"
FontWeight="{x:Bind helpers:XamlHelpers.GetFontWeightBySyncState(IsActive), Mode=OneWay}"
Style="{StaticResource TitleTextBlockStyle}"
- Text="{Binding Title}" />
+ Text="{x:Bind Title}" />