Skip to content

Commit 9d17a03

Browse files
CopilotLeftofZen
andcommitted
Add individual add/remove buttons for dependent objects list in RegionView
Co-authored-by: LeftofZen <7483209+LeftofZen@users.noreply.github.com>
1 parent 4e2a3b8 commit 9d17a03

4 files changed

Lines changed: 72 additions & 2 deletions

File tree

Gui/ViewModels/Loco/Objects/RegionViewModel.cs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
1+
using Avalonia;
2+
using Avalonia.Controls.ApplicationLifetimes;
13
using Definitions.ObjectModels.Objects.Region;
24
using Definitions.ObjectModels.Types;
35
using Gui.Models;
6+
using Gui.Views;
47
using ReactiveUI;
8+
using ReactiveUI.Fody.Helpers;
59
using System.Collections.Generic;
610
using System.ComponentModel;
711
using System.Linq;
812
using System.Reactive;
13+
using System.Reactive.Linq;
914
using System.Text.Json;
1015
using System.Threading.Tasks;
1116

@@ -24,7 +29,11 @@ public RegionViewModel(RegionObject model, ObjectEditorContext? editorContext =
2429
CargoInfluenceObjects = new BindingList<ObjectModelHeader>(model.CargoInfluenceObjects);
2530
CargoInfluenceTownFilter = new BindingList<CargoInfluenceTownFilterType>(model.CargoInfluenceTownFilter);
2631

32+
var hasSelection = this.WhenAnyValue(x => x.SelectedDependentObject).Select(obj => obj != null);
33+
2734
PopulateDependentObjectsFromFolderCommand = ReactiveCommand.CreateFromTask(PopulateDependentObjectsFromFolder);
35+
AddDependentObjectCommand = ReactiveCommand.CreateFromTask(AddDependentObjectAsync);
36+
RemoveSelectedDependentObjectCommand = ReactiveCommand.Create(RemoveSelectedDependentObject, hasSelection);
2837
CopyDependentObjectsCommand = ReactiveCommand.CreateFromTask(CopyDependentObjectsAsync);
2938
PasteDependentObjectsCommand = ReactiveCommand.CreateFromTask(PasteDependentObjectsAsync);
3039
ClearDependentObjectsCommand = ReactiveCommand.Create(ClearDependentObjects);
@@ -45,6 +54,10 @@ public uint8_t pad_07
4554
[Browsable(false)]
4655
public BindingList<ObjectModelHeader> DependentObjects { get; }
4756

57+
[Browsable(false)]
58+
[Reactive]
59+
public ObjectModelHeader? SelectedDependentObject { get; set; }
60+
4861
[Category("Cargo")]
4962
public BindingList<ObjectModelHeader> CargoInfluenceObjects { get; }
5063

@@ -54,6 +67,12 @@ public uint8_t pad_07
5467
[Browsable(false)]
5568
public ReactiveCommand<Unit, Unit> PopulateDependentObjectsFromFolderCommand { get; }
5669

70+
[Browsable(false)]
71+
public ReactiveCommand<Unit, Unit> AddDependentObjectCommand { get; }
72+
73+
[Browsable(false)]
74+
public ReactiveCommand<Unit, Unit> RemoveSelectedDependentObjectCommand { get; }
75+
5776
[Browsable(false)]
5877
public ReactiveCommand<Unit, Unit> CopyDependentObjectsCommand { get; }
5978

@@ -80,6 +99,37 @@ Task PopulateDependentObjectsFromFolder()
8099
return Task.CompletedTask;
81100
}
82101

