using System.Numerics; using Dalamud.Bindings.ImGui; using Dalamud.Interface.Utility; using Dalamud.Interface.Utility.Raii; using FFXIVClientStructs.FFXIV.Client.UI.Agent; using KamiLib.Window; using Mappy.Data; using Mappy.Windows; namespace Mappy.Classes.MapWindowComponents; public unsafe class MapContextMenu { public void Draw(Vector2 mapDrawOffset) { using var contextMenu = ImRaii.ContextPopup("Mappy_Context_Menu"); if (!contextMenu) return; var cursorPosition = ImGui.GetMousePosOnOpeningCurrentPopup(); var textureClickLocation = (cursorPosition - mapDrawOffset - System.MapRenderer.DrawPosition) / MapRenderer.MapRenderer.Scale; var result = textureClickLocation - new Vector2(1024.0f, 1024.0f); var scaledResult = result / DrawHelpers.GetMapScaleFactor() + DrawHelpers.GetRawMapOffsetVector(); var noteAtCursor = System.MapNoteConfig.FindNoteAt( AgentMap.Instance()->SelectedTerritoryId, AgentMap.Instance()->SelectedMapId, scaledResult.X, scaledResult.Y); if (ImGui.MenuItem("Place Note")) { MapWindow.PendingMapNotePosition = (AgentMap.Instance()->SelectedTerritoryId, AgentMap.Instance()->SelectedMapId, scaledResult.X, scaledResult.Y); MapWindow.RequestOpenAddNotePopup(); } if (ImGui.MenuItem("Remove Note", false, noteAtCursor is not null)) { if (noteAtCursor is { } note) { System.MapNoteConfig.Notes.Remove(note); System.MapNoteConfig.Save(); } } if (ImGui.MenuItem("Clear Movement Trail")) { System.MovementTrailConfig.Clear(); } if (ImGui.MenuItem("Place Flag")) { AgentMap.Instance()->FlagMarkerCount = 0; AgentMap.Instance()->SetFlagMapMarker(AgentMap.Instance()->SelectedTerritoryId, AgentMap.Instance()->SelectedMapId, scaledResult.X, scaledResult.Y); AgentChatLog.Instance()->InsertTextCommandParam(1048, false); } if (ImGui.MenuItem("Remove Flag", false, AgentMap.Instance()->FlagMarkerCount is not 0)) { AgentMap.Instance()->FlagMarkerCount = 0; } ImGuiHelpers.ScaledDummy(5.0f); if (ImGui.MenuItem("Center on Player", false, Service.ObjectTable.LocalPlayer is not null) && Service.ObjectTable.LocalPlayer is not null) { System.IntegrationsController.OpenOccupiedMap(); System.MapRenderer.CenterOnGameObject(Service.ObjectTable.LocalPlayer); } if (ImGui.MenuItem("Center on Map")) { System.SystemConfig.FollowPlayer = false; System.MapRenderer.DrawOffset = Vector2.Zero; } ImGuiHelpers.ScaledDummy(5.0f); if (ImGui.MenuItem("Lock Zoom", "", ref System.SystemConfig.ZoomLocked)) { SystemConfig.Save(); } ImGuiHelpers.ScaledDummy(5.0f); if (ImGui.MenuItem("Open Quest List", false, System.WindowManager.GetWindow() is null)) { System.WindowManager.AddWindow(new QuestListWindow(), WindowFlags.OpenImmediately | WindowFlags.RequireLoggedIn); } if (ImGui.MenuItem("Open Fate List", false, System.WindowManager.GetWindow() is null)) { System.WindowManager.AddWindow(new FateListWindow(), WindowFlags.OpenImmediately | WindowFlags.RequireLoggedIn); } if (ImGui.MenuItem("Open Flag List", false, System.WindowManager.GetWindow() is null)) { System.WindowManager.AddWindow(new FlagHistoryWindow(), WindowFlags.OpenImmediately | WindowFlags.RequireLoggedIn); } if (ImGui.MenuItem("Open Note List", false, System.WindowManager.GetWindow() is null)) { System.WindowManager.AddWindow(new MapNoteListWindow(), WindowFlags.OpenImmediately | WindowFlags.RequireLoggedIn); } } }