diff --git a/CHANGELOG.md b/CHANGELOG.md index 9faafebd..7b3601c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ * Nothing yet... * Slideshow more responsive on pressing next * Slideshow timer resets when next is pressed +* Changed modlist extension to `.wabbajack` +* You can now open modlists directly (after initial launch) #### Version 1.0 alpha 2 - 10/15/2019 * Fix installer running in wrong mode diff --git a/Wabbajack.Common/Consts.cs b/Wabbajack.Common/Consts.cs index 55af331f..4aa71c9a 100644 --- a/Wabbajack.Common/Consts.cs +++ b/Wabbajack.Common/Consts.cs @@ -9,7 +9,6 @@ namespace Wabbajack.Common { public static bool TestMode { get; set; } = false; - public static string ModlistExtension = ".modlist_v2"; public static string GameFolderFilesDir = "Game Folder Files"; public static string LOOTFolderFilesDir = "LOOT Config Files"; public static string BSACreationDir = "TEMP_BSA_FILES"; diff --git a/Wabbajack.Common/ExtensionManager.cs b/Wabbajack.Common/ExtensionManager.cs new file mode 100644 index 00000000..065326ed --- /dev/null +++ b/Wabbajack.Common/ExtensionManager.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using Microsoft.Win32; + +namespace Wabbajack.Common +{ + public class ExtensionManager + { + [DllImport("Shell32.dll", CharSet = CharSet.Auto, SetLastError = true)] + public static extern void SHChangeNotify(uint wEventId, uint uFlags, IntPtr dwItem1, IntPtr dwItem2); + + public static string Extension = ".wabbajack"; + + private static readonly string ProgIDPath = "Software\\Classes\\Wabbajack"; + private static readonly string ExtPath = $"Software\\Classes\\{Extension}"; + + private static readonly Dictionary ProgIDList = new Dictionary + { + {"", "Wabbajack"}, + {"FriendlyTypeName", "Wabbajack"}, + {"shell\\open\\command", "\"{appPath}\" -i \"%1\""}, + }; + + private static readonly Dictionary ExtList = new Dictionary + { + {"", "Wabbajack"}, + {"PerceivedType", "Compressed"} + }; + + public static bool NeedsUpdating(string appPath) + { + var progIDKey = Registry.CurrentUser.OpenSubKey(ProgIDPath); + var tempKey = progIDKey?.OpenSubKey("shell\\open\\command"); + if (progIDKey == null || tempKey == null) return true; + return tempKey.GetValue("").ToString().Equals($"\"{appPath}\" -i \"%1\""); + } + + public static bool IsAssociated(string appPath) + { + var progIDKey = Registry.CurrentUser.OpenSubKey(ProgIDPath); + var extKey = Registry.CurrentUser.OpenSubKey(ExtPath); + return (progIDKey != null && extKey != null); + } + + public static void Associate(string appPath) + { + var progIDKey = Registry.CurrentUser.CreateSubKey(ProgIDPath, RegistryKeyPermissionCheck.ReadWriteSubTree); + foreach (KeyValuePair entry in ProgIDList) + { + if (entry.Key.Contains("\\")) + { + var tempKey = progIDKey.CreateSubKey(entry.Key); + tempKey.SetValue("", entry.Value.Replace("{appPath}", appPath)); + } + else + { + progIDKey?.SetValue(entry.Key, entry.Value.Replace("{appPath}", appPath)); + } + } + + var extKey = Registry.CurrentUser.CreateSubKey(ExtPath, RegistryKeyPermissionCheck.ReadWriteSubTree); + foreach (KeyValuePair entry in ExtList) + { + extKey?.SetValue(entry.Key, entry.Value); + } + + progIDKey?.Close(); + extKey?.Close(); + SHChangeNotify(0x000000, 0x0000, IntPtr.Zero, IntPtr.Zero); + } + } +} diff --git a/Wabbajack.Common/Wabbajack.Common.csproj b/Wabbajack.Common/Wabbajack.Common.csproj index 216fcdfb..65755644 100644 --- a/Wabbajack.Common/Wabbajack.Common.csproj +++ b/Wabbajack.Common/Wabbajack.Common.csproj @@ -108,6 +108,7 @@ + diff --git a/Wabbajack.Lib/Compiler.cs b/Wabbajack.Lib/Compiler.cs index 97f74240..94a0f0a4 100644 --- a/Wabbajack.Lib/Compiler.cs +++ b/Wabbajack.Lib/Compiler.cs @@ -69,7 +69,7 @@ namespace Wabbajack.Lib public string MO2ProfileDir => Path.Combine(MO2Folder, "profiles", MO2Profile); public string ModListOutputFolder => "output_folder"; - public string ModListOutputFile => MO2Profile + Consts.ModlistExtension; + public string ModListOutputFile => MO2Profile + ExtensionManager.Extension; public List InstallDirectives { get; private set; } internal UserStatus User { get; private set; } diff --git a/Wabbajack/App.xaml b/Wabbajack/App.xaml index 18bed80d..fa8f6a15 100644 --- a/Wabbajack/App.xaml +++ b/Wabbajack/App.xaml @@ -2,7 +2,6 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:Wabbajack" - StartupUri="UI\ModeSelectionWindow.xaml" ShutdownMode="OnExplicitShutdown"> diff --git a/Wabbajack/App.xaml.cs b/Wabbajack/App.xaml.cs index 8b0c9d7d..7956c9f0 100644 --- a/Wabbajack/App.xaml.cs +++ b/Wabbajack/App.xaml.cs @@ -1,4 +1,5 @@ using System; +using System.Reflection; using System.Windows; using Wabbajack.Common; using Wabbajack.Lib.Updater; @@ -29,6 +30,18 @@ namespace Wabbajack Environment.Exit(1); }*/ + var appPath = Assembly.GetExecutingAssembly().Location; + if (!ExtensionManager.IsAssociated(appPath) || ExtensionManager.NeedsUpdating(appPath)) + { + ExtensionManager.Associate(appPath); + } + + string[] args = Environment.GetCommandLineArgs(); + StartupUri = new Uri("UI/ModeSelectionWindow.xaml", UriKind.Relative); + if (args.Length != 3) return; + if (!args[1].Contains("-i")) return; + // modlists gets loaded using a shell command + StartupUri = new Uri("UI/MainWindow.xaml", UriKind.Relative); } private void SetupHandlers() diff --git a/Wabbajack/UI/MainWindow.xaml.cs b/Wabbajack/UI/MainWindow.xaml.cs index d847a082..6dbe87d4 100644 --- a/Wabbajack/UI/MainWindow.xaml.cs +++ b/Wabbajack/UI/MainWindow.xaml.cs @@ -17,10 +17,19 @@ namespace Wabbajack { private AppState _state; + public MainWindow() + { + string[] args = Environment.GetCommandLineArgs(); + + if (args.Length != 3) return; + var modlistPath = args[2]; + var mainWindow = new MainWindow(RunMode.Install, modlistPath); + mainWindow.Show(); + Close(); + } + public MainWindow(RunMode mode, string source) { - var args = Environment.GetCommandLineArgs(); - InitializeComponent(); var context = new AppState(mode); diff --git a/Wabbajack/UI/ModeSelectionWindow.xaml.cs b/Wabbajack/UI/ModeSelectionWindow.xaml.cs index ce390ccf..821d0695 100644 --- a/Wabbajack/UI/ModeSelectionWindow.xaml.cs +++ b/Wabbajack/UI/ModeSelectionWindow.xaml.cs @@ -90,7 +90,7 @@ namespace Wabbajack private void InstallFromList_Click(object sender, RoutedEventArgs e) { OpenMainWindow(RunMode.Install, - UIUtils.OpenFileDialog($"*{Consts.ModlistExtension}|*{Consts.ModlistExtension}")); + UIUtils.OpenFileDialog($"*{ExtensionManager.Extension}|*{ExtensionManager.Extension}")); } } } diff --git a/Wabbajack/UI/ModeSelectionWindowViewModel.cs b/Wabbajack/UI/ModeSelectionWindowViewModel.cs index 4413ab69..6b86a7bc 100644 --- a/Wabbajack/UI/ModeSelectionWindowViewModel.cs +++ b/Wabbajack/UI/ModeSelectionWindowViewModel.cs @@ -52,7 +52,7 @@ namespace Wabbajack.UI if (!Directory.Exists(Consts.ModListDownloadFolder)) Directory.CreateDirectory(Consts.ModListDownloadFolder); - string dest = Path.Combine(Consts.ModListDownloadFolder, SelectedModList.Links.MachineURL + Consts.ModlistExtension); + string dest = Path.Combine(Consts.ModListDownloadFolder, SelectedModList.Links.MachineURL + ExtensionManager.Extension); var window = new DownloadWindow(SelectedModList.Links.Download, SelectedModList.Title, dest); window.ShowDialog(); diff --git a/Wabbajack/Wabbajack.csproj b/Wabbajack/Wabbajack.csproj index aed33bf3..bd20e1e5 100644 --- a/Wabbajack/Wabbajack.csproj +++ b/Wabbajack/Wabbajack.csproj @@ -17,6 +17,7 @@ true + false publish\ true Disk @@ -29,7 +30,6 @@ true 0 1.0.0.%2a - false false true