---
id: selectable_text_cpp_core
name: selectable_text
kind: function
lang: cpp
domain: core
version: 1.0.0
purity: pure
signature: "void fn_ui::selectable_text_wrapped(const char* text)"
description: "Texto seleccionable y copiable (drag-to-select + Ctrl+C) para ventanas ImGui. Drop-in de ImGui::Text/TextWrapped cuando se quiere permitir copia. Tambien expone variantes ligeras con right-click → Copy."
tags: [imgui, text, selectable, clipboard, copy, accessibility]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports:
  - "imgui.h"
params:
  - name: text
    desc: "Texto a renderizar (UTF-8). Caller-owned, no copiado. El cast interno a char* es seguro porque ReadOnly impide escritura."
output: "Renderiza el texto en la ventana ImGui actual con drag-to-select y Ctrl+C habilitados. No retorna valor."
example: |
  // En lugar de ImGui::TextWrapped("%s", chat_msg.c_str()):
  fn_ui::selectable_text_wrapped(chat_msg.c_str());

  // Single line (drop-in de ImGui::Text):
  fn_ui::selectable_text(entity_id.c_str());

  // Variante ligera (sin char-selection, copia el texto entero con
  // boton derecho):
  fn_ui::text_wrapped_with_copy(stats_line.c_str());
tested: false
tests: []
test_file_path: ""
file_path: "cpp/functions/core/selectable_text.cpp"
framework: "imgui"
notes: |
  ImGui::Text/TextWrapped son draw-list puro: no aceptan eventos de mouse, asi
  que NO pueden seleccionarse. La unica via reliable hoy en ImGui (1.91.x) para
  permitir char-level selection es usar InputTextMultiline con flag ReadOnly.

  Esta funcion stylea el frame a transparente (sin borde, sin fondo, sin
  padding, sin spacing) — visualmente identico a TextWrapped pero arrastrable.
  Calcula la altura exacta con ImGui::CalcTextSize(text, NULL, false, wrap_w)
  asi NO aparece scrollbar.

  El cast `const_cast<char*>(text)` es seguro porque ImGui no escribe cuando
  ReadOnly esta activo. La sobrecarga es minima (un InputText no es tan caro
  como parece — ImGui ya cachea el layout entre frames).

  Para textos muy largos (>10k chars) considera usar un InputTextMultiline
  explicito con scrollbar visible — la altura calculada para "todo el bloque"
  rompe el flujo de la ventana.

  Cuando el usuario solo quiere copiar el texto entero (sin seleccionar parte),
  text_with_copy() / text_wrapped_with_copy() son mas ligeros: dibujan con
  Text() normal y abren un popup "Copy" con boton derecho.
documentation: |
  ## Diferencia con ImGui::Text

  | Aspecto | ImGui::Text | fn_ui::selectable_text |
  |---|---|---|
  | Drag selection | No | Si |
  | Ctrl+C | No | Si |
  | Right-click | No | Menu de InputText |
  | Coste | 1 DrawList ops | 1 InputText (cacheado) |
  | Apariencia | Identica | Identica si frame transparente |

  ## Cuando usar cada variante

  - **selectable_text_wrapped** — chat outputs, logs, descriptions, JSON dumps,
    cualquier sitio donde el usuario podria querer copiar parte del texto.
  - **selectable_text** — IDs cortos, paths, nombres tecnicos.
  - **text_wrapped_with_copy** — stats lines, tooltips persistentes, status
    messages. El usuario puede copiar todo de una vez sin seleccionar.

  ## Compatibilidad

  Tambien funciona dentro de tablas ImGui (TableNextColumn → selectable_text).
  No se rompe con docking/multi-viewport.
---
