Tooltip: SetTooltip() is expanded immediately into a window, honoring current font / styling setting. Add internal mechanism to override tooltips (not exposed in BeginTooltip yet because bools are evil) (#862)
This commit is contained in:
parent
100d30a0a1
commit
138a9dbaeb
36
imgui.cpp
36
imgui.cpp
@ -2157,7 +2157,7 @@ void ImGui::NewFrame()
|
|||||||
|
|
||||||
g.Time += g.IO.DeltaTime;
|
g.Time += g.IO.DeltaTime;
|
||||||
g.FrameCount += 1;
|
g.FrameCount += 1;
|
||||||
g.Tooltip[0] = '\0';
|
g.TooltipOverrideCount = 0;
|
||||||
g.OverlayDrawList.Clear();
|
g.OverlayDrawList.Clear();
|
||||||
g.OverlayDrawList.PushTextureID(g.IO.Fonts->TexID);
|
g.OverlayDrawList.PushTextureID(g.IO.Fonts->TexID);
|
||||||
g.OverlayDrawList.PushClipRectFullScreen();
|
g.OverlayDrawList.PushClipRectFullScreen();
|
||||||
@ -2657,14 +2657,6 @@ void ImGui::EndFrame()
|
|||||||
IM_ASSERT(g.Initialized); // Forgot to call ImGui::NewFrame()
|
IM_ASSERT(g.Initialized); // Forgot to call ImGui::NewFrame()
|
||||||
IM_ASSERT(g.FrameCountEnded != g.FrameCount); // ImGui::EndFrame() called multiple times, or forgot to call ImGui::NewFrame() again
|
IM_ASSERT(g.FrameCountEnded != g.FrameCount); // ImGui::EndFrame() called multiple times, or forgot to call ImGui::NewFrame() again
|
||||||
|
|
||||||
// Render tooltip
|
|
||||||
if (g.Tooltip[0])
|
|
||||||
{
|
|
||||||
ImGui::BeginTooltip();
|
|
||||||
ImGui::TextUnformatted(g.Tooltip);
|
|
||||||
ImGui::EndTooltip();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Notify OS when our Input Method Editor cursor has moved (e.g. CJK inputs using Microsoft IME)
|
// Notify OS when our Input Method Editor cursor has moved (e.g. CJK inputs using Microsoft IME)
|
||||||
if (g.IO.ImeSetInputScreenPosFn && ImLengthSqr(g.OsImePosRequest - g.OsImePosSet) > 0.0001f)
|
if (g.IO.ImeSetInputScreenPosFn && ImLengthSqr(g.OsImePosRequest - g.OsImePosSet) > 0.0001f)
|
||||||
{
|
{
|
||||||
@ -3388,11 +3380,28 @@ static ImRect GetVisibleRect()
|
|||||||
return ImRect(0.0f, 0.0f, g.IO.DisplaySize.x, g.IO.DisplaySize.y);
|
return ImRect(0.0f, 0.0f, g.IO.DisplaySize.x, g.IO.DisplaySize.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tooltip is stored and turned into a BeginTooltip()/EndTooltip() sequence at the end of the frame. Each call override previous value.
|
// Not exposed publicly as BeginTooltip() because bool parameters are evil. Let's see if other needs arise first.
|
||||||
void ImGui::SetTooltipV(const char* fmt, va_list args)
|
static void BeginTooltipEx(bool override_previous_tooltip)
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
ImFormatStringV(g.Tooltip, IM_ARRAYSIZE(g.Tooltip), fmt, args);
|
char window_name[16];
|
||||||
|
ImFormatString(window_name, IM_ARRAYSIZE(window_name), "##Tooltip%02d", g.TooltipOverrideCount);
|
||||||
|
if (override_previous_tooltip)
|
||||||
|
if (ImGuiWindow* window = ImGui::FindWindowByName(window_name))
|
||||||
|
if (window->Active)
|
||||||
|
{
|
||||||
|
// Hide previous tooltips. We can't easily "reset" the content of a window so we create a new one.
|
||||||
|
window->HiddenFrames = 1;
|
||||||
|
ImFormatString(window_name, IM_ARRAYSIZE(window_name), "##Tooltip%02d", ++g.TooltipOverrideCount);
|
||||||
|
}
|
||||||
|
ImGui::Begin(window_name, NULL, ImGuiWindowFlags_Tooltip|ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoSavedSettings|ImGuiWindowFlags_AlwaysAutoResize);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImGui::SetTooltipV(const char* fmt, va_list args)
|
||||||
|
{
|
||||||
|
BeginTooltipEx(true);
|
||||||
|
TextV(fmt, args);
|
||||||
|
EndTooltip();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGui::SetTooltip(const char* fmt, ...)
|
void ImGui::SetTooltip(const char* fmt, ...)
|
||||||
@ -3405,8 +3414,7 @@ void ImGui::SetTooltip(const char* fmt, ...)
|
|||||||
|
|
||||||
void ImGui::BeginTooltip()
|
void ImGui::BeginTooltip()
|
||||||
{
|
{
|
||||||
ImGuiWindowFlags flags = ImGuiWindowFlags_Tooltip|ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoSavedSettings|ImGuiWindowFlags_AlwaysAutoResize;
|
BeginTooltipEx(false);
|
||||||
ImGui::Begin("##Tooltip", NULL, flags);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGui::EndTooltip()
|
void ImGui::EndTooltip()
|
||||||
|
4
imgui.h
4
imgui.h
@ -361,9 +361,9 @@ namespace ImGui
|
|||||||
IMGUI_API void ValueColor(const char* prefix, ImU32 v);
|
IMGUI_API void ValueColor(const char* prefix, ImU32 v);
|
||||||
|
|
||||||
// Tooltips
|
// Tooltips
|
||||||
IMGUI_API void SetTooltip(const char* fmt, ...) IM_PRINTFARGS(1); // set tooltip under mouse-cursor, typically use with ImGui::IsHovered(). last call wins
|
IMGUI_API void SetTooltip(const char* fmt, ...) IM_PRINTFARGS(1); // set text tooltip under mouse-cursor, typically use with ImGui::IsItemHovered(). overidde any previous call to SetTooltip().
|
||||||
IMGUI_API void SetTooltipV(const char* fmt, va_list args);
|
IMGUI_API void SetTooltipV(const char* fmt, va_list args);
|
||||||
IMGUI_API void BeginTooltip(); // use to create full-featured tooltip windows that aren't just text
|
IMGUI_API void BeginTooltip(); // begin/append a tooltip window. to create full-featured tooltip (with any kind of contents).
|
||||||
IMGUI_API void EndTooltip();
|
IMGUI_API void EndTooltip();
|
||||||
|
|
||||||
// Menus
|
// Menus
|
||||||
|
@ -437,7 +437,7 @@ struct ImGuiContext
|
|||||||
float DragSpeedScaleSlow;
|
float DragSpeedScaleSlow;
|
||||||
float DragSpeedScaleFast;
|
float DragSpeedScaleFast;
|
||||||
ImVec2 ScrollbarClickDeltaToGrabCenter; // Distance between mouse and center of grab box, normalized in parent space. Use storage?
|
ImVec2 ScrollbarClickDeltaToGrabCenter; // Distance between mouse and center of grab box, normalized in parent space. Use storage?
|
||||||
char Tooltip[1024];
|
int TooltipOverrideCount;
|
||||||
char* PrivateClipboard; // If no custom clipboard handler is defined
|
char* PrivateClipboard; // If no custom clipboard handler is defined
|
||||||
ImVec2 OsImePosRequest, OsImePosSet; // Cursor position request & last passed to the OS Input Method Editor
|
ImVec2 OsImePosRequest, OsImePosSet; // Cursor position request & last passed to the OS Input Method Editor
|
||||||
|
|
||||||
@ -506,7 +506,7 @@ struct ImGuiContext
|
|||||||
DragSpeedScaleSlow = 0.01f;
|
DragSpeedScaleSlow = 0.01f;
|
||||||
DragSpeedScaleFast = 10.0f;
|
DragSpeedScaleFast = 10.0f;
|
||||||
ScrollbarClickDeltaToGrabCenter = ImVec2(0.0f, 0.0f);
|
ScrollbarClickDeltaToGrabCenter = ImVec2(0.0f, 0.0f);
|
||||||
memset(Tooltip, 0, sizeof(Tooltip));
|
TooltipOverrideCount = 0;
|
||||||
PrivateClipboard = NULL;
|
PrivateClipboard = NULL;
|
||||||
OsImePosRequest = OsImePosSet = ImVec2(-1.0f, -1.0f);
|
OsImePosRequest = OsImePosSet = ImVec2(-1.0f, -1.0f);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user