diff --git a/Dalamud/Game/Addon/Events/AddonEventData.cs b/Dalamud/Game/Addon/Events/EventDataTypes/AddonEventData.cs similarity index 59% rename from Dalamud/Game/Addon/Events/AddonEventData.cs rename to Dalamud/Game/Addon/Events/EventDataTypes/AddonEventData.cs index 3a5c05660..423bf5eb9 100644 --- a/Dalamud/Game/Addon/Events/AddonEventData.cs +++ b/Dalamud/Game/Addon/Events/EventDataTypes/AddonEventData.cs @@ -1,10 +1,32 @@ -namespace Dalamud.Game.Addon.Events; +namespace Dalamud.Game.Addon.Events.EventDataTypes; /// /// Object representing data that is relevant in handling native events. /// public class AddonEventData { + /// + /// Initializes a new instance of the class. + /// + internal AddonEventData() + { + } + + /// + /// Initializes a new instance of the class. + /// + /// Other event data to copy. + internal AddonEventData(AddonEventData eventData) + { + this.AtkEventType = eventData.AtkEventType; + this.Param = eventData.Param; + this.AtkEventPointer = eventData.AtkEventPointer; + this.AtkEventDataPointer = eventData.AtkEventDataPointer; + this.AddonPointer = eventData.AddonPointer; + this.NodeTargetPointer = eventData.NodeTargetPointer; + this.AtkEventListener = eventData.AtkEventListener; + } + /// /// Gets the AtkEventType for this event. /// @@ -18,8 +40,8 @@ public class AddonEventData /// /// Gets the pointer to the AtkEvent object for this event. /// - /// Note: This is not a pointer to the AtkEventData object.

- /// Warning: AtkEvent->Node has been modified to be the AtkUnitBase*, and AtkEvent->Target has been modified to be the AtkResNode* that triggered this event. + /// Note: This is not a pointer to the AtkEventData object.

