Skip to content

Commit a370b7c

Browse files
authored
Merge pull request #4065 from erri120/fix/file-conflicts-collections
File conflict improvements and fixes
2 parents 0c94715 + 178ff19 commit a370b7c

File tree

9 files changed

+31
-47
lines changed

9 files changed

+31
-47
lines changed

src/NexusMods.Abstractions.Loadouts.Synchronizers/ILoadoutManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ IJobTask<IInstallLoadoutItemJob, InstallLoadoutItemJobResult> InstallItem(
7676
/// <summary>
7777
/// Removes a collection.
7878
/// </summary>
79-
ValueTask RemoveCollection(LoadoutId loadoutId, CollectionGroupId collection);
79+
ValueTask RemoveCollection(CollectionGroupId collection);
8080

8181
/// <summary>
8282
/// Removes all groups and installs the new library item.

src/NexusMods.App.UI/Helpers/CollectionDeleteHelpers.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using DynamicData;
33
using NexusMods.Abstractions.Collections;
44
using NexusMods.Abstractions.Loadouts;
5+
using NexusMods.Abstractions.Loadouts.Synchronizers;
56
using NexusMods.App.UI.Dialog;
67
using NexusMods.App.UI.Dialog.Enums;
78
using NexusMods.App.UI.Pages.CollectionDownload;
@@ -60,6 +61,7 @@ public static IObservable<bool> ObserveCanDeleteCollection(CollectionGroupId col
6061
/// <returns>A task representing the asynchronous operation.</returns>
6162
public static async Task DeleteCollectionAsync(
6263
CollectionGroupId collectionId,
64+
ILoadoutManager loadoutManager,
6365
IWorkspaceController workspaceController,
6466
IConnection connection,
6567
IWindowNotificationService notificationService)
@@ -92,9 +94,8 @@ await Dispatcher.UIThread.InvokeAsync(() =>
9294
context => context.GroupScope == CollectionGroupId.From(group.Id))
9395
);
9496
}
95-
96-
await CollectionCreator.DeleteCollectionGroup(connection, collectionId, CancellationToken.None);
97-
97+
98+
await loadoutManager.RemoveCollection(collectionId);
9899
notificationService.ShowToast(Language.ToastNotification_Collection_removed);
99100
}
100101

src/NexusMods.App.UI/LeftMenu/Items/CollectionLeftMenuItemViewModel.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using NexusMods.Abstractions.Loadouts;
66
using NexusMods.Abstractions.Loadouts.Extensions;
77
using NexusMods.Abstractions.Collections;
8+
using NexusMods.Abstractions.Loadouts.Synchronizers;
89
using NexusMods.App.UI.Controls.Navigation;
910
using NexusMods.App.UI.Helpers;
1011
using NexusMods.App.UI.Resources;
@@ -28,7 +29,8 @@ public class CollectionLeftMenuItemViewModel : LeftMenuItemViewModel, ILeftMenuI
2829
public ReactiveCommand<Unit, Unit> ToggleIsEnabledCommand { get; }
2930

