Files
HSMappy/Mappy/MappyPlugin.cs
T

141 lines
6.0 KiB
C#

using System.Numerics;
using Dalamud.Bindings.ImGui;
using Dalamud.Interface.GameFonts;
using Dalamud.Plugin;
using FFXIVClientStructs.FFXIV.Client.UI.Agent;
using KamiLib.Classes;
using KamiLib.CommandManager;
using KamiLib.Window;
using Mappy.Controllers;
using Mappy.Data;
using Mappy.Windows;
namespace Mappy;
public sealed class MappyPlugin : IDalamudPlugin
{
private static bool _minimapPushedPadding;
public MappyPlugin(IDalamudPluginInterface pluginInterface)
{
pluginInterface.Create<Service>();
System.LargeAxisFontHandle = Service.PluginInterface.UiBuilder.FontAtlas.NewGameFontHandle(new GameFontStyle
{
SizePt = 72.0f,
FamilyAndSize = GameFontFamilyAndSize.Axis36,
Italic = true,
BaseSkewStrength = 16f,
});
System.MinimapAxis12FontHandle = Service.PluginInterface.UiBuilder.FontAtlas.NewGameFontHandle(new GameFontStyle(GameFontFamilyAndSize.Axis12));
System.MinimapAxis18FontHandle = Service.PluginInterface.UiBuilder.FontAtlas.NewGameFontHandle(new GameFontStyle(GameFontFamilyAndSize.Axis18));
System.SystemConfig = SystemConfig.Load();
System.IconConfig = IconConfig.Load();
System.FlagConfig = FlagConfig.Load();
System.MapNoteConfig = MapNoteConfig.Load();
System.MovementTrailConfig = new MovementTrailConfig();
System.Teleporter = new Teleporter(Service.PluginInterface);
System.CommandManager = new CommandManager(Service.PluginInterface, "hsmappy");
System.MapRenderer = new MapRenderer.MapRenderer();
System.ConfigWindow = new ConfigurationWindow();
System.MapWindow = new MapWindow();
System.MinimapWindow = new MinimapWindow();
// Push zero padding before window system draw so the first window (minimap) gets it.
Service.PluginInterface.UiBuilder.Draw += SetMinimapZeroPadding;
System.WindowManager = new WindowManager(Service.PluginInterface);
Service.PluginInterface.UiBuilder.Draw += PopMinimapPadding;
// Minimap is added first so it's drawn first and receives the zero padding.
System.WindowManager.AddWindow(System.MinimapWindow, WindowFlags.RequireLoggedIn);
System.WindowManager.AddWindow(System.ConfigWindow, WindowFlags.IsConfigWindow | WindowFlags.RequireLoggedIn);
System.WindowManager.AddWindow(System.MapWindow, WindowFlags.RequireLoggedIn);
if (System.SystemConfig.ShowMinimap)
System.MinimapWindow.UnCollapseOrShow();
// PopMinimapPadding already registered above (after WindowManager)
System.FlagController = new FlagController();
System.AreaMapController = new AddonAreaMapController();
System.IntegrationsController = new IntegrationsController();
Service.PluginInterface.UiBuilder.OpenMainUi += OpenMapWindow;
System.CommandManager.RegisterCommand(new ToggleCommandHandler
{
BaseActivationPath = "/fatelist",
EnableDelegate = _ => System.WindowManager.OpenOrCreateUnique<FateListWindow>(WindowFlags.OpenImmediately | WindowFlags.RequireLoggedIn),
DisableDelegate = _ => System.WindowManager.GetWindow<FateListWindow>()?.Close(),
ToggleDelegate = _ => System.WindowManager.GetWindow<FateListWindow>()?.UnCollapseOrToggle(),
});
System.CommandManager.RegisterCommand(new ToggleCommandHandler
{
BaseActivationPath = "/questlist",
EnableDelegate = _ => System.WindowManager.OpenOrCreateUnique<QuestListWindow>(WindowFlags.OpenImmediately | WindowFlags.RequireLoggedIn),
DisableDelegate = _ => System.WindowManager.GetWindow<QuestListWindow>()?.Close(),
ToggleDelegate = _ => System.WindowManager.GetWindow<QuestListWindow>()?.UnCollapseOrToggle(),
});
System.CommandManager.RegisterCommand(new ToggleCommandHandler
{
BaseActivationPath = "/flaglist",
EnableDelegate = _ => System.WindowManager.OpenOrCreateUnique<FlagHistoryWindow>(WindowFlags.OpenImmediately | WindowFlags.RequireLoggedIn),
DisableDelegate = _ => System.WindowManager.GetWindow<FlagHistoryWindow>()?.Close(),
ToggleDelegate = _ => System.WindowManager.GetWindow<FlagHistoryWindow>()?.UnCollapseOrToggle(),
});
System.CommandManager.RegisterCommand(new ToggleCommandHandler
{
BaseActivationPath = "/notelist",
EnableDelegate = _ => System.WindowManager.OpenOrCreateUnique<MapNoteListWindow>(WindowFlags.OpenImmediately | WindowFlags.RequireLoggedIn),
DisableDelegate = _ => System.WindowManager.GetWindow<MapNoteListWindow>()?.Close(),
ToggleDelegate = _ => System.WindowManager.GetWindow<MapNoteListWindow>()?.UnCollapseOrToggle(),
});
}
private unsafe void OpenMapWindow() => AgentMap.Instance()->Show();
/// <summary>
/// Called first each frame so the first window (minimap) gets zero padding when visible.
/// </summary>
private static void SetMinimapZeroPadding()
{
if (System.SystemConfig.ShowMinimap && IntegrationsController.ShouldShowMinimap()) {
ImGui.PushStyleVar(ImGuiStyleVar.WindowPadding, new Vector2(0f, 0f));
_minimapPushedPadding = true;
}
}
/// <summary>
/// Called after window system draw to pop the padding we pushed (keeps style stack balanced).
/// </summary>
private static void PopMinimapPadding()
{
if (_minimapPushedPadding) {
ImGui.PopStyleVar();
_minimapPushedPadding = false;
}
}
public void Dispose()
{
Service.PluginInterface.UiBuilder.Draw -= SetMinimapZeroPadding;
Service.PluginInterface.UiBuilder.Draw -= PopMinimapPadding;
System.MapWindow.OnClose();
System.WindowManager.Dispose();
System.IntegrationsController.Dispose();
System.AreaMapController.Dispose();
System.FlagController.Dispose();
System.MapRenderer.Dispose();
Service.PluginInterface.UiBuilder.OpenMainUi -= OpenMapWindow;
}
}