Remove install location changing post installation

This commit is contained in:
pizzaboxer 2023-08-23 12:43:10 +01:00
parent cf09956258
commit 517546087c
No known key found for this signature in database
GPG Key ID: 59D4A1DBAD0F2BA8
7 changed files with 137 additions and 199 deletions

View File

@ -178,8 +178,6 @@ namespace Bloxstrap
await CheckLatestVersion(); await CheckLatestVersion();
CheckInstallMigration();
// install/update roblox if we're running for the first time, needs updating, or the player location doesn't exist // install/update roblox if we're running for the first time, needs updating, or the player location doesn't exist
if (App.IsFirstRun || _latestVersionGuid != App.State.Prop.VersionGuid || !File.Exists(_playerLocation)) if (App.IsFirstRun || _latestVersionGuid != App.State.Prop.VersionGuid || !File.Exists(_playerLocation))
await InstallLatestVersion(); await InstallLatestVersion();
@ -477,71 +475,6 @@ namespace Bloxstrap
App.Logger.WriteLine(LOG_IDENT, $"Registered as {totalSize} KB"); App.Logger.WriteLine(LOG_IDENT, $"Registered as {totalSize} KB");
} }
private void CheckInstallMigration()
{
const string LOG_IDENT = "Bootstrapper::CheckInstallMigration";
// check if we've changed our install location since the last time we started
// in which case, we'll have to copy over all our folders so we don't lose any mods and stuff
using RegistryKey? applicationKey = Registry.CurrentUser.OpenSubKey($@"Software\{App.ProjectName}", true);
string? oldInstallLocation = (string?)applicationKey?.GetValue("OldInstallLocation");
if (applicationKey is null || oldInstallLocation is null || oldInstallLocation == Paths.Base)
return;
SetStatus("Migrating install location...");
if (Directory.Exists(oldInstallLocation))
{
App.Logger.WriteLine(LOG_IDENT, $"Moving all files in {oldInstallLocation} to {Paths.Base}...");
foreach (string oldFileLocation in Directory.GetFiles(oldInstallLocation, "*.*", SearchOption.AllDirectories))
{
string relativeFile = oldFileLocation.Substring(oldInstallLocation.Length + 1);
string newFileLocation = Path.Combine(Paths.Base, relativeFile);
string? newDirectory = Path.GetDirectoryName(newFileLocation);
try
{
if (!String.IsNullOrEmpty(newDirectory))
Directory.CreateDirectory(newDirectory);
File.Move(oldFileLocation, newFileLocation, true);
}
catch (Exception ex)
{
App.Logger.WriteLine(LOG_IDENT, $"Failed to move {oldFileLocation} to {newFileLocation}! {ex}");
}
}
try
{
Directory.Delete(oldInstallLocation, true);
App.Logger.WriteLine(LOG_IDENT, "Deleted old install location");
}
catch (Exception ex)
{
App.Logger.WriteLine(LOG_IDENT, $"Failed to delete old install location! {ex}");
}
}
applicationKey.DeleteValue("OldInstallLocation");
// allow shortcuts to be re-registered
if (Directory.Exists(Paths.StartMenu))
Directory.Delete(Paths.StartMenu, true);
if (File.Exists(DesktopShortcutLocation))
{
File.Delete(DesktopShortcutLocation);
App.Settings.Prop.CreateDesktopIcon = true;
}
App.Logger.WriteLine(LOG_IDENT, "Finished migrating install location!");
}
public static void CheckInstall() public static void CheckInstall()
{ {
const string LOG_IDENT = "Bootstrapper::CheckInstall"; const string LOG_IDENT = "Bootstrapper::CheckInstall";
@ -746,7 +679,7 @@ namespace Bloxstrap
// if the folder we're installed to does not end with "Bloxstrap", we're installed to a user-selected folder // if the folder we're installed to does not end with "Bloxstrap", we're installed to a user-selected folder
// in which case, chances are they chose to install to somewhere they didn't really mean to (prior to the added warning in 2.4.0) // in which case, chances are they chose to install to somewhere they didn't really mean to (prior to the added warning in 2.4.0)
// if so, we're walking on eggshells and have to ensure we only clean up what we need to clean up // if so, we're walking on eggshells and have to ensure we only clean up what we need to clean up
bool cautiousUninstall = !Paths.Base.EndsWith(App.ProjectName); bool cautiousUninstall = !Paths.Base.ToLower().EndsWith(App.ProjectName.ToLower());
var cleanupSequence = new List<Action> var cleanupSequence = new List<Action>
{ {
@ -1418,6 +1351,7 @@ namespace Bloxstrap
App.Logger.WriteLine(LOG_IDENT, $"An exception occurred after downloading {totalBytesRead} bytes. ({i}/{maxTries})"); App.Logger.WriteLine(LOG_IDENT, $"An exception occurred after downloading {totalBytesRead} bytes. ({i}/{maxTries})");
App.Logger.WriteException(LOG_IDENT, ex); App.Logger.WriteException(LOG_IDENT, ex);
if (File.Exists(packageLocation))
File.Delete(packageLocation); File.Delete(packageLocation);
if (i >= maxTries) if (i >= maxTries)

View File

@ -78,7 +78,5 @@
<ui:Button Content="Cancel" Command="{Binding CloseWindowCommand, Mode=OneWay}" /> <ui:Button Content="Cancel" Command="{Binding CloseWindowCommand, Mode=OneWay}" />
</StatusBarItem> </StatusBarItem>
</StatusBar> </StatusBar>
<ui:Dialog x:Name="RootDialog" Title="WPF UI" Grid.Row="1" Grid.RowSpan="2" ButtonLeftVisibility="Collapsed" ButtonRightName="Continue" DialogHeight="225" DialogWidth="430" />
</Grid> </Grid>
</ui:UiWindow> </ui:UiWindow>

View File

@ -15,16 +15,14 @@ namespace Bloxstrap.UI.Elements.Menu
public partial class MainWindow : INavigationWindow public partial class MainWindow : INavigationWindow
{ {
private readonly IThemeService _themeService = new ThemeService(); private readonly IThemeService _themeService = new ThemeService();
private readonly IDialogService _dialogService = new DialogService();
public MainWindow() public MainWindow()
{ {
App.Logger.WriteLine("MainWindow::MainWindow", "Initializing menu"); App.Logger.WriteLine("MainWindow::MainWindow", "Initializing menu");
DataContext = new MainWindowViewModel(this, _dialogService); DataContext = new MainWindowViewModel(this);
SetTheme(); SetTheme();
InitializeComponent(); InitializeComponent();
_dialogService.SetDialogControl(RootDialog);
} }
public void SetTheme() public void SetTheme()

View File

@ -1,5 +1,4 @@
using Bloxstrap.UI.ViewModels.Menu; using System;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
@ -14,6 +13,8 @@ using System.Windows.Media.Imaging;
using System.Windows.Navigation; using System.Windows.Navigation;
using System.Windows.Shapes; using System.Windows.Shapes;
using Bloxstrap.UI.ViewModels.Menu;
namespace Bloxstrap.UI.Elements.Menu.Pages namespace Bloxstrap.UI.Elements.Menu.Pages
{ {
/// <summary> /// <summary>

View File

@ -3,16 +3,29 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:models="clr-namespace:Bloxstrap.UI.ViewModels"
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml" xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
xmlns:local="clr-namespace:Bloxstrap.UI.Elements.Menu.Pages"
xmlns:models="clr-namespace:Bloxstrap.UI.ViewModels"
xmlns:viewmodels="clr-namespace:Bloxstrap.UI.ViewModels.Menu"
d:DataContext="{d:DesignInstance Type=viewmodels:InstallationViewModel}"
mc:Ignorable="d" mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800" d:DesignHeight="450" d:DesignWidth="800"
Title="InstallationPage" Title="InstallationPage">
Scrollable="True">
<StackPanel Margin="0,0,14,14"> <StackPanel Margin="0,0,14,14">
<TextBlock Text="Configure how Bloxstrap/Roblox is installed." FontSize="14" Foreground="{DynamicResource TextFillColorSecondaryBrush}" /> <TextBlock Text="Configure how Bloxstrap/Roblox is installed." FontSize="14" Foreground="{DynamicResource TextFillColorSecondaryBrush}" />
<ui:CardExpander Margin="0,16,0,0" IsExpanded="True"> <ui:CardExpander Margin="0,16,0,0" IsExpanded="True">
<ui:CardExpander.Style>
<Style TargetType="ui:CardExpander" BasedOn="{StaticResource {x:Type ui:CardExpander}}">
<Setter Property="Visibility" Value="Collapsed" />
<Style.Triggers>
<DataTrigger Binding="{Binding Source={x:Static models:GlobalViewModel.IsNotFirstRun}}" Value="False">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</ui:CardExpander.Style>
<ui:CardExpander.Header> <ui:CardExpander.Header>
<StackPanel> <StackPanel>
<TextBlock FontSize="14" Text="Install Location" /> <TextBlock FontSize="14" Text="Install Location" />

View File

@ -1,4 +1,19 @@
using Bloxstrap.UI.ViewModels.Menu; using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Bloxstrap.UI.ViewModels.Menu;
namespace Bloxstrap.UI.Elements.Menu.Pages namespace Bloxstrap.UI.Elements.Menu.Pages
{ {

View File

@ -14,8 +14,6 @@ namespace Bloxstrap.UI.ViewModels.Menu
public class MainWindowViewModel : NotifyPropertyChangedViewModel public class MainWindowViewModel : NotifyPropertyChangedViewModel
{ {
private readonly Window _window; private readonly Window _window;
private readonly IDialogService _dialogService;
private readonly string _originalBaseDirectory = App.BaseDirectory; // we need this to check if the basedirectory changes
public ICommand CloseWindowCommand => new RelayCommand(CloseWindow); public ICommand CloseWindowCommand => new RelayCommand(CloseWindow);
public ICommand ConfirmSettingsCommand => new RelayCommand(ConfirmSettings); public ICommand ConfirmSettingsCommand => new RelayCommand(ConfirmSettings);
@ -24,25 +22,31 @@ namespace Bloxstrap.UI.ViewModels.Menu
public string ConfirmButtonText => App.IsFirstRun ? "Install" : "Save"; public string ConfirmButtonText => App.IsFirstRun ? "Install" : "Save";
public bool ConfirmButtonEnabled { get; set; } = true; public bool ConfirmButtonEnabled { get; set; } = true;
public MainWindowViewModel(Window window, IDialogService dialogService) public MainWindowViewModel(Window window)
{ {
_window = window; _window = window;
_dialogService = dialogService;
} }
private void CloseWindow() => _window.Close(); private void CloseWindow() => _window.Close();
private void ConfirmSettings() private void ConfirmSettings()
{ {
if (!App.IsFirstRun)
{
App.ShouldSaveConfigs = true;
App.FastFlags.Save();
CloseWindow();
return;
}
if (string.IsNullOrEmpty(App.BaseDirectory)) if (string.IsNullOrEmpty(App.BaseDirectory))
{ {
Controls.ShowMessageBox("You must set an install location", MessageBoxImage.Error); Controls.ShowMessageBox("You must set an install location", MessageBoxImage.Error);
return; return;
} }
bool shouldCheckInstallLocation = App.IsFirstRun || App.BaseDirectory != _originalBaseDirectory; if (NavigationVisibility == Visibility.Visible)
if (shouldCheckInstallLocation && NavigationVisibility == Visibility.Visible)
{ {
try try
{ {
@ -105,8 +109,6 @@ namespace Bloxstrap.UI.ViewModels.Menu
} }
} }
if (App.IsFirstRun)
{
if (NavigationVisibility == Visibility.Visible) if (NavigationVisibility == Visibility.Visible)
{ {
((INavigationWindow)_window).Navigate(typeof(PreInstallPage)); ((INavigationWindow)_window).Navigate(typeof(PreInstallPage));
@ -131,28 +133,5 @@ namespace Bloxstrap.UI.ViewModels.Menu
CloseWindow(); CloseWindow();
} }
} }
else
{
App.ShouldSaveConfigs = true;
App.FastFlags.Save();
if (shouldCheckInstallLocation)
{
App.Logger.WriteLine("MainWindowViewModel::ConfirmSettings", $"Changing install location from {_originalBaseDirectory} to {App.BaseDirectory}");
Controls.ShowMessageBox(
$"{App.ProjectName} will install to the new location you've set the next time it runs.",
MessageBoxImage.Information
);
using RegistryKey registryKey = Registry.CurrentUser.CreateSubKey($@"Software\{App.ProjectName}");
registryKey.SetValue("InstallLocation", App.BaseDirectory);
registryKey.SetValue("OldInstallLocation", _originalBaseDirectory);
Paths.Initialize(App.BaseDirectory);
}
CloseWindow();
}
}
} }
} }