3031
public CollectionGroupId CollectionGroupId { get; }
31-
32+
33+
private readonly IServiceProvider _serviceProvider;
3234
private readonly IConnection _connection;
3335
private readonly IWorkspaceController _workspaceController;
3436
private readonly bool _isNexusCollection;
@@ -41,6 +43,7 @@ public CollectionLeftMenuItemViewModel(
4143
IServiceProvider serviceProvider,
4244
CollectionGroupId collectionGroupId) : base(workspaceController, workspaceId, pageData)
4345
{
46+
_serviceProvider = serviceProvider;
4447
_connection = serviceProvider.GetRequiredService<IConnection>();
4548
_toastNotificationService = serviceProvider.GetRequiredService<IWindowNotificationService>();
4649
_workspaceController = workspaceController;
@@ -119,7 +122,11 @@ private ReactiveCommand<Unit, Unit> CreateDeleteCommand()
119122

120123
return ReactiveCommand.CreateFromTask(async () =>
121124
{
122-
await CollectionDeleteHelpers.DeleteCollectionAsync(CollectionGroupId, _workspaceController, _connection,
125+
await CollectionDeleteHelpers.DeleteCollectionAsync(
126+
CollectionGroupId,
127+
_serviceProvider.GetRequiredService<ILoadoutManager>(),
128+
_workspaceController,
129+
_connection,
123130
_toastNotificationService);
124131
}, canExecute: canExecute);
125132
}

src/NexusMods.App.UI/Pages/LoadoutPage/CollectionLoadoutViewModel.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using Microsoft.Extensions.DependencyInjection;
66
using NexusMods.Abstractions.Collections;
77
using NexusMods.Abstractions.Loadouts;
8+
using NexusMods.Abstractions.Loadouts.Synchronizers;
89
using NexusMods.Abstractions.NexusModsLibrary.Models;
910
using NexusMods.Abstractions.NexusWebApi.Types;
1011
using NexusMods.App.UI.Controls.Navigation;
@@ -112,8 +113,7 @@ public CollectionLoadoutViewModel(
112113
executeAsync: async (_, _) =>
113114
{
114115
var workspaceController = GetWorkspaceController();
115-
await CollectionDeleteHelpers.DeleteCollectionAsync(nexusCollectionGroup.AsCollectionGroup(),
116-
workspaceController, connection, toastNotificationService);
116+
await CollectionDeleteHelpers.DeleteCollectionAsync(nexusCollectionGroup.AsCollectionGroup(), serviceProvider.GetRequiredService<ILoadoutManager>(), workspaceController, connection, toastNotificationService);
117117
},
118118
awaitOperation: AwaitOperation.Drop,
119119
configureAwait: false

src/NexusMods.App.UI/Pages/LoadoutPage/LoadoutViewModel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ public LoadoutViewModel(
415415
var confirmed = await CollectionDeleteHelpers.ShowDeleteConfirmationDialogAsync(collectionGroup.Name, WindowManager);
416416
if (confirmed)
417417
{
418-
await CollectionDeleteHelpers.DeleteCollectionAsync(collectionGroupId.Value, GetWorkspaceController(), _connection, _notificationService);
418+
await CollectionDeleteHelpers.DeleteCollectionAsync(collectionGroupId.Value, _loadoutManager, GetWorkspaceController(), _connection, _notificationService);
419419
CommandOpenLibraryPage?.Execute(NavigationInformation.From(OpenPageBehaviorType.ReplaceTab));
420420
}
421421
});

src/NexusMods.App.UI/Pages/Sorting/FileConflicts/FileConflictsViewModel.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
using NexusMods.App.UI.Controls.MarkdownRenderer;
1919
using NexusMods.App.UI.Dialog;
2020
using NexusMods.App.UI.Dialog.Enums;
21+
using NexusMods.App.UI.Pages.LoadoutPage;
2122
using NexusMods.App.UI.Windows;
2223
using NexusMods.HyperDuck;
2324
using NexusMods.MnemonicDB.Abstractions;
@@ -335,6 +336,11 @@ private CompositeItemModel<EntityId> CreateItemModel((EntityId, long, EntityId,
335336
numLosers: new ValueComponent<long>(value: numLosingFiles)
336337
));
337338

339+
if (loadoutGroup.AsLoadoutItem().Parent.TryGetAsCollectionGroup(out var collection))
340+
{
341+
itemModel.Add(LoadoutColumns.Collections.ComponentKey, new StringComponent(value: collection.AsLoadoutItemGroup().AsLoadoutItem().Name));
342+
}
343+
338344
itemModel.Add(FileConflictsColumns.Actions.ViewComponentKey, new FileConflictsComponents.ViewAction(hasConflicts: numWinningFiles > 0 || numLosingFiles > 0));
339345

340346
var neighbourIds = new FileConflictsComponents.NeighbourIds(previousId, nextId);
@@ -431,6 +437,7 @@ protected override IColumn<CompositeItemModel<EntityId>>[] CreateColumns(bool vi
431437
ITreeDataGridItemModel<CompositeItemModel<EntityId>, EntityId>.CreateExpanderColumn(indexColumn),
432438
ColumnCreator.Create<EntityId, SharedColumns.Name>(canUserSortColumn: false),
433439
ColumnCreator.Create<EntityId, FileConflictsColumns.ConflictsColumn>(canUserSortColumn: false),
440+
ColumnCreator.Create<EntityId, LoadoutColumns.Collections>(canUserSortColumn: false),
434441
ColumnCreator.Create<EntityId, FileConflictsColumns.Actions>(canUserSortColumn: false),
435442
];
436443
}

src/NexusMods.Collections/CollectionCreator.cs

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -61,42 +61,6 @@ private static string GenerateNewCollectionName(string[] allNames)
6161
string TemplatedName() => string.Format(template, ++count);
6262
}
6363

64-
public static async ValueTask DeleteCollectionGroup(
65-
IConnection connection,
66-
CollectionGroupId managedCollectionGroup,
67-
CancellationToken cancellationToken)
68-
{
69-
using var tx = connection.BeginTransaction();
70-
71-
var groups = new Queue<LoadoutItemGroupId>();
72-
groups.Enqueue(managedCollectionGroup.Value);
73-
74-
while (groups.TryDequeue(out var groupId))
75-
{
76-
var group = LoadoutItemGroup.Load(connection.Db, groupId);
77-
foreach (var datom in group)
78-
{
79-
datom.Retract(tx);
80-
}
81-
82-
foreach (var child in group.Children)
83-
{
84-
if (child.IsLoadoutItemGroup())
85-
{
86-
groups.Enqueue(child.Id);
87-
continue;
88-
}
89-
90-
foreach (var datom in child)
91-
{
92-
datom.Retract(tx);
93-
}
94-
}
95-
}
96-
97-
await tx.Commit();
98-
}
99-
10064
/// <summary>
10165
/// Creates a new collection group in the loadout.
10266
/// </summary>

src/NexusMods.DataModel/LoadoutManager.TxFuncs.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,12 @@ public void Apply(ITransaction tx, IDb basis)
4545
var index = Array.BinarySearch(_toSkip, model.TargetId);
4646
if (index >= 0) continue;
4747

48+
if (!model.Target.IsValid())
49+
{
50+
tx.Delete(model.Id, recursive: false);
51+
continue;
52+
}
53+
4854
var newPriority = ConflictPriority.From(++start);
4955
tx.Add(model.Id, LoadoutItemGroupPriority.Priority, newPriority);
5056
}

src/NexusMods.DataModel/LoadoutManager.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System.Diagnostics;
2-
using System.Xml;
32
using DynamicData.Kernel;
43
using Microsoft.Extensions.DependencyInjection;
54
using Microsoft.Extensions.Logging;
@@ -414,7 +413,7 @@ private void RemoveItems(ITransaction tx, LoadoutItemGroupId[] groupIds)
414413
}
415414
}
416415

417-
public async ValueTask RemoveCollection(LoadoutId loadoutId, CollectionGroupId collection)
416+
public async ValueTask RemoveCollection(CollectionGroupId collection)
418417
{
419418
var db = _connection.Db;
420419
using var tx = _connection.BeginTransaction();

0 commit comments

Comments
 (0)