From 814b24ebd85353641e5d133c4ca243d78049a8e8 Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Tue, 21 Mar 2023 14:18:03 +0100 Subject: [PATCH] tryout of context menu --- MareSynchronos/MareSynchronos.csproj | 1 + .../PlayerData/Pairs/CachedPlayer.cs | 9 ++++++-- MareSynchronos/PlayerData/Pairs/Pair.cs | 14 +++++++++++- .../PlayerData/Pairs/PairManager.cs | 22 +++++++++++++++++-- MareSynchronos/Plugin.cs | 4 +++- 5 files changed, 44 insertions(+), 6 deletions(-) diff --git a/MareSynchronos/MareSynchronos.csproj b/MareSynchronos/MareSynchronos.csproj index f855594..1c87699 100644 --- a/MareSynchronos/MareSynchronos.csproj +++ b/MareSynchronos/MareSynchronos.csproj @@ -26,6 +26,7 @@ + diff --git a/MareSynchronos/PlayerData/Pairs/CachedPlayer.cs b/MareSynchronos/PlayerData/Pairs/CachedPlayer.cs index 57b02ae..8ebac22 100644 --- a/MareSynchronos/PlayerData/Pairs/CachedPlayer.cs +++ b/MareSynchronos/PlayerData/Pairs/CachedPlayer.cs @@ -1,7 +1,7 @@ using Dalamud.Interface.Internal.Notifications; using Dalamud.Logging; +using FFXIVClientStructs.FFXIV.Client.Game.Object; using MareSynchronos.API.Data; -using MareSynchronos.API.Data.Enum; using MareSynchronos.API.Dto.User; using MareSynchronos.FileCache; using MareSynchronos.Interop; @@ -12,6 +12,7 @@ using MareSynchronos.Utils; using MareSynchronos.WebAPI.Files; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; +using ObjectKind = MareSynchronos.API.Data.Enum.ObjectKind; namespace MareSynchronos.PlayerData.Pairs; @@ -59,7 +60,11 @@ public sealed class CachedPlayer : DisposableMediatorSubscriberBase public string? PlayerName { get; private set; } public string PlayerNameHash => OnlineUser.Ident; private OnlineUserIdentDto OnlineUser { get; set; } - private IntPtr PlayerCharacter => _charaHandler?.Address ?? IntPtr.Zero; + public IntPtr PlayerCharacter => _charaHandler?.Address ?? IntPtr.Zero; + + public unsafe uint PlayerCharacterId => (_charaHandler?.Address ?? IntPtr.Zero) == IntPtr.Zero + ? uint.MaxValue + : ((GameObject*)_charaHandler.Address)->ObjectID; public void ApplyCharacterData(CharacterData characterData, OptionalPluginWarning warning, bool forced = false) { diff --git a/MareSynchronos/PlayerData/Pairs/Pair.cs b/MareSynchronos/PlayerData/Pairs/Pair.cs index 27d7b4d..9c4a129 100644 --- a/MareSynchronos/PlayerData/Pairs/Pair.cs +++ b/MareSynchronos/PlayerData/Pairs/Pair.cs @@ -1,4 +1,6 @@ -using Dalamud.Utility; +using Dalamud.ContextMenu; +using Dalamud.Game.Text.SeStringHandling; +using Dalamud.Utility; using MareSynchronos.API.Data; using MareSynchronos.API.Data.Comparer; using MareSynchronos.API.Data.Extensions; @@ -170,4 +172,14 @@ public class Pair return data; } + + public void AddContextMenu(GameObjectContextMenuOpenArgs args) + { + if (CachedPlayer == null || args.ObjectId != CachedPlayer.PlayerCharacterId) return; + + args.AddCustomItem(new GameObjectContextMenuItem("Reapply last data", (a) => + { + ApplyLastReceivedData(true); + } ,true)); + } } \ No newline at end of file diff --git a/MareSynchronos/PlayerData/Pairs/PairManager.cs b/MareSynchronos/PlayerData/Pairs/PairManager.cs index 9033fa6..b9f9e4c 100644 --- a/MareSynchronos/PlayerData/Pairs/PairManager.cs +++ b/MareSynchronos/PlayerData/Pairs/PairManager.cs @@ -1,4 +1,5 @@ -using Dalamud.Game.ClientState.Objects.SubKinds; +using Dalamud.ContextMenu; +using Dalamud.Game.ClientState.Objects.SubKinds; using Dalamud.Interface.Internal.Notifications; using Dalamud.Utility; using MareSynchronos.API.Data; @@ -19,21 +20,36 @@ public sealed class PairManager : DisposableMediatorSubscriberBase private readonly ConcurrentDictionary _allClientPairs = new(UserDataComparer.Instance); private readonly ConcurrentDictionary _allGroups = new(GroupDataComparer.Instance); private readonly MareConfigService _configurationService; + private readonly DalamudContextMenu _dalamudContextMenu; private readonly Func _pairFactory; private Lazy> _directPairsInternal; private Lazy>> _groupPairsInternal; public PairManager(ILogger logger, Func pairFactory, - MareConfigService configurationService, MareMediator mediator) : base(logger, mediator) + MareConfigService configurationService, MareMediator mediator, + DalamudContextMenu dalamudContextMenu) : base(logger, mediator) { _pairFactory = pairFactory; _configurationService = configurationService; + _dalamudContextMenu = dalamudContextMenu; Mediator.Subscribe(this, (_) => DalamudUtilOnZoneSwitched()); Mediator.Subscribe(this, (_) => DalamudUtilOnDelayedFrameworkUpdate()); Mediator.Subscribe(this, (_) => ClearPairs()); _directPairsInternal = DirectPairsLazy(); _groupPairsInternal = GroupPairsLazy(); + + _dalamudContextMenu.OnOpenGameObjectContextMenu += DalamudContextMenuOnOnOpenGameObjectContextMenu; + } + + private void DalamudContextMenuOnOnOpenGameObjectContextMenu(GameObjectContextMenuOpenArgs args) + { + if (args.ObjectId == 0xE000000) return; + + foreach (var pair in _allClientPairs.Where((p => p.Value.IsVisible))) + { + pair.Value.AddContextMenu(args); + } } public List DirectPairs => _directPairsInternal.Value; @@ -318,6 +334,8 @@ public sealed class PairManager : DisposableMediatorSubscriberBase { base.Dispose(disposing); + _dalamudContextMenu.OnOpenGameObjectContextMenu -= DalamudContextMenuOnOnOpenGameObjectContextMenu; + DisposePairs(); } diff --git a/MareSynchronos/Plugin.cs b/MareSynchronos/Plugin.cs index e351c4e..88e844b 100644 --- a/MareSynchronos/Plugin.cs +++ b/MareSynchronos/Plugin.cs @@ -1,4 +1,5 @@ -using Dalamud.Data; +using Dalamud.ContextMenu; +using Dalamud.Data; using Dalamud.Game; using Dalamud.Game.ClientState; using Dalamud.Game.ClientState.Conditions; @@ -57,6 +58,7 @@ public sealed class Plugin : IDalamudPlugin // add mare related singletons collection.AddSingleton(); collection.AddSingleton(); + collection.AddSingleton(); collection.AddSingleton(); collection.AddSingleton(); collection.AddSingleton();