From 677d0ea139407566664c635665a4ddb54d4ce261 Mon Sep 17 00:00:00 2001 From: Jamiras Date: Mon, 24 Aug 2026 08:03:42 -0600 Subject: [PATCH 1/2] disable Update Local menu for Invalid assets --- Source/ViewModels/AchievementSetViewModel.cs | 4 +- .../EditorNavigationViewModelBase.cs | 17 +++----- .../EditorNavigationViewModelBaseTests.cs | 43 ++++++++++++++----- 3 files changed, 42 insertions(+), 22 deletions(-) diff --git a/Source/ViewModels/AchievementSetViewModel.cs b/Source/ViewModels/AchievementSetViewModel.cs index f70785d4..b951ef45 100644 --- a/Source/ViewModels/AchievementSetViewModel.cs +++ b/Source/ViewModels/AchievementSetViewModel.cs @@ -231,7 +231,7 @@ public bool UpdateLocal(Achievement achievement, Achievement localAchievement, A public bool UpdateLocal(Leaderboard leaderboard, Leaderboard localLeaderboard, Action assetChangedHandler, bool refresh) { - if (leaderboard.OwnerSetId != AchievementSet.OwnerSetId) + if (leaderboard != null && leaderboard.OwnerSetId != AchievementSet.OwnerSetId) { if (leaderboard.OwnerSetId != 0 || _achievementSet.Type != AchievementSetType.Core) return false; @@ -269,7 +269,7 @@ public bool UpdateLocal(Leaderboard leaderboard, Leaderboard localLeaderboard, A internal bool UpdateLocal(RichPresence richPresence, RichPresence localRichPresence, Action assetChangedHandler, bool refresh) { - if (richPresence.OwnerSetId != AchievementSet.OwnerSetId) + if (richPresence != null && richPresence.OwnerSetId != AchievementSet.OwnerSetId) { if (richPresence.OwnerSetId != 0 || _achievementSet.Type != AchievementSetType.Core) return false; diff --git a/Source/ViewModels/Navigation/EditorNavigationViewModelBase.cs b/Source/ViewModels/Navigation/EditorNavigationViewModelBase.cs index 1faf10f1..84ed1b7c 100644 --- a/Source/ViewModels/Navigation/EditorNavigationViewModelBase.cs +++ b/Source/ViewModels/Navigation/EditorNavigationViewModelBase.cs @@ -42,6 +42,7 @@ public ViewerViewModelBase Editor Label = _editor?.Title; OnEditorCompareStateChanged(); + OnEditorCanUpdateChanged(); OnPropertyChanged(() => Editor); } @@ -59,6 +60,8 @@ protected virtual void OnEditorPropertyChanged(System.ComponentModel.PropertyCha { if (e.PropertyName == "CompareState") OnEditorCompareStateChanged(); + else if (e.PropertyName == "CanUpdate") + OnEditorCanUpdateChanged(); else if (e.PropertyName == "Title") Label = _editor?.Title; } @@ -66,7 +69,10 @@ protected virtual void OnEditorPropertyChanged(System.ComponentModel.PropertyCha private void OnEditorCompareStateChanged() { CompareState = _editor?.CompareState ?? GeneratedCompareState.None; + } + private void OnEditorCanUpdateChanged() + { var updateLocalMenuItem = ContextMenu?.FirstOrDefault(m => m.Label == "Update Local"); if (updateLocalMenuItem != null) updateLocalMenuItem.Command = CanUpdateLocal() ? Editor.UpdateLocalCommand : DisabledCommand.Instance; @@ -77,16 +83,7 @@ protected bool CanUpdateLocal() if (Editor == null) return false; - switch (Editor.CompareState) - { - case GeneratedCompareState.None: - case GeneratedCompareState.Same: - case GeneratedCompareState.NotGenerated: - return false; - - default: - return true; - } + return Editor.CanUpdate; } public bool IsNodeFor(AssetBase asset) diff --git a/Tests/ViewModels/Nagivation/EditorNavigationViewModelBaseTests.cs b/Tests/ViewModels/Nagivation/EditorNavigationViewModelBaseTests.cs index 01b8ef41..b6c3c181 100644 --- a/Tests/ViewModels/Nagivation/EditorNavigationViewModelBaseTests.cs +++ b/Tests/ViewModels/Nagivation/EditorNavigationViewModelBaseTests.cs @@ -46,6 +46,11 @@ public void SetCompareState(GeneratedCompareState state) CompareState = state; // CompareState updates ModificationMesssage } + + public void SetCanUpdate(bool value) + { + CanUpdate = value; + } } [Test] @@ -98,24 +103,42 @@ public void TestTitleAndCompareStateFromEditor() } [Test] - [TestCase(GeneratedCompareState.None, false)] - [TestCase(GeneratedCompareState.Same, false)] - [TestCase(GeneratedCompareState.NotGenerated, false)] - [TestCase(GeneratedCompareState.GeneratedOnly, true)] - [TestCase(GeneratedCompareState.PublishedDiffers, true)] - [TestCase(GeneratedCompareState.LocalDiffers, true)] - public void TestCanUpdateLocal(GeneratedCompareState state, bool expected) + public void TestCompareStateSync() { var harness = new EditorNavigationViewModelHarness(); + Assert.That(harness.CompareState, Is.EqualTo(GeneratedCompareState.Same)); + var editor = new DummyViewerViewModel(); - editor.SetCompareState(state); + editor.SetCompareState(GeneratedCompareState.NotGenerated); + // sync on assign harness.Editor = editor; - Assert.That(harness.CompareState, Is.EqualTo(state)); + Assert.That(harness.CompareState, Is.EqualTo(GeneratedCompareState.NotGenerated)); + + // sync on update + editor.SetCompareState(GeneratedCompareState.GeneratedOnly); + Assert.That(harness.CompareState, Is.EqualTo(GeneratedCompareState.GeneratedOnly)); + } + [Test] + public void TestCanUpdateSync() + { + var harness = new EditorNavigationViewModelHarness(); Assert.That(harness.ContextMenu, Is.Not.Null); Assert.That(harness.ContextMenu.Count(), Is.EqualTo(1)); - Assert.That(harness.ContextMenu.First().Command.CanExecute(null), Is.EqualTo(expected)); + var updateLocalMenuItem = harness.ContextMenu.First(); + Assert.That(updateLocalMenuItem.Command.CanExecute(null), Is.False); + + var editor = new DummyViewerViewModel(); + editor.SetCanUpdate(true); + + // sync on assign + harness.Editor = editor; + Assert.That(updateLocalMenuItem.Command.CanExecute(null), Is.True); + + // sync on update + editor.SetCanUpdate(false); + Assert.That(updateLocalMenuItem.Command.CanExecute(null), Is.False); } } } From 9276538aac1d0bf6fcd96751b47d8de72be0d6a9 Mon Sep 17 00:00:00 2001 From: Jamiras Date: Mon, 24 Aug 2026 08:25:18 -0600 Subject: [PATCH 2/2] update test --- Tests/ViewModels/Nagivation/NavigationListViewModelTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/ViewModels/Nagivation/NavigationListViewModelTests.cs b/Tests/ViewModels/Nagivation/NavigationListViewModelTests.cs index 6fc5a423..3cbd56eb 100644 --- a/Tests/ViewModels/Nagivation/NavigationListViewModelTests.cs +++ b/Tests/ViewModels/Nagivation/NavigationListViewModelTests.cs @@ -469,7 +469,7 @@ public void TestMergePublishedAndGeneratedAchievementIdentical() Assert.AreEqual(1, achievementNode.ContextMenu.Count()); var menuItem = achievementNode.ContextMenu.First(); Assert.AreEqual("Update Local", menuItem.Label); - Assert.IsFalse(menuItem.Command.CanExecute(null)); + Assert.IsTrue(menuItem.Command.CanExecute(null)); // same, but not in local } [Test]