diff --git a/Files/App.xaml.cs b/Files/App.xaml.cs index 321c4dcaea6a..f7c229a1bb6a 100644 --- a/Files/App.xaml.cs +++ b/Files/App.xaml.cs @@ -55,6 +55,7 @@ sealed partial class App : Application public static DrivesManager DrivesManager { get; private set; } public static WSLDistroManager WSLDistroManager { get; private set; } public static LibraryManager LibraryManager { get; private set; } + public static ExternalResourcesHelper ExternalResourcesHelper { get; private set; } private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); @@ -89,6 +90,9 @@ private static async Task EnsureSettingsAndConfigurationAreBootstrapped() AppSettings = await SettingsViewModel.CreateInstance(); } + ExternalResourcesHelper ??= new ExternalResourcesHelper(); + await ExternalResourcesHelper.LoadSelectedTheme(); + InteractionViewModel ??= new InteractionViewModel(); SidebarPinnedController ??= await SidebarPinnedController.CreateInstance(); LibraryManager ??= new LibraryManager(); diff --git a/Files/Files.csproj b/Files/Files.csproj index 5288c42bf5db..0b2752c33855 100644 --- a/Files/Files.csproj +++ b/Files/Files.csproj @@ -208,6 +208,7 @@ RestartDialog.xaml + diff --git a/Files/Helpers/ExternalResourcesHelper.cs b/Files/Helpers/ExternalResourcesHelper.cs new file mode 100644 index 000000000000..a3a9d5d507da --- /dev/null +++ b/Files/Helpers/ExternalResourcesHelper.cs @@ -0,0 +1,78 @@ +using Microsoft.Toolkit.Uwp.Extensions; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Windows.Storage; +using Windows.UI.Core; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Markup; + +namespace Files.Helpers +{ + public class ExternalResourcesHelper + { + + public List Themes = new List() + { + "DefaultScheme".GetLocalized() + }; + + private StorageFolder ThemeFolder { get; set; } + + public string CurrentThemeResources { get; set; } + + public async Task LoadSelectedTheme() + { + ThemeFolder = (await ApplicationData.Current.LocalFolder.TryGetItemAsync("Themes")) as StorageFolder; + ThemeFolder ??= await ApplicationData.Current.LocalFolder.CreateFolderAsync("Themes"); + + if (App.AppSettings.PathToThemeFile != "DefaultScheme".GetLocalized()) + { + await TryLoadThemeAsync(App.AppSettings.PathToThemeFile); + } + + LoadOtherThemesAsync(); + } + + private async void LoadOtherThemesAsync() + { + try + { + foreach (var file in (await ThemeFolder.GetFilesAsync()).Where(x => x.FileType == ".xaml")) + { + Themes.Add(file.Name); + } + } + catch (Exception) + { + Debug.WriteLine($"Error loading themes"); + } + } + + public async Task TryLoadThemeAsync(string name) + { + try + { + var file = await ThemeFolder.GetFileAsync(name); + CurrentThemeResources = await FileIO.ReadTextAsync(file); + var xaml = XamlReader.Load(CurrentThemeResources) as ResourceDictionary; + App.Current.Resources.MergedDictionaries.Add(xaml); + + return true; + } + catch (Exception) + { + return false; + } + } + + public struct AppTheme + { + public ResourceDictionary ResourceDictionary { get; set; } + public string Name { get; set; } + } + } +} diff --git a/Files/Interacts/Interaction.cs b/Files/Interacts/Interaction.cs index 9ec88f3afe1f..15e9533f48ee 100644 --- a/Files/Interacts/Interaction.cs +++ b/Files/Interacts/Interaction.cs @@ -832,6 +832,7 @@ await newWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => Window.Current.Close(); }; }); + bool viewShown = await ApplicationViewSwitcher.TryShowAsStandaloneAsync(newView.Id); // Set window size again here as sometimes it's not resized in the page Loaded event newView.TryResizeView(new Size(400, 550)); diff --git a/Files/MultilingualResources/Files.ar.xlf b/Files/MultilingualResources/Files.ar.xlf index 1212f46d2d1e..14c76fa5021c 100644 --- a/Files/MultilingualResources/Files.ar.xlf +++ b/Files/MultilingualResources/Files.ar.xlf @@ -2394,6 +2394,14 @@ Open in new Pane Open in new Pane + + Default + Default + + + Color scheme + Color scheme + diff --git a/Files/MultilingualResources/Files.cs-CZ.xlf b/Files/MultilingualResources/Files.cs-CZ.xlf index 47ec6ba26c4b..3cf30424d1d2 100644 --- a/Files/MultilingualResources/Files.cs-CZ.xlf +++ b/Files/MultilingualResources/Files.cs-CZ.xlf @@ -2414,6 +2414,14 @@ Open in new Pane Open in new Pane + + Default + Default + + + Color scheme + Color scheme + diff --git a/Files/MultilingualResources/Files.da-DK.xlf b/Files/MultilingualResources/Files.da-DK.xlf index 375bf75ae74f..4b7e69d2521d 100644 --- a/Files/MultilingualResources/Files.da-DK.xlf +++ b/Files/MultilingualResources/Files.da-DK.xlf @@ -2394,6 +2394,14 @@ Open in new Pane Open in new Pane + + Default + Default + + + Color scheme + Color scheme + diff --git a/Files/MultilingualResources/Files.da.xlf b/Files/MultilingualResources/Files.da.xlf index cbd493f563d6..61a670ade4af 100644 --- a/Files/MultilingualResources/Files.da.xlf +++ b/Files/MultilingualResources/Files.da.xlf @@ -2394,6 +2394,14 @@ Open in new Pane Open in new Pane + + Default + Default + + + Color scheme + Color scheme + diff --git a/Files/MultilingualResources/Files.de-DE.xlf b/Files/MultilingualResources/Files.de-DE.xlf index b2996ed25653..9d87c6fc3006 100644 --- a/Files/MultilingualResources/Files.de-DE.xlf +++ b/Files/MultilingualResources/Files.de-DE.xlf @@ -2396,6 +2396,14 @@ Open in new Pane Open in new Pane + + Default + Default + + + Color scheme + Color scheme + diff --git a/Files/MultilingualResources/Files.es-ES.xlf b/Files/MultilingualResources/Files.es-ES.xlf index 2e95c765e33b..ad4095a0a9a2 100644 --- a/Files/MultilingualResources/Files.es-ES.xlf +++ b/Files/MultilingualResources/Files.es-ES.xlf @@ -2394,6 +2394,14 @@ Open in new Pane Abrir en nuevo Panel + + Default + Default + + + Color scheme + Color scheme + diff --git a/Files/MultilingualResources/Files.fr-FR.xlf b/Files/MultilingualResources/Files.fr-FR.xlf index f4ea29393a39..2326807c91f0 100644 --- a/Files/MultilingualResources/Files.fr-FR.xlf +++ b/Files/MultilingualResources/Files.fr-FR.xlf @@ -2398,6 +2398,14 @@ Open in new Pane Open in new Pane + + Default + Default + + + Color scheme + Color scheme + diff --git a/Files/MultilingualResources/Files.he-IL.xlf b/Files/MultilingualResources/Files.he-IL.xlf index 85e228dac308..44637a61cc6e 100644 --- a/Files/MultilingualResources/Files.he-IL.xlf +++ b/Files/MultilingualResources/Files.he-IL.xlf @@ -2396,6 +2396,14 @@ Open in new Pane Open in new Pane + + Default + Default + + + Color scheme + Color scheme + diff --git a/Files/MultilingualResources/Files.hi-IN.xlf b/Files/MultilingualResources/Files.hi-IN.xlf index 5751a20e2a47..bf5a502d2ba9 100644 --- a/Files/MultilingualResources/Files.hi-IN.xlf +++ b/Files/MultilingualResources/Files.hi-IN.xlf @@ -2407,6 +2407,14 @@ Open in new Pane Open in new Pane + + Default + Default + + + Color scheme + Color scheme + diff --git a/Files/MultilingualResources/Files.hu-HU.xlf b/Files/MultilingualResources/Files.hu-HU.xlf index ab8dcb03b4ca..5dd52b4a96d7 100644 --- a/Files/MultilingualResources/Files.hu-HU.xlf +++ b/Files/MultilingualResources/Files.hu-HU.xlf @@ -2394,6 +2394,14 @@ Open in new Pane Open in new Pane + + Default + Default + + + Color scheme + Color scheme + diff --git a/Files/MultilingualResources/Files.it-IT.xlf b/Files/MultilingualResources/Files.it-IT.xlf index 005aaaeecc87..d85949a6bb42 100644 --- a/Files/MultilingualResources/Files.it-IT.xlf +++ b/Files/MultilingualResources/Files.it-IT.xlf @@ -2394,6 +2394,14 @@ Open in new Pane Open in new Pane + + Default + Default + + + Color scheme + Color scheme + diff --git a/Files/MultilingualResources/Files.ja-JP.xlf b/Files/MultilingualResources/Files.ja-JP.xlf index 3ffbd1b2afe7..40b619cd2d4b 100644 --- a/Files/MultilingualResources/Files.ja-JP.xlf +++ b/Files/MultilingualResources/Files.ja-JP.xlf @@ -2394,6 +2394,14 @@ Open in new Pane Open in new Pane + + Default + Default + + + Color scheme + Color scheme + diff --git a/Files/MultilingualResources/Files.ko-KR.xlf b/Files/MultilingualResources/Files.ko-KR.xlf index 50618da4d893..be9842faf01c 100644 --- a/Files/MultilingualResources/Files.ko-KR.xlf +++ b/Files/MultilingualResources/Files.ko-KR.xlf @@ -2395,6 +2395,14 @@ Open in new Pane Open in new Pane + + Default + Default + + + Color scheme + Color scheme + diff --git a/Files/MultilingualResources/Files.nl-NL.xlf b/Files/MultilingualResources/Files.nl-NL.xlf index 93c0422f62f9..bb7ce1199d57 100644 --- a/Files/MultilingualResources/Files.nl-NL.xlf +++ b/Files/MultilingualResources/Files.nl-NL.xlf @@ -2409,6 +2409,14 @@ Open in new Pane Open in new Pane + + Default + Default + + + Color scheme + Color scheme + diff --git a/Files/MultilingualResources/Files.or-IN.xlf b/Files/MultilingualResources/Files.or-IN.xlf index 87bb72ad7e8c..b3ed30512999 100644 --- a/Files/MultilingualResources/Files.or-IN.xlf +++ b/Files/MultilingualResources/Files.or-IN.xlf @@ -2407,6 +2407,14 @@ Open in new Pane Open in new Pane + + Default + Default + + + Color scheme + Color scheme + diff --git a/Files/MultilingualResources/Files.pl-PL.xlf b/Files/MultilingualResources/Files.pl-PL.xlf index 92b4e92384fe..ed4eafae3001 100644 --- a/Files/MultilingualResources/Files.pl-PL.xlf +++ b/Files/MultilingualResources/Files.pl-PL.xlf @@ -2400,6 +2400,14 @@ Open in new Pane Open in new Pane + + Default + Default + + + Color scheme + Color scheme + diff --git a/Files/MultilingualResources/Files.pt-BR.xlf b/Files/MultilingualResources/Files.pt-BR.xlf index 27f1f5535bc9..2d78f393a6e1 100644 --- a/Files/MultilingualResources/Files.pt-BR.xlf +++ b/Files/MultilingualResources/Files.pt-BR.xlf @@ -2397,6 +2397,14 @@ Open in new Pane Open in new Pane + + Default + Default + + + Color scheme + Color scheme + diff --git a/Files/MultilingualResources/Files.ru-RU.xlf b/Files/MultilingualResources/Files.ru-RU.xlf index 6da5b1bde0a4..1cfb58cd9ed3 100644 --- a/Files/MultilingualResources/Files.ru-RU.xlf +++ b/Files/MultilingualResources/Files.ru-RU.xlf @@ -2394,6 +2394,14 @@ Open in new Pane Open in new Pane + + Default + Default + + + Color scheme + Color scheme + diff --git a/Files/MultilingualResources/Files.sv-SE.xlf b/Files/MultilingualResources/Files.sv-SE.xlf index 2642f6358d00..bb46e8756d02 100644 --- a/Files/MultilingualResources/Files.sv-SE.xlf +++ b/Files/MultilingualResources/Files.sv-SE.xlf @@ -2394,6 +2394,14 @@ Open in new Pane Open in new Pane + + Default + Default + + + Color scheme + Color scheme + diff --git a/Files/MultilingualResources/Files.ta.xlf b/Files/MultilingualResources/Files.ta.xlf index 0baf5f86060f..bfa4a0fa2116 100644 --- a/Files/MultilingualResources/Files.ta.xlf +++ b/Files/MultilingualResources/Files.ta.xlf @@ -2402,6 +2402,14 @@ Open in new Pane Open in new Pane + + Default + Default + + + Color scheme + Color scheme + diff --git a/Files/MultilingualResources/Files.tr-TR.xlf b/Files/MultilingualResources/Files.tr-TR.xlf index f88f8f42849f..f82e24faeb71 100644 --- a/Files/MultilingualResources/Files.tr-TR.xlf +++ b/Files/MultilingualResources/Files.tr-TR.xlf @@ -2395,6 +2395,14 @@ Open in new Pane Open in new Pane + + Default + Default + + + Color scheme + Color scheme + diff --git a/Files/MultilingualResources/Files.uk-UA.xlf b/Files/MultilingualResources/Files.uk-UA.xlf index e61b44bd82bc..09f7be2b77c4 100644 --- a/Files/MultilingualResources/Files.uk-UA.xlf +++ b/Files/MultilingualResources/Files.uk-UA.xlf @@ -2394,6 +2394,14 @@ Open in new Pane Open in new Pane + + Default + Default + + + Color scheme + Color scheme + diff --git a/Files/MultilingualResources/Files.zh-Hans.xlf b/Files/MultilingualResources/Files.zh-Hans.xlf index d18026dd31fb..79239c0d6f04 100644 --- a/Files/MultilingualResources/Files.zh-Hans.xlf +++ b/Files/MultilingualResources/Files.zh-Hans.xlf @@ -2394,6 +2394,14 @@ Open in new Pane Open in new Pane + + Default + Default + + + Color scheme + Color scheme + diff --git a/Files/MultilingualResources/Files.zh-Hant.xlf b/Files/MultilingualResources/Files.zh-Hant.xlf index 318dcfb2a389..b3fb77203496 100644 --- a/Files/MultilingualResources/Files.zh-Hant.xlf +++ b/Files/MultilingualResources/Files.zh-Hant.xlf @@ -2404,6 +2404,14 @@ Open in new Pane Open in new Pane + + Default + Default + + + Color scheme + Color scheme + diff --git a/Files/Strings/en-US/Resources.resw b/Files/Strings/en-US/Resources.resw index c9d8fd6ad392..5505a74864ee 100644 --- a/Files/Strings/en-US/Resources.resw +++ b/Files/Strings/en-US/Resources.resw @@ -1908,4 +1908,10 @@ Show Library section on the sidebar + + Default + + + Color scheme + \ No newline at end of file diff --git a/Files/ViewModels/SettingsViewModel.cs b/Files/ViewModels/SettingsViewModel.cs index bd6f373b9287..8228d97ce2bc 100644 --- a/Files/ViewModels/SettingsViewModel.cs +++ b/Files/ViewModels/SettingsViewModel.cs @@ -549,6 +549,14 @@ public bool ShowOpenInNewTabMenuItem set => Set(value); } + /// + /// The relative path (from the Themes folder) to an xaml file containing a resource dictionary to be loaded at startup. + /// + public string PathToThemeFile + { + get => Get("DefaultScheme".GetLocalized()); + set => Set(value); + } #endregion Appearance #region Experimental diff --git a/Files/ViewModels/SettingsViewModels/AppearanceViewModel.cs b/Files/ViewModels/SettingsViewModels/AppearanceViewModel.cs index 50f41ddad535..77586af6a16e 100644 --- a/Files/ViewModels/SettingsViewModels/AppearanceViewModel.cs +++ b/Files/ViewModels/SettingsViewModels/AppearanceViewModel.cs @@ -17,6 +17,8 @@ public class AppearanceViewModel : ObservableObject private bool showCopyLocationMenuItem = App.AppSettings.ShowCopyLocationMenuItem; private bool showOpenInNewTabMenuItem = App.AppSettings.ShowOpenInNewTabMenuItem; private bool areRightClickContentMenuAnimationsEnabled = App.AppSettings.AreRightClickContentMenuAnimationsEnabled; + private string selectedThemeName = App.AppSettings.PathToThemeFile; + private bool showRestartDialog = false; public AppearanceViewModel() { @@ -35,6 +37,7 @@ public AppearanceViewModel() } public List Themes { get; set; } + public List ColorSchemes => App.ExternalResourcesHelper.Themes; public int SelectedThemeIndex { @@ -139,5 +142,26 @@ public bool AreRightClickContentMenuAnimationsEnabled } } } + public string SelectedThemeName + { + get + { + return selectedThemeName; + } + set + { + if (SetProperty(ref selectedThemeName, value)) + { + App.AppSettings.PathToThemeFile = selectedThemeName; + ShowRestartDialog = true; + } + } + } + + public bool ShowRestartDialog + { + get => showRestartDialog; + set => SetProperty(ref showRestartDialog, value); + } } } \ No newline at end of file diff --git a/Files/Views/Pages/Properties.xaml b/Files/Views/Pages/Properties.xaml index 3fe93261fa88..9f4ace0f013d 100644 --- a/Files/Views/Pages/Properties.xaml +++ b/Files/Views/Pages/Properties.xaml @@ -12,6 +12,7 @@ KeyDown="Page_KeyDown" Loaded="Properties_Loaded" Unloaded="Properties_Unloaded" + Loading="Page_Loading" mc:Ignorable="d"> diff --git a/Files/Views/Pages/Properties.xaml.cs b/Files/Views/Pages/Properties.xaml.cs index 436abd0f585f..5f60d558d5ee 100644 --- a/Files/Views/Pages/Properties.xaml.cs +++ b/Files/Views/Pages/Properties.xaml.cs @@ -15,6 +15,7 @@ using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Input; +using Windows.UI.Xaml.Markup; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Navigation; @@ -268,5 +269,19 @@ public class PropertyNavParam public object navParameter; public IShellPage AppInstanceArgument { get; set; } } + + private void Page_Loading(FrameworkElement sender, object args) + { + // This manually adds the user's theme resources to the page + // I was unable to get this to work any other way + try + { + var xaml = XamlReader.Load(App.ExternalResourcesHelper.CurrentThemeResources) as ResourceDictionary; + App.Current.Resources.MergedDictionaries.Add(xaml); + } + catch (Exception) + { + } + } } } \ No newline at end of file diff --git a/Files/Views/SettingsPages/Appearance.xaml b/Files/Views/SettingsPages/Appearance.xaml index ddbd317b682c..e317583f550a 100644 --- a/Files/Views/SettingsPages/Appearance.xaml +++ b/Files/Views/SettingsPages/Appearance.xaml @@ -5,7 +5,7 @@ xmlns:converters="using:Microsoft.Toolkit.Uwp.UI.Converters" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - xmlns:settingsviewmodels="using:Files.ViewModels.SettingsViewModels" + xmlns:settingsviewmodels="using:Files.ViewModels.SettingsViewModels" xmlns:dialogs="using:Files.Dialogs" mc:Ignorable="d"> @@ -43,6 +43,18 @@ ItemsSource="{Binding Themes}" SelectedIndex="{Binding SelectedThemeIndex, Mode=TwoWay}" /> + + + + - \ No newline at end of file + diff --git a/Files/Views/SettingsPages/Appearance.xaml.cs b/Files/Views/SettingsPages/Appearance.xaml.cs index 5b00734483b8..998a148956d6 100644 --- a/Files/Views/SettingsPages/Appearance.xaml.cs +++ b/Files/Views/SettingsPages/Appearance.xaml.cs @@ -8,5 +8,7 @@ public Appearance() { InitializeComponent(); } + + private bool ShowColorSchemeSelector => App.ExternalResourcesHelper.Themes.Count > 1; } } \ No newline at end of file