---
name: text_editor
kind: component
lang: cpp
domain: core
version: "1.0.0"
purity: pure
signature: "fn::TextEditorState* fn::text_editor_create(fn::CodeLang); void fn::text_editor_destroy(fn::TextEditorState*); void fn::text_editor_set_text(fn::TextEditorState*, const char*); const char* fn::text_editor_get_text(fn::TextEditorState*); bool fn::text_editor_render(fn::TextEditorState*, const char* label, ImVec2 size); bool fn::text_editor_is_dirty(const fn::TextEditorState*); void fn::text_editor_clear_dirty(fn::TextEditorState*)"
description: "Editor de codigo embebido en ImGui con syntax highlighting (GLSL, SQL, C++, Generic). Wrapper PIMPL sobre ImGuiColorTextEdit (vendor MIT) — la API solo expone tipos opacos en namespace fn::."
tags: [imgui, editor, text, code, glsl, sql, syntax-highlighting, tokens]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: [imgui, TextEditor]
tested: false
tests: []
test_file_path: ""
file_path: "cpp/functions/core/text_editor.cpp"
framework: imgui
source_repo: "https://github.com/BalazsJako/ImGuiColorTextEdit"
source_license: "MIT"
source_file: "TextEditor.h, TextEditor.cpp"
params: []
output: "TextEditorState opaco — encapsula el editor del vendor + buffer de texto cacheado + flag dirty. Render devuelve true cuando el contenido cambio en el frame actual."
notes: "consumido por cpp/apps/text_editor_smoke/main.cpp; scaffolding/demo en primitives_gallery"
---

# text_editor

Editor de codigo in-app con syntax highlighting. Resuelve el ciclo de edicion sin alt-tab a un editor externo (ej: editar GLSL en `shaders_lab` y recompilar al guardar; futuro `sql_workbench` con CTAS sobre `registry.db`).

## API

```cpp
namespace fn {
    enum class CodeLang { Generic, GLSL, SQL, Cpp };
    struct TextEditorState;  // PIMPL — tipo opaco

    TextEditorState* text_editor_create(CodeLang lang = CodeLang::Generic);
    void             text_editor_destroy(TextEditorState*);

    void             text_editor_set_text(TextEditorState*, const char* text);
    const char*      text_editor_get_text(TextEditorState*);  // valido hasta el siguiente call
    bool             text_editor_render(TextEditorState*, const char* label, ImVec2 size);  // true si cambio
    bool             text_editor_is_dirty(const TextEditorState*);
    void             text_editor_clear_dirty(TextEditorState*);
}
```

## Ejemplo — editor GLSL con boton de guardado

```cpp
#include "core/text_editor.h"
#include "core/button.h"

static fn::TextEditorState* g_ed = nullptr;

void render() {
    if (!g_ed) {
        g_ed = fn::text_editor_create(fn::CodeLang::GLSL);
        fn::text_editor_set_text(g_ed,
            "#version 330\nout vec4 c;\nvoid main() { c = vec4(1); }\n");
    }

    fn::text_editor_render(g_ed, "##editor", ImVec2(600, 400));

    if (fn::text_editor_is_dirty(g_ed)) ImGui::TextUnformatted("(modificado)");

    if (fn_ui::button("Save")) {
        FILE* f = std::fopen("/tmp/shader.glsl", "w");
        std::fputs(fn::text_editor_get_text(g_ed), f);
        std::fclose(f);
        fn::text_editor_clear_dirty(g_ed);
    }
}
```

## Decisiones de diseño

- **PIMPL** — el tipo `TextEditor` del vendor no aparece en `text_editor.h`. El header publico solo importa `imgui.h` (por `ImVec2`).
- **`get_text` cachea** el resultado en un `std::string` propio del state para que el `const char*` siga siendo valido entre llamadas (el `GetText()` del vendor devuelve un `std::string` por valor).
- **Sin tokens custom** — el editor hereda el theme global de ImGui (paleta interna del vendor). Para integrar `fn_tokens` haria falta crear un `Palette` propio; lo dejamos para una v2 si pesa visualmente.
- **`Generic` reusa C++** como default: el vendor no tiene un "plain text" sin highlighting; C++ es el menos intrusivo.

## Lenguajes soportados

| `CodeLang` | Highlighting | Origen |
|-----------|--------------|--------|
| `GLSL`    | Si            | `LanguageDefinition::GLSL()` |
| `SQL`     | Si            | `LanguageDefinition::SQL()`  |
| `Cpp`     | Si            | `LanguageDefinition::CPlusPlus()` |
| `Generic` | C++ por defecto | `LanguageDefinition::CPlusPlus()` |

## Vendor

`cpp/vendor/imgui_text_edit/` (commit pinneado en su `README.md`). MIT.

## Combinacion sugerida

`text_editor` + `file_watcher_cpp_core` = ciclo de edicion completo. Ver `apps/primitives_gallery/demos_text_editor.cpp` para la demo combinada.
