CurrencyAlertClassic/CurrencyAlert/Windows/OverlayWindow.cs
MidoriKami e97fe36ba0
Complete Rework + Update (#15)
* Remove unused dalamud packager overrides

* Use category tags, add actual description

* Use .net7

* Update DalamudPackager, update for Api8

* Remove hardcoded images, we'll use lumina to get these dynamically

* Add KamiLib

* Refactor Currency Alert

* Add LocalizationManager.cs

* remove trailing comma

* Add No Decoration flag

* More touchups and features

* Increase Version Number 0.5.0.0

* Move Chat Notifications to its own category

* Hide overlay if not logged in or there are no warnings to show

* Increase update frequency to 4x per second
2023-01-10 21:07:57 +01:00

163 lines
4.5 KiB
C#

using System.Linq;
using System.Numerics;
using CurrencyAlert.Commands;
using CurrencyAlert.DataModels;
using CurrencyAlert.Localization;
using Dalamud.Interface.Windowing;
using ImGuiNET;
using KamiLib;
using KamiLib.Configuration;
using KamiLib.GameState;
using KamiLib.Windows;
namespace CurrencyAlert.Windows;
public class OverlaySettings
{
public Setting<bool> LockPosition = new(false);
public Setting<float> Opacity = new(1.0f);
public Setting<bool> MinimalDisplay = new(false);
public Setting<bool> Show = new(true);
public Setting<bool> AscendingDescending = new(false);
}
public class OverlayWindow : Window
{
private static OverlaySettings OverlaySettings => Service.Configuration.OverlaySettings;
private static DisplaySettings DisplaySettings => Service.Configuration.DisplaySettings;
private Vector2 lastWindowSize = Vector2.Zero;
public OverlayWindow() : base("Currency Alert Overlay")
{
KamiCommon.CommandManager.AddCommand(new OverlayCommands());
Flags |= ImGuiWindowFlags.NoDecoration;
Flags |= ImGuiWindowFlags.NoBringToFrontOnFocus;
Flags |= ImGuiWindowFlags.NoFocusOnAppearing;
Flags |= ImGuiWindowFlags.NoNavFocus;
Flags |= ImGuiWindowFlags.AlwaysAutoResize;
}
public override void PreOpenCheck()
{
IsOpen = OverlaySettings.Show;
if (Condition.IsBoundByDuty()) IsOpen = false;
if (Condition.IsInCutsceneOrQuestEvent()) IsOpen = false;
if (!Service.CurrencyTracker.ActiveWarnings.Any()) IsOpen = false;
if (!Service.ClientState.IsLoggedIn) IsOpen = false;
}
public override void PreDraw()
{
var bgColor = ImGui.GetStyle().Colors[(int)ImGuiCol.WindowBg];
ImGui.PushStyleColor(ImGuiCol.WindowBg, bgColor with {W = OverlaySettings.Opacity.Value});
var borderColor = ImGui.GetStyle().Colors[(int)ImGuiCol.Border];
ImGui.PushStyleColor(ImGuiCol.Border, borderColor with {W = OverlaySettings.Opacity.Value});
if (OverlaySettings.LockPosition)
{
Flags |= DrawFlags.LockPosition;
}
else
{
Flags &= ~DrawFlags.LockPosition;
}
}
public override void Draw()
{
ResizeWindow();
if (OverlaySettings.MinimalDisplay)
{
DrawMinimalDisplay();
}
else
{
DrawNormalDisplay();
}
}
public override void PostDraw()
{
ImGui.PopStyleColor();
ImGui.PopStyleColor();
}
private void ResizeWindow()
{
if(OverlaySettings.AscendingDescending)
{
var size = ImGui.GetWindowSize();
if(lastWindowSize != Vector2.Zero)
{
var offset = lastWindowSize - size;
offset.X = 0;
if (offset != Vector2.Zero)
{
ImGui.SetWindowPos(ImGui.GetWindowPos() + offset);
}
}
lastWindowSize = size;
}
}
private static void DrawMinimalDisplay()
{
if (DisplaySettings.ShowWarningText)
{
ImGui.TextColored(DisplaySettings.TextColor.Value, Strings.OverlayWarningText);
ImGui.SameLine();
}
foreach (var currency in Service.CurrencyTracker.ActiveWarnings)
{
if (DisplaySettings.ShowIcon)
{
currency.DrawIcon();
if (DisplaySettings.ShowName)
{
ImGui.SameLine();
currency.DrawName(DisplaySettings.TextColor.Value);
ImGui.SameLine();
}
}
else if (DisplaySettings.ShowName)
{
currency.DrawName(DisplaySettings.TextColor.Value);
ImGui.SameLine();
}
}
}
private static void DrawNormalDisplay()
{
foreach (var currency in Service.CurrencyTracker.ActiveWarnings)
{
if (DisplaySettings.ShowWarningText)
{
ImGui.TextColored(DisplaySettings.TextColor.Value, Strings.OverlayWarningText);
ImGui.SameLine();
}
if (DisplaySettings.ShowIcon)
{
currency.DrawIcon();
ImGui.SameLine();
}
if (DisplaySettings.ShowName)
{
currency.DrawName(DisplaySettings.TextColor.Value);
}
}
}
}