mirror of
https://github.com/goatcorp/Dalamud.git
synced 2026-01-03 06:13:40 +01:00
feat: add new ImGui windowing system
This commit is contained in:
parent
efdf9ca1ee
commit
266865a14c
2 changed files with 217 additions and 0 deletions
144
Dalamud/Interface/Windowing/Window.cs
Normal file
144
Dalamud/Interface/Windowing/Window.cs
Normal file
|
|
@ -0,0 +1,144 @@
|
|||
using System.Numerics;
|
||||
|
||||
using ImGuiNET;
|
||||
|
||||
namespace Dalamud.Interface.Windowing
|
||||
{
|
||||
/// <summary>
|
||||
/// Base class you can use to implement an ImGui window for use with the built-in <see cref="WindowSystem"/>.
|
||||
/// </summary>
|
||||
public abstract class Window
|
||||
{
|
||||
private bool internalIsOpen;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="Window"/> class.
|
||||
/// </summary>
|
||||
/// <param name="name">The name/ID of this window.
|
||||
/// If you have multiple windows with the same name, you will need to
|
||||
/// append an unique ID to it by specifying it after "###" behind the window title.
|
||||
/// </param>
|
||||
/// <param name="flags">The <see cref="ImGuiWindowFlags"/> of this window.</param>
|
||||
/// <param name="forceMainWindow">Whether or not this window should be limited to the main game window.</param>
|
||||
protected Window(string name, ImGuiWindowFlags flags, bool forceMainWindow = false)
|
||||
{
|
||||
this.WindowName = name;
|
||||
this.Flags = flags;
|
||||
this.ForceMainWindow = forceMainWindow;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the name of the window.
|
||||
/// If you have multiple windows with the same name, you will need to
|
||||
/// append an unique ID to it by specifying it after "###" behind the window title.
|
||||
/// </summary>
|
||||
public string WindowName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the position of this window.
|
||||
/// </summary>
|
||||
public Vector2? Position { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the condition that defines when the position of this window is set.
|
||||
/// </summary>
|
||||
public ImGuiCond PositionCondition { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the size of the window.
|
||||
/// </summary>
|
||||
public Vector2? Size { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the condition that defines when the size of this window is set.
|
||||
/// </summary>
|
||||
public ImGuiCond SizeCondition { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the minimum size of this window.
|
||||
/// </summary>
|
||||
public Vector2? SizeConstraintsMin { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the maximum size of this window.
|
||||
/// </summary>
|
||||
public Vector2? SizeConstraintsMax { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether or not this window is collapsed.
|
||||
/// </summary>
|
||||
public bool? Collapsed { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the condition that defines when the collapsed state of this window is set.
|
||||
/// </summary>
|
||||
public ImGuiCond CollapsedCondition { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the window flags.
|
||||
/// </summary>
|
||||
public ImGuiWindowFlags Flags { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether or not this ImGui window will be forced to stay inside the main game window.
|
||||
/// </summary>
|
||||
public bool ForceMainWindow { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether or not this window will stay open.
|
||||
/// </summary>
|
||||
public bool IsOpen
|
||||
{
|
||||
get => this.internalIsOpen;
|
||||
set => this.internalIsOpen = value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// In this method, implement your drawing code.
|
||||
/// You do NOT need to ImGui.Begin your window.
|
||||
/// </summary>
|
||||
public abstract void Draw();
|
||||
|
||||
/// <summary>
|
||||
/// Draw the window via ImGui.
|
||||
/// </summary>
|
||||
internal void DrawInternal()
|
||||
{
|
||||
this.ApplyConditionals();
|
||||
|
||||
if (this.ForceMainWindow)
|
||||
ImGuiHelpers.ForceMainWindow();
|
||||
|
||||
if (ImGui.Begin(this.WindowName, ref this.internalIsOpen, this.Flags))
|
||||
{
|
||||
// Draw the actual window contents
|
||||
this.Draw();
|
||||
|
||||
ImGui.End();
|
||||
}
|
||||
}
|
||||
|
||||
private void ApplyConditionals()
|
||||
{
|
||||
if (this.Position.HasValue)
|
||||
{
|
||||
ImGui.SetNextWindowPos(this.Position.Value, this.PositionCondition);
|
||||
}
|
||||
|
||||
if (this.Size.HasValue)
|
||||
{
|
||||
ImGui.SetNextWindowPos(this.Size.Value, this.SizeCondition);
|
||||
}
|
||||
|
||||
if (this.Collapsed.HasValue)
|
||||
{
|
||||
ImGui.SetNextWindowCollapsed(this.Collapsed.Value, this.CollapsedCondition);
|
||||
}
|
||||
|
||||
if (this.SizeConstraintsMin.HasValue && this.SizeConstraintsMax.HasValue)
|
||||
{
|
||||
ImGui.SetNextWindowSizeConstraints(this.SizeConstraintsMin.Value, this.SizeConstraintsMax.Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
73
Dalamud/Interface/Windowing/WindowSystem.cs
Normal file
73
Dalamud/Interface/Windowing/WindowSystem.cs
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
using ImGuiNET;
|
||||
|
||||
namespace Dalamud.Interface.Windowing
|
||||
{
|
||||
/// <summary>
|
||||
/// Class running a WindowSystem using <see cref="Window"/> implementations to simplify ImGui windowing.
|
||||
/// </summary>
|
||||
public class WindowSystem
|
||||
{
|
||||
private readonly List<Window> windows = new List<Window>();
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="WindowSystem"/> class.
|
||||
/// </summary>
|
||||
/// <param name="imNamespace">The name/ID-space of this <see cref="WindowSystem"/>.</param>
|
||||
public WindowSystem(string imNamespace = null)
|
||||
{
|
||||
this.Namespace = imNamespace;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the name/ID-space of this <see cref="WindowSystem"/>.
|
||||
/// </summary>
|
||||
public string Namespace { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Add a window to this <see cref="WindowSystem"/>.
|
||||
/// </summary>
|
||||
/// <param name="window">The window to add.</param>
|
||||
public void AddWindow(Window window)
|
||||
{
|
||||
if (this.windows.Any(x => x.WindowName == window.WindowName))
|
||||
throw new ArgumentException("A window with this name/ID already exists.");
|
||||
|
||||
this.windows.Add(window);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Remove a window from this <see cref="WindowSystem"/>.
|
||||
/// </summary>
|
||||
/// <param name="window">The window to remove.</param>
|
||||
public void RemoveWindow(Window window)
|
||||
{
|
||||
if (!this.windows.Contains(window))
|
||||
throw new ArgumentException("This window is not registered on this WindowSystem.");
|
||||
|
||||
this.windows.Remove(window);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Draw all registered windows using ImGui.
|
||||
/// </summary>
|
||||
public void Draw()
|
||||
{
|
||||
var hasNamespace = !string.IsNullOrEmpty(this.Namespace);
|
||||
|
||||
if (hasNamespace)
|
||||
ImGui.PushID(this.Namespace);
|
||||
|
||||
foreach (var window in this.windows)
|
||||
{
|
||||
window.DrawInternal();
|
||||
}
|
||||
|
||||
if (hasNamespace)
|
||||
ImGui.PopID();
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue