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_AllowOverlap are also frequently used flags. FIXME: Selectable() with (size.x == 0.0f) and (SelectableTextAlign.x > 0.0
| 7235 | // With this scheme, ImGuiSelectableFlags_SpanAllColumns and ImGuiSelectableFlags_AllowOverlap are also frequently used flags. |
| 7236 | // FIXME: Selectable() with (size.x == 0.0f) and (SelectableTextAlign.x > 0.0f) followed by SameLine() is currently not supported. |
| 7237 | bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags flags, const ImVec2& size_arg) |
| 7238 | { |
| 7239 | ImGuiWindow* window = GetCurrentWindow(); |
| 7240 | if (window->SkipItems) |
| 7241 | return false; |
| 7242 | |
| 7243 | ImGuiContext& g = *GImGui; |
| 7244 | const ImGuiStyle& style = g.Style; |
| 7245 | |
| 7246 | // Submit label or explicit size to ItemSize(), whereas ItemAdd() will submit a larger/spanning rectangle. |
| 7247 | ImGuiID id = window->GetID(label); |
| 7248 | ImVec2 label_size = CalcTextSize(label, NULL, true); |
| 7249 | ImVec2 size(size_arg.x != 0.0f ? size_arg.x : label_size.x, size_arg.y != 0.0f ? size_arg.y : label_size.y); |
| 7250 | ImVec2 pos = window->DC.CursorPos; |
| 7251 | pos.y += window->DC.CurrLineTextBaseOffset; |
| 7252 | ItemSize(size, 0.0f); |
| 7253 | |
| 7254 | // Fill horizontal space |
| 7255 | // We don't support (size < 0.0f) in Selectable() because the ItemSpacing extension would make explicitly right-aligned sizes not visibly match other widgets. |
| 7256 | const bool span_all_columns = (flags & ImGuiSelectableFlags_SpanAllColumns) != 0; |
| 7257 | const float min_x = span_all_columns ? window->ParentWorkRect.Min.x : pos.x; |
| 7258 | const float max_x = span_all_columns ? window->ParentWorkRect.Max.x : window->WorkRect.Max.x; |
| 7259 | if (size_arg.x == 0.0f || (flags & ImGuiSelectableFlags_SpanAvailWidth)) |
| 7260 | size.x = ImMax(label_size.x, max_x - min_x); |
| 7261 | |
| 7262 | // Selectables are meant to be tightly packed together with no click-gap, so we extend their box to cover spacing between selectable. |
| 7263 | // FIXME: Not part of layout so not included in clipper calculation, but ItemSize currently doesn't allow offsetting CursorPos. |
| 7264 | ImRect bb(min_x, pos.y, min_x + size.x, pos.y + size.y); |
| 7265 | if ((flags & ImGuiSelectableFlags_NoPadWithHalfSpacing) == 0) |
| 7266 | { |
| 7267 | const float spacing_x = span_all_columns ? 0.0f : style.ItemSpacing.x; |
| 7268 | const float spacing_y = style.ItemSpacing.y; |
| 7269 | const float spacing_L = IM_TRUNC(spacing_x * 0.50f); |
| 7270 | const float spacing_U = IM_TRUNC(spacing_y * 0.50f); |
| 7271 | bb.Min.x -= spacing_L; |
| 7272 | bb.Min.y -= spacing_U; |
| 7273 | bb.Max.x += (spacing_x - spacing_L); |
| 7274 | bb.Max.y += (spacing_y - spacing_U); |
| 7275 | } |
| 7276 | //if (g.IO.KeyCtrl) { GetForegroundDrawList()->AddRect(bb.Min, bb.Max, IM_COL32(0, 255, 0, 255)); } |
| 7277 | |
| 7278 | const bool disabled_item = (flags & ImGuiSelectableFlags_Disabled) != 0; |
| 7279 | const ImGuiItemFlags extra_item_flags = disabled_item ? (ImGuiItemFlags)ImGuiItemFlags_Disabled : ImGuiItemFlags_None; |
| 7280 | bool is_visible; |
| 7281 | if (span_all_columns) |
| 7282 | { |
| 7283 | // Modify ClipRect for the ItemAdd(), faster than doing a PushColumnsBackground/PushTableBackgroundChannel for every Selectable.. |
| 7284 | const float backup_clip_rect_min_x = window->ClipRect.Min.x; |
| 7285 | const float backup_clip_rect_max_x = window->ClipRect.Max.x; |
| 7286 | window->ClipRect.Min.x = window->ParentWorkRect.Min.x; |
| 7287 | window->ClipRect.Max.x = window->ParentWorkRect.Max.x; |
| 7288 | is_visible = ItemAdd(bb, id, NULL, extra_item_flags); |
| 7289 | window->ClipRect.Min.x = backup_clip_rect_min_x; |
| 7290 | window->ClipRect.Max.x = backup_clip_rect_max_x; |
| 7291 | } |
| 7292 | else |
| 7293 | { |
| 7294 | is_visible = ItemAdd(bb, id, NULL, extra_item_flags); |
nothing calls this directly
no test coverage detected