Edit
Funciones
Edit* | edit_create (void) |
Edit* | edit_multiline (void) |
void | edit_OnFilter (...) |
void | edit_OnChange (...) |
void | edit_OnFocus (...) |
void | edit_text (...) |
void | edit_font (...) |
void | edit_align (...) |
void | edit_passmode (...) |
void | edit_editable (...) |
void | edit_autoselect (...) |
void | edit_select (...) |
void | edit_tooltip (...) |
void | edit_color (...) |
void | edit_color_focus (...) |
void | edit_bgcolor (...) |
void | edit_bgcolor_focus (...) |
void | edit_phtext (...) |
void | edit_phcolor (...) |
void | edit_phstyle (...) |
void | edit_vpadding (...) |
const char_t* | edit_get_text (...) |
real32_t | edit_get_height (...) |
void | edit_copy (...) |
void | edit_cut (...) |
void | edit_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.
1. Validar textos
- Utiliza edit_OnChange para validar el texto.
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)); |
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).
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.
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.
- Si
start == -1
yend == 0
, se deselecciona todo el texto, dejando el caret en su posición actual. - Si
start == -1
yend == -1
, se deselecciona todo el texto, moviendo el caret al final del texto. - Si
start == 0
yend == -1
se selecciona todo el texto, moviendo el caret al final del texto. - Si
start > 0
yend == -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.
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 |
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 |
|
edit_autoselect ()
Activa o desactiva la autoselección del texto.
void edit_autoselect(Edit *edit, const bool_t autoselect);
edit | El edit. |
autoselect |
|
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 |
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 |
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 |
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.