|
@@ -339,6 +339,52 @@ void ImGui::TextWrappedV(const char* fmt, va_list args)
|
|
PopTextWrapPos();
|
|
PopTextWrapPos();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void ImGui::TextAligned(float align_x, const char* fmt, ...)
|
|
|
|
+{
|
|
|
|
+ va_list args;
|
|
|
|
+ va_start(args, fmt);
|
|
|
|
+ TextAlignedV(align_x, fmt, args);
|
|
|
|
+ va_end(args);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// align_x: 0.0f = left, 0.5f = center, 1.0f = right.
|
|
|
|
+// FIXME-WIP: Works but API is likely to be reworked. This is designed for 1 item on the line. (#7024)
|
|
|
|
+void ImGui::TextAlignedV(float align_x, const char* fmt, va_list args)
|
|
|
|
+{
|
|
|
|
+ TextAlignedExV(align_x, GetContentRegionAvail().x, fmt, args);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void ImGui::TextAlignedExV(float align_x, float avail_x, const char* fmt, va_list args)
|
|
|
|
+{
|
|
|
|
+ ImGuiWindow* window = GetCurrentWindow();
|
|
|
|
+ if (window->SkipItems)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ const char* text, *text_end;
|
|
|
|
+ ImFormatStringToTempBufferV(&text, &text_end, fmt, args);
|
|
|
|
+ const ImVec2 text_size = CalcTextSize(text, text_end);
|
|
|
|
+
|
|
|
|
+ ImVec2 pos(window->DC.CursorPos.x, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset);
|
|
|
|
+ ImVec2 pos_max(pos.x + avail_x, window->ClipRect.Max.y);
|
|
|
|
+ ImVec2 size(ImMin(avail_x, text_size.x), text_size.y);
|
|
|
|
+ window->DC.CursorMaxPos.x = ImMax(window->DC.CursorMaxPos.x, pos.x + text_size.x);
|
|
|
|
+ window->DC.IdealMaxPos.x = ImMax(window->DC.IdealMaxPos.x, pos.x + text_size.x);
|
|
|
|
+ if (align_x > 0.0f && text_size.x < avail_x)
|
|
|
|
+ {
|
|
|
|
+ pos.x += ImTrunc((avail_x - text_size.x) * align_x);
|
|
|
|
+ window->DC.CursorPos = pos;
|
|
|
|
+ }
|
|
|
|
+ RenderTextEllipsis(window->DrawList, pos, pos_max, pos_max.x, text, text_end, &text_size);
|
|
|
|
+
|
|
|
|
+ const ImVec2 backup_max_pos = window->DC.CursorMaxPos;
|
|
|
|
+ ItemSize(size);
|
|
|
|
+ ItemAdd(ImRect(pos, pos + size), 0);
|
|
|
|
+ window->DC.CursorMaxPos.x = backup_max_pos.x; // Cancel out extending content size because right-aligned text would otherwise mess it up.
|
|
|
|
+
|
|
|
|
+ if (avail_x < text_size.x && IsItemHovered(ImGuiHoveredFlags_NoNavOverride | ImGuiHoveredFlags_AllowWhenDisabled | ImGuiHoveredFlags_ForTooltip))
|
|
|
|
+ SetTooltip("%.*s", (int)(text_end - text), text);
|
|
|
|
+}
|
|
|
|
+
|
|
void ImGui::LabelText(const char* label, const char* fmt, ...)
|
|
void ImGui::LabelText(const char* label, const char* fmt, ...)
|
|
{
|
|
{
|
|
va_list args;
|
|
va_list args;
|
|
@@ -5167,8 +5213,6 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
|
// Otherwise request text input ahead for next frame.
|
|
// Otherwise request text input ahead for next frame.
|
|
if (g.ActiveId == id && clear_active_id)
|
|
if (g.ActiveId == id && clear_active_id)
|
|
ClearActiveID();
|
|
ClearActiveID();
|
|
- else if (g.ActiveId == id)
|
|
|
|
- g.WantTextInputNextFrame = 1;
|
|
|
|
|
|
|
|
// Render frame
|
|
// Render frame
|
|
if (!is_multiline)
|
|
if (!is_multiline)
|
|
@@ -5349,12 +5393,16 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
|
|
draw_window->DrawList->AddLine(cursor_screen_rect.Min, cursor_screen_rect.GetBL(), GetColorU32(ImGuiCol_InputTextCursor), 1.0f); // FIXME-DPI: Cursor thickness (#7031)
|
|
draw_window->DrawList->AddLine(cursor_screen_rect.Min, cursor_screen_rect.GetBL(), GetColorU32(ImGuiCol_InputTextCursor), 1.0f); // FIXME-DPI: Cursor thickness (#7031)
|
|
|
|
|
|
// Notify OS of text input position for advanced IME (-1 x offset so that Windows IME can cover our cursor. Bit of an extra nicety.)
|
|
// Notify OS of text input position for advanced IME (-1 x offset so that Windows IME can cover our cursor. Bit of an extra nicety.)
|
|
- if (!is_readonly)
|
|
|
|
|
|
+ // This is required for some backends (SDL3) to start emitting character/text inputs.
|
|
|
|
+ // As per #6341, make sure we don't set that on the deactivating frame.
|
|
|
|
+ if (!is_readonly && g.ActiveId == id)
|
|
{
|
|
{
|
|
- g.PlatformImeData.WantVisible = true;
|
|
|
|
- g.PlatformImeData.InputPos = ImVec2(cursor_screen_pos.x - 1.0f, cursor_screen_pos.y - g.FontSize);
|
|
|
|
- g.PlatformImeData.InputLineHeight = g.FontSize;
|
|
|
|
- g.PlatformImeViewport = window->Viewport->ID;
|
|
|
|
|
|
+ ImGuiPlatformImeData* ime_data = &g.PlatformImeData; // (this is a public struct, passed to io.Platform_SetImeDataFn() handler)
|
|
|
|
+ ime_data->WantVisible = true;
|
|
|
|
+ ime_data->WantTextInput = true;
|
|
|
|
+ ime_data->InputPos = ImVec2(cursor_screen_pos.x - 1.0f, cursor_screen_pos.y - g.FontSize);
|
|
|
|
+ ime_data->InputLineHeight = g.FontSize;
|
|
|
|
+ ime_data->ViewportId = window->Viewport->ID;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|