MCPcopy Create free account
hub / github.com/RenderKit/embree / Selectable

Method Selectable

tutorials/common/imgui/imgui_widgets.cpp:6252–6396  ·  view source on GitHub ↗

Tip: pass a non-visible label (e.g. "##hello") then you can use the space to draw other text or image. But you need to make sure the ID is unique, e.g. enclose calls in PushID/PopID or use ##unique_id. With this scheme, ImGuiSelectableFlags_SpanAllColumns and ImGuiSelectableFlags_AllowItemOverlap are also frequently used flags. FIXME: Selectable() with (size.x == 0.0f) and (SelectableTextAlign.x >

Source from the content-addressed store, hash-verified

6250// With this scheme, ImGuiSelectableFlags_SpanAllColumns and ImGuiSelectableFlags_AllowItemOverlap are also frequently used flags.
6251// FIXME: Selectable() with (size.x == 0.0f) and (SelectableTextAlign.x > 0.0f) followed by SameLine() is currently not supported.
6252bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags flags, const ImVec2& size_arg)
6253{
6254 ImGuiWindow* window = GetCurrentWindow();
6255 if (window->SkipItems)
6256 return false;
6257
6258 ImGuiContext& g = *GImGui;
6259 const ImGuiStyle& style = g.Style;
6260
6261 // Submit label or explicit size to ItemSize(), whereas ItemAdd() will submit a larger/spanning rectangle.
6262 ImGuiID id = window->GetID(label);
6263 ImVec2 label_size = CalcTextSize(label, NULL, true);
6264 ImVec2 size(size_arg.x != 0.0f ? size_arg.x : label_size.x, size_arg.y != 0.0f ? size_arg.y : label_size.y);
6265 ImVec2 pos = window->DC.CursorPos;
6266 pos.y += window->DC.CurrLineTextBaseOffset;
6267 ItemSize(size, 0.0f);
6268
6269 // Fill horizontal space
6270 // We don't support (size < 0.0f) in Selectable() because the ItemSpacing extension would make explicitly right-aligned sizes not visibly match other widgets.
6271 const bool span_all_columns = (flags & ImGuiSelectableFlags_SpanAllColumns) != 0;
6272 const float min_x = span_all_columns ? window->ParentWorkRect.Min.x : pos.x;
6273 const float max_x = span_all_columns ? window->ParentWorkRect.Max.x : window->WorkRect.Max.x;
6274 if (size_arg.x == 0.0f || (flags & ImGuiSelectableFlags_SpanAvailWidth))
6275 size.x = ImMax(label_size.x, max_x - min_x);
6276
6277 // Text stays at the submission position, but bounding box may be extended on both sides
6278 const ImVec2 text_min = pos;
6279 const ImVec2 text_max(min_x + size.x, pos.y + size.y);
6280
6281 // Selectables are meant to be tightly packed together with no click-gap, so we extend their box to cover spacing between selectable.
6282 ImRect bb(min_x, pos.y, text_max.x, text_max.y);
6283 if ((flags & ImGuiSelectableFlags_NoPadWithHalfSpacing) == 0)
6284 {
6285 const float spacing_x = span_all_columns ? 0.0f : style.ItemSpacing.x;
6286 const float spacing_y = style.ItemSpacing.y;
6287 const float spacing_L = IM_FLOOR(spacing_x * 0.50f);
6288 const float spacing_U = IM_FLOOR(spacing_y * 0.50f);
6289 bb.Min.x -= spacing_L;
6290 bb.Min.y -= spacing_U;
6291 bb.Max.x += (spacing_x - spacing_L);
6292 bb.Max.y += (spacing_y - spacing_U);
6293 }
6294 //if (g.IO.KeyCtrl) { GetForegroundDrawList()->AddRect(bb.Min, bb.Max, IM_COL32(0, 255, 0, 255)); }
6295
6296 // Modify ClipRect for the ItemAdd(), faster than doing a PushColumnsBackground/PushTableBackground for every Selectable..
6297 const float backup_clip_rect_min_x = window->ClipRect.Min.x;
6298 const float backup_clip_rect_max_x = window->ClipRect.Max.x;
6299 if (span_all_columns)
6300 {
6301 window->ClipRect.Min.x = window->ParentWorkRect.Min.x;
6302 window->ClipRect.Max.x = window->ParentWorkRect.Max.x;
6303 }
6304
6305 const bool disabled_item = (flags & ImGuiSelectableFlags_Disabled) != 0;
6306 const bool item_add = ItemAdd(bb, id, NULL, disabled_item ? ImGuiItemFlags_Disabled : ImGuiItemFlags_None);
6307 if (span_all_columns)
6308 {
6309 window->ClipRect.Min.x = backup_clip_rect_min_x;

Callers

nothing calls this directly

Calls 5

GetCurrentWindowFunction · 0.85
ItemSizeFunction · 0.85
ImMaxFunction · 0.85
WindowRectAbsToRelFunction · 0.85
GetIDMethod · 0.80

Tested by

no test coverage detected