Initial HSMappy release (fork of Mappy)
Made-with: Cursor
This commit is contained in:
@@ -0,0 +1,162 @@
|
||||
using System.Linq;
|
||||
using System.Numerics;
|
||||
using Dalamud.Bindings.ImGui;
|
||||
using Dalamud.Interface;
|
||||
using Dalamud.Interface.Utility;
|
||||
using Dalamud.Interface.Utility.Raii;
|
||||
using Dalamud.Utility;
|
||||
using FFXIVClientStructs.FFXIV.Client.UI.Agent;
|
||||
using FFXIVClientStructs.FFXIV.Component.GUI;
|
||||
using KamiLib.Extensions;
|
||||
using KamiLib.Window;
|
||||
using Lumina.Excel.Sheets;
|
||||
using Mappy.Windows;
|
||||
using MapType = Lumina.Excel.Sheets.MapType;
|
||||
|
||||
namespace Mappy.Classes.MapWindowComponents;
|
||||
|
||||
public unsafe class MapToolbar
|
||||
{
|
||||
public void Draw()
|
||||
{
|
||||
var toolbarSize = new Vector2(ImGui.GetContentRegionMax().X, 33.0f * ImGuiHelpers.GlobalScale);
|
||||
|
||||
using var childBackgroundStyle = ImRaii.PushColor(ImGuiCol.ChildBg, Vector4.Zero with { W = System.SystemConfig.ToolbarFade });
|
||||
using var toolbarChild = ImRaii.Child("toolbar_child", toolbarSize);
|
||||
if (!toolbarChild) return;
|
||||
|
||||
ImGui.SetCursorPos(new Vector2(5.0f, 5.0f));
|
||||
|
||||
if (MappyGuiTweaks.IconButton(FontAwesomeIcon.ArrowUp, "up", "Open Parent Map")) {
|
||||
var valueArgs = new AtkValue
|
||||
{
|
||||
Type = ValueType.Int, Int = 5,
|
||||
};
|
||||
|
||||
var returnValue = new AtkValue();
|
||||
AgentMap.Instance()->ReceiveEvent(&returnValue, &valueArgs, 1, 0);
|
||||
}
|
||||
|
||||
ImGui.SameLine();
|
||||
|
||||
if (MappyGuiTweaks.IconButton(FontAwesomeIcon.LayerGroup, "layers", "Show Map Layers")) {
|
||||
ImGui.OpenPopup("Mappy_Show_Layers");
|
||||
}
|
||||
|
||||
DrawLayersContextMenu();
|
||||
|
||||
ImGui.SameLine();
|
||||
|
||||
using (var _ = ImRaii.PushColor(ImGuiCol.Button, ImGui.GetStyle().GetColor(ImGuiCol.ButtonActive), System.SystemConfig.FollowPlayer)) {
|
||||
if (MappyGuiTweaks.IconButton(FontAwesomeIcon.LocationArrow, "follow", "Toggle Follow Player")) {
|
||||
System.SystemConfig.FollowPlayer = !System.SystemConfig.FollowPlayer;
|
||||
|
||||
if (System.SystemConfig.FollowPlayer) {
|
||||
System.IntegrationsController.OpenOccupiedMap();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ImGui.SameLine();
|
||||
|
||||
if (MappyGuiTweaks.IconButton(FontAwesomeIcon.ArrowsToCircle, "centerPlayer", "Center on Player") && Service.ObjectTable.LocalPlayer is not null) {
|
||||
// Don't center on player if we are already following the player.
|
||||
if (!System.SystemConfig.FollowPlayer) {
|
||||
System.IntegrationsController.OpenOccupiedMap();
|
||||
System.MapRenderer.CenterOnGameObject(Service.ObjectTable.LocalPlayer);
|
||||
}
|
||||
}
|
||||
|
||||
ImGui.SameLine();
|
||||
|
||||
if (MappyGuiTweaks.IconButton(FontAwesomeIcon.MapMarked, "centerMap", "Center on Map")) {
|
||||
System.SystemConfig.FollowPlayer = false;
|
||||
System.MapRenderer.DrawOffset = Vector2.Zero;
|
||||
}
|
||||
|
||||
ImGui.SameLine();
|
||||
|
||||
if (MappyGuiTweaks.IconButton(FontAwesomeIcon.Search, "search", "Search for Map")) {
|
||||
System.WindowManager.AddWindow(new MapSelectionWindow
|
||||
{
|
||||
SingleSelectionCallback = selection =>
|
||||
{
|
||||
if (selection?.Map != null) {
|
||||
if (AgentMap.Instance()->SelectedMapId != selection.Map.RowId) {
|
||||
System.IntegrationsController.OpenMap(selection.Map.RowId);
|
||||
}
|
||||
|
||||
if (selection.MarkerLocation is { } location) {
|
||||
System.SystemConfig.FollowPlayer = false;
|
||||
System.MapRenderer.DrawOffset = -location + DrawHelpers.GetMapCenterOffsetVector();
|
||||
}
|
||||
}
|
||||
},
|
||||
}, WindowFlags.OpenImmediately | WindowFlags.RequireLoggedIn);
|
||||
}
|
||||
|
||||
var offset = System.SystemConfig.HideWindowFrame ? 50.0f : 25.0f;
|
||||
|
||||
ImGui.SameLine();
|
||||
ImGui.SetCursorPosX(ImGui.GetContentRegionMax().X - offset * ImGuiHelpers.GlobalScale - ImGui.GetStyle().ItemSpacing.X);
|
||||
|
||||
if (MappyGuiTweaks.IconButton(FontAwesomeIcon.Cog, "settings", "Open Settings")) {
|
||||
System.ConfigWindow.UnCollapseOrShow();
|
||||
ImGui.SetWindowFocus(System.ConfigWindow.WindowName);
|
||||
}
|
||||
|
||||
if (!System.SystemConfig.HideWindowFrame) return;
|
||||
|
||||
ImGui.SameLine();
|
||||
|
||||
if (MappyGuiTweaks.IconButton(FontAwesomeIcon.Times, "closeMap", "Close Map"))
|
||||
{
|
||||
System.MapWindow.Close();
|
||||
}
|
||||
}
|
||||
|
||||
private void DrawLayersContextMenu()
|
||||
{
|
||||
using var contextMenu = ImRaii.Popup("Mappy_Show_Layers");
|
||||
if (!contextMenu) return;
|
||||
|
||||
var currentMap = Service.DataManager.GetExcelSheet<Map>().GetRow(AgentMap.Instance()->SelectedMapId);
|
||||
if (currentMap.RowId is 0) return;
|
||||
|
||||
// If this is a region map
|
||||
if (currentMap.MapType.RowId == 3) {
|
||||
foreach (var marker in AgentMap.Instance()->MapMarkers) {
|
||||
if (!DrawHelpers.IsRegionIcon(marker.MapMarker.IconId)) continue;
|
||||
|
||||
var label = marker.MapMarker.Subtext.AsDalamudSeString();
|
||||
|
||||
if (ImGui.MenuItem(label.ToString())) {
|
||||
System.IntegrationsController.OpenMap(marker.DataKey);
|
||||
System.SystemConfig.FollowPlayer = false;
|
||||
System.MapRenderer.DrawOffset = Vector2.Zero;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Any other map
|
||||
else {
|
||||
var layers = Service.DataManager.GetExcelSheet<Map>()
|
||||
.Where(eachMap => eachMap.PlaceName.RowId == currentMap.PlaceName.RowId)
|
||||
.Where(eachMap => eachMap.MapIndex != 0)
|
||||
.OrderBy(eachMap => eachMap.MapIndex)
|
||||
.ToList();
|
||||
|
||||
if (layers.Count is 0) {
|
||||
ImGui.Text("No layers for this map");
|
||||
}
|
||||
|
||||
foreach (var layer in layers) {
|
||||
if (ImGui.MenuItem(layer.PlaceNameSub.Value.Name.ExtractText(), "", AgentMap.Instance()->SelectedMapId == layer.RowId)) {
|
||||
System.IntegrationsController.OpenMap(layer.RowId);
|
||||
System.SystemConfig.FollowPlayer = false;
|
||||
System.MapRenderer.DrawOffset = Vector2.Zero;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user