diff --git a/ModAssistant/App.xaml b/ModAssistant/App.xaml index 513b6f9..8b75b66 100644 --- a/ModAssistant/App.xaml +++ b/ModAssistant/App.xaml @@ -1,4 +1,4 @@ - - + + + + @@ -28,6 +31,9 @@ + + + diff --git a/ModAssistant/Classes/Themes.cs b/ModAssistant/Classes/Themes.cs index 971fb90..3ba3411 100644 --- a/ModAssistant/Classes/Themes.cs +++ b/ModAssistant/Classes/Themes.cs @@ -15,14 +15,22 @@ namespace ModAssistant { public class Themes { - public static string LoadedTheme { get; private set; } //Currently loaded theme - public static List LoadedThemes { get => loadedThemes.Keys.ToList(); } //String of themes that can be loaded - public static string ThemeDirectory => $"{Environment.CurrentDirectory}/Themes"; //Self explanatory. + public static string LoadedTheme { get; private set; } + public static List LoadedThemes { get => loadedThemes.Keys.ToList(); } + public static string ThemeDirectory => $"{Environment.CurrentDirectory}/Themes"; - //Local dictionary of ResourceDictionarys mapped by their names. - private static Dictionary loadedThemes = new Dictionary(); - private static Dictionary loadedWaifus = new Dictionary(); - private static List preInstalledThemes = new List { "Light", "Dark", "Light Pink" }; //These themes will always be available to use. + /// + /// Local dictionary of Resource Dictionaries mapped by their names. + /// + private static Dictionary loadedThemes = new Dictionary(); + private static List preInstalledThemes = new List { "Light", "Dark", "Light Pink" }; + + /// + /// Index of "LoadedTheme" in App.xaml + /// + private static readonly int LOADED_THEME_INDEX = 3; + + private static List supportedVideoExtensions = new List() { ".mp4", ".webm", ".mkv", ".avi", ".m2ts" }; /// /// Load all themes from local Themes subfolder and from embedded resources. @@ -31,46 +39,53 @@ namespace ModAssistant public static void LoadThemes() { loadedThemes.Clear(); - loadedWaifus.Clear(); - if (Directory.Exists(ThemeDirectory)) //Load themes from Themes subfolder if it exists. + + /* + * Begin by loading local themes. We should always load these first. + * I am doing loading here to prevent the LoadTheme function from becoming too crazy. + */ + foreach (string localTheme in preInstalledThemes) + { + string location = $"Themes/{localTheme}.xaml"; + Uri local = new Uri(location, UriKind.Relative); + + ResourceDictionary localDictionary = new ResourceDictionary(); + localDictionary.Source = local; + + Theme theme = new Theme(localTheme, localDictionary); + loadedThemes.Add(localTheme, theme); + } + + // Load themes from Themes subfolder if it exists. + if (Directory.Exists(ThemeDirectory)) { foreach (string file in Directory.EnumerateFiles(ThemeDirectory)) { FileInfo info = new FileInfo(file); - //FileInfo includes the extension in its Name field, so we have to select only the actual name. string name = Path.GetFileNameWithoutExtension(info.Name); - //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 - //user-made ones so that one more user-made Light/Dark theme can be added. - if (info.Extension.ToLower().Equals(".xaml") && !loadedThemes.ContainsKey(name)) + + if (info.Extension.ToLower().Equals(".mat")) { - ResourceDictionary theme = LoadTheme(name); - if (theme != null) - { - loadedThemes.Add(name, theme); - } + Theme theme = LoadZipTheme(ThemeDirectory, name, ".mat"); + if (theme is null) continue; + + AddOrModifyTheme(name, theme); } } - foreach (string file in Directory.EnumerateFiles(ThemeDirectory)) + + // Finally load any loose theme files in subfolders. + foreach (string directory in Directory.EnumerateDirectories(ThemeDirectory)) { - FileInfo info = new FileInfo(file); - string name = Path.GetFileNameWithoutExtension(info.Name); - //Look for zip files with ".mat" extension. - if (info.Extension.ToLower().Equals(".mat") && !loadedThemes.ContainsKey(name)) - { - LoadZipTheme(ThemeDirectory, name, ".mat"); - } + string name = directory.Split('\\').Last(); + Theme theme = LoadTheme(directory, name); + + if (theme is null) continue; + AddOrModifyTheme(name, theme); } } - foreach (string localTheme in preInstalledThemes) //Load local themes (Light and Dark) - { - if (!loadedThemes.ContainsKey(localTheme)) - { - ResourceDictionary theme = LoadTheme(localTheme, true); - loadedThemes.Add(localTheme, theme); - } - } - if (Options.Instance != null && Options.Instance.ApplicationThemeComboBox != null) //Refresh Themes dropdown in Options screen. + + // Refresh Themes dropdown in Options screen. + if (Options.Instance != null && Options.Instance.ApplicationThemeComboBox != null) { Options.Instance.ApplicationThemeComboBox.ItemsSource = LoadedThemes; Options.Instance.ApplicationThemeComboBox.SelectedIndex = LoadedThemes.IndexOf(LoadedTheme); @@ -88,6 +103,7 @@ namespace ModAssistant Themes.ApplyWindowsTheme(); return; } + try { Themes.ApplyTheme(savedTheme, false); @@ -106,18 +122,44 @@ namespace ModAssistant /// Send message to MainText (default: true). public static void ApplyTheme(string theme, bool sendMessage = true) { - if (loadedThemes.TryGetValue(theme, out ResourceDictionary newTheme)) + if (loadedThemes.TryGetValue(theme, out Theme newTheme)) { - Application.Current.Resources.MergedDictionaries.RemoveAt(2); //We might want to change this to a static integer or search by name. LoadedTheme = theme; - Application.Current.Resources.MergedDictionaries.Insert(2, newTheme); //Insert our new theme into the same spot as last time. + MainWindow.Instance.BackgroundVideo.Pause(); + MainWindow.Instance.BackgroundVideo.Visibility = Visibility.Hidden; + + if (newTheme.ThemeDictionary != null) + { + // TODO: Search by name + Application.Current.Resources.MergedDictionaries.RemoveAt(LOADED_THEME_INDEX); + Application.Current.Resources.MergedDictionaries.Insert(LOADED_THEME_INDEX, newTheme.ThemeDictionary); + } + Properties.Settings.Default.SelectedTheme = theme; Properties.Settings.Default.Save(); + if (sendMessage) { MainWindow.Instance.MainText = string.Format((string)Application.Current.FindResource("Themes:ThemeSet"), theme); } - LoadWaifus(theme); + + ApplyWaifus(); + + if (File.Exists(newTheme.VideoLocation)) + { + Uri videoUri = new Uri(newTheme.VideoLocation, UriKind.Absolute); + MainWindow.Instance.BackgroundVideo.Visibility = Visibility.Visible; + + // Load the source video if it's not the same as what's playing, or if the theme is loading for the first time. + if (!sendMessage || MainWindow.Instance.BackgroundVideo.Source?.AbsoluteUri != videoUri.AbsoluteUri) + { + MainWindow.Instance.BackgroundVideo.Stop(); + MainWindow.Instance.BackgroundVideo.Source = videoUri; + } + + MainWindow.Instance.BackgroundVideo.Play(); + } + ReloadIcons(); } else @@ -127,26 +169,24 @@ namespace ModAssistant } /// - /// Writes a local theme to disk. You cannot write a theme loaded from the Themes subfolder to disk. + /// Writes an Embedded Resource theme to disk. You cannot write an outside theme to disk. /// /// Name of local theme. public static void WriteThemeToDisk(string themeName) { - if (!Directory.Exists(ThemeDirectory)) - { - Directory.CreateDirectory(ThemeDirectory); - } + Directory.CreateDirectory(ThemeDirectory); + Directory.CreateDirectory($"{ThemeDirectory}\\{themeName}"); - if (!File.Exists($@"{ThemeDirectory}\\{themeName}.xaml")) + if (File.Exists($@"{ThemeDirectory}\\{themeName}.xaml") == false) { /* - * Light Pink theme is set to build as an Embedded Resource instead of the default Page. + * Any theme that you want to write must be set as an Embedded Resource instead of the default Page. * This is so that we can grab its exact content from Manifest, shown below. * Writing it as is instead of using XAMLWriter keeps the source as is with comments, spacing, and organization. * Using XAMLWriter would compress it into an unorganized mess. */ using (Stream s = Assembly.GetExecutingAssembly().GetManifestResourceStream($"ModAssistant.Themes.{themeName}.xaml")) - using (FileStream writer = new FileStream($@"{ThemeDirectory}\\{themeName}.xaml", FileMode.Create)) + using (FileStream writer = new FileStream($@"{ThemeDirectory}\\{themeName}\\{themeName}.xaml", FileMode.Create)) { byte[] buffer = new byte[s.Length]; int read = s.Read(buffer, 0, (int)s.Length); @@ -180,39 +220,102 @@ namespace ModAssistant return; } } + ApplyTheme("Light", false); } } /// - /// Loads a ResourceDictionary from either Embedded Resources or from a file location. + /// Loads a Theme from a directory location. /// - /// ResourceDictionary file name. - /// Specifies whether or not to search locally or in the Themes subfolder. + /// The full directory path to the theme. + /// Name of the containing folder. /// - private static ResourceDictionary LoadTheme(string name, bool localUri = false) + private static Theme LoadTheme(string directory, string name) { - string location = $"{Environment.CurrentDirectory}/Themes/{name}.xaml"; - if (!File.Exists(location) && !localUri) //Return null if we're looking for an item in the Themes subfolder that doesn't exist. + Theme theme = new Theme(name, null); + theme.Waifus = new Waifus(); + + foreach (string file in Directory.EnumerateFiles(directory).OrderBy(x => x)) { - return null; + FileInfo info = new FileInfo(file); + bool isPng = info.Name.EndsWith(".png", StringComparison.OrdinalIgnoreCase); + bool isSidePng = info.Name.EndsWith(".side.png", StringComparison.OrdinalIgnoreCase); + bool isXaml = info.Name.EndsWith(".xaml", StringComparison.OrdinalIgnoreCase); + + if (isPng && !isSidePng) + { + theme.Waifus.Background = new BitmapImage(new Uri(info.FullName)); + } + + if (isSidePng) + { + theme.Waifus.Sidebar = new BitmapImage(new Uri(info.FullName)); + } + + if (isXaml) + { + try + { + Uri resourceSource = new Uri(info.FullName); + ResourceDictionary dictionary = new ResourceDictionary(); + dictionary.Source = resourceSource; + theme.ThemeDictionary = dictionary; + } + catch (Exception ex) + { + string message = string.Format((string)Application.Current.FindResource("Themes:FailedToLoadXaml"), name, ex.Message); + MessageBox.Show(message); + } + } + + if (supportedVideoExtensions.Contains(info.Extension)) + { + if (info.Name != $"_{name}{info.Extension}" || theme.VideoLocation is null) + { + theme.VideoLocation = info.FullName; + } + } } - if (localUri) //Change the location of the theme since we're not looking in a directory but rather in ModAssistant itself. + + return theme; + } + + /// + /// Modifies an already existing theme, or adds the theme if it doesn't exist + /// + /// Name of the theme. + /// Theme to modify/apply + private static void AddOrModifyTheme(string name, Theme theme) + { + if (loadedThemes.TryGetValue(name, out _)) { - location = $"Themes/{name}.xaml"; + if (theme.ThemeDictionary != null) + { + loadedThemes[name].ThemeDictionary = theme.ThemeDictionary; + } + + if (theme.Waifus?.Background != null) + { + if (loadedThemes[name].Waifus is null) loadedThemes[name].Waifus = new Waifus(); + loadedThemes[name].Waifus.Background = theme.Waifus.Background; + } + + if (theme.Waifus?.Sidebar != null) + { + if (loadedThemes[name].Waifus is null) loadedThemes[name].Waifus = new Waifus(); + loadedThemes[name].Waifus.Sidebar = theme.Waifus.Sidebar; + } + + if (!string.IsNullOrEmpty(theme.VideoLocation)) + { + loadedThemes[name].VideoLocation = theme.VideoLocation; + } } - Uri uri = new Uri(location, localUri ? UriKind.Relative : UriKind.Absolute); - ResourceDictionary dictionary = new ResourceDictionary(); - try - { - dictionary.Source = uri; + else + { + loadedThemes.Add(name, theme); } - catch (Exception ex) - { - MessageBox.Show($"Could not load {name}.\n\n{ex.Message}\n\nIgnoring..."); - return null; - } - return dictionary; } /// @@ -221,46 +324,74 @@ namespace ModAssistant /// Theme directory /// Theme name /// Theme extension - private static void LoadZipTheme(string directory, string name, string extension) + private static Theme LoadZipTheme(string directory, string name, string extension) { - if (!loadedWaifus.TryGetValue(name, out Waifus waifus)) - { - waifus = new Waifus(); - loadedWaifus.Add(name, waifus); - } + Waifus waifus = new Waifus(); + ResourceDictionary dictionary = null; using (FileStream stream = new FileStream(Path.Combine(directory, name + extension), FileMode.Open)) using (ZipArchive archive = new ZipArchive(stream)) { foreach (ZipArchiveEntry file in archive.Entries) { - if (file.Name.EndsWith(".png", StringComparison.OrdinalIgnoreCase) && - !file.Name.EndsWith(".side.png", StringComparison.OrdinalIgnoreCase)) + bool isPng = file.Name.EndsWith(".png", StringComparison.OrdinalIgnoreCase); + bool isSidePng = file.Name.EndsWith(".side.png", StringComparison.OrdinalIgnoreCase); + bool isXaml = file.Name.EndsWith(".xaml", StringComparison.OrdinalIgnoreCase); + + if (isPng && !isSidePng) { waifus.Background = GetImageFromStream(Utils.StreamToArray(file.Open())); } - if (file.Name.EndsWith(".side.png", StringComparison.OrdinalIgnoreCase)) + + if (isSidePng) { waifus.Sidebar = GetImageFromStream(Utils.StreamToArray(file.Open())); } - if (file.Name.EndsWith(".xaml", StringComparison.OrdinalIgnoreCase)) + + string videoExtension = $".{file.Name.Split('.').Last()}"; + if (supportedVideoExtensions.Contains(videoExtension)) { - if (!loadedThemes.ContainsKey(name)) + string videoName = $"{ThemeDirectory}\\{name}\\_{name}{videoExtension}"; + Directory.CreateDirectory($"{ThemeDirectory}\\{name}"); + + if (File.Exists(videoName) == false) { - try + file.ExtractToFile(videoName, false); + } + else + { + /* + * Check to see if the lengths of each file are different. If they are, overwrite what currently exists. + * The reason we are also checking LoadedTheme against the name variable is to prevent overwriting a file that's + * already being used by ModAssistant and causing a System.IO.IOException. + */ + FileInfo existingInfo = new FileInfo(videoName); + if (existingInfo.Length != file.Length && LoadedTheme != name) { - ResourceDictionary dictionary = (ResourceDictionary)XamlReader.Load(file.Open()); - loadedThemes.Add(name, dictionary); - } - catch (Exception ex) - { - MessageBox.Show($"Could not load {name}.\n\n{ex.Message}\n\nIgnoring..."); + file.ExtractToFile(videoName, true); } } } + + if (isXaml && loadedThemes.ContainsKey(name) == false) + { + try + { + dictionary = (ResourceDictionary)XamlReader.Load(file.Open()); + } + catch (Exception ex) + { + string message = string.Format((string)Application.Current.FindResource("Themes:FailedToLoadXaml"), name, ex.Message); + MessageBox.Show(message); + } + } } } - loadedWaifus[name] = waifus; + + Theme theme = new Theme(name, dictionary); + theme.Waifus = waifus; + + return theme; } /// @@ -277,48 +408,38 @@ namespace ModAssistant image.CacheOption = BitmapCacheOption.OnLoad; image.StreamSource = mStream; image.EndInit(); - if (image.CanFreeze) - image.Freeze(); + if (image.CanFreeze) image.Freeze(); + return image; } } /// - /// Applies waifus from Dictionary. + /// Applies waifus from currently loaded Theme. /// - /// - private static void ApplyWaifus(string theme) + private static void ApplyWaifus() { - loadedWaifus.TryGetValue(theme, out Waifus waifus); - MainWindow.Instance.BackgroundImage.ImageSource = waifus.Background; - MainWindow.Instance.SideImage.Source = waifus.Sidebar; - } + Waifus waifus = loadedThemes[LoadedTheme].Waifus; - /// - /// Loads the waifus from the Themes folder or theme files if they exist. - /// - /// Theme's name. - private static void LoadWaifus(string name) - { - string location = Path.Combine(Environment.CurrentDirectory, "Themes"); - if (!loadedWaifus.TryGetValue(name, out Waifus waifus)) + if (waifus?.Background is null) { - waifus = new Waifus(); - loadedWaifus.Add(name, waifus); + MainWindow.Instance.BackgroundImage.Opacity = 0; + } + else + { + MainWindow.Instance.BackgroundImage.Opacity = 1; + MainWindow.Instance.BackgroundImage.ImageSource = waifus.Background; } - if (File.Exists(Path.Combine(location, name + ".png"))) + if (waifus?.Sidebar is null) { - waifus.Background = new BitmapImage(new Uri(Path.Combine(location, name + ".png"))); + MainWindow.Instance.SideImage.Visibility = Visibility.Hidden; } - - if (File.Exists(Path.Combine(location, name + ".side.png"))) + else { - waifus.Sidebar = new BitmapImage(new Uri(Path.Combine(location, name + ".side.png"))); + MainWindow.Instance.SideImage.Visibility = Visibility.Visible; + MainWindow.Instance.SideImage.Source = waifus.Sidebar; } - - loadedWaifus[name] = waifus; - ApplyWaifus(name); } /// @@ -342,7 +463,7 @@ namespace ModAssistant /// DrawingGroup name for the image. private static void ChangeColor(ResourceDictionary icons, string ResourceColorName, string DrawingGroupName) { - Application.Current.Resources[ResourceColorName] = loadedThemes[LoadedTheme][ResourceColorName]; + Application.Current.Resources[ResourceColorName] = loadedThemes[LoadedTheme].ThemeDictionary[ResourceColorName]; ((GeometryDrawing)((DrawingGroup)icons[DrawingGroupName]).Children[0]).Brush = (Brush)Application.Current.Resources[ResourceColorName]; } @@ -351,5 +472,19 @@ namespace ModAssistant public BitmapImage Background = null; public BitmapImage Sidebar = null; } + + private class Theme + { + public string Name; + public ResourceDictionary ThemeDictionary; + public Waifus Waifus = null; + public string VideoLocation = null; + + public Theme(string name, ResourceDictionary dictionary) + { + Name = name; + ThemeDictionary = dictionary; + } + } } } diff --git a/ModAssistant/Localisation/en-DEBUG.xaml b/ModAssistant/Localisation/en-DEBUG.xaml index 3e6ee2b..f0a22b6 100644 --- a/ModAssistant/Localisation/en-DEBUG.xaml +++ b/ModAssistant/Localisation/en-DEBUG.xaml @@ -150,6 +150,7 @@ {0} Themes:ThemeMissing Themes:SavedTemplateTheme {0} Themes:TemplateThemeExists + Themes:FailedToLoadXaml {0} {1} Updater:CheckFailed diff --git a/ModAssistant/Localisation/en-US.xaml b/ModAssistant/Localisation/en-US.xaml index 5f94089..b9e8975 100644 --- a/ModAssistant/Localisation/en-US.xaml +++ b/ModAssistant/Localisation/en-US.xaml @@ -71,7 +71,7 @@ Please read the Beginners Guide on the Wiki - . + . I Agree Disagree @@ -170,8 +170,8 @@ please purchase the game HERE - . - + + . If your copy of the game is @@ -209,6 +209,7 @@ {0} does not exist. Template theme "{0}" saved to Themes folder. Template theme already exists! + Failed to load .xaml file for theme {0}: {1} Couldn't check for updates. diff --git a/ModAssistant/MainWindow.xaml b/ModAssistant/MainWindow.xaml index 3871b61..f9c3eaf 100644 --- a/ModAssistant/MainWindow.xaml +++ b/ModAssistant/MainWindow.xaml @@ -6,7 +6,7 @@ xmlns:local="clr-namespace:ModAssistant" mc:Ignorable="d" Icon="Resources/icon.ico" - Title="{DynamicResource MainWindow:WindowTitle}" Width="1280" Height="720" + Title="{DynamicResource MainWindow:WindowTitle}" SizeChanged="Window_SizeChanged" UIElement.PreviewMouseDown="Window_PreviewMouseDown"> @@ -16,6 +16,7 @@ + diff --git a/ModAssistant/MainWindow.xaml.cs b/ModAssistant/MainWindow.xaml.cs index b88fd23..66e21ee 100644 --- a/ModAssistant/MainWindow.xaml.cs +++ b/ModAssistant/MainWindow.xaml.cs @@ -39,6 +39,16 @@ namespace ModAssistant InitializeComponent(); Instance = this; + const int ContentWidth = 1280; + const int ContentHeight = 720; + + double ChromeWidth = SystemParameters.WindowNonClientFrameThickness.Left + SystemParameters.WindowNonClientFrameThickness.Right; + double ChromeHeight = SystemParameters.WindowNonClientFrameThickness.Top + SystemParameters.WindowNonClientFrameThickness.Bottom; + double ResizeBorder = SystemParameters.ResizeFrameVerticalBorderWidth; + + Width = ChromeWidth + ContentWidth + 2 * ResizeBorder; + Height = ChromeHeight + ContentHeight + 2 * ResizeBorder; + VersionText.Text = App.Version; if (Utils.IsVoid()) @@ -303,5 +313,11 @@ namespace ModAssistant Mods.Instance.RefreshColumns(); } } + + private void BackgroundVideo_MediaEnded(object sender, RoutedEventArgs e) + { + BackgroundVideo.Position = TimeSpan.Zero; + BackgroundVideo.Play(); + } } } diff --git a/ModAssistant/ModAssistant.csproj b/ModAssistant/ModAssistant.csproj index b8e73d3..f019050 100644 --- a/ModAssistant/ModAssistant.csproj +++ b/ModAssistant/ModAssistant.csproj @@ -1,230 +1,246 @@ - - - - - Debug - AnyCPU - {6A224B82-40DA-40B3-94DC-EFBEC2BDDA39} - WinExe - ModAssistant - ModAssistant - v4.6.1 - 512 - {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - 4 - true - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - Resources\icon.ico - - - - - - - - - - - - - - - - - - - 4.0 - - - - - - - - - MSBuild:Compile - Designer - - - - - - - - - Intro.xaml - - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Invalid.xaml - - - Loading.xaml - - - Mods.xaml - - - About.xaml - - - - Designer - MSBuild:Compile - - - MSBuild:Compile - Designer - - - App.xaml - Code - - - - MainWindow.xaml - Code - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - - - Options.xaml - - - Code - - - True - True - Resources.resx - - - True - Settings.settings - True - - - ResXFileCodeGenerator - Resources.Designer.cs - - - PublicSettingsSingleFileGenerator - Settings.Designer.cs - - - - - - - - - + + + + + Debug + AnyCPU + {6A224B82-40DA-40B3-94DC-EFBEC2BDDA39} + WinExe + ModAssistant + ModAssistant + v4.6.1 + 512 + {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 4 + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + Resources\icon.ico + + + + + + + + + + + + + + + + + + + 4.0 + + + + + + + + + MSBuild:Compile + Designer + + + + + + + + + Intro.xaml + + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Invalid.xaml + + + Loading.xaml + + + Mods.xaml + + + About.xaml + + + + Designer + MSBuild:Compile + + + MSBuild:Compile + Designer + + + App.xaml + Code + + + + MainWindow.xaml + Code + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + + + Options.xaml + + + Code + + + True + True + Resources.resx + + + True + Settings.settings + True + + + ResXFileCodeGenerator + Resources.Designer.cs + + + PublicSettingsSingleFileGenerator + Settings.Designer.cs + + + + + + + + + \ No newline at end of file diff --git a/ModAssistant/Styles/RepeatButton.xaml b/ModAssistant/Styles/RepeatButton.xaml new file mode 100644 index 0000000..599c92a --- /dev/null +++ b/ModAssistant/Styles/RepeatButton.xaml @@ -0,0 +1,105 @@ + + + + diff --git a/ModAssistant/Styles/ScrollBar.xaml b/ModAssistant/Styles/ScrollBar.xaml new file mode 100644 index 0000000..5c65bad --- /dev/null +++ b/ModAssistant/Styles/ScrollBar.xaml @@ -0,0 +1,336 @@ + + + diff --git a/ModAssistant/Styles/Thumb.xaml b/ModAssistant/Styles/Thumb.xaml new file mode 100644 index 0000000..0bb8794 --- /dev/null +++ b/ModAssistant/Styles/Thumb.xaml @@ -0,0 +1,45 @@ + + + diff --git a/ModAssistant/Themes/Dark.xaml b/ModAssistant/Themes/Dark.xaml index 29c827a..23434e3 100644 --- a/ModAssistant/Themes/Dark.xaml +++ b/ModAssistant/Themes/Dark.xaml @@ -13,7 +13,7 @@ #AEAEAE - + @@ -56,9 +56,22 @@ - + + + + + + + + + + + + + 0 + @@ -74,7 +87,9 @@ - UniformToFill - Bottom + + UniformToFill + + Bottom diff --git a/ModAssistant/Themes/Default Scrollbar.xaml b/ModAssistant/Themes/Default Scrollbar.xaml new file mode 100644 index 0000000..a0c3718 --- /dev/null +++ b/ModAssistant/Themes/Default Scrollbar.xaml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + 0 + diff --git a/ModAssistant/Themes/Light Pink.xaml b/ModAssistant/Themes/Light Pink.xaml index 51bfa25..5b7dfb2 100644 --- a/ModAssistant/Themes/Light Pink.xaml +++ b/ModAssistant/Themes/Light Pink.xaml @@ -49,6 +49,19 @@ + + + + + + + + + + + + 0 + @@ -62,7 +75,9 @@ - UniformToFill - Bottom - + + UniformToFill + + Bottom + diff --git a/ModAssistant/Themes/Light.xaml b/ModAssistant/Themes/Light.xaml index 10b7e3f..8cbbcd7 100644 --- a/ModAssistant/Themes/Light.xaml +++ b/ModAssistant/Themes/Light.xaml @@ -55,9 +55,22 @@ - + + + + + + + + + + + + + 0 + @@ -72,8 +85,10 @@ - - UniformToFill - Bottom - + + + UniformToFill + + Bottom + diff --git a/ModAssistant/Themes/Ugly Kulu-Ya-Ku.xaml b/ModAssistant/Themes/Ugly Kulu-Ya-Ku.xaml index b0779d9..5f27e91 100644 --- a/ModAssistant/Themes/Ugly Kulu-Ya-Ku.xaml +++ b/ModAssistant/Themes/Ugly Kulu-Ya-Ku.xaml @@ -51,6 +51,7 @@ + @@ -73,11 +74,26 @@ + + + + + + + + + + + + 0 + + + @@ -89,7 +105,10 @@ - UniformToFill - Bottom + + + UniformToFill + + Bottom