mirror of
https://github.com/ocornut/imgui.git
synced 2026-03-21 16:09:43 +00:00
Added TextLink(), TextLinkOpenURL() hyperlink widgets. (#7660)
This commit is contained in:
@@ -422,6 +422,7 @@ void ImGui::BulletTextV(const char* fmt, va_list args)
|
||||
// - RadioButton()
|
||||
// - ProgressBar()
|
||||
// - Bullet()
|
||||
// - Hyperlink()
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
// The ButtonBehavior() function is key to many interactions and used by many/most widgets.
|
||||
@@ -1370,6 +1371,76 @@ void ImGui::Bullet()
|
||||
SameLine(0, style.FramePadding.x * 2.0f);
|
||||
}
|
||||
|
||||
// This is provided as a convenience for being an often requested feature.
|
||||
// FIXME-STYLE: we delayed adding as there is a larger plan to revamp the styling system.
|
||||
// Because of this we currently don't provide many styling options for this widget
|
||||
// (e.g. hovered/active colors are automatically inferred from a single color).
|
||||
bool ImGui::TextLink(const char* label)
|
||||
{
|
||||
ImGuiWindow* window = GetCurrentWindow();
|
||||
if (window->SkipItems)
|
||||
return false;
|
||||
|
||||
ImGuiContext& g = *GImGui;
|
||||
const ImGuiID id = window->GetID(label);
|
||||
const char* label_end = FindRenderedTextEnd(label);
|
||||
|
||||
ImVec2 pos = window->DC.CursorPos;
|
||||
ImVec2 size = CalcTextSize(label, label_end, true);
|
||||
ImRect bb(pos, pos + size);
|
||||
ItemSize(size, 0.0f);
|
||||
if (!ItemAdd(bb, id))
|
||||
return false;
|
||||
|
||||
bool hovered, held;
|
||||
bool pressed = ButtonBehavior(bb, id, &hovered, &held);
|
||||
RenderNavHighlight(bb, id, ImGuiNavHighlightFlags_None);
|
||||
|
||||
ImVec4 text_colf = g.Style.Colors[ImGuiCol_TextLink];
|
||||
ImVec4 line_colf = text_colf;
|
||||
{
|
||||
// FIXME-STYLE: Read comments above. This widget is NOT written in the same style as some earlier widgets,
|
||||
// as we are currently experimenting/planning a different styling system.
|
||||
float h, s, v;
|
||||
ColorConvertRGBtoHSV(text_colf.x, text_colf.y, text_colf.z, h, s, v);
|
||||
if (held || hovered)
|
||||
{
|
||||
v = ImSaturate(v + (held ? 0.4f : 0.3f));
|
||||
h = ImFmod(h + 0.02f, 1.0f);
|
||||
}
|
||||
ColorConvertHSVtoRGB(h, s, v, text_colf.x, text_colf.y, text_colf.z);
|
||||
v = ImSaturate(v - 0.20f);
|
||||
ColorConvertHSVtoRGB(h, s, v, line_colf.x, line_colf.y, line_colf.z);
|
||||
}
|
||||
|
||||
float line_y = bb.Max.y + ImFloor(g.Font->Descent * g.FontScale * 0.20f);
|
||||
window->DrawList->AddLine(ImVec2(bb.Min.x, line_y), ImVec2(bb.Max.x, line_y), GetColorU32(line_colf)); // FIXME-TEXT: Underline mode.
|
||||
|
||||
PushStyleColor(ImGuiCol_Text, GetColorU32(text_colf));
|
||||
RenderText(bb.Min, label, label_end);
|
||||
PopStyleColor();
|
||||
|
||||
IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags);
|
||||
return pressed;
|
||||
}
|
||||
|
||||
void ImGui::TextLinkOpenURL(const char* label, const char* url)
|
||||
{
|
||||
ImGuiContext& g = *GImGui;
|
||||
if (url == NULL)
|
||||
url = label;
|
||||
if (TextLink(label))
|
||||
if (g.IO.PlatformOpenInShellFn != NULL)
|
||||
g.IO.PlatformOpenInShellFn(&g, url);
|
||||
SetItemTooltip("%s", url); // It is more reassuring for user to _always_ display URL when we same as label
|
||||
if (BeginPopupContextItem())
|
||||
{
|
||||
if (MenuItem(LocalizeGetMsg(ImGuiLocKey_CopyLink)))
|
||||
SetClipboardText(url);
|
||||
EndPopup();
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
// [SECTION] Widgets: Low-level Layout helpers
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user