Skip to content

Commit

Permalink
Merge pull request #2071 from Nexus-Mods/fix/delete-from-library-fix
Browse files Browse the repository at this point in the history
Fix Library deletions
  • Loading branch information
Al12rs authored Sep 24, 2024
2 parents 37b749f + 9b6fbb2 commit 20868cf
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,23 @@ namespace NexusMods.App.UI.Pages.LibraryPage;
public class FakeParentLibraryItemModel : LibraryItemModel
{
public required IObservable<int> NumInstalledObservable { get; init; }
public required IObservable<IChangeSet<LibraryItem.ReadOnly, EntityId>> LibraryItemsObservable { get; init; }
public IObservable<IChangeSet<LibraryItem.ReadOnly, EntityId>> LibraryItemsObservable { get; }
protected ObservableHashSet<LibraryItem.ReadOnly> LibraryItems { get; set; } = [];

public override IReadOnlyCollection<LibraryItemId> GetLoadoutItemIds() => LibraryItems.Select(static item => item.LibraryItemId).ToArray();

private readonly IDisposable _modelActivationDisposable;
private readonly SerialDisposable _libraryItemsDisposable = new();
private readonly IDisposable _libraryItemsDisposable;

public FakeParentLibraryItemModel(LibraryItemId libraryItemId) : base(libraryItemId)
public FakeParentLibraryItemModel(LibraryItemId libraryItemId, IObservable<IChangeSet<LibraryItem.ReadOnly, EntityId>> libraryItemsObservable) : base(libraryItemId)
{
LibraryItemsObservable = libraryItemsObservable;

// NOTE(Al12rs): This needs to be set up even if model is never activated,
// as it is possible for items to get selected and interacted with without their model being activated
// (e.g. by quick scrolling to bottom with scrollbar and shift-selecting all items)
_libraryItemsDisposable = LibraryItemsObservable.OnUI().SubscribeWithErrorLogging(changeSet => LibraryItems.ApplyChanges(changeSet));

_modelActivationDisposable = WhenModelActivated(this, static (model, disposables) =>
{
model.NumInstalledObservable
Expand Down Expand Up @@ -54,11 +61,6 @@ public FakeParentLibraryItemModel(LibraryItemId libraryItemId) : base(libraryIte
}
})
.AddTo(disposables);

if (model._libraryItemsDisposable.Disposable is null)
{
model._libraryItemsDisposable.Disposable = model.LibraryItemsObservable.OnUI().SubscribeWithErrorLogging(changeSet => model.LibraryItems.ApplyChanges(changeSet));
}
});
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using DynamicData;
using NexusMods.Abstractions.Library.Models;
using NexusMods.Abstractions.MnemonicDB.Attributes.Extensions;
using NexusMods.MnemonicDB.Abstractions;
using NexusMods.Paths;
using ObservableCollections;
using R3;
Expand All @@ -9,7 +11,8 @@ namespace NexusMods.App.UI.Pages.LibraryPage;
public class NexusModsModPageLibraryItemModel : FakeParentLibraryItemModel
{
private readonly IDisposable _modelActivationDisposable;
public NexusModsModPageLibraryItemModel() : base(default(LibraryItemId))
public NexusModsModPageLibraryItemModel(IObservable<IChangeSet<LibraryItem.ReadOnly, EntityId>> libraryItemsObservable)
: base(default(LibraryItemId), libraryItemsObservable)
{
_modelActivationDisposable = WhenModelActivated(this, static (model, disposables) =>
{
Expand Down
5 changes: 3 additions & 2 deletions src/NexusMods.App.UI/Pages/LocalFileDataProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -81,14 +81,15 @@ public IObservable<IChangeSet<LibraryItemModel, EntityId>> ObserveNestedLibraryI
// NOTE(erri120): LocalFiles have only one child, this can only be 0 or 1.
var numInstalledObservable = linkedLoadoutItemsObservable.IsEmpty().Select(isEmpty => isEmpty ? 0 : 1);

var model = new FakeParentLibraryItemModel(libraryFile.Id)
var model = new FakeParentLibraryItemModel(
libraryFile.Id,
libraryItemsObservable: UIObservableExtensions.ReturnFactory(() => new ChangeSet<LibraryItem.ReadOnly, EntityId>([new Change<LibraryItem.ReadOnly, EntityId>(ChangeReason.Add, entityId, LibraryItem.Load(_connection.Db, entityId))])))
{
Name = libraryFile.AsLibraryItem().Name,
HasChildrenObservable = hasChildrenObservable,
ChildrenObservable = childrenObservable,
LinkedLoadoutItemsObservable = linkedLoadoutItemsObservable,
NumInstalledObservable = numInstalledObservable,
LibraryItemsObservable = UIObservableExtensions.ReturnFactory(() => new ChangeSet<LibraryItem.ReadOnly, EntityId>([new Change<LibraryItem.ReadOnly, EntityId>(ChangeReason.Add, entityId, LibraryItem.Load(_connection.Db, entityId))])),
};

model.CreatedAtDate.Value = libraryFile.GetCreatedAt();
Expand Down
3 changes: 1 addition & 2 deletions src/NexusMods.App.UI/Pages/NexusModsDataProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -104,14 +104,13 @@ private LibraryItemModel ToLibraryItemModel(NexusModsModPageMetadata.ReadOnly mo
.Prepend(false)
).QueryWhenChanged(static query => query.Items.Count(static b => b));

return new NexusModsModPageLibraryItemModel
return new NexusModsModPageLibraryItemModel(libraryFilesObservable)
{
Name = modPageMetadata.Name,
HasChildrenObservable = hasChildrenObservable,
ChildrenObservable = childrenObservable,
LinkedLoadoutItemsObservable = linkedLoadoutItemsObservable,
NumInstalledObservable = numInstalledObservable,
LibraryItemsObservable = libraryFilesObservable,
};
}

Expand Down

0 comments on commit 20868cf

Please sign in to comment.