using ImGuiNET;
namespace T3.Editor.Gui.UiHelpers;
///
/// A small helper that helps to layout item blocks in a flexible column grid.
///
///
/// Using ImGui's Columns would require a pre-pass to calculate the count and width of columns.
/// This method basically sets the cursor-position to "fake" a similar thing. Obviously this
/// can't be nested.
///
internal static class ColumnLayout
{
internal static void StartLayout(int wrapCount = 10)
{
_wrapLineCount = wrapCount;
_layoutStartPosY = ImGui.GetCursorPosY();
_currentColumnWidth = 0;
}
internal static void StartGroupAndWrapIfRequired(int lineCountInGroup)
{
var y = ImGui.GetCursorPosY() - _layoutStartPosY;
var isFirstBlock = y < 10;
if (isFirstBlock)
return;
var requiredHeight = y + ImGui.GetFrameHeight() * lineCountInGroup;
var wrapHeight = _wrapLineCount * ImGui.GetFrameHeight();
if (requiredHeight < wrapHeight)
return;
// Start next column
ImGui.SetCursorPosY(_layoutStartPosY);
ImGui.Indent(_currentColumnWidth + Padding);
_currentColumnWidth = 0;
}
internal static void ExtendWidth(float itemWidth)
{
_currentColumnWidth = MathF.Max(_currentColumnWidth, itemWidth);
}
private static int _wrapLineCount = 10;
private static float _layoutStartPosY;
private static float _currentColumnWidth;
private static float Padding => 30 * T3Ui.UiScaleFactor;
}
///
/// Sometimes ImGui's methods to automatically resize windows (like popups) to their correct size doesn't work
/// out of the box. In these this class be used "measure" the required content size by calling
/// after each draw call. Before creating the window you can then use to get the size of the last frame.
/// In most scenarios, the frame delay is not noticeable.
///
internal static class WindowContentExtend
{
internal static void ExtendToLastItem()
{
_currentExtend = Vector2.Max(_currentExtend, ImGui.GetItemRectMax() - ImGui.GetWindowPos()) + new Vector2(ImGui.GetScrollX(), ImGui.GetScrollY());
}
internal static void ExtendToLastItem(int width)
{
_currentExtend = Vector2.Max(_currentExtend, new Vector2(width, ImGui.GetItemRectMax().Y - ImGui.GetWindowPos().Y + ImGui.GetScrollY()));
}
internal static Vector2 GetLastAndReset()
{
var lastExtend = _currentExtend;
_currentExtend = Vector2.Zero;
return lastExtend;
}
private static Vector2 _currentExtend = Vector2.Zero;
}