mirror of
https://github.com/wabbajack-tools/wabbajack.git
synced 2024-08-30 18:42:17 +00:00
Fix file selection for install page
This commit is contained in:
parent
c14d740367
commit
2a03b01e4a
41
Wabbajack.App/Controls/ButtonSettingTextBox.axaml
Normal file
41
Wabbajack.App/Controls/ButtonSettingTextBox.axaml
Normal file
@ -0,0 +1,41 @@
|
||||
<UserControl xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:i="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia"
|
||||
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||
x:Class="Wabbajack.App.Controls.ButtonSettingTextBox">
|
||||
|
||||
<UserControl.Styles>
|
||||
<Style Selector="Button:not(:pointerover) /template/ ContentPresenter">
|
||||
<Setter Property="Background" Value="Transparent" />
|
||||
<Setter Property="BorderBrush" Value="LightGray" />
|
||||
<Setter Property="CornerRadius" Value="0, 5, 5, 0" />
|
||||
</Style>
|
||||
|
||||
<Style Selector="Button:pointerover /template/ ContentPresenter">
|
||||
<Setter Property="Background" Value="Transparent" />
|
||||
<Setter Property="BorderBrush" Value="LightGray" />
|
||||
<Setter Property="CornerRadius" Value="0, 5, 5, 0" />
|
||||
</Style>
|
||||
|
||||
<Style Selector="TextBox:not(:focus) /template/ ContentPresenter">
|
||||
<Setter Property="Background" Value="Transparent" />
|
||||
<Setter Property="BorderBrush" Value="LightGray" />
|
||||
<Setter Property="CornerRadius" Value="5, 0, 0, 5" />
|
||||
</Style>
|
||||
|
||||
<Style Selector="TextBox:focus /template/ ContentPresenter">
|
||||
<Setter Property="Background" Value="Transparent" />
|
||||
<Setter Property="BorderBrush" Value="LightGray" />
|
||||
<Setter Property="CornerRadius" Value="5, 0, 0, 5" />
|
||||
</Style>
|
||||
</UserControl.Styles>
|
||||
|
||||
<Grid ColumnDefinitions="*, 30" Height="30">
|
||||
<TextBox Grid.Column="0" Name="Path" Height="30" x:Name="TextBox" IsEnabled="False" />
|
||||
<Button Grid.Column="1" Name="SelectButton" Height="30">
|
||||
<i:MaterialIcon Kind="Search" />
|
||||
</Button>
|
||||
</Grid>
|
||||
</UserControl>
|
12
Wabbajack.App/Controls/ButtonSettingTextBox.axaml.cs
Normal file
12
Wabbajack.App/Controls/ButtonSettingTextBox.axaml.cs
Normal file
@ -0,0 +1,12 @@
|
||||
using Avalonia.Controls;
|
||||
|
||||
namespace Wabbajack.App.Controls;
|
||||
|
||||
public partial class ButtonSettingTextBox : UserControl
|
||||
{
|
||||
public ButtonSettingTextBox()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
}
|
@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
using System.Reactive.Disposables;
|
||||
using System.Reactive.Linq;
|
||||
@ -7,6 +8,7 @@ using System.Threading.Tasks;
|
||||
using Avalonia;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.ReactiveUI;
|
||||
using Avalonia.Threading;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using ReactiveUI;
|
||||
using ReactiveUI.Fody.Helpers;
|
||||
@ -14,11 +16,8 @@ using Wabbajack.Paths;
|
||||
|
||||
namespace Wabbajack.App.Controls;
|
||||
|
||||
public partial class FileSelectionBox : UserControl
|
||||
public partial class FileSelectionBox : ReactiveUserControl<FileSelectionBoxViewModel>
|
||||
{
|
||||
public static readonly DirectProperty<FileSelectionBox, AbsolutePath> SelectedPathProperty =
|
||||
AvaloniaProperty.RegisterDirect<FileSelectionBox, AbsolutePath>(nameof(SelectedPath), o => o.SelectedPath);
|
||||
|
||||
public static readonly StyledProperty<string> AllowedExtensionsProperty =
|
||||
AvaloniaProperty.Register<FileSelectionBox, string>(nameof(AllowedExtensions));
|
||||
|
||||
@ -63,7 +62,7 @@ public partial class FileSelectionBox : UserControl
|
||||
}
|
||||
|
||||
[Reactive]
|
||||
public AbsolutePath SelectedPath { get; private set; }
|
||||
public AbsolutePath SelectedPath { get; set; }
|
||||
|
||||
public string AllowedExtensions
|
||||
{
|
||||
@ -79,7 +78,9 @@ public partial class FileSelectionBox : UserControl
|
||||
|
||||
public void Load(AbsolutePath path)
|
||||
{
|
||||
TextBox.Text = path.ToString();
|
||||
SelectedPath = path;
|
||||
Dispatcher.UIThread.Post(() => {
|
||||
TextBox.Text = path.ToString();
|
||||
SelectedPath = path;
|
||||
});
|
||||
}
|
||||
}
|
@ -18,13 +18,13 @@
|
||||
</Grid>
|
||||
<Grid Margin="40" RowDefinitions="40, 40, 40, *" ColumnDefinitions="100, *, 200" Grid.Row="1">
|
||||
<Label Grid.Column="0" Grid.Row="0" HorizontalAlignment="Right" VerticalAlignment="Center">ModList:</Label>
|
||||
<controls:FileSelectionBox Grid.Column="1" Grid.Row="0" AllowedExtensions=".wabbajack" x:Name="ModListFile" />
|
||||
<controls:ButtonSettingTextBox Grid.Column="1" Grid.Row="0" x:Name="ModListFile" />
|
||||
|
||||
<Label Grid.Column="0" Grid.Row="1" HorizontalAlignment="Right" VerticalAlignment="Center">Install To:</Label>
|
||||
<controls:FileSelectionBox Grid.Column="1" Grid.Row="1" SelectFolder="True" x:Name="InstallPath" />
|
||||
<controls:ButtonSettingTextBox Grid.Column="1" Grid.Row="1" x:Name="InstallPath" />
|
||||
|
||||
<Label Grid.Column="0" Grid.Row="2" HorizontalAlignment="Right" VerticalAlignment="Center">Download To:</Label>
|
||||
<controls:FileSelectionBox Grid.Column="1" Grid.Row="2" SelectFolder="True" x:Name="DownloadPath" />
|
||||
<controls:ButtonSettingTextBox Grid.Column="1" Grid.Row="2" x:Name="DownloadPath" />
|
||||
|
||||
<controls:LargeIconButton x:Name="BeginInstall" Margin="40, 0, 0, 0" Grid.Row="0" Grid.Column="2"
|
||||
Grid.RowSpan="4" Icon="DownloadNetwork" Text="Install" />
|
||||
|
@ -1,11 +1,18 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reactive.Disposables;
|
||||
using System.Reactive.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.ReactiveUI;
|
||||
using Avalonia.Threading;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using ReactiveUI;
|
||||
using Wabbajack.App.Interfaces;
|
||||
using Wabbajack.App.ViewModels;
|
||||
using Wabbajack.Common;
|
||||
using Wabbajack.Paths;
|
||||
|
||||
namespace Wabbajack.App.Views;
|
||||
|
||||
@ -18,30 +25,23 @@ public partial class InstallConfigurationView : ScreenBase<InstallConfigurationV
|
||||
|
||||
this.WhenActivated(disposables =>
|
||||
{
|
||||
ViewModel.WhenAnyValue(vm => vm.ModListPath)
|
||||
.Subscribe(path => ModListFile.Load(path))
|
||||
ModListFile.SelectButton.Command = ReactiveCommand.CreateFromTask(SelectWabbajackFile)
|
||||
.DisposeWith(disposables);
|
||||
this.OneWayBind(ViewModel, vm => vm.ModListPath, view => view.ModListFile.TextBox.Text)
|
||||
.DisposeWith(disposables);
|
||||
|
||||
ViewModel.WhenAnyValue(vm => vm.Download)
|
||||
.Subscribe(path => DownloadPath.Load(path))
|
||||
InstallPath.SelectButton.Command = ReactiveCommand.CreateFromTask(() =>
|
||||
SelectFolder("Select Install Location", p => ViewModel!.Install = p))
|
||||
.DisposeWith(disposables);
|
||||
this.OneWayBind(ViewModel, vm => vm.Install, view => view.InstallPath.TextBox.Text)
|
||||
.DisposeWith(disposables);
|
||||
|
||||
ViewModel.WhenAnyValue(vm => vm.Install)
|
||||
.Subscribe(path => InstallPath.Load(path))
|
||||
DownloadPath.SelectButton.Command = ReactiveCommand.CreateFromTask(() =>
|
||||
SelectFolder("Select Download Location", p => ViewModel!.Download = p))
|
||||
.DisposeWith(disposables);
|
||||
|
||||
this.WhenAnyValue(view => view.ModListFile.SelectedPath)
|
||||
.BindTo(ViewModel, vm => vm.ModListPath)
|
||||
this.OneWayBind(ViewModel, vm => vm.Download, view => view.DownloadPath.TextBox.Text)
|
||||
.DisposeWith(disposables);
|
||||
|
||||
this.WhenAnyValue(view => view.DownloadPath.SelectedPath)
|
||||
.BindTo(ViewModel, vm => vm.Download)
|
||||
.DisposeWith(disposables);
|
||||
|
||||
this.WhenAnyValue(view => view.InstallPath.SelectedPath)
|
||||
.BindTo(ViewModel, vm => vm.Install)
|
||||
.DisposeWith(disposables);
|
||||
|
||||
|
||||
this.OneWayBind(ViewModel, vm => vm.ModListImage, view => view.ModListImage.Source)
|
||||
.DisposeWith(disposables);
|
||||
|
||||
@ -50,5 +50,40 @@ public partial class InstallConfigurationView : ScreenBase<InstallConfigurationV
|
||||
});
|
||||
}
|
||||
|
||||
private async Task SelectWabbajackFile()
|
||||
{
|
||||
var fod = new OpenFileDialog()
|
||||
{
|
||||
Filters = new List<FileDialogFilter> {new()
|
||||
{
|
||||
Name = "Wabbajack",
|
||||
Extensions = new List<string> {Ext.Wabbajack.ToString()}
|
||||
}
|
||||
}
|
||||
};
|
||||
var result = await fod.ShowAsync(App.MainWindow);
|
||||
if (result == null) return;
|
||||
|
||||
Dispatcher.UIThread.Post(() =>
|
||||
{
|
||||
ViewModel!.ModListPath = result.First().ToAbsolutePath();
|
||||
});
|
||||
}
|
||||
|
||||
public async Task SelectFolder(string title, Action<AbsolutePath> toCall)
|
||||
{
|
||||
var fod = new OpenFolderDialog
|
||||
{
|
||||
Title = title
|
||||
};
|
||||
var result = await fod.ShowAsync(App.MainWindow);
|
||||
if (result == null) return;
|
||||
|
||||
Dispatcher.UIThread.Post(() =>
|
||||
{
|
||||
toCall(result.ToAbsolutePath());
|
||||
});
|
||||
}
|
||||
|
||||
public Type ViewModelType => typeof(InstallConfigurationViewModel);
|
||||
}
|
Loading…
Reference in New Issue
Block a user