mirror of
https://github.com/wabbajack-tools/wabbajack.git
synced 2024-08-30 18:42:17 +00:00
added more visible error messages to avoid user confusion
added hard drive free space detection, added red error message text, removed overwrite checkbox, added wiki button link extended the error text for starting wabbajack in protected location removed debug code shortened error message to fit in text box
This commit is contained in:
parent
4017c5ce51
commit
98c12d46f0
@ -35,6 +35,8 @@ using Wabbajack.Paths.IO;
|
||||
using Wabbajack.Services.OSIntegrated;
|
||||
using Wabbajack.Util;
|
||||
using System.Windows.Forms;
|
||||
using System.Web;
|
||||
using System.Diagnostics;
|
||||
|
||||
namespace Wabbajack;
|
||||
|
||||
@ -140,6 +142,7 @@ public class InstallerVM : BackNavigatingVM, IBackNavigatingVM, ICpuStatusVM
|
||||
// Command properties
|
||||
public ReactiveCommand<Unit, Unit> ShowManifestCommand { get; }
|
||||
public ReactiveCommand<Unit, Unit> OpenReadmeCommand { get; }
|
||||
public ReactiveCommand<Unit, Unit> OpenWikiCommand { get; }
|
||||
public ReactiveCommand<Unit, Unit> OpenDiscordButton { get; }
|
||||
public ReactiveCommand<Unit, Unit> VisitModListWebsiteCommand { get; }
|
||||
|
||||
@ -178,6 +181,11 @@ public class InstallerVM : BackNavigatingVM, IBackNavigatingVM, ICpuStatusVM
|
||||
UIUtils.OpenWebsite(new Uri(ModList!.Readme));
|
||||
}, this.WhenAnyValue(vm => vm.LoadingLock.IsNotLoading, vm => vm.ModList.Readme, (isNotLoading, readme) => isNotLoading && !string.IsNullOrWhiteSpace(readme)));
|
||||
|
||||
OpenWikiCommand = ReactiveCommand.Create(() =>
|
||||
{
|
||||
UIUtils.OpenWebsite(new Uri("https://wiki.wabbajack.org/index.html"));
|
||||
}, this.WhenAnyValue(vm => vm.LoadingLock.IsNotLoading));
|
||||
|
||||
VisitModListWebsiteCommand = ReactiveCommand.Create(() =>
|
||||
{
|
||||
UIUtils.OpenWebsite(ModList!.Website);
|
||||
@ -280,6 +288,10 @@ public class InstallerVM : BackNavigatingVM, IBackNavigatingVM, ICpuStatusVM
|
||||
{
|
||||
yield return ErrorResponse.Fail("Can't have identical install and download folders");
|
||||
}
|
||||
if (installPath.ToString().Length > 0 && downloadPath.ToString().Length > 0 && KnownFolders.IsSubDirectoryOf(installPath.ToString(), downloadPath.ToString()))
|
||||
{
|
||||
yield return ErrorResponse.Fail("Can't put the install folder inside the download folder");
|
||||
}
|
||||
foreach (var game in GameRegistry.Games)
|
||||
{
|
||||
if (!_gameLocator.TryFindLocation(game.Key, out var location))
|
||||
@ -305,11 +317,12 @@ public class InstallerVM : BackNavigatingVM, IBackNavigatingVM, ICpuStatusVM
|
||||
}
|
||||
|
||||
if (installPath.ToString().Length != 0 && installPath != LastInstallPath &&
|
||||
!Installer.AutomaticallyOverwrite &&
|
||||
Directory.EnumerateFileSystemEntries(installPath.ToString()).Any())
|
||||
{
|
||||
string message =
|
||||
"There are existing files in the chosen install path, they will be deleted or overwritten (if updating existing modlist), continue?";
|
||||
"There are files already in the chosen install path, if you are updating an existing modlist, this is fine. " + Environment.NewLine +
|
||||
" Otherwise, please ensure you intend for the folder contents to be deleted during the modlist install." + Environment.NewLine +
|
||||
" Continue? ";
|
||||
string title = "Files found in install folder";
|
||||
MessageBoxButtons buttons = MessageBoxButtons.YesNo;
|
||||
DialogResult result = MessageBox.Show(message, title, buttons);
|
||||
@ -325,8 +338,41 @@ public class InstallerVM : BackNavigatingVM, IBackNavigatingVM, ICpuStatusVM
|
||||
|
||||
if (KnownFolders.IsInSpecialFolder(installPath) || KnownFolders.IsInSpecialFolder(downloadPath))
|
||||
{
|
||||
yield return ErrorResponse.Fail("Can't install a modlist into Windows protected locations - such as Downloads, Documents etc");
|
||||
yield return ErrorResponse.Fail("Can't install a modlist into Windows protected locations - such as Downloads,Documents etc, please make a new folder for the modlist.");
|
||||
}
|
||||
|
||||
if (installPath.ToString().Length > 0 && downloadPath.ToString().Length > 0 && !HasEnoughSpace(installPath, downloadPath)){
|
||||
yield return ErrorResponse.Fail("Can't install modlist due to lack of free hard drive space, please read the modlist Readme to learn more.");
|
||||
}
|
||||
}
|
||||
|
||||
private bool HasEnoughSpace(AbsolutePath inpath, AbsolutePath downpath)
|
||||
{
|
||||
string driveLetterInPath = inpath.ToString().Substring(0,1);
|
||||
string driveLetterDownPath = inpath.ToString().Substring(0,1);
|
||||
DriveInfo driveUsedInPath = new DriveInfo(driveLetterInPath);
|
||||
DriveInfo driveUsedDownPath = new DriveInfo(driveLetterDownPath);
|
||||
long spaceRequiredforInstall = ModlistMetadata.DownloadMetadata.SizeOfInstalledFiles;
|
||||
long spaceRequiredforDownload = ModlistMetadata.DownloadMetadata.SizeOfArchives;
|
||||
long spaceInstRemaining = driveUsedInPath.AvailableFreeSpace;
|
||||
long spaceDownRemaining = driveUsedDownPath.AvailableFreeSpace;
|
||||
if ( driveLetterInPath == driveLetterDownPath)
|
||||
{
|
||||
long totalSpaceRequired = spaceRequiredforInstall + spaceRequiredforDownload;
|
||||
if (spaceInstRemaining < totalSpaceRequired)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
} else
|
||||
{
|
||||
if( spaceInstRemaining < spaceRequiredforInstall || spaceDownRemaining < spaceRequiredforDownload)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
private async Task BeginSlideShow(CancellationToken token)
|
||||
|
@ -39,9 +39,6 @@ namespace Wabbajack
|
||||
|
||||
public bool SupportsAfterInstallNavigation => true;
|
||||
|
||||
[Reactive]
|
||||
public bool AutomaticallyOverwrite { get; set; }
|
||||
|
||||
public int ConfigVisualVerticalOffset => 25;
|
||||
|
||||
public MO2InstallerVM(InstallerVM installerVM)
|
||||
@ -166,7 +163,6 @@ namespace Wabbajack
|
||||
if (settings == null) return;
|
||||
settings.InstallationLocation = Location.TargetPath;
|
||||
settings.DownloadLocation = DownloadLocation.TargetPath;
|
||||
settings.AutomaticallyOverrideExistingInstall = AutomaticallyOverwrite;
|
||||
}
|
||||
|
||||
public void AfterInstallNavigation()
|
||||
|
@ -12,7 +12,7 @@
|
||||
x:TypeArguments="local:InstallerVM"
|
||||
mc:Ignorable="d">
|
||||
<local:AttentionBorder x:Name="AttentionBorder" ClipToBounds="True">
|
||||
<Grid Margin="5">
|
||||
<Grid Margin="6">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="*" />
|
||||
<RowDefinition Height="3*" />
|
||||
@ -23,6 +23,7 @@
|
||||
<ColumnDefinition Width="*" />
|
||||
<ColumnDefinition Width="*" />
|
||||
<ColumnDefinition Width="*" />
|
||||
<ColumnDefinition Width="*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="5"
|
||||
x:Name="TitleText"
|
||||
@ -124,11 +125,34 @@
|
||||
<TextBlock Grid.Row="1"
|
||||
Margin="0,10,0,0"
|
||||
HorizontalAlignment="Center"
|
||||
Text="Readme" />
|
||||
Text="Modlist Readme" />
|
||||
</Grid>
|
||||
<Grid Grid.Row="1" Grid.Column="4"
|
||||
VerticalAlignment="Center"
|
||||
Background="Transparent">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
</Grid.RowDefinitions>
|
||||
<Button
|
||||
x:Name="OpenWikiButton"
|
||||
Width="50"
|
||||
Height="50"
|
||||
Style="{StaticResource CircleButtonStyle}">
|
||||
<icon:PackIconFontAwesome
|
||||
Width="25"
|
||||
Height="25"
|
||||
Foreground="{Binding Foreground, RelativeSource={RelativeSource AncestorType={x:Type Button}}}"
|
||||
Kind="QuestionSolid" />
|
||||
</Button>
|
||||
<TextBlock Grid.Row="1"
|
||||
Margin="0,10,0,0"
|
||||
HorizontalAlignment="Center"
|
||||
Text="Help and Wiki" />
|
||||
</Grid>
|
||||
<Grid Grid.Row="1" Grid.Column="5"
|
||||
VerticalAlignment="Center"
|
||||
Background="Transparent">
|
||||
Background="Transparent" Grid.ColumnSpan="2" Margin="0,0,10,0">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
|
@ -46,6 +46,9 @@ namespace Wabbajack
|
||||
this.WhenAny(x => x.ViewModel.OpenReadmeCommand)
|
||||
.BindToStrict(this, x => x.OpenReadmeButton.Command)
|
||||
.DisposeWith(dispose);
|
||||
this.WhenAny(x => x.ViewModel.OpenWikiCommand)
|
||||
.BindToStrict(this, x => x.OpenWikiButton.Command)
|
||||
.DisposeWith(dispose);
|
||||
this.WhenAny(x => x.ViewModel.CloseWhenCompleteCommand)
|
||||
.BindToStrict(this, x => x.CloseButton.Command)
|
||||
.DisposeWith(dispose);
|
||||
|
@ -39,6 +39,13 @@
|
||||
FontSize="14"
|
||||
Text="Target Modlist"
|
||||
TextAlignment="Center" />
|
||||
<TextBlock x:Name="errorTextBox"
|
||||
Grid.Row="3"
|
||||
FontFamily="Verdana" FontSize="10" FontWeight="ExtraBold"
|
||||
Background="{StaticResource WindowBackgroundBrush}"
|
||||
Foreground="Red"
|
||||
Text=""
|
||||
TextAlignment="Left" Margin="0,79,0,-45" Grid.ColumnSpan="3" />
|
||||
<local:FilePicker Grid.Row="1" Grid.Column="2"
|
||||
x:Name="ModListLocationPicker"
|
||||
Height="30"
|
||||
|
@ -47,6 +47,11 @@ namespace Wabbajack
|
||||
.BindToStrict(this, view => view.BeginButton.IsEnabled)
|
||||
.DisposeWith(dispose);
|
||||
|
||||
this.WhenAnyValue(x => x.ViewModel.ErrorState)
|
||||
.Select(v => v.Reason)
|
||||
.BindToStrict(this, view => view.errorTextBox.Text)
|
||||
.DisposeWith(dispose);
|
||||
|
||||
this.WhenAnyValue(x => x.ViewModel.ErrorState)
|
||||
.Select(v => v.Failed ? Visibility.Visible : Visibility.Hidden)
|
||||
.BindToStrict(this, view => view.ErrorSummaryIcon.Visibility)
|
||||
|
@ -46,21 +46,5 @@
|
||||
FontSize="14"
|
||||
PickerVM="{Binding DownloadLocation}"
|
||||
ToolTip="The directory where modlist archives will be downloaded to" />
|
||||
<CheckBox Grid.Row="2" Grid.Column="2"
|
||||
HorizontalAlignment="Right"
|
||||
Content="Overwrite Installation"
|
||||
IsChecked="{Binding AutomaticallyOverwrite}"
|
||||
ToolTip="If installing over an existing installation, automatically replace it without asking permission.">
|
||||
<CheckBox.Style>
|
||||
<Style TargetType="CheckBox">
|
||||
<Setter Property="Opacity" Value="0.6" />
|
||||
<Style.Triggers>
|
||||
<DataTrigger Binding="{Binding IsMouseOver, RelativeSource={RelativeSource Self}}" Value="True">
|
||||
<Setter Property="Opacity" Value="1" />
|
||||
</DataTrigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
</CheckBox.Style>
|
||||
</CheckBox>
|
||||
</Grid>
|
||||
</UserControl>
|
||||
|
@ -33,13 +33,6 @@
|
||||
<TextBlock Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3"
|
||||
x:Name="ExtendedDescription"
|
||||
TextWrapping="WrapWithOverflow" />
|
||||
<CheckBox Grid.Row="2" Grid.Column="2"
|
||||
x:Name="AutoOverwriteCheckbox"
|
||||
Margin="4"
|
||||
HorizontalAlignment="Right"
|
||||
Content="Remember"
|
||||
IsChecked="{Binding Installer.AutomaticallyOverwrite}"
|
||||
ToolTip="If installing over an existing installation next time, automatically replace it without asking permission." />
|
||||
<Button Grid.Row="3" Grid.Column="0"
|
||||
x:Name="CancelButton"
|
||||
Content="Cancel" />
|
||||
|
@ -40,11 +40,6 @@ namespace Wabbajack
|
||||
this.WhenAny(x => x.ViewModel.Source.CancelCommand)
|
||||
.BindToStrict(this, x => x.CancelButton.Command)
|
||||
.DisposeWith(dispose);
|
||||
|
||||
this.BindStrict(this.ViewModel, x => x.Installer.AutomaticallyOverwrite, x => x.AutoOverwriteCheckbox.IsChecked,
|
||||
vmToViewConverter: x => x,
|
||||
viewToVmConverter: x => x ?? false)
|
||||
.DisposeWith(dispose);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -22,7 +22,6 @@ using Wabbajack.Networking.Http.Interfaces;
|
||||
using Wabbajack.Networking.NexusApi;
|
||||
using Wabbajack.Paths;
|
||||
using Wabbajack.Paths.IO;
|
||||
#pragma warning disable SYSLIB0014
|
||||
|
||||
namespace Wabbajack.Launcher.ViewModels;
|
||||
|
||||
@ -231,7 +230,7 @@ public class MainWindowViewModel : ViewModelBase
|
||||
ShowInCenter = true,
|
||||
ContentTitle = "Wabbajack Launcher: Bad startup path",
|
||||
ContentMessage =
|
||||
"Cannot start in the root of a drive, or protected folder locations such as Downloads, Desktop etc.\nPlease move Wabbajack to another folder."
|
||||
"Cannot start in the root of a drive, or protected folder locations such as Downloads, Desktop etc.\nPlease move Wabbajack to another folder, creating a new folder if necessary ( example : C:\\Wabbajack\\, outside of these locations."
|
||||
});
|
||||
var result = await msg.Show();
|
||||
Environment.Exit(1);
|
||||
|
Loading…
Reference in New Issue
Block a user