SDK Multiplataforma en C logo

SDK Multiplataforma en C

Edit

❮ Anterior
Siguiente ❯

Funciones

Edit*edit_create (void)
Edit*edit_multiline (void)
voidedit_OnFilter (...)
voidedit_OnChange (...)
voidedit_OnFocus (...)
voidedit_text (...)
voidedit_font (...)
voidedit_align (...)
voidedit_passmode (...)
voidedit_editable (...)
voidedit_autoselect (...)
voidedit_select (...)
voidedit_tooltip (...)
voidedit_color (...)
voidedit_color_focus (...)
voidedit_bgcolor (...)
voidedit_bgcolor_focus (...)
voidedit_phtext (...)
voidedit_phcolor (...)
voidedit_phstyle (...)
voidedit_vpadding (...)
const char_t*edit_get_text (...)
real32_tedit_get_height (...)
voidedit_copy (...)
voidedit_cut (...)
voidedit_paste (...)

Los EditBox son pequeñas cajas de texto con capacidades de edición. Al igual que los Label son de formato uniforme: La tipografía y colores afectarán a la totalidad del texto (Figura 1). Suelen utilizarse para editar campos en formularios, normalmente restringidos a una sola línea, aunque también pueden extenderse a varias de ellas. Para editar textos con múltiples atributos utilizar TextView. En ¡Hola Edit y UpDown! tienes un ejemplo de uso.

  • Utiliza edit_create para crear una caja de edición.
  • Utiliza edit_multiline para crear una caja de edición multilínea.
  • Utiliza edit_passmode para ocultar el texto del control.
  • Utiliza edit_phtext para establecer un placeholder.
  • Ventana donde aparecen varias cajas de edición, a modo de formulario.
    Figura 1: Cajas de edición en diferentes plataformas.

1. Validar textos

En función del valor que estemos editando, es posible que sea necesario validar el texto introducido. Justamente antes de perder el foco del teclado, el control recibirá un evento OnChange, para el que podemos proveer un manejador especializado (Listado 1) (Figura 2). Si el texto no fuese válido, dicho manejador deberá devolver FALSE, impidiendo así que el foco cambie al siguiente control, permaneciendo en el editbox y obligando al usuario a corregirlo.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
static void i_OnChange(App *app, Event *e)
{
    const EvText *p = event_params(e, EvText);
    if (is_valid_text(app, p->text) == FALSE)
    {
        // Force the focus remain in editbox
        bool_t *r = event_result(e, bool_t);
        *r = FALSE;
    }
}
...
edit_OnChange(edit, listener(app, i_OnChange, App));
Muestra el cambio del foco del teclado entre dos cajas de edición.
Figura 2: El evento OnChange se llama justamente antes de que el control pierda el foco.

Por ejemplo, en ¡Hola Edit y UpDown! activando el check Field validations se mostrará una ventana modal dentro del evento OnChange permitiendo validar o rechazar el texto (Figura 3).

Muestra un formulario donde se pregunta al usuario si los datos son válidos.
Figura 3: Validación de campos de texto mediante ventanas modales.
No será posible mover el foco del teclado a otro control mientras el texto no sea válido.

2. Filtrar textos

  • Utiliza edit_OnFilter para detectar y corregir cada pulsación del usuario.

En caso que queramos implementar filtros más elaborados, que corrijan el texto mientras se escribe, utilizaremos el evento edit_OnFilter (Figura 4). Un ejemplo lo tenemos en ¡Hola TextSel y Clipboard!. Recibiremos, a través de la estructura EvText, una copia del texto actual (EvText::text), la posición del cursor (EvText::cpos) y el número de caracteres añadidos o eliminados (EvText::len). A partir de aquí, si el texto debe modificarse, debemos obtener la estructura resultado EvTextFilter, poniendo a TRUE su campo apply. En EvTextFilter::text deberemos copiar el nuevo texto y, en EvTextFilter::cpos, la nueva posición del cursor. Por ejemplo, en (Listado 2) se transforman a mayúsculas los caracteres insertados únicamente, dejando el resto del texto intacto.

