fix formatting
This commit is contained in:
+89
-71
@@ -9,124 +9,134 @@ using ImGuiNET;
|
||||
|
||||
namespace ChatTwo.Util;
|
||||
|
||||
internal static class ImGuiUtil {
|
||||
private static readonly ImGuiMouseButton[] Buttons = {
|
||||
internal static class ImGuiUtil
|
||||
{
|
||||
private static readonly ImGuiMouseButton[] Buttons =
|
||||
[
|
||||
ImGuiMouseButton.Left,
|
||||
ImGuiMouseButton.Middle,
|
||||
ImGuiMouseButton.Right,
|
||||
};
|
||||
ImGuiMouseButton.Right
|
||||
];
|
||||
|
||||
private static Payload? _hovered;
|
||||
private static Payload? _lastLink;
|
||||
private static readonly List<(Vector2, Vector2)> PayloadBounds = new();
|
||||
|
||||
internal static void PostPayload(Chunk chunk, PayloadHandler? handler) {
|
||||
internal static void PostPayload(Chunk chunk, PayloadHandler? handler)
|
||||
{
|
||||
var payload = chunk.Link;
|
||||
if (payload != null && ImGui.IsItemHovered()) {
|
||||
if (payload != null && ImGui.IsItemHovered())
|
||||
{
|
||||
_hovered = payload;
|
||||
ImGui.SetMouseCursor(ImGuiMouseCursor.Hand);
|
||||
handler?.Hover(payload);
|
||||
} else if (!ReferenceEquals(_hovered, payload)) {
|
||||
}
|
||||
else if (!ReferenceEquals(_hovered, payload))
|
||||
{
|
||||
_hovered = null;
|
||||
}
|
||||
|
||||
if (handler == null) {
|
||||
if (handler == null)
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (var button in Buttons) {
|
||||
if (ImGui.IsItemClicked(button)) {
|
||||
foreach (var button in Buttons)
|
||||
if (ImGui.IsItemClicked(button))
|
||||
handler.Click(chunk, payload, button);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal static unsafe void WrapText(string csText, Chunk chunk, PayloadHandler? handler, Vector4 defaultText, float lineWidth) {
|
||||
void Text(byte* text, byte* textEnd) {
|
||||
internal static unsafe void WrapText(string csText, Chunk chunk, PayloadHandler? handler, Vector4 defaultText, float lineWidth)
|
||||
{
|
||||
void Text(byte* text, byte* textEnd)
|
||||
{
|
||||
var oldPos = ImGui.GetCursorScreenPos();
|
||||
|
||||
ImGuiNative.igTextUnformatted(text, textEnd);
|
||||
PostPayload(chunk, handler);
|
||||
|
||||
if (!ReferenceEquals(_lastLink, chunk.Link)) {
|
||||
if (!ReferenceEquals(_lastLink, chunk.Link))
|
||||
PayloadBounds.Clear();
|
||||
}
|
||||
|
||||
_lastLink = chunk.Link;
|
||||
|
||||
if (_hovered != null && ReferenceEquals(_hovered, chunk.Link)) {
|
||||
if (_hovered != null && ReferenceEquals(_hovered, chunk.Link))
|
||||
{
|
||||
defaultText.W = 0.25f;
|
||||
var actualCol = ColourUtil.Vector4ToAbgr(defaultText);
|
||||
ImGui.GetWindowDrawList().AddRectFilled(oldPos, oldPos + ImGui.GetItemRectSize(), actualCol);
|
||||
|
||||
foreach (var (start, size) in PayloadBounds) {
|
||||
foreach (var (start, size) in PayloadBounds)
|
||||
ImGui.GetWindowDrawList().AddRectFilled(start, start + size, actualCol);
|
||||
}
|
||||
|
||||
PayloadBounds.Clear();
|
||||
}
|
||||
|
||||
if (_hovered == null && chunk.Link != null) {
|
||||
if (_hovered == null && chunk.Link != null)
|
||||
PayloadBounds.Add((oldPos, ImGui.GetItemRectSize()));
|
||||
}
|
||||
}
|
||||
|
||||
if (csText.Length == 0) {
|
||||
if (csText.Length == 0)
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (var part in csText.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None)) {
|
||||
foreach (var part in csText.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None))
|
||||
{
|
||||
var bytes = Encoding.UTF8.GetBytes(part);
|
||||
fixed (byte* rawText = bytes) {
|
||||
fixed (byte* rawText = bytes)
|
||||
{
|
||||
var text = rawText;
|
||||
var textEnd = text + bytes.Length;
|
||||
|
||||
// empty string
|
||||
if (text == null) {
|
||||
if (text == null)
|
||||
{
|
||||
ImGui.TextUnformatted("");
|
||||
continue;
|
||||
}
|
||||
|
||||
var widthLeft = ImGui.GetContentRegionAvail().X;
|
||||
var endPrevLine = ImGuiNative.ImFont_CalcWordWrapPositionA(ImGui.GetFont().NativePtr, ImGuiHelpers.GlobalScale, text, textEnd, widthLeft);
|
||||
if (endPrevLine == null) {
|
||||
if (endPrevLine == null)
|
||||
continue;
|
||||
}
|
||||
|
||||
var firstSpace = FindFirstSpace(text, textEnd);
|
||||
var properBreak = firstSpace <= endPrevLine;
|
||||
if (properBreak) {
|
||||
if (properBreak)
|
||||
{
|
||||
Text(text, endPrevLine);
|
||||
} else {
|
||||
if (lineWidth == 0f) {
|
||||
}
|
||||
else
|
||||
{
|
||||
if (lineWidth == 0f)
|
||||
{
|
||||
ImGui.TextUnformatted("");
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
// check if the next bit is longer than the entire line width
|
||||
var wrapPos = ImGuiNative.ImFont_CalcWordWrapPositionA(ImGui.GetFont().NativePtr, ImGuiHelpers.GlobalScale, text, firstSpace, lineWidth);
|
||||
if (wrapPos >= firstSpace) {
|
||||
// only go to next line is it's going to wrap at the space
|
||||
|
||||
// only go to next line is it's going to wrap at the space
|
||||
if (wrapPos >= firstSpace)
|
||||
ImGui.TextUnformatted("");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
widthLeft = ImGui.GetContentRegionAvail().X;
|
||||
while (endPrevLine < textEnd) {
|
||||
if (properBreak) {
|
||||
while (endPrevLine < textEnd)
|
||||
{
|
||||
if (properBreak)
|
||||
text = endPrevLine;
|
||||
}
|
||||
|
||||
if (*text == ' ') {
|
||||
// skip a space at start of line
|
||||
if (*text == ' ')
|
||||
++text;
|
||||
} // skip a space at start of line
|
||||
|
||||
var newEnd = ImGuiNative.ImFont_CalcWordWrapPositionA(ImGui.GetFont().NativePtr, ImGuiHelpers.GlobalScale, text, textEnd, widthLeft);
|
||||
if (properBreak && newEnd == endPrevLine) {
|
||||
if (properBreak && newEnd == endPrevLine)
|
||||
break;
|
||||
}
|
||||
|
||||
endPrevLine = newEnd;
|
||||
if (endPrevLine == null) {
|
||||
if (endPrevLine == null)
|
||||
{
|
||||
ImGui.TextUnformatted("");
|
||||
ImGui.TextUnformatted("");
|
||||
break;
|
||||
@@ -134,7 +144,8 @@ internal static class ImGuiUtil {
|
||||
|
||||
Text(text, endPrevLine);
|
||||
|
||||
if (!properBreak) {
|
||||
if (!properBreak)
|
||||
{
|
||||
properBreak = true;
|
||||
widthLeft = ImGui.GetContentRegionAvail().X;
|
||||
}
|
||||
@@ -143,29 +154,29 @@ internal static class ImGuiUtil {
|
||||
}
|
||||
}
|
||||
|
||||
private static unsafe byte* FindFirstSpace(byte* text, byte* textEnd) {
|
||||
for (var i = text; i < textEnd; i++) {
|
||||
if (char.IsWhiteSpace((char) *i)) {
|
||||
private static unsafe byte* FindFirstSpace(byte* text, byte* textEnd)
|
||||
{
|
||||
for (var i = text; i < textEnd; i++)
|
||||
if (char.IsWhiteSpace((char) *i))
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return textEnd;
|
||||
}
|
||||
|
||||
internal static bool IconButton(FontAwesomeIcon icon, string? id = null, string? tooltip = null) {
|
||||
internal static bool IconButton(FontAwesomeIcon icon, string? id = null, string? tooltip = null)
|
||||
{
|
||||
ImGui.PushFont(UiBuilder.IconFont);
|
||||
|
||||
var label = icon.ToIconString();
|
||||
if (id != null) {
|
||||
if (id != null)
|
||||
label += $"##{id}";
|
||||
}
|
||||
|
||||
var ret = ImGui.Button(label);
|
||||
|
||||
ImGui.PopFont();
|
||||
|
||||
if (tooltip != null && ImGui.IsItemHovered()) {
|
||||
if (tooltip != null && ImGui.IsItemHovered())
|
||||
{
|
||||
ImGui.BeginTooltip();
|
||||
ImGui.TextUnformatted(tooltip);
|
||||
ImGui.EndTooltip();
|
||||
@@ -174,58 +185,63 @@ internal static class ImGuiUtil {
|
||||
return ret;
|
||||
}
|
||||
|
||||
internal static bool OptionCheckbox(ref bool value, string label, string? description = null) {
|
||||
internal static bool OptionCheckbox(ref bool value, string label, string? description = null)
|
||||
{
|
||||
var ret = ImGui.Checkbox(label, ref value);
|
||||
|
||||
if (description != null) {
|
||||
if (description != null)
|
||||
HelpText(description);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
internal static void HelpText(string text) {
|
||||
internal static void HelpText(string text)
|
||||
{
|
||||
var colour = ImGui.GetStyle().Colors[(int) ImGuiCol.TextDisabled];
|
||||
ImGui.PushStyleColor(ImGuiCol.Text, colour);
|
||||
ImGui.PushTextWrapPos();
|
||||
|
||||
try {
|
||||
try
|
||||
{
|
||||
ImGui.TextUnformatted(text);
|
||||
} finally {
|
||||
}
|
||||
finally
|
||||
{
|
||||
ImGui.PopTextWrapPos();
|
||||
ImGui.PopStyleColor();
|
||||
}
|
||||
}
|
||||
|
||||
internal static void WarningText(string text, bool wrap = true) {
|
||||
internal static void WarningText(string text, bool wrap = true)
|
||||
{
|
||||
var style = StyleModel.GetConfiguredStyle() ?? StyleModel.GetFromCurrent();
|
||||
var dalamudOrange = style.BuiltInColors?.DalamudOrange;
|
||||
if (dalamudOrange != null) {
|
||||
if (dalamudOrange != null)
|
||||
ImGui.PushStyleColor(ImGuiCol.Text, dalamudOrange.Value);
|
||||
}
|
||||
|
||||
if (wrap) ImGui.PushTextWrapPos();
|
||||
ImGui.TextUnformatted(text);
|
||||
if (wrap) ImGui.PopTextWrapPos();
|
||||
|
||||
if (dalamudOrange != null) {
|
||||
if (dalamudOrange != null)
|
||||
ImGui.PopStyleColor();
|
||||
}
|
||||
}
|
||||
|
||||
internal static bool BeginComboVertical(string label, string previewValue, ImGuiComboFlags flags = ImGuiComboFlags.None) {
|
||||
internal static bool BeginComboVertical(string label, string previewValue, ImGuiComboFlags flags = ImGuiComboFlags.None)
|
||||
{
|
||||
ImGui.TextUnformatted(label);
|
||||
ImGui.SetNextItemWidth(-1);
|
||||
return ImGui.BeginCombo($"##{label}", previewValue, flags);
|
||||
}
|
||||
|
||||
internal static bool DragFloatVertical(string label, ref float value, float vSpeed = 1.0f, float vMin = float.MinValue, float vMax = float.MaxValue, string? format = null, ImGuiSliderFlags flags = ImGuiSliderFlags.None) {
|
||||
internal static bool DragFloatVertical(string label, ref float value, float vSpeed = 1.0f, float vMin = float.MinValue, float vMax = float.MaxValue, string? format = null, ImGuiSliderFlags flags = ImGuiSliderFlags.None)
|
||||
{
|
||||
ImGui.TextUnformatted(label);
|
||||
ImGui.SetNextItemWidth(-1);
|
||||
return ImGui.DragFloat($"##{label}", ref value, vSpeed, vMin, vMax, format, flags);
|
||||
}
|
||||
|
||||
internal static bool DragFloatVertical(string label, string description, ref float value, float vSpeed = 1.0f, float vMin = float.MinValue, float vMax = float.MaxValue, string? format = null, ImGuiSliderFlags flags = ImGuiSliderFlags.None) {
|
||||
internal static bool DragFloatVertical(string label, string description, ref float value, float vSpeed = 1.0f, float vMin = float.MinValue, float vMax = float.MaxValue, string? format = null, ImGuiSliderFlags flags = ImGuiSliderFlags.None)
|
||||
{
|
||||
ImGui.TextUnformatted(label);
|
||||
ImGui.SetNextItemWidth(-1);
|
||||
var r = ImGui.DragFloat($"##{label}", ref value, vSpeed, vMin, vMax, format, flags);
|
||||
@@ -234,7 +250,8 @@ internal static class ImGuiUtil {
|
||||
return r;
|
||||
}
|
||||
|
||||
internal static bool InputIntVertical(string label, string description, ref int value, int step = 1, int stepFast = 100, ImGuiInputTextFlags flags = ImGuiInputTextFlags.None) {
|
||||
internal static bool InputIntVertical(string label, string description, ref int value, int step = 1, int stepFast = 100, ImGuiInputTextFlags flags = ImGuiInputTextFlags.None)
|
||||
{
|
||||
ImGui.TextUnformatted(label);
|
||||
ImGui.SetNextItemWidth(-1);
|
||||
var r = ImGui.InputInt($"##{label}", ref value, step, stepFast, flags);
|
||||
@@ -259,7 +276,8 @@ internal static class ImGuiUtil {
|
||||
return ret;
|
||||
}
|
||||
|
||||
internal static bool TryToImGui(this VirtualKey key, out ImGuiKey result) {
|
||||
internal static bool TryToImGui(this VirtualKey key, out ImGuiKey result)
|
||||
{
|
||||
result = key switch {
|
||||
VirtualKey.NO_KEY => ImGuiKey.None,
|
||||
VirtualKey.BACK => ImGuiKey.Backspace,
|
||||
|
||||
Reference in New Issue
Block a user