Merge branch 'blocking_fixes' into pre-release

# Conflicts:
#	CHANGELOG.md
This commit is contained in:
EzioTheDeadPoet 2023-08-22 19:56:23 +02:00
commit 31200dff1e
11 changed files with 94 additions and 40 deletions

View File

@ -1,5 +1,8 @@
### Changelog ### Changelog
### Version - TBA
* Fixed some UI issues arising from 3.2.0.0 changes - more informative error text, drive space checking, wiki link button
#### Version - 3.2.0.1 - 7/23/2023 #### Version - 3.2.0.1 - 7/23/2023
* Code cleanup: re-added some network and diagnostic code missing since 2.5 * Code cleanup: re-added some network and diagnostic code missing since 2.5

View File

@ -140,6 +140,7 @@ public class InstallerVM : BackNavigatingVM, IBackNavigatingVM, ICpuStatusVM
// Command properties // Command properties
public ReactiveCommand<Unit, Unit> ShowManifestCommand { get; } public ReactiveCommand<Unit, Unit> ShowManifestCommand { get; }
public ReactiveCommand<Unit, Unit> OpenReadmeCommand { get; } public ReactiveCommand<Unit, Unit> OpenReadmeCommand { get; }
public ReactiveCommand<Unit, Unit> OpenWikiCommand { get; }
public ReactiveCommand<Unit, Unit> OpenDiscordButton { get; } public ReactiveCommand<Unit, Unit> OpenDiscordButton { get; }
public ReactiveCommand<Unit, Unit> VisitModListWebsiteCommand { get; } public ReactiveCommand<Unit, Unit> VisitModListWebsiteCommand { get; }
@ -178,6 +179,11 @@ public class InstallerVM : BackNavigatingVM, IBackNavigatingVM, ICpuStatusVM
UIUtils.OpenWebsite(new Uri(ModList!.Readme)); UIUtils.OpenWebsite(new Uri(ModList!.Readme));
}, this.WhenAnyValue(vm => vm.LoadingLock.IsNotLoading, vm => vm.ModList.Readme, (isNotLoading, readme) => isNotLoading && !string.IsNullOrWhiteSpace(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(() => VisitModListWebsiteCommand = ReactiveCommand.Create(() =>
{ {
UIUtils.OpenWebsite(ModList!.Website); UIUtils.OpenWebsite(ModList!.Website);
@ -280,6 +286,10 @@ public class InstallerVM : BackNavigatingVM, IBackNavigatingVM, ICpuStatusVM
{ {
yield return ErrorResponse.Fail("Can't have identical install and download folders"); 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) foreach (var game in GameRegistry.Games)
{ {
if (!_gameLocator.TryFindLocation(game.Key, out var location)) if (!_gameLocator.TryFindLocation(game.Key, out var location))
@ -305,11 +315,12 @@ public class InstallerVM : BackNavigatingVM, IBackNavigatingVM, ICpuStatusVM
} }
if (installPath.ToString().Length != 0 && installPath != LastInstallPath && if (installPath.ToString().Length != 0 && installPath != LastInstallPath &&
!Installer.AutomaticallyOverwrite &&
Directory.EnumerateFileSystemEntries(installPath.ToString()).Any()) Directory.EnumerateFileSystemEntries(installPath.ToString()).Any())
{ {
string message = 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"; string title = "Files found in install folder";
MessageBoxButtons buttons = MessageBoxButtons.YesNo; MessageBoxButtons buttons = MessageBoxButtons.YesNo;
DialogResult result = MessageBox.Show(message, title, buttons); DialogResult result = MessageBox.Show(message, title, buttons);
@ -325,8 +336,41 @@ public class InstallerVM : BackNavigatingVM, IBackNavigatingVM, ICpuStatusVM
if (KnownFolders.IsInSpecialFolder(installPath) || KnownFolders.IsInSpecialFolder(downloadPath)) 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) private async Task BeginSlideShow(CancellationToken token)

View File

@ -39,9 +39,6 @@ namespace Wabbajack
public bool SupportsAfterInstallNavigation => true; public bool SupportsAfterInstallNavigation => true;
[Reactive]
public bool AutomaticallyOverwrite { get; set; }
public int ConfigVisualVerticalOffset => 25; public int ConfigVisualVerticalOffset => 25;
public MO2InstallerVM(InstallerVM installerVM) public MO2InstallerVM(InstallerVM installerVM)
@ -166,7 +163,6 @@ namespace Wabbajack
if (settings == null) return; if (settings == null) return;
settings.InstallationLocation = Location.TargetPath; settings.InstallationLocation = Location.TargetPath;
settings.DownloadLocation = DownloadLocation.TargetPath; settings.DownloadLocation = DownloadLocation.TargetPath;
settings.AutomaticallyOverrideExistingInstall = AutomaticallyOverwrite;
} }
public void AfterInstallNavigation() public void AfterInstallNavigation()

View File

@ -12,7 +12,7 @@
x:TypeArguments="local:InstallerVM" x:TypeArguments="local:InstallerVM"
mc:Ignorable="d"> mc:Ignorable="d">
<local:AttentionBorder x:Name="AttentionBorder" ClipToBounds="True"> <local:AttentionBorder x:Name="AttentionBorder" ClipToBounds="True">
<Grid Margin="5"> <Grid Margin="6">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="*" /> <RowDefinition Height="*" />
<RowDefinition Height="3*" /> <RowDefinition Height="3*" />
@ -23,6 +23,7 @@
<ColumnDefinition Width="*" /> <ColumnDefinition Width="*" />
<ColumnDefinition Width="*" /> <ColumnDefinition Width="*" />
<ColumnDefinition Width="*" /> <ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="5" <TextBlock Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="5"
x:Name="TitleText" x:Name="TitleText"
@ -124,7 +125,7 @@
<TextBlock Grid.Row="1" <TextBlock Grid.Row="1"
Margin="0,10,0,0" Margin="0,10,0,0"
HorizontalAlignment="Center" HorizontalAlignment="Center"
Text="Readme" /> Text="Modlist Readme" />
</Grid> </Grid>
<Grid Grid.Row="1" Grid.Column="4" <Grid Grid.Row="1" Grid.Column="4"
VerticalAlignment="Center" VerticalAlignment="Center"
@ -133,6 +134,29 @@
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
</Grid.RowDefinitions> </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" Grid.ColumnSpan="2" Margin="0,0,10,0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Button <Button
x:Name="CloseButton" x:Name="CloseButton"
Width="50" Width="50"

View File

@ -46,6 +46,9 @@ namespace Wabbajack
this.WhenAny(x => x.ViewModel.OpenReadmeCommand) this.WhenAny(x => x.ViewModel.OpenReadmeCommand)
.BindToStrict(this, x => x.OpenReadmeButton.Command) .BindToStrict(this, x => x.OpenReadmeButton.Command)
.DisposeWith(dispose); .DisposeWith(dispose);
this.WhenAny(x => x.ViewModel.OpenWikiCommand)
.BindToStrict(this, x => x.OpenWikiButton.Command)
.DisposeWith(dispose);
this.WhenAny(x => x.ViewModel.CloseWhenCompleteCommand) this.WhenAny(x => x.ViewModel.CloseWhenCompleteCommand)
.BindToStrict(this, x => x.CloseButton.Command) .BindToStrict(this, x => x.CloseButton.Command)
.DisposeWith(dispose); .DisposeWith(dispose);

View File

@ -39,6 +39,13 @@
FontSize="14" FontSize="14"
Text="Target Modlist" Text="Target Modlist"
TextAlignment="Center" /> 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" <local:FilePicker Grid.Row="1" Grid.Column="2"
x:Name="ModListLocationPicker" x:Name="ModListLocationPicker"
Height="30" Height="30"

View File

@ -47,6 +47,11 @@ namespace Wabbajack
.BindToStrict(this, view => view.BeginButton.IsEnabled) .BindToStrict(this, view => view.BeginButton.IsEnabled)
.DisposeWith(dispose); .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) this.WhenAnyValue(x => x.ViewModel.ErrorState)
.Select(v => v.Failed ? Visibility.Visible : Visibility.Hidden) .Select(v => v.Failed ? Visibility.Visible : Visibility.Hidden)
.BindToStrict(this, view => view.ErrorSummaryIcon.Visibility) .BindToStrict(this, view => view.ErrorSummaryIcon.Visibility)

View File

@ -46,21 +46,5 @@
FontSize="14" FontSize="14"
PickerVM="{Binding DownloadLocation}" PickerVM="{Binding DownloadLocation}"
ToolTip="The directory where modlist archives will be downloaded to" /> 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> </Grid>
</UserControl> </UserControl>

View File

@ -33,13 +33,6 @@
<TextBlock Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" <TextBlock Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3"
x:Name="ExtendedDescription" x:Name="ExtendedDescription"
TextWrapping="WrapWithOverflow" /> 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" <Button Grid.Row="3" Grid.Column="0"
x:Name="CancelButton" x:Name="CancelButton"
Content="Cancel" /> Content="Cancel" />

View File

@ -40,11 +40,6 @@ namespace Wabbajack
this.WhenAny(x => x.ViewModel.Source.CancelCommand) this.WhenAny(x => x.ViewModel.Source.CancelCommand)
.BindToStrict(this, x => x.CancelButton.Command) .BindToStrict(this, x => x.CancelButton.Command)
.DisposeWith(dispose); .DisposeWith(dispose);
this.BindStrict(this.ViewModel, x => x.Installer.AutomaticallyOverwrite, x => x.AutoOverwriteCheckbox.IsChecked,
vmToViewConverter: x => x,
viewToVmConverter: x => x ?? false)
.DisposeWith(dispose);
}); });
} }
} }

View File

@ -231,7 +231,7 @@ public class MainWindowViewModel : ViewModelBase
ShowInCenter = true, ShowInCenter = true,
ContentTitle = "Wabbajack Launcher: Bad startup path", ContentTitle = "Wabbajack Launcher: Bad startup path",
ContentMessage = 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(); var result = await msg.Show();
Environment.Exit(1); Environment.Exit(1);