Muestra el evento tras pulsar una tecla en una caja de edición.
Figura 4: El evento OnFilter se llama tras cada pulsación o pegado.
Listado 2: Filtro que transforma los caracteres insertados en mayúsculas.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
static void i_OnFilter(SelData *data, Event *e)
{
    const EvText *p = event_params(e, EvText);
    cassert_no_null(data);

    /*
     * Convert the inserted text in caps.
     * p->text the control current text (const).
     * r->text the new filterd text.
     * p->cpos current caret position.
     * r->apply = TRUE means the editbox text has to be updated.
     * p->len number of chars inserted at left of caret (to caps).
     * We are working with UTF8-Strings. Sequential access.
     */
    if (button_get_state(data->caps) == ekGUI_ON && p->len > 0)
    {
        EvTextFilter *r = event_result(e, EvTextFilter);
        const char_t *src = p->text;
        char_t *dest = r->text;
        uint32_t cp = unicode_to_u32(src, ekUTF8);
        uint32_t pos = 0;
        while (cp != 0)
        {
            uint32_t offset = 0;
            if (pos >= p->cpos - p->len && pos < p->cpos)
            {
                if (cp >= 'a' && cp <= 'z')
                    cp -= 32;
            }
            offset = unicode_to_char(cp, dest, ekUTF8);
            dest += offset;
            src = unicode_next(src, ekUTF8);
            cp = unicode_to_u32(src, ekUTF8);
            pos += 1;
        }

        *dest = 0;
        r->cpos = p->cpos;
        r->apply = TRUE;
    }

    textview_printf(data->info_text, "Edit: Pos %d Len %d\n", p->cpos, p->len);
    textview_scroll_caret(data->info_text);
}
...
edit_OnFilter(edit, listener(data, i_OnFilter, SelData));

3. Selección del texto

  • Utiliza edit_select para seleccionar texto.
  • Utiliza edit_autoselect para seleccionar automáticamente todo el texto cada vez que el control recibe el foco del teclado.

Es posible mediante código cambiar la selección del texto (Figura 5) y la posición del cursor (caret), utilizando esta lógica.

Cuadro de edición con texto seleccionado.
Figura 5: Selección de texto (2, 20).
  • Si start == -1 y end == 0, se deselecciona todo el texto, dejando el caret en su posición actual.
  • Si start == -1 y end == -1, se deselecciona todo el texto, moviendo el caret al final del texto.
  • Si start == 0 y end == -1 se selecciona todo el texto, moviendo el caret al final del texto.
  • Si start > 0 y end == -1 se selecciona hasta el final, moviendo el caret al final del texto.
  • Si start == end se mueve el caret a la posición, deseleccionando todo el texto.

4. Operaciones con el portapapeles

Al ser componentes nativos, los controles Edit soportan las operaciones típicas del portapapeles: Copiar, Pegar, Cortar, etc, así como sus atajos de teclado. No obstante, puede ser util acceder a estas operaciones desde el código del programa permitiendo, por ejemplo, que se copie al portapapeles el texto seleccionado en el control.

  • Utiliza edit_copy para copiar al portapapeles el texto seleccionado.
  • Utiliza edit_cut para cortar el texto seleccionado, copiándolo al portapapeles.
  • Utiliza edit_paste para pegar el texto del portapapeles en la posición del caret.
❮ Anterior
Siguiente ❯

edit_create ()

Crea un control de edición de texto.

Edit*
edit_create(void);

Retorna

El edit.


edit_multiline ()

Crea un control de edición de texto que permite múltiples líneas.

Edit*
edit_multiline(void);

Retorna

El edit.


edit_OnFilter ()

Establece un manejador para filtrar el texto mientras se edita.

void
edit_OnFilter(Edit *edit,
              Listener *listener);
edit

El edit.

listener

Función callback que se llamará tras cada pulsación de tecla. En EvTextFilter de event_result se devolverá el texto filtrado.

Observaciones

Ver Filtrar textos y Eventos GUI.


edit_OnChange ()

Establece un manejador para detectar cuando el texto ha cambiado.

void
edit_OnChange(Edit *edit,
              Listener *listener);
edit

El edit.

listener

Función callback que se llamará cuando el control pierda el foco del teclado, lo que indicará el final de la edición.

Observaciones

Ver Validar textos y Eventos GUI.


edit_OnFocus ()

Establece un manejador para el foco del teclado.

void
edit_OnFocus(Edit *edit,
             Listener *listener);
edit

El edit.

listener

Función callback que se llamará cuando se reciba o se pierda el foco del teclado.

Observaciones

Ver Eventos GUI.


edit_text ()

Establece el texto del control de edición.

void
edit_text(Edit *edit,
          const char_t *text);
edit

El edit.

text

Cadena C UTF8 terminada en carácter nulo '\0'.


edit_font ()

Establece la fuente del control edit.

void
edit_font(Edit *edit,
          const Font *font);
edit

El edit.

font

Fuente tipográfica.


