using System; using System.Reflection; using Dalamud.Bindings.ImGui; using Dalamud.Interface.Windowing; namespace LLib.ImGui; [Obfuscation(Feature = "-rename", Exclude = false, ApplyToMembers = true)] public abstract class LWindow : Window { private bool _initializedConfig; private bool _wasCollapsedLastFrame; private bool _closeRequested; protected bool UncollapseNextFrame { get; set; } public bool IsOpenAndUncollapsed { get { if (base.IsOpen) { return !_wasCollapsedLastFrame; } return false; } set { base.IsOpen = value; UncollapseNextFrame = value; } } protected int? Alpha { get { float? bgAlpha = base.BgAlpha; if (bgAlpha.HasValue) { float valueOrDefault = bgAlpha.GetValueOrDefault(); return (int)MathF.Round(100000f * valueOrDefault); } return null; } set { base.BgAlpha = (float?)value / 100000f; } } protected LWindow(string windowName, ImGuiWindowFlags flags = ImGuiWindowFlags.None, bool forceMainWindow = false) : base(windowName, flags, forceMainWindow) { } private void LoadWindowConfig() { if (!(this is IPersistableWindowConfig persistableWindowConfig)) { return; } WindowConfig windowConfig = persistableWindowConfig.WindowConfig; if (windowConfig != null) { if (base.AllowPinning) { base.IsPinned = windowConfig.IsPinned; } if (base.AllowClickthrough) { base.IsClickthrough = windowConfig.IsClickthrough; } Alpha = windowConfig.Alpha; } _initializedConfig = true; } private void UpdateWindowConfig() { if (!(this is IPersistableWindowConfig persistableWindowConfig) || Dalamud.Bindings.ImGui.ImGui.IsAnyMouseDown()) { return; } WindowConfig windowConfig = persistableWindowConfig.WindowConfig; if (windowConfig != null) { bool flag = false; if (base.AllowPinning && windowConfig.IsPinned != base.IsPinned) { windowConfig.IsPinned = base.IsPinned; flag = true; } if (base.AllowClickthrough && windowConfig.IsClickthrough != base.IsClickthrough) { windowConfig.IsClickthrough = base.IsClickthrough; flag = true; } if (windowConfig.Alpha != Alpha) { windowConfig.Alpha = Alpha; flag = true; } if (flag) { persistableWindowConfig.SaveWindowConfig(); } } } public void ToggleOrUncollapse() { IsOpenAndUncollapsed = !IsOpenAndUncollapsed; } protected void RequestClose() { _closeRequested = true; } public override void OnOpen() { _closeRequested = false; UncollapseNextFrame = true; base.OnOpen(); } public override void Update() { _wasCollapsedLastFrame = true; } public override void PreDraw() { if (_closeRequested) { _closeRequested = false; base.IsOpen = false; } if (!_initializedConfig) { LoadWindowConfig(); } if (UncollapseNextFrame) { Dalamud.Bindings.ImGui.ImGui.SetNextWindowCollapsed(collapsed: false); UncollapseNextFrame = false; } base.PreDraw(); } public sealed override void Draw() { _wasCollapsedLastFrame = false; DrawContent(); } public abstract void DrawContent(); public override void PostDraw() { base.PostDraw(); if (_initializedConfig) { UpdateWindowConfig(); } } }