mirror of
https://github.com/knah/VRCMelonAssistant.git
synced 2024-06-28 02:50:28 +12:00
Themes refactoring and commenting
This commit is contained in:
parent
621880a925
commit
4e0e7c1900
|
@ -19,27 +19,30 @@ namespace ModAssistant
|
||||||
private static Dictionary<string, ResourceDictionary> loadedThemes = new Dictionary<string, ResourceDictionary>();
|
private static Dictionary<string, ResourceDictionary> loadedThemes = new Dictionary<string, ResourceDictionary>();
|
||||||
private static List<string> preInstalledThemes = new List<string> { "Light", "Dark" };
|
private static List<string> preInstalledThemes = new List<string> { "Light", "Dark" };
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Load all themes from local Themes subfolder and from embedded resources.
|
||||||
|
/// This also refreshes the Themes dropdown in the Options screen.
|
||||||
|
/// </summary>
|
||||||
public static void LoadThemes()
|
public static void LoadThemes()
|
||||||
{
|
{
|
||||||
loadedThemes.Clear();
|
loadedThemes.Clear();
|
||||||
foreach (string localTheme in preInstalledThemes)
|
foreach (string localTheme in preInstalledThemes) //Load local themes (Light and Dark)
|
||||||
{
|
{
|
||||||
ResourceDictionary theme = LoadTheme(localTheme, true);
|
ResourceDictionary theme = LoadTheme(localTheme, true);
|
||||||
loadedThemes.Add(localTheme, theme);
|
loadedThemes.Add(localTheme, theme);
|
||||||
}
|
}
|
||||||
if (Directory.Exists(ThemeDirectory))
|
if (Directory.Exists(ThemeDirectory)) //Load themes from Themes subfolder if it exists.
|
||||||
{
|
{
|
||||||
foreach (string file in Directory.EnumerateFiles(ThemeDirectory))
|
foreach (string file in Directory.EnumerateFiles(ThemeDirectory))
|
||||||
{
|
{
|
||||||
FileInfo info = new FileInfo(file);
|
FileInfo info = new FileInfo(file);
|
||||||
|
//FileInfo includes the extension in its Name field, so we have to split the string and select only the actual name.
|
||||||
|
string name = info.Name.Split('.').First();
|
||||||
//Ignore Themes without the xaml extension and ignore themes with the same names as others.
|
//Ignore Themes without the xaml extension and ignore themes with the same names as others.
|
||||||
//If requests are made I can instead make a Theme class that splits the pre-installed themes from
|
//If requests are made I can instead make a Theme class that splits the pre-installed themes from
|
||||||
//user-made ones so that one more user-made Light/Dark theme can be added.
|
//user-made ones so that one more user-made Light/Dark theme can be added.
|
||||||
MessageBox.Show(info.Extension);
|
if (info.Extension.ToLower().Contains("xaml") && !loadedThemes.ContainsKey(name))
|
||||||
if (info.Extension.ToLower().Contains("xaml"))
|
|
||||||
{
|
{
|
||||||
string name = info.Name.Split('.').First();
|
|
||||||
MessageBox.Show(name);
|
|
||||||
ResourceDictionary theme = LoadTheme(name);
|
ResourceDictionary theme = LoadTheme(name);
|
||||||
if (theme != null)
|
if (theme != null)
|
||||||
{
|
{
|
||||||
|
@ -47,27 +50,20 @@ namespace ModAssistant
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//MessageBox.Show($"(DEBUG) Loaded {loadedThemes.Count - 2} themes from Themes folder.");
|
|
||||||
}
|
}
|
||||||
if (Options.Instance != null && Options.Instance.ApplicationThemeComboBox != null)
|
if (Options.Instance != null && Options.Instance.ApplicationThemeComboBox != null) //Refresh Themes dropdown in Options screen.
|
||||||
{
|
{
|
||||||
Options.Instance.ApplicationThemeComboBox.ItemsSource = LoadedThemes;
|
Options.Instance.ApplicationThemeComboBox.ItemsSource = LoadedThemes;
|
||||||
Options.Instance.ApplicationThemeComboBox.SelectedIndex = LoadedThemes.IndexOf(LoadedTheme);
|
Options.Instance.ApplicationThemeComboBox.SelectedIndex = LoadedThemes.IndexOf(LoadedTheme);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ResourceDictionary LoadTheme(string name, bool localUri = false)
|
/// <summary>
|
||||||
{
|
/// Applies a loaded theme to ModAssistant.
|
||||||
string location = $"{Environment.CurrentDirectory}/Themes/{name}.xaml";
|
/// </summary>
|
||||||
if (!File.Exists(location) && !localUri) return null;
|
/// <param name="theme">Name of the theme.</param>
|
||||||
if (localUri) location = $"Themes/{name}.xaml";
|
/// <param name="element">Page that this is called on (Used for refreshing button icon colors).</param>
|
||||||
Uri uri = new Uri(location, localUri ? UriKind.Relative : UriKind.Absolute);
|
public static void ApplyTheme(string theme)
|
||||||
ResourceDictionary dictionary = new ResourceDictionary();
|
|
||||||
dictionary.Source = uri;
|
|
||||||
return dictionary;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void ApplyTheme(string theme, FrameworkElement element)
|
|
||||||
{
|
{
|
||||||
ResourceDictionary newTheme = loadedThemes[theme];
|
ResourceDictionary newTheme = loadedThemes[theme];
|
||||||
if (newTheme != null)
|
if (newTheme != null)
|
||||||
|
@ -75,27 +71,15 @@ namespace ModAssistant
|
||||||
Application.Current.Resources.MergedDictionaries.RemoveAt(0);
|
Application.Current.Resources.MergedDictionaries.RemoveAt(0);
|
||||||
LoadedTheme = theme;
|
LoadedTheme = theme;
|
||||||
Application.Current.Resources.MergedDictionaries.Insert(0, newTheme);
|
Application.Current.Resources.MergedDictionaries.Insert(0, newTheme);
|
||||||
ReloadIcons(element);
|
ReloadIcons();
|
||||||
}
|
}
|
||||||
else throw new ArgumentException($"{theme} does not exist.");
|
else throw new ArgumentException($"{theme} does not exist.");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void ReloadIcons(FrameworkElement element)
|
/// <summary>
|
||||||
{
|
/// Writes a local theme to disk. You cannot write a theme loaded from the Themes subfolder to disk.
|
||||||
ResourceDictionary icons = Application.Current.Resources.MergedDictionaries.First(x => x.Source.ToString() == "Resources/Icons.xaml");
|
/// </summary>
|
||||||
|
/// <param name="themeName">Name of local theme.</param>
|
||||||
ChangeColor(element, icons, "AboutIconColor", "heartDrawingGroup");
|
|
||||||
ChangeColor(element, icons, "InfoIconColor", "info_circleDrawingGroup");
|
|
||||||
ChangeColor(element, icons, "OptionsIconColor", "cogDrawingGroup");
|
|
||||||
ChangeColor(element, icons, "ModsIconColor", "microchipDrawingGroup");
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void ChangeColor(FrameworkElement element, ResourceDictionary icons, string ResourceColorName, string DrawingGroupName)
|
|
||||||
{
|
|
||||||
element.Resources[ResourceColorName] = loadedThemes[LoadedTheme][ResourceColorName];
|
|
||||||
((GeometryDrawing)((DrawingGroup)icons[DrawingGroupName]).Children[0]).Brush = (Brush)element.Resources[ResourceColorName];
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void WriteThemeToDisk(string themeName)
|
public static void WriteThemeToDisk(string themeName)
|
||||||
{
|
{
|
||||||
if (!Directory.Exists(ThemeDirectory))
|
if (!Directory.Exists(ThemeDirectory))
|
||||||
|
@ -118,5 +102,47 @@ namespace ModAssistant
|
||||||
}
|
}
|
||||||
else MessageBox.Show("Template theme already exists!");
|
else MessageBox.Show("Template theme already exists!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Loads a ResourceDictionary from either Embedded Resources or from a file location.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name">ResourceDictionary file name.</param>
|
||||||
|
/// <param name="localUri">Specifies whether or not to search in Embedded Resources or in the Themes subfolder.</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private static ResourceDictionary LoadTheme(string name, bool localUri = false)
|
||||||
|
{
|
||||||
|
string location = $"{Environment.CurrentDirectory}/Themes/{name}.xaml";
|
||||||
|
if (!File.Exists(location) && !localUri) return null;
|
||||||
|
if (localUri) location = $"Themes/{name}.xaml";
|
||||||
|
Uri uri = new Uri(location, localUri ? UriKind.Relative : UriKind.Absolute);
|
||||||
|
ResourceDictionary dictionary = new ResourceDictionary();
|
||||||
|
dictionary.Source = uri;
|
||||||
|
return dictionary;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Reload the icon colors for the About, Info, Options, and Mods buttons from the currently loaded theme.
|
||||||
|
/// </summary>
|
||||||
|
private static void ReloadIcons()
|
||||||
|
{
|
||||||
|
ResourceDictionary icons = Application.Current.Resources.MergedDictionaries.First(x => x.Source.ToString() == "Resources/Icons.xaml");
|
||||||
|
|
||||||
|
ChangeColor(icons, "AboutIconColor", "heartDrawingGroup");
|
||||||
|
ChangeColor(icons, "InfoIconColor", "info_circleDrawingGroup");
|
||||||
|
ChangeColor(icons, "OptionsIconColor", "cogDrawingGroup");
|
||||||
|
ChangeColor(icons, "ModsIconColor", "microchipDrawingGroup");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Change the color of an image from the loaded theme.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="icons">ResourceDictionary that contains the image.</param>
|
||||||
|
/// <param name="ResourceColorName">Resource name of the color to change.</param>
|
||||||
|
/// <param name="DrawingGroupName">DrawingGroup name for the image.</param>
|
||||||
|
private static void ChangeColor(ResourceDictionary icons, string ResourceColorName, string DrawingGroupName)
|
||||||
|
{
|
||||||
|
Application.Current.Resources[ResourceColorName] = loadedThemes[LoadedTheme][ResourceColorName];
|
||||||
|
((GeometryDrawing)((DrawingGroup)icons[DrawingGroupName]).Children[0]).Brush = (Brush)Application.Current.Resources[ResourceColorName];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,11 +63,11 @@ namespace ModAssistant
|
||||||
Themes.LoadThemes();
|
Themes.LoadThemes();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Themes.ApplyTheme("Light", this);
|
Themes.ApplyTheme("Light");
|
||||||
}
|
}
|
||||||
catch (ArgumentException)
|
catch (ArgumentException)
|
||||||
{
|
{
|
||||||
Themes.ApplyTheme("Light", this);
|
Themes.ApplyTheme("Light");
|
||||||
MainText = "Theme not found, reverting to Light theme...";
|
MainText = "Theme not found, reverting to Light theme...";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -251,9 +251,9 @@ namespace ModAssistant.Pages
|
||||||
{
|
{
|
||||||
if ((sender as ComboBox).SelectedItem == null)
|
if ((sender as ComboBox).SelectedItem == null)
|
||||||
{
|
{
|
||||||
Themes.ApplyTheme("Light", this);
|
Themes.ApplyTheme("Light");
|
||||||
MainWindow.Instance.MainText = "Current theme has been removed, reverting to Light...";
|
MainWindow.Instance.MainText = "Current theme has been removed, reverting to Light...";
|
||||||
}else Themes.ApplyTheme((sender as ComboBox).SelectedItem.ToString(), this);
|
}else Themes.ApplyTheme((sender as ComboBox).SelectedItem.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ApplicationThemeExportTemplate_Click(object sender, RoutedEventArgs e)
|
private void ApplicationThemeExportTemplate_Click(object sender, RoutedEventArgs e)
|
||||||
|
|
Loading…
Reference in a new issue