edit_align ()

Establece la alineación del texto.

void
edit_align(Edit *edit,
           const align_t align);
edit

El edit.

align

La alineación.


edit_passmode ()

Activa el modo contraseña, que ocultará los caracteres tecleados.

void
edit_passmode(Edit *edit,
              const bool_t passmode);
edit

El edit.

passmode

Activa o desactiva el modo contraseña.


edit_editable ()

Activa o desactiva la edición en el control.

void
edit_editable(Edit *edit,
              const bool_t is_editable);
edit

El edit.

is_editable

TRUE permitirá editar el texto (por defecto).


edit_autoselect ()

Activa o desactiva la autoselección del texto.

void
edit_autoselect(Edit *edit,
                const bool_t autoselect);
edit

El edit.

autoselect

TRUE el texto del control será totalmente seleccionado cuando reciba el foco. Por defecto es FALSE.

Observaciones

Ver Selección del texto.


edit_select ()

Selecciona texto.

void
edit_select(Edit *edit,
            const int32_t start,
            const int32_t end);
edit

El edit.

start

Posición del carácter inicial.

end

Posición del carácter final.

Observaciones

Ver Selección del texto.


edit_tooltip ()

Asigna un tooltip al control edit.

void
edit_tooltip(Edit *edit,
             const char_t *text);
edit

El edit.

text

Cadena C UTF8 terminada en carácter nulo '\0'.


edit_color ()

Establece el color del texto.

void
edit_color(Edit *edit,
           const color_t color);
edit

El edit.

color

El color del texto.

Observaciones

Los valores RGB puede que no sean del todo portables. Ver Colores.


edit_color_focus ()

Establece el color del texto, cuando el control tiene el foco del teclado.

void
edit_color_focus(Edit *edit,
                 const color_t color);
edit

El edit.

color

El color del texto.

Observaciones

Los valores RGB puede que no sean del todo portables. Ver Colores.


edit_bgcolor ()

Establece el color de fondo.

void
edit_bgcolor(Edit *edit,
             const color_t color);
edit

El edit.

color

El color de fondo.

Observaciones

Los valores RGB puede que no sean del todo portables. Ver Colores.


edit_bgcolor_focus ()

Establece el color de fondo, cuando el control tiene el foco del teclado.

void
edit_bgcolor_focus(Edit *edit,
                   const color_t color);
edit

El edit.

color

El color de fondo.

Observaciones

Los valores RGB puede que no sean del todo portables. Ver Colores.


edit_phtext ()

Establece un texto explicativo para cuando el control está en blanco (placeholder).

void
edit_phtext(Edit *edit,
            const char_t *text);
edit

El edit.

text

Cadena C UTF8 terminada en carácter nulo '\0'.


edit_phcolor ()

Establece el color del texto placeholder.

void
edit_phcolor(Edit *edit,
             const color_t color);
edit

El edit.

color

El color del texto.

Observaciones

Los valores RGB puede que no sean del todo portables. Ver Colores.


edit_phstyle ()

Establece el estilo de la fuente para el placeholder.

void
edit_phstyle(Edit *edit,
             const uint32_t fstyle);
edit

El edit.

fstyle

Combinación de valores de fstyle_t.


edit_vpadding ()

Establece el margen vertical interior.

void
edit_vpadding(Edit *edit,
              const real32_t padding);
edit

El edit.

padding

Si 0 no habrá margen entre el texto y el borde del control. Si <0 se establecerá el margen por defecto.


edit_get_text ()

Obtiene el texto del control.

const char_t*
edit_get_text(const Edit *edit);
edit

El edit.

Retorna

Cadena C UTF8 terminada en carácter nulo '\0'.


edit_get_height ()

Obtiene la altura actual del control.

real32_t
edit_get_height(const Edit *edit);
edit

El edit.

Retorna

La altura del control, que cambiará en función del tamaño de letra y el vpadding.


edit_copy ()

Copia al portapapeles el texto seleccionado.

void
edit_copy(const Edit *edit);
edit

El edit.

Observaciones

Ver Operaciones con el portapapeles.


edit_cut ()

Corta el texto seleccionado, copiándolo al portapapeles.

void
edit_cut(Edit *edit);
edit

El edit.

Observaciones

Ver Operaciones con el portapapeles.


edit_paste ()

Pega el texto del portapapeles en la posición del caret.

void
edit_paste(Edit *edit);
edit

El edit.

Observaciones

Ver Operaciones con el portapapeles.

❮ Anterior
Siguiente ❯