102+
async Task AddDependentObjectAsync()
103+
{
104+
var objectIndex = editorContext?.ObjectIndex;
105+
if (objectIndex == null)
106+
{
107+
return;
108+
}
109+
110+
if (Application.Current?.ApplicationLifetime is not IClassicDesktopStyleApplicationLifetime app || app.MainWindow == null)
111+
{
112+
return;
113+
}
114+
115+
var vm = new ObjectSelectionWindowViewModel(objectIndex.Objects);
116+
var dialog = new ObjectSelectionWindow { DataContext = vm };
117+
var result = await dialog.ShowDialog<ObjectSelectionWindowViewModel?>(app.MainWindow);
118+
119+
if (result?.SelectedObject is { DatChecksum: not null } selected)
120+
{
121+
DependentObjects.Add(new ObjectModelHeader(selected.DisplayName, selected.ObjectType, selected.ObjectSource, selected.DatChecksum.Value));
122+
}
123+
}
124+
125+
void RemoveSelectedDependentObject()
126+
{
127+
if (SelectedDependentObject != null)
128+
{
129+
DependentObjects.Remove(SelectedDependentObject);
130+
}
131+
}
132+
83133
async Task CopyDependentObjectsAsync()
84134
{
85135
var json = JsonSerializer.Serialize(DependentObjects.ToList(), JsonSerializerOptions);

Gui/Views/ObjectSelectionWindow.axaml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,13 @@
1717
<DockPanel>
1818
<TextBox DockPanel.Dock="Top" Watermark="Search" Text="{Binding SearchTerm}"></TextBox>
1919
<UniformGrid Rows="1" Columns="2" DockPanel.Dock="Bottom">
20-
<Button Grid.Column="0" HorizontalAlignment="Stretch" HorizontalContentAlignment="Center">Confirm</Button>
21-
<Button Grid.Column="1" HorizontalAlignment="Stretch" HorizontalContentAlignment="Center">Cancel</Button>
20+
<Button Grid.Column="0" HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" Command="{Binding ConfirmCommand}">Confirm</Button>
21+
<Button Grid.Column="1" HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" Command="{Binding CancelCommand}">Cancel</Button>
2222
</UniformGrid>
2323
<ListBox SelectedItem="{Binding SelectedObject}" ItemsSource="{Binding ObjectView}" SelectionMode="Single">
2424
<ListBox.ItemTemplate>
2525
<DataTemplate>
26+
<TextBlock Text="{Binding DisplayName}" />
2627
</DataTemplate>
2728
</ListBox.ItemTemplate>
2829
</ListBox>

Gui/Views/ObjectSelectionWindow.axaml.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
using Gui.ViewModels;
2+
using ReactiveUI;
23
using ReactiveUI.Avalonia;
4+
using System;
5+
using System.Reactive;
36

47
namespace Gui.Views;
58

@@ -8,5 +11,10 @@ public partial class ObjectSelectionWindow : ReactiveWindow<ObjectSelectionWindo
811
public ObjectSelectionWindow()
912
{
1013
InitializeComponent();
14+
this.WhenActivated(d =>
15+
{
16+
d(ViewModel!.ConfirmCommand.Subscribe(Observer.Create<Unit>(_ => Close(ViewModel))));
17+
d(ViewModel!.CancelCommand.Subscribe(Observer.Create<Unit>(_ => Close(null))));
18+
});
1119
}
1220
}

Gui/Views/RegionView.axaml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,16 @@
1818
<TabItem Header="Dependent Objects">
1919
<DockPanel>
2020
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Spacing="4" Margin="4">
21+
<Button Command="{Binding AddDependentObjectCommand}"
22+
ToolTip.Tip="Select and add an object from the current folder to the list">
23+
Add object
24+
</Button>
25+
<Button Command="{Binding RemoveSelectedDependentObjectCommand}"
26+
Classes="danger"
27+
ToolTip.Tip="Remove the currently selected object from the list">
28+
Remove selected
29+
</Button>
30+
<Separator Width="8" />
2131
<Button Command="{Binding PopulateDependentObjectsFromFolderCommand}"
2232
ToolTip.Tip="Clear the list and populate it with all objects from the currently loaded folder">
2333
Populate from current folder
@@ -40,6 +50,7 @@
4050
</StackPanel>
4151
<DataGrid
4252
ItemsSource="{Binding DependentObjects}"
53+
SelectedItem="{Binding SelectedDependentObject}"
4354
AutoGenerateColumns="False"
4455
CanUserSortColumns="True"
4556
IsReadOnly="True">

0 commit comments

Comments
 (0)