+ /// Warning: AtkEvent->Node has been modified to be the AtkUnitBase*, and AtkEvent->Target has been modified to be the AtkResNode* that triggered this event.
public nint AtkEventPointer { get; internal set; } /// diff --git a/Dalamud/Game/Addon/Events/EventDataTypes/AddonMouseEventData.cs b/Dalamud/Game/Addon/Events/EventDataTypes/AddonMouseEventData.cs new file mode 100644 index 000000000..27d56c287 --- /dev/null +++ b/Dalamud/Game/Addon/Events/EventDataTypes/AddonMouseEventData.cs @@ -0,0 +1,82 @@ +using System.Numerics; + +using FFXIVClientStructs.FFXIV.Component.GUI; + +using AtkMouseData = FFXIVClientStructs.FFXIV.Component.GUI.AtkEventData.AtkMouseData; +using ModifierFlag = FFXIVClientStructs.FFXIV.Component.GUI.AtkEventData.AtkMouseData.ModifierFlag; + +namespace Dalamud.Game.Addon.Events.EventDataTypes; + +/// +public unsafe class AddonMouseEventData : AddonEventData +{ + /// + /// Initializes a new instance of the class. + /// + internal AddonMouseEventData() + { + } + + /// + /// Initializes a new instance of the class. + /// + /// Other event data to copy. + internal AddonMouseEventData(AddonEventData eventData) + : base(eventData) + { + } + + /// + /// Gets a value indicating whether the event was a Left Mouse Click. + /// + public bool IsLeftClick => this.MouseData.ButtonId is 0; + + /// + /// Gets a value indicating whether the event was a Right Mouse Click. + /// + public bool IsRightClick => this.MouseData.ButtonId is 1; + + /// + /// Gets a value indicating whether there are any modifiers set such as alt, control, shift, or dragging. + /// + public bool IsNoModifier => this.MouseData.Modifier is 0; + + /// + /// Gets a value indicating whether alt was being held when this event triggered. + /// + public bool IsAltHeld => this.MouseData.Modifier.HasFlag(ModifierFlag.Alt); + + /// + /// Gets a value indicating whether control was being held when this event triggered. + /// + public bool IsControlHeld => this.MouseData.Modifier.HasFlag(ModifierFlag.Ctrl); + + /// + /// Gets a value indicating whether shift was being held when this event triggered. + /// + public bool IsShiftHeld => this.MouseData.Modifier.HasFlag(ModifierFlag.Shift); + + /// + /// Gets a value indicating whether this event is a mouse drag or not. + /// + public bool IsDragging => this.MouseData.Modifier.HasFlag(ModifierFlag.Dragging); + + /// + /// Gets a value indicating whether the event was a scroll up. + /// + public bool IsScrollUp => this.MouseData.WheelDirection is 1; + + /// + /// Gets a value indicating whether the event was a scroll down. + /// + public bool IsScrollDown => this.MouseData.WheelDirection is -1; + + /// + /// Gets the position of the mouse when this event was triggered. + /// + public Vector2 Position => new(this.MouseData.PosX, this.MouseData.PosY); + + private AtkEventData* AtkEventData => (AtkEventData*)this.AtkEventDataPointer; + + private AtkMouseData MouseData => this.AtkEventData->MouseData; +} diff --git a/Dalamud/Game/Addon/Events/PluginEventController.cs b/Dalamud/Game/Addon/Events/PluginEventController.cs index 950087c5c..afaee9966 100644 --- a/Dalamud/Game/Addon/Events/PluginEventController.cs +++ b/Dalamud/Game/Addon/Events/PluginEventController.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Linq; +using Dalamud.Game.Addon.Events.EventDataTypes; using Dalamud.Game.Gui; using Dalamud.Logging.Internal; using Dalamud.Plugin.Services; diff --git a/Dalamud/Game/Gui/Dtr/DtrBar.cs b/Dalamud/Game/Gui/Dtr/DtrBar.cs index 18d8b7f86..8a8a4787a 100644 --- a/Dalamud/Game/Gui/Dtr/DtrBar.cs +++ b/Dalamud/Game/Gui/Dtr/DtrBar.cs @@ -5,6 +5,7 @@ using System.Threading; using Dalamud.Configuration.Internal; using Dalamud.Game.Addon.Events; +using Dalamud.Game.Addon.Events.EventDataTypes; using Dalamud.Game.Addon.Lifecycle; using Dalamud.Game.Addon.Lifecycle.AddonArgTypes; using Dalamud.Game.Text.SeStringHandling; @@ -596,24 +597,13 @@ internal sealed unsafe class DtrBar : IInternalDisposableService, IDtrBar newTextNode->TextColor = new ByteColor { R = 255, G = 255, B = 255, A = 255 }; newTextNode->EdgeColor = new ByteColor { R = 142, G = 106, B = 12, A = 255 }; - // ICreatable was restored, this may be necessary if AtkUldManager.CreateAtkTextNode(); is used instead of Create - // // Memory is filled with random data after being created, zero out some things to avoid issues. - // newTextNode->UnkPtr_1 = null; - // newTextNode->SelectStart = 0; - // newTextNode->SelectEnd = 0; - // newTextNode->FontCacheHandle = 0; - // newTextNode->CharSpacing = 0; - // newTextNode->BackgroundColor = new ByteColor { R = 0, G = 0, B = 0, A = 0 }; - // newTextNode->TextId = 0; - // newTextNode->SheetType = 0; - return newTextNode; } - private void DtrEventHandler(AddonEventType atkEventType, AddonEventData data) + private void DtrEventHandler(AddonEventType atkEventType, AddonEventData eventData) { - var addon = (AtkUnitBase*)data.AddonPointer; - var node = (AtkResNode*)data.NodeTargetPointer; + var addon = (AtkUnitBase*)eventData.AddonPointer; + var node = (AtkResNode*)eventData.NodeTargetPointer; DtrBarEntry? dtrBarEntry = null; this.entriesLock.EnterReadLock(); @@ -652,7 +642,7 @@ internal sealed unsafe class DtrBar : IInternalDisposableService, IDtrBar break; case AddonEventType.MouseClick: - dtrBarEntry.OnClick.Invoke(); + dtrBarEntry.OnClick?.Invoke(new AddonMouseEventData(eventData)); break; } } diff --git a/Dalamud/Game/Gui/Dtr/DtrBarEntry.cs b/Dalamud/Game/Gui/Dtr/DtrBarEntry.cs index 26708eb4c..54847705d 100644 --- a/Dalamud/Game/Gui/Dtr/DtrBarEntry.cs +++ b/Dalamud/Game/Gui/Dtr/DtrBarEntry.cs @@ -1,4 +1,5 @@ using Dalamud.Configuration.Internal; +using Dalamud.Game.Addon.Events.EventDataTypes; using Dalamud.Game.Text.SeStringHandling; using Dalamud.Plugin.Internal.Types; using Dalamud.Utility; @@ -42,12 +43,6 @@ public interface IReadOnlyDtrBarEntry /// Gets a value indicating whether the user has hidden this entry from view through the Dalamud settings. /// public bool UserHidden { get; } - - /// - /// Triggers the click action of this entry. - /// - /// True, if a click action was registered and executed. - public bool TriggerClickAction(); } /// @@ -71,9 +66,9 @@ public interface IDtrBarEntry : IReadOnlyDtrBarEntry public new bool Shown { get; set; } /// - /// Gets or sets a action to be invoked when the user clicks on the dtr entry. + /// Gets or sets an action to be invoked when the user clicks on the dtr entry. /// - public Action? OnClick { get; set; } + public Action? OnClick { get; set; } /// /// Remove this entry from the bar. @@ -122,10 +117,8 @@ internal sealed unsafe class DtrBarEntry : IDisposable, IDtrBarEntry /// public SeString? Tooltip { get; set; } - /// - /// Gets or sets a action to be invoked when the user clicks on the dtr entry. - /// - public Action? OnClick { get; set; } + /// + public Action? OnClick { get; set; } /// public bool HasClickAction => this.OnClick != null; @@ -145,7 +138,7 @@ internal sealed unsafe class DtrBarEntry : IDisposable, IDtrBarEntry } /// - [Api13ToDo("Maybe make this config scoped to internalname?")] + [Api13ToDo("Maybe make this config scoped to internal name?")] public bool UserHidden => this.configuration.DtrIgnore?.Contains(this.Title) ?? false; /// @@ -178,16 +171,6 @@ internal sealed unsafe class DtrBarEntry : IDisposable, IDtrBarEntry /// internal LocalPlugin? OwnerPlugin { get; set; } - /// - public bool TriggerClickAction() - { - if (this.OnClick == null) - return false; - - this.OnClick.Invoke(); - return true; - } - /// /// Remove this entry from the bar. /// You will need to re-acquire it from DtrBar to reuse it. diff --git a/Dalamud/Plugin/Services/IAddonEventManager.cs b/Dalamud/Plugin/Services/IAddonEventManager.cs index e50548c58..c6499e4e2 100644 --- a/Dalamud/Plugin/Services/IAddonEventManager.cs +++ b/Dalamud/Plugin/Services/IAddonEventManager.cs @@ -1,4 +1,5 @@ -using Dalamud.Game.Addon.Events; +using Dalamud.Game.Addon.Events; +using Dalamud.Game.Addon.Events.EventDataTypes; namespace Dalamud.Plugin.Services;