mirror of
https://github.com/aseprite/aseprite.git
synced 2024-12-29 09:23:32 +00:00
1445 lines
45 KiB
Plaintext
1445 lines
45 KiB
Plaintext
|
|
|||
|
Jinete 0.4
|
|||
|
|
|||
|
A GUI library.
|
|||
|
|
|||
|
By David A. Capello, 2005.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#include <std_disclaimer.h>
|
|||
|
|
|||
|
"No me responsabilizo de ning<6E>n efecto, adverso u otro que este c<>digo
|
|||
|
pueda tener sobre usted, su ordenador, su salud, su perro, o cualquier
|
|||
|
otra cosa que pueda imaginar. Uselo bajo su propia responsabilidad."
|
|||
|
|
|||
|
|
|||
|
|
|||
|
======================================
|
|||
|
============ Introducci<63>n ============
|
|||
|
======================================
|
|||
|
|
|||
|
Jinete es una librer<65>a que proporciona un Interfaz Gr<47>fico de
|
|||
|
Usuario (GUI por sus siglas en ingl<67>s), sencilla y r<>pida tanto de
|
|||
|
usar, como de programar y dise<73>ar di<64>logos. Conjuntamente con la
|
|||
|
librer<65>a Allegro, se encarga de controlar los eventos que produce el
|
|||
|
usuario a trav<61>s del rat<61>n (mouse) y el teclado.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
===================================
|
|||
|
============ Copyright ============
|
|||
|
===================================
|
|||
|
|
|||
|
Jinete es gift-ware (software-regalo). Puede usar, modificar,
|
|||
|
redistribuir, y generalmente modificarlo de cualquier forma que
|
|||
|
desee, y no debe darme nada a cambio. Si redistribuye partes de este
|
|||
|
c<>digo o hace una aplicaci<63>n con <20>l, ser<65>a bonito que mencionase
|
|||
|
Jinete en alguna parte de los cr<63>ditos, pero no est<73> obligado a
|
|||
|
hacerlo.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
================================================
|
|||
|
============ Funcionamiento General ============
|
|||
|
================================================
|
|||
|
|
|||
|
El GUI se maneja a trav<61>s de widgets (controles u objetos gr<67>ficos).
|
|||
|
Cada widget puede contener varios widgets hijos, donde cada uno de
|
|||
|
<20>stos tiene un puntero a su <20>nico padre; siendo el padre ra<72>z de
|
|||
|
todos los widgets: el manager (gestor) principal del GUI (el cual
|
|||
|
tambi<62>n es un widget).
|
|||
|
|
|||
|
Jinete es controlado con el manager principal, el cual es creado por
|
|||
|
primera y <20>nica vez a trav<61>s de la primer llamada de jmanager_new,
|
|||
|
y deber<65> ser eliminado mediante jmanager_free.
|
|||
|
|
|||
|
Los managers s<>lo pueden contener ventanas dentro, mientras que las
|
|||
|
ventanas pueden contener todo tipo de widgets, inclusive otros
|
|||
|
managers alternativos (o sub-managers) los cuales a su vez pueden
|
|||
|
contener otras ventanas (con Jinete puede lograr algo as<61> como la
|
|||
|
MDI de Windows).
|
|||
|
|
|||
|
El manager principal controla los mensajes y los despacha a los
|
|||
|
dem<65>s widgets. Cabe destacar que todo mensaje enviado a trav<61>s de
|
|||
|
jmanager_send_message no es procesado de inmediato, dicho mensaje
|
|||
|
solo se guardar<61> en una cola para luego ser despachado (si espera
|
|||
|
una respuesta inmediata, vea jmanager_dispatch_messages o
|
|||
|
jwidget_send_message).
|
|||
|
|
|||
|
|
|||
|
Foco de entrada (jmanager_get_focus):
|
|||
|
Es un puntero a un widget que indica que ser<65> el encargado de
|
|||
|
recibir la entrada del teclado. Por lo menos, ser<65> el primero en
|
|||
|
tener la oportunidad de procesarla, si <20>l no la utiliza, se enviar<61>
|
|||
|
el mensaje a otros widgets. El foco de entrada se mueve con la tecla
|
|||
|
TAB.
|
|||
|
|
|||
|
Widget con el mouse (jmanager_get_mouse):
|
|||
|
Un puntero al widget que tiene el mouse encima.
|
|||
|
|
|||
|
Widget con el mouse capturado (jmanager_get_capture):
|
|||
|
Un puntero al widget que captur<75> el mouse. Generalmente cuando se le
|
|||
|
hace click encima de un widget, <20>ste captura el mouse para que siga
|
|||
|
recibiendo la entrada del mouse hasta que el usuario suelte el
|
|||
|
bot<6F>n.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
=========================================
|
|||
|
============ Rutinas B<>sicas ============
|
|||
|
=========================================
|
|||
|
|
|||
|
void *jmalloc (unsigned long n_bytes);
|
|||
|
void *jmalloc0 (unsigned long n_bytes);
|
|||
|
void *jrealloc (void *mem, unsigned long n_bytes);
|
|||
|
void jfree (void *mem);
|
|||
|
Equivalentes a malloc, calloc, realloc, y free respectivamente.
|
|||
|
|
|||
|
#define jnew(struct_type, n_structs)
|
|||
|
#define jnew0(struct_type, n_structs)
|
|||
|
#define jrenew(struct_type, mem, n_structs)
|
|||
|
Equivalente a usar:
|
|||
|
|
|||
|
struct_type *mem1 = malloc (sizeof (struct_type) * n_structs).
|
|||
|
|
|||
|
|
|||
|
|
|||
|
================================
|
|||
|
============ Widget ============
|
|||
|
================================
|
|||
|
|
|||
|
Los widgets son los componentes, objetos o controles del interfaz
|
|||
|
gr<67>fico; un bot<6F>n, o una ventana son ejemplos de widgets. En Jinete,
|
|||
|
el tipo JWidget representa dicho controles:
|
|||
|
|
|||
|
typedef struct jwidget *JWidget;
|
|||
|
|
|||
|
Es decir que JWidget en realidad se trata de un puntero a una
|
|||
|
estructura jwidget definida en el archivo "jinete/widget.h".
|
|||
|
|
|||
|
En general, la gran mayor<6F>a de los tipos en Jinete (definidos en
|
|||
|
"jinete/base.h") se tratan de punteros a estructuras definidas en
|
|||
|
cada uno de los archivos de cabecera particulares.
|
|||
|
|
|||
|
Para modificar el comportamiento de un widget, se deben agregar
|
|||
|
ganchos ("hooks", JHook en Jinete), los cuales se encargan de
|
|||
|
interceptar mensajes.
|
|||
|
|
|||
|
Los campos de la estructura jwidget son:
|
|||
|
|
|||
|
JID id;
|
|||
|
C<>digo de identificaci<63>n. Es un n<>mero con el cual puede identificar
|
|||
|
a un widget (por lo menos mientras <20>ste exista). Al liberar el widget
|
|||
|
(con jwidget_free), su ID quedar<61> disponible para un pr<70>ximo widget
|
|||
|
que se cree (mediante jwidget_new).
|
|||
|
|
|||
|
int type;
|
|||
|
Tipo de widget. Puede ser JI_WIDGET para indicar un tipo de widget
|
|||
|
an<61>nimo, o puede ser JI_BUTTON si se cre<72> desde jbutton_new, o
|
|||
|
JI_WINDOW si se utiliz<69> jwindow_new, etc.
|
|||
|
|
|||
|
Es el valor que se le pasa a la funci<63>n jwidget_new (puede tratarse
|
|||
|
de un valor devuelto por ji_register_widget_type).
|
|||
|
|
|||
|
char *name;
|
|||
|
Nombre del widget (generalmente NULL si no es que es un widget
|
|||
|
cargado desde un archivo .jid). Es <20>til para buscar el widget
|
|||
|
desde su padre utilizando la rutina jwidget_find_name.
|
|||
|
|
|||
|
JRect pos;
|
|||
|
Ubicaci<63>n del widget: esquina superior-izquierda (x, y) y tama<6D>o (w, h).
|
|||
|
Es una posici<63>n ABSOLUTA en la pantalla, NO ES UNA POSICI<43>N RELATIVA.
|
|||
|
|
|||
|
struct { int l, t, r, b; } border_width;
|
|||
|
Tama<6D>o de los bordes izquierdo, superior, derecho e inferior (left,
|
|||
|
top, right, bottom).
|
|||
|
|
|||
|
int child_spacing;
|
|||
|
Separaci<63>n entre los hijos del widget.
|
|||
|
|
|||
|
int flags;
|
|||
|
Banderas o propiedades del widget.
|
|||
|
|
|||
|
int emit_signals;
|
|||
|
Contador que indica si el widget debe o no generar se<73>ales (si
|
|||
|
emit_signals es igual a 0, las se<73>ales se emiten).
|
|||
|
|
|||
|
int static_w, static_h;
|
|||
|
Tama<6D>o est<73>tico del widget por defecto (si es que no se intercepta
|
|||
|
el mensaje JM_REQSIZE, se utilizar<61> este tama<6D>o como el tama<6D>o
|
|||
|
necesario por el widget).
|
|||
|
|
|||
|
JList children;
|
|||
|
Lista de widgets hijos. Son los controles que est<73>n contenidos en
|
|||
|
este widget. La funci<63>n jwidget_add_child sirve para agregar hijos
|
|||
|
dentro de un widget.
|
|||
|
|
|||
|
JTheme theme;
|
|||
|
Tema o estilo que utiliza el widget (inicializ<69>ndolo al tema por
|
|||
|
defecto a trav<61>s de la funci<63>n ji_get_theme).
|
|||
|
|
|||
|
JWidget parent;
|
|||
|
Puntero al widget padre.
|
|||
|
|
|||
|
JList hooks;
|
|||
|
Lista de ganchos (JHook).
|
|||
|
|
|||
|
JDrawWidget draw_method;
|
|||
|
Funci<63>n encargada de dibujar el widget, al inicializar un widget,
|
|||
|
se intenta extraer desde el tema activo (ji_get_theme) un m<>todo
|
|||
|
correspondiente para este tipo de widget (widget->draw_type).
|
|||
|
|
|||
|
Si el mensaje JM_DRAW no es interceptado, esta rutina ser<65> utilizada
|
|||
|
para dibujar el widget.
|
|||
|
|
|||
|
int align;
|
|||
|
Alineamiento u orientaci<63>n del widget (generalmente alineaci<63>n del texto).
|
|||
|
|
|||
|
int text_size;
|
|||
|
char *text;
|
|||
|
Texto del widget.
|
|||
|
|
|||
|
FONT *text_font;
|
|||
|
Tipo de fuente para dibujar texto (este campo es inicializado con
|
|||
|
el valor "ji_get_theme ()->default_font").
|
|||
|
|
|||
|
int bg_color;
|
|||
|
Color de fondo del widget (si es -1, se utiliza el del padre, y as<61>
|
|||
|
sucesivamente).
|
|||
|
|
|||
|
BITMAP *icon;
|
|||
|
<20>cono del widget (XXX).
|
|||
|
|
|||
|
int icon_align;
|
|||
|
Alineamiento del <20>cono (XXX).
|
|||
|
|
|||
|
void *theme_data[4];
|
|||
|
Datos para el tema.
|
|||
|
|
|||
|
void *user_data[4];
|
|||
|
Datos para el usuario.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
int ji_register_widget_type (void);
|
|||
|
Retorna un n<>mero entero positivo para identificar un nuevo tipo de
|
|||
|
widget. Deber<65>a utilizarlo s<>lo si necesita conocer en alguna parte
|
|||
|
de su c<>digo que un determinado widget es del tipo que deber<65>a ser.
|
|||
|
|
|||
|
Retornar<61> valores continuos a JI_USER_WIDGET.
|
|||
|
|
|||
|
JWidget jwidget_new (int type);
|
|||
|
Crea un nuevo "widget" de tipo "type" listo para ser utilizado.
|
|||
|
|
|||
|
void jwidget_free (JWidget widget);
|
|||
|
Libera el "widget", dejando su espacio disponible para pr<70>ximos
|
|||
|
controles que as<61> lo necesiten. Note que esta funci<63>n no libera
|
|||
|
memoria, solo deja su espacio disponible para que otro posible
|
|||
|
futuro widget lo utilice. S<>lo la funci<63>n _ji_free_all_widgets
|
|||
|
libera toda la memoria ocupada por todos los widgets. Dicha funci<63>n
|
|||
|
es llamada al borrar el primer "manager" creado.
|
|||
|
|
|||
|
Los widgets hijos tambi<62>n son eliminados (recursivamente). El campo
|
|||
|
"widget->specific_data" tambi<62>n es eliminado (mediante jfree).
|
|||
|
|
|||
|
Env<6E>a el mensaje JM_DESTROY al widget inmediatamente.
|
|||
|
|
|||
|
void jwidget_init_theme (JWidget widget);
|
|||
|
Inicializa el widget a su tema (estilo) correspondiente haciendo uso
|
|||
|
de la funci<63>n init_widget de la estructura jtheme.
|
|||
|
|
|||
|
void jwidget_add_hook (JWidget widget, int type,
|
|||
|
JMessageFunc msg_proc, void *data);
|
|||
|
Crea un nuevo gancho (hook) para interceptar mensajes. Cada gancho
|
|||
|
tiene un tipo ("type"), que puede ser an<61>nimo (JI_WIDGET) o puede
|
|||
|
ser de un tipo personalizado (alg<6C>n tipo devuelto mediante
|
|||
|
ji_register_widget_type). Este tipo luego es utilizado para obtener
|
|||
|
los datos "data".
|
|||
|
|
|||
|
El "msg_proc" es un puntero a una funci<63>n encargada de recibir cada
|
|||
|
mensaje y procesarlo. Esta funci<63>n debe retornar FALSE si no utiliza
|
|||
|
un determinado mensaje y/o quiere dejarle el paso a un posible
|
|||
|
"msg_proc" padre que se encuentre en el widget.
|
|||
|
|
|||
|
JHook jwidget_get_hook (JWidget widget, int type);
|
|||
|
|
|||
|
void *jwidget_get_data (JWidget widget, int type);
|
|||
|
|
|||
|
int jwidget_get_type (JWidget widget);
|
|||
|
Devuelve el tipo de widget que es "widget". Puede ser igual a
|
|||
|
JI_WIDGET si se trata de un tipo an<61>nimo de widget, o alguno de los
|
|||
|
widgets est<73>ndares (como JI_BOX, JI_BUTTON, JI_WINDOW, etc.), o
|
|||
|
finalmente deber<65>a tratarse de alg<6C>n tipo creado por el usuario
|
|||
|
mediante ji_register_widget_type ().
|
|||
|
|
|||
|
const char *jwidget_get_name (JWidget widget);
|
|||
|
Obtiene el nombre del widget. Generalmente los widgets nunca tendr<64>n
|
|||
|
nombre al menos que sean cargados desde un archivo .jid.
|
|||
|
|
|||
|
const char *jwidget_get_text (JWidget widget);
|
|||
|
Retorna un puntero al texto actual del widget, el cual puede ser
|
|||
|
tanto una etiqueta que lleve un bot<6F>n, el t<>tulo de una ventana,
|
|||
|
etc.
|
|||
|
|
|||
|
No utilice el puntero si es que lo consigui<75> antes de una llamada a
|
|||
|
jwidget_set_text. EVITE SIEMPRE hacer esto:
|
|||
|
|
|||
|
const char *text = jwidget_get_text (widget);
|
|||
|
jwidget_set_text (widget, "Hola");
|
|||
|
printf (text);
|
|||
|
|
|||
|
int jwidget_get_align (JWidget widget);
|
|||
|
Devuelve el alineamiento del widget (widget->align).
|
|||
|
|
|||
|
FONT *jwidget_get_font (JWidget widget);
|
|||
|
|
|||
|
void jwidget_set_name (JWidget widget, const char *name);
|
|||
|
Cambia el nombre del widget, generalmente <20>til si piensa luego usar
|
|||
|
jwidget_find_name desde otra funci<63>n o gancho.
|
|||
|
|
|||
|
void jwidget_set_text (JWidget widget, const char *text);
|
|||
|
Cambia el texto del widget. Est<73> funci<63>n tambi<62>n se encarga de
|
|||
|
ensuciar el widget mediante jwidget_dirty.
|
|||
|
|
|||
|
void jwidget_set_align (JWidget widget, int align);
|
|||
|
Cambia el alineamiento del widget (widget->align = align).
|
|||
|
|
|||
|
void jwidget_set_font (JWidget widget, FONT *font);
|
|||
|
|
|||
|
void jwidget_magnetic (JWidget widget, bool state);
|
|||
|
Cambia el estado de magnetismo del widget. Un widget magn<67>tica es
|
|||
|
la que obtiene el foco de entrada por defecto. Generalmente los
|
|||
|
botones de "Aceptar" o "Continuar" suelen tener esta propiedad,
|
|||
|
teniendo la posibilidad de capturar la tecla y utilizarla
|
|||
|
para suponer que se quiso presionar dicho bot<6F>n (sin necesidad de
|
|||
|
poseer el foco de entrada).
|
|||
|
|
|||
|
void jwidget_expansive (JWidget widget, bool state);
|
|||
|
Cambia el estado de expansi<73>n del widget. Un widget expansivo es
|
|||
|
el que acapara mayor espacio en el widget padre. <20>til <20>nicamente
|
|||
|
cuando el widget padre es una caja (box).
|
|||
|
|
|||
|
void jwidget_decorative (JWidget widget, bool state);
|
|||
|
Cambia el estado de decoraci<63>n del widget. Un widget decorativo es
|
|||
|
un objeto especial el cual sirve para decorar las ventanas. S<>lo
|
|||
|
los temas deber<65>an utilizar esta funci<63>n, ya que es <20>til para
|
|||
|
agregar un bot<6F>n que cierre la ventana, o para minimizarla, o
|
|||
|
para maximizarla/restaurarla, etc.
|
|||
|
|
|||
|
void jwidget_autodestroy (JWidget widget, bool state);
|
|||
|
|
|||
|
void jwidget_focusrest (JWidget widget, bool state);
|
|||
|
|
|||
|
bool jwidget_is_magnetic (JWidget widget);
|
|||
|
bool jwidget_is_expansive (JWidget widget);
|
|||
|
bool jwidget_is_decorative (JWidget widget);
|
|||
|
bool jwidget_is_autodestroy (JWidget widget);
|
|||
|
Devuelve TRUE si el widget es lo que preguntamos que sea (magn<67>tica,
|
|||
|
expansiva, decorativa, o autodestructiva).
|
|||
|
|
|||
|
bool jwidget_is_focusrest (JWidget widget);
|
|||
|
|
|||
|
void jwidget_dirty (JWidget widget);
|
|||
|
Ensucia el widget para que sea redibujado en una pr<70>xima llamada a
|
|||
|
jmanager_poll. S<>lo colocar<61> una bandera que le dir<69> al manager
|
|||
|
que genere los mensajes necesarios para dibujar las partes visibles
|
|||
|
del widget. Emite la se<73>al JM_DIRTY.
|
|||
|
|
|||
|
Si desea redibujar un widget de forma instant<6E>nea:
|
|||
|
|
|||
|
jwidget_dirty (widget);
|
|||
|
jwidget_flush_redraw (widget);
|
|||
|
jmanager_dispatch_draw_messages ();
|
|||
|
|
|||
|
Tenga en cuenta, que muchas funciones que cambian el estado del
|
|||
|
widget, suelen llamar a jwidget_dirty para redibujar el widget con
|
|||
|
su nuevo estado.
|
|||
|
|
|||
|
void jwidget_show (JWidget widget);
|
|||
|
void jwidget_hide (JWidget widget);
|
|||
|
|
|||
|
void jwidget_enable (JWidget widget);
|
|||
|
void jwidget_disable (JWidget widget);
|
|||
|
|
|||
|
void jwidget_select (JWidget widget);
|
|||
|
void jwidget_deselect (JWidget widget);
|
|||
|
|
|||
|
bool jwidget_is_visible (JWidget widget);
|
|||
|
bool jwidget_is_hidden (JWidget widget);
|
|||
|
|
|||
|
bool jwidget_is_enabled (JWidget widget);
|
|||
|
bool jwidget_is_disabled (JWidget widget);
|
|||
|
|
|||
|
bool jwidget_is_selected (JWidget widget);
|
|||
|
bool jwidget_is_deselected (JWidget widget);
|
|||
|
|
|||
|
bool jwidget_has_focus (JWidget widget);
|
|||
|
bool jwidget_has_mouse (JWidget widget);
|
|||
|
bool jwidget_has_capture (JWidget widget);
|
|||
|
|
|||
|
void jwidget_add_child (JWidget widget, JWidget child);
|
|||
|
Agrega un nuevo widget hijo "child" dentro del widget padre
|
|||
|
"widget".
|
|||
|
|
|||
|
Emite la se<73>al JI_SIGNAL_NEW_PARENT para "child", y
|
|||
|
JI_SIGNAL_ADD_CHILD para "widget".
|
|||
|
|
|||
|
void jwidget_add_childs (JWidget widget, ...);
|
|||
|
|
|||
|
void jwidget_remove_child (JWidget widget, JWidget child);
|
|||
|
|
|||
|
void jwidget_replace_child (JWidget widget, JWidget old, JWidget new);
|
|||
|
|
|||
|
JWidget jwidget_get_parent (JWidget widget);
|
|||
|
Devuelve un puntero al widget padre. Es equivalente a utilizar
|
|||
|
widget->parent directamente.
|
|||
|
|
|||
|
JWidget jwidget_get_window (JWidget widget);
|
|||
|
Recorre los padres del widget hasta encontrar la ventana a la que
|
|||
|
pertenece, devolviendo dicho puntero o NULL si es que no se pudo
|
|||
|
encontrar una ventana padre.
|
|||
|
|
|||
|
JList jwidget_get_parents (JWidget widget, bool ascendant);
|
|||
|
Retornar una list de los padres de "widget". Si "ascendant" es TRUE
|
|||
|
retorna desde el widget hasta el padre. Si "ascendant" es FALSE
|
|||
|
retorna desde el padre hasta "widget".
|
|||
|
|
|||
|
Deber<65> liberar la lista devuelta mediante jlist_free.
|
|||
|
|
|||
|
JList jwidget_get_children (JWidget widget);
|
|||
|
|
|||
|
Deber<65> liberar la lista devuelta mediante jlist_free.
|
|||
|
|
|||
|
JWidget jwidget_pick (JWidget widget, int x, int y);
|
|||
|
Busca un widget dentro de "widget" que se encuentre en la posici<63>n
|
|||
|
(x, y), partiendo desde el "widget", pasando por todos sus hijos.
|
|||
|
|
|||
|
Devolver<65> el widget m<>s lejano de "widget" (el hijo m<>s profundo) si
|
|||
|
es que <20>ste se abarca el punto (x, y).
|
|||
|
|
|||
|
bool jwidget_has_child (JWidget widget, JWidget child);
|
|||
|
Devuelve TRUE si el "widget" posee dentro el widget hijo "child".
|
|||
|
Est<73> funci<63>n s<>lo mira por los hijos de "widget", nunca baja a los
|
|||
|
hijos de sus hijos.
|
|||
|
|
|||
|
void jwidget_request_size (JWidget widget, int *w, int *h);
|
|||
|
|
|||
|
JRect jwidget_get_position (JWidget widget);
|
|||
|
Retorna la posici<63>n del widget.
|
|||
|
|
|||
|
El rect<63>ngulo devuelto JRect deber<65> ser liberado mediante jrect_free.
|
|||
|
|
|||
|
JRect jwidget_get_child_position (JWidget widget);
|
|||
|
|
|||
|
JRegion jwidget_get_region (JWidget widget);
|
|||
|
|
|||
|
Deber<65> liberar la regi<67>n devuelta mediante jregion_free.
|
|||
|
|
|||
|
JRegion jwidget_get_drawable_region (JWidget widget, int flags);
|
|||
|
|
|||
|
Deber<65> liberar la regi<67>n devuelta mediante jregion_free.
|
|||
|
|
|||
|
int jwidget_get_bg_color (JWidget widget);
|
|||
|
Devuelve el color de fondo de este widget (o si es -1 pregunta por
|
|||
|
el color del padre).
|
|||
|
|
|||
|
JTheme jwidget_get_theme (JWidget widget);
|
|||
|
Devuelve un puntero al tema que utiliza dicho widget.
|
|||
|
|
|||
|
int jwidget_get_text_length (JWidget widget);
|
|||
|
int jwidget_get_text_height (JWidget widget);
|
|||
|
Retorna las medidas del texto del widget en p<>xeles. Puede ser
|
|||
|
equivalente a utilizar:
|
|||
|
|
|||
|
int length = ji_font_text_len (widget->text_font, widget->text);
|
|||
|
int height = text_height (widget->text_font);
|
|||
|
|
|||
|
void jwidget_get_texticon_info (JWidget widget,
|
|||
|
JRect box, JRect text, JRect icon,
|
|||
|
int icon_w, int icon_h);
|
|||
|
|
|||
|
void jwidget_noborders (JWidget widget);
|
|||
|
|
|||
|
void jwidget_set_border (JWidget widget, int l, int t, int r, int b);
|
|||
|
|
|||
|
void jwidget_set_position (JWidget widget, JRect rect);
|
|||
|
|
|||
|
void jwidget_set_static_size (JWidget widget, int w, int h);
|
|||
|
|
|||
|
void jwidget_set_bg_color (JWidget widget, int color);
|
|||
|
|
|||
|
void jwidget_set_theme (JWidget widget, JTheme theme);
|
|||
|
|
|||
|
void jwidget_flush_redraw (JWidget widget);
|
|||
|
|
|||
|
void jwidget_redraw_region (JWidget widget, const JRegion region);
|
|||
|
|
|||
|
void jwidget_signal_on (JWidget widget);
|
|||
|
void jwidget_signal_off (JWidget widget);
|
|||
|
|
|||
|
int jwidget_emit_signal (JWidget widget, int signal_num);
|
|||
|
|
|||
|
bool jwidget_send_message (JWidget widget, JMessage msg);
|
|||
|
|
|||
|
bool jwidget_send_message_after_type (JWidget widget,
|
|||
|
JMessage msg, int type);
|
|||
|
|
|||
|
void jwidget_close_window (JWidget widget);
|
|||
|
|
|||
|
void jwidget_capture_mouse (JWidget widget);
|
|||
|
void jwidget_hard_capture_mouse (JWidget widget);
|
|||
|
|
|||
|
void jwidget_release_mouse (JWidget widget);
|
|||
|
|
|||
|
JWidget jwidget_find_name (JWidget widget, const char *name);
|
|||
|
Busca por el widget hijo con el nombre "name" dentro del widget
|
|||
|
"widget". <20>til para obtener widgets hijos cargados desde un archivo
|
|||
|
.jid.
|
|||
|
|
|||
|
bool jwidget_check_underscored (JWidget widget, int ascii);
|
|||
|
|
|||
|
Widget's flags
|
|||
|
--------------
|
|||
|
|
|||
|
Valores posibles para las banderas widget->flags. Evite usar estos
|
|||
|
valores directamente, en su lugar intente usar las funciones
|
|||
|
"jwidget_is_..." donde sea posible.
|
|||
|
|
|||
|
JI_DIRTY
|
|||
|
El widget est<73> "sucio" (necesita ser redibujado en su totalidad).
|
|||
|
|
|||
|
JI_HIDDEN
|
|||
|
El widget est<73> escondido.
|
|||
|
|
|||
|
JI_SELECTED
|
|||
|
El widget est<73> seleccinado.
|
|||
|
|
|||
|
JI_DISABLED
|
|||
|
El widget est<73> deshabilitado.
|
|||
|
|
|||
|
JI_HASFOCUS
|
|||
|
El widget tiene el foco de entrada (o alguno de sus hijos lo
|
|||
|
tiene). Esta bandera s<>lo la pueden conseguir widgets que sean
|
|||
|
JI_FOCUSREST.
|
|||
|
|
|||
|
JI_HASMOUSE
|
|||
|
El widget tiene el mouse (o alguno de sus hijos lo tiene).
|
|||
|
|
|||
|
JI_HASCAPTURE
|
|||
|
El widget tiene el mouse capturado.
|
|||
|
|
|||
|
JI_FOCUSREST
|
|||
|
El widget es un descanso para el foco, es decir, puede recibir el
|
|||
|
foco de entrada ya que lo utilizar<61> para algo. Por ejemplo: un bot<6F>n
|
|||
|
es focus-rest, pero una etiqueta (label) o una caja (box) no lo son.
|
|||
|
|
|||
|
JI_MAGNETIC
|
|||
|
El widget es magn<67>tico (recibe el foco de entrada por defecto).
|
|||
|
|
|||
|
JI_EXPANSIVE
|
|||
|
El widget es expansivo: intenta obtener el mayor lugar posible si su
|
|||
|
padre es una caja (box).
|
|||
|
|
|||
|
JI_DECORATIVE
|
|||
|
El widget es decorativo (ver jwidget_decorative).
|
|||
|
|
|||
|
JI_AUTODESTROY
|
|||
|
El widget es auto-destructivo (ver jwidget_autodestroy).
|
|||
|
|
|||
|
JI_HARDCAPTURE
|
|||
|
El widget captur<75> el mouse en una forma "dura". Cuando se utiliza
|
|||
|
jwidget_hard_capture_mouse, el widget con el mouse
|
|||
|
(jmanager_get_mouse) ser<65> siempre el mismo widget que captur<75> el
|
|||
|
mouse, es imposible que cambie a otro widget.
|
|||
|
|
|||
|
Cuando utiliza jwidget_capture_mouse, el widget con el mouse puede
|
|||
|
cambiar a otro widget, pero los mensajes del mouse siguen siendo
|
|||
|
enviados al que posee la captura.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
========================================
|
|||
|
============ JHook (gancho) ============
|
|||
|
========================================
|
|||
|
|
|||
|
|
|||
|
int type;
|
|||
|
|
|||
|
JMessageFunc msg_proc;
|
|||
|
Funci<63>n encargada de procesar los mensajes, debe retornar TRUE si el
|
|||
|
mensaje se utiliz<69> y no se desea que el mismo sea procesado por los
|
|||
|
siguientes "ganchos" consecutivos, o FALSE en caso contrario.
|
|||
|
|
|||
|
void *data;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
===========================================
|
|||
|
============ Message (mensaje) ============
|
|||
|
===========================================
|
|||
|
|
|||
|
Cuando se genera un mensaje, al ser despachado se comienza enviando
|
|||
|
el mismo a los ganchos de los widgets receptores, comenzando del
|
|||
|
primer gancho (el cual ser<65>a el <20>ltimo gancho agregado) hasta el
|
|||
|
<20>ltimo gancho del widget.
|
|||
|
|
|||
|
Recuerde que si intercepta un mensaje, debe retornar TRUE indicando
|
|||
|
que el mensaje fue utilizado, as<61> frena el enviado de mensajes a
|
|||
|
otros ganchos. Esto es v<>lido para todos los mensajes menos para
|
|||
|
JM_DESTROY. Ya que devolviendo TRUE, los ganchos pr<70>ximos no
|
|||
|
recibir<69>n dicho mensaje y es posible que algo de memoria no se
|
|||
|
libere.
|
|||
|
|
|||
|
JM_OPEN
|
|||
|
-------
|
|||
|
|
|||
|
Es enviado a todos los widgets de una ventana cuando est<73> es abierta
|
|||
|
en un determinado manager.
|
|||
|
|
|||
|
JM_CLOSE
|
|||
|
--------
|
|||
|
|
|||
|
Cuando una ventana es cerrada, este mensaje se env<6E>a a todos los
|
|||
|
widgets de la misma.
|
|||
|
|
|||
|
JM_DESTROY
|
|||
|
----------
|
|||
|
|
|||
|
Se env<6E>a al eliminar el widget mediante jwidget_free. Un widget
|
|||
|
recibe una <20>nica vez este mensaje (siendo adem<65>s el <20>ltimo mensaje
|
|||
|
que recibir<69>). Recuerde retornar FALSE para no frenar el env<6E>o del
|
|||
|
mensaje a los ganchos pr<70>ximos.
|
|||
|
|
|||
|
JM_DRAW
|
|||
|
-------
|
|||
|
|
|||
|
JM_IDLE
|
|||
|
-------
|
|||
|
|
|||
|
JM_SIGNAL
|
|||
|
---------
|
|||
|
|
|||
|
JM_REQSIZE
|
|||
|
----------
|
|||
|
|
|||
|
Mensaje utilizado para obtener el tama<6D>o necesario para el widget.
|
|||
|
Debe rellenar las variables msg->reqsize.w y msg->reqsize.h, y
|
|||
|
retornar TRUE si as<61> lo hizo.
|
|||
|
|
|||
|
JM_SETPOS
|
|||
|
---------
|
|||
|
|
|||
|
Mensaje utilizado para cambiar el tama<6D>o del widget, si lo intercepta,
|
|||
|
deber<65> hacer un "jrect_copy (widget->pos, &msg->setpos.rect)".
|
|||
|
|
|||
|
Enganchar este mensaje es <20>til solamente si piensa reacomodar los
|
|||
|
hijos cada vez que cambie la posici<63>n del widget (es decir, siempre
|
|||
|
que un widget acepte hijos, deber<65> hacer su propio comportamiento
|
|||
|
para acomodar el widget y a sus respectivos widgets hijos).
|
|||
|
|
|||
|
JM_DRAWRGN
|
|||
|
----------
|
|||
|
|
|||
|
Puede cambiar la forma de redibujar una regi<67>n de un widget
|
|||
|
(jwidget_redraw_region). Por ahora s<>lo los managers necesitan
|
|||
|
interceptar este mensaje.
|
|||
|
|
|||
|
JM_DIRTYCHILDREN
|
|||
|
----------------
|
|||
|
|
|||
|
Tambi<62>n puede cambiar la forma de "ensuciar" los widgets hijos. Por
|
|||
|
ejemplo, las list-boxes (cuadros de lista) necesitan enganchar este
|
|||
|
mensaje para redibujar <20>nicamente los <20>tems que est<73>n dentro del
|
|||
|
<20>rea de visible (para optimizar la velocidad de proceso).
|
|||
|
|
|||
|
JM_CHAR
|
|||
|
-------
|
|||
|
|
|||
|
JM_KEYPRESSED
|
|||
|
-------------
|
|||
|
|
|||
|
JM_KEYRELEASED
|
|||
|
--------------
|
|||
|
|
|||
|
JM_FOCUSENTER
|
|||
|
-------------
|
|||
|
|
|||
|
JM_FOCUSLEAVE
|
|||
|
-------------
|
|||
|
|
|||
|
JM_BUTTONPRESSED
|
|||
|
----------------
|
|||
|
|
|||
|
JM_BUTTONRELEASED
|
|||
|
-----------------
|
|||
|
|
|||
|
JM_DOUBLECLICK
|
|||
|
--------------
|
|||
|
|
|||
|
JM_MOUSEENTER
|
|||
|
-------------
|
|||
|
|
|||
|
JM_MOUSELEAVE
|
|||
|
-------------
|
|||
|
|
|||
|
JM_MOTION
|
|||
|
---------
|
|||
|
|
|||
|
JM_WHEEL
|
|||
|
--------
|
|||
|
|
|||
|
|
|||
|
|
|||
|
==========================================
|
|||
|
============ Signal (se<73>ales) ============
|
|||
|
==========================================
|
|||
|
|
|||
|
Las se<73>ales son un buen m<>todo de enganchar determinadas funciones
|
|||
|
que controlan a las widgets. Es decir que podemos saber cuando
|
|||
|
ocurre determinado cambio en un widget (por ejemplo si un widget fue
|
|||
|
eliminado, o si un bot<6F>n cambio de estado).
|
|||
|
|
|||
|
JI_SIGNAL_DIRTY
|
|||
|
---------------
|
|||
|
|
|||
|
Se envia cuando un widget determinado es ensuciado.
|
|||
|
|
|||
|
JI_SIGNAL_ENABLE
|
|||
|
----------------
|
|||
|
|
|||
|
Al cambiar el estado de un widget a activado.
|
|||
|
|
|||
|
JI_SIGNAL_DISABLE
|
|||
|
-----------------
|
|||
|
|
|||
|
Al cambiar el estado de un widget a desactivado.
|
|||
|
|
|||
|
JI_SIGNAL_SELECT
|
|||
|
----------------
|
|||
|
|
|||
|
JI_SIGNAL_DESELECT
|
|||
|
------------------
|
|||
|
|
|||
|
JI_SIGNAL_SHOW
|
|||
|
--------------
|
|||
|
|
|||
|
JI_SIGNAL_HIDE
|
|||
|
--------------
|
|||
|
|
|||
|
JI_SIGNAL_ADD_CHILD
|
|||
|
-------------------
|
|||
|
|
|||
|
JI_SIGNAL_REMOVE_CHILD
|
|||
|
----------------------
|
|||
|
|
|||
|
JI_SIGNAL_NEW_PARENT
|
|||
|
--------------------
|
|||
|
|
|||
|
JI_SIGNAL_GET_TEXT
|
|||
|
------------------
|
|||
|
|
|||
|
JI_SIGNAL_SET_TEXT
|
|||
|
------------------
|
|||
|
|
|||
|
JI_SIGNAL_INIT_THEME
|
|||
|
--------------------
|
|||
|
|
|||
|
JI_SIGNAL_CHECK_CHANGE
|
|||
|
----------------------
|
|||
|
|
|||
|
JI_SIGNAL_RADIO_CHANGE
|
|||
|
----------------------
|
|||
|
|
|||
|
JI_SIGNAL_ENTRY_CHANGE
|
|||
|
----------------------
|
|||
|
|
|||
|
JI_SIGNAL_LISTBOX_CHANGE
|
|||
|
------------------------
|
|||
|
|
|||
|
JI_SIGNAL_LISTBOX_SELECT
|
|||
|
------------------------
|
|||
|
|
|||
|
JI_SIGNAL_MENUITEM_SELECT
|
|||
|
-------------------------
|
|||
|
|
|||
|
JI_SIGNAL_SLIDER_CHANGE
|
|||
|
-----------------------
|
|||
|
|
|||
|
|
|||
|
|
|||
|
==========================================
|
|||
|
============ Manager (gestor) ============
|
|||
|
==========================================
|
|||
|
|
|||
|
JWidget ji_get_default_manager (void);
|
|||
|
Retorna un puntero del manager principal, el primer manager creado
|
|||
|
con jmanager_new.
|
|||
|
|
|||
|
JWidget jmanager_new (void);
|
|||
|
|
|||
|
void jmanager_free (JWidget manager);
|
|||
|
|
|||
|
void jmanager_run (JWidget manager);
|
|||
|
|
|||
|
bool jmanager_poll (JWidget manager, bool all_windows);
|
|||
|
|
|||
|
void jmanager_send_message (const JMessage msg);
|
|||
|
|
|||
|
JWidget jmanager_get_focus (void);
|
|||
|
|
|||
|
JWidget jmanager_get_mouse (void);
|
|||
|
|
|||
|
JWidget jmanager_get_capture (void);
|
|||
|
|
|||
|
void jmanager_set_focus (JWidget widget);
|
|||
|
|
|||
|
void jmanager_set_mouse (JWidget widget);
|
|||
|
|
|||
|
void jmanager_set_capture (JWidget widget);
|
|||
|
|
|||
|
void jmanager_attract_focus (JWidget widget);
|
|||
|
|
|||
|
void jmanager_free_focus (void);
|
|||
|
void jmanager_free_mouse (void);
|
|||
|
void jmanager_free_capture (void);
|
|||
|
|
|||
|
void jmanager_free_widget (JWidget widget);
|
|||
|
|
|||
|
void jmanager_remove_message (JMessage msg);
|
|||
|
|
|||
|
void jmanager_remove_messages_for (JWidget widget);
|
|||
|
|
|||
|
void jmanager_refresh_screen (void);
|
|||
|
|
|||
|
void jmanager_dispatch_messages (void);
|
|||
|
|
|||
|
void jmanager_dispatch_draw_messages (void);
|
|||
|
|
|||
|
void jmanager_open_window (JWidget manager, JWidget window);
|
|||
|
|
|||
|
void jmanager_close_window (JWidget manager, JWidget window, bool sendtokill);
|
|||
|
|
|||
|
JI_SIGNAL_MANAGER_EXTERNAL_CLOSE
|
|||
|
--------------------------------
|
|||
|
|
|||
|
JI_SIGNAL_MANAGER_ADD_WINDOW
|
|||
|
----------------------------
|
|||
|
|
|||
|
JI_SIGNAL_MANAGER_REMOVE_WINDOW
|
|||
|
-------------------------------
|
|||
|
|
|||
|
JI_SIGNAL_MANAGER_IDLE
|
|||
|
----------------------
|
|||
|
|
|||
|
JI_SIGNAL_MANAGER_LOSTCHAR
|
|||
|
--------------------------
|
|||
|
|
|||
|
|
|||
|
|
|||
|
==========================================
|
|||
|
============ Window (ventana) ============
|
|||
|
==========================================
|
|||
|
|
|||
|
Una ventana es un tipo de widget especial en una caja rectangular que
|
|||
|
representa un cuadro de di<64>logo (entre el usuario y el programa) el
|
|||
|
cual el usuario puede mover o cambiar de tama<6D>o a su antojo.
|
|||
|
|
|||
|
En Jinete, la ventana incluye s<>lo los rebordes y la barra de t<>tulo,
|
|||
|
usted debe agregarle los widgets hijos mediante jwidget_add_child.
|
|||
|
La posici<63>n de los hijos es puesta en el <20>rea cliente (el <20>rea dentro
|
|||
|
de los bordes de la ventana), por lo que deber<65> agregar s<>lo un widget
|
|||
|
dentro de la ventana (generalmente una caja (box)) la cual contendr<64>
|
|||
|
los dem<65>s widgets.
|
|||
|
|
|||
|
JWidget jwindow_new (const char *text);
|
|||
|
Crea una nueva ventana con el texto "text" en la barra de t<>tulo.
|
|||
|
|
|||
|
JWidget jwindow_new_desktop (void);
|
|||
|
Crea una nueva ventana de tipo desktop (escritorio). Los escritorios
|
|||
|
ocupan toda la pantalla (o mejor dicho, todo el tama<6D>o del manager
|
|||
|
padre).
|
|||
|
|
|||
|
JWidget jwindow_get_killer (JWidget window);
|
|||
|
Devuelve el puntero al widget que "mat<61>" (cerr<72>) la ventana
|
|||
|
"window". Puede que este puntero sea NULL en el caso de que alg<6C>n
|
|||
|
ente an<61>nimo haya cerrado la ventana (como el bot<6F>n "x" para
|
|||
|
cerrarla, o la tecla ).
|
|||
|
|
|||
|
JWidget jwindow_get_manager (JWidget window);
|
|||
|
Devuelve el manager en el cual la ventana "window" se encuentra
|
|||
|
dentro.
|
|||
|
|
|||
|
void jwindow_mobile (JWidget window, bool mobile);
|
|||
|
Cambia el estado de movilidad de la ventana "window". Si una ventana
|
|||
|
es m<>vil, significa que el usuario puede cambiarle la posici<63>n y su
|
|||
|
tama<6D>o.
|
|||
|
|
|||
|
void jwindow_remap (JWidget window);
|
|||
|
XXX
|
|||
|
|
|||
|
Esta funci<63>n generalmente no es necesaria utilizarla si usted usa
|
|||
|
jwindow_center o jwindow_position antes. Ser<65> necesaria en casos
|
|||
|
especiales donde usted necesite saber el tama<6D>o m<>nimo que necesita
|
|||
|
la ventana antes de abrirla.
|
|||
|
|
|||
|
void jwindow_center (JWidget window);
|
|||
|
Cambia la posici<63>n de la ventana "window" al centro el manager
|
|||
|
principal (el manager principal tiene el tama<6D>o de la pantalla
|
|||
|
f<>sica, o mejor dicho, del modo de video actual).
|
|||
|
|
|||
|
void jwindow_position (JWidget window, int x, int y);
|
|||
|
Posiciona la ventana a otro punto (x, y). Note que esta funci<63>n
|
|||
|
difiere de jwidget_set_position en el sentido de que s<>lo desplaza
|
|||
|
la ventana (y sus widgets hijos) a la nueva posici<63>n.
|
|||
|
|
|||
|
void jwindow_open (JWidget window);
|
|||
|
Abre la ventana en el manager por defecto para ser procesadas por
|
|||
|
pr<70>ximas llamadas a jmanager_poll.
|
|||
|
|
|||
|
No deber<65>a usar esta funci<63>n a menos que sepa lo que est<73>
|
|||
|
haciendo. Generalmente nunca la deber<65> llamar directamente, en
|
|||
|
cambio, las funciones jwindow_open_fg o jwindow_open_bg son las
|
|||
|
com<6F>nmente utilizadas (y las mismas suelen utilizar jwindow_open).
|
|||
|
|
|||
|
void jwindow_open_fg (JWidget window);
|
|||
|
Abre la ventana en primer plano (foreground), paralizando las dem<65>s
|
|||
|
ventanas abiertas, y esperando una respuesta del usuario
|
|||
|
inmediata. Cuando la ventana se cierra se vuelve a donde la funci<63>n
|
|||
|
se llam<61>.
|
|||
|
|
|||
|
<20>til cuando necesita hacer cosas como:
|
|||
|
|
|||
|
jwindow_open_fg (window);
|
|||
|
if (jwindow_get_killer (window) == boton_aceptar) {
|
|||
|
...
|
|||
|
}
|
|||
|
jwidget_free (window);
|
|||
|
|
|||
|
void jwindow_open_bg (JWidget window);
|
|||
|
Abre la ventana y la deja ejecut<75>ndose en segundo plano
|
|||
|
(background).
|
|||
|
|
|||
|
Esta funci<63>n s<>lo coloca la bandera auto-destroy a la ventana y
|
|||
|
llama a la funci<63>n jwindow_open. La bandera auto-destroy hace que
|
|||
|
la ventana, al ser cerrada, sea autom<6F>ticamente liberada
|
|||
|
(jwidget_free) por el mismo manager antes que por nosotros.
|
|||
|
|
|||
|
void jwindow_close (JWidget window, JWidget killer);
|
|||
|
Cierra la ventana "window" forzosamente. El paramentro "killer"
|
|||
|
indica quien "mat<61>" (cerr<72>) la ventana, esto es debido a que esta
|
|||
|
funci<63>n generalmente se utiliza dentro de un "msg_proc" de un widget
|
|||
|
especial que se encarga de cerrar la ventana (por ejemplo un bot<6F>n,
|
|||
|
que al presionarlo, su acci<63>n por defecto es matar a su ventana
|
|||
|
padre).
|
|||
|
|
|||
|
bool jwindow_is_toplevel (JWidget window);
|
|||
|
Retorna TRUE si la ventana "window" se encuentra encima de todas las
|
|||
|
ventanas.
|
|||
|
|
|||
|
bool jwindow_is_foreground (JWidget window);
|
|||
|
Retorna TRUE si la ventana se ejecuta en primer plano (foreground).
|
|||
|
|
|||
|
bool jwindow_is_desktop (JWidget window);
|
|||
|
Retorna TRUE si la ventana es de tipo escritorio (desktop).
|
|||
|
|
|||
|
JI_SIGNAL_WINDOW_CLOSE
|
|||
|
----------------------
|
|||
|
|
|||
|
JI_SIGNAL_WINDOW_RESIZE
|
|||
|
-----------------------
|
|||
|
|
|||
|
|
|||
|
====================================
|
|||
|
============ Box (caja) ============
|
|||
|
====================================
|
|||
|
|
|||
|
Una caja (box) es uno de los widgets m<>s sencillos de manejar y a su
|
|||
|
vez, uno de los m<>s <20>tiles. Sirve para disponer los widgets hijos de
|
|||
|
forma horizontal o vertical, acomod<6F>ndolos a nuestro antojo, pero sin
|
|||
|
tener que preocuparnos por el tama<6D>o que necesita cada widget
|
|||
|
en particular.
|
|||
|
|
|||
|
JWidget jbox_new (int align);
|
|||
|
Crea una nueva caja (box) con las propiedades de alineamiento de "align".
|
|||
|
|
|||
|
"align" debe poseer uno de estos dos valores:
|
|||
|
|
|||
|
JI_HORIZONTAL o JI_VERTICAL:
|
|||
|
Indica si queremos ordenar los widgets de forma horizontal o
|
|||
|
vertical respectivamente.
|
|||
|
|
|||
|
Y puede o no estar en combinaci<63>n con:
|
|||
|
|
|||
|
JI_HOMOGENEOUS
|
|||
|
Indica que todos los widgets hijos deben poseer el mismo tama<6D>o.
|
|||
|
Generalmente el m<>ximo tama<6D>o necesario por el widget hijo m<>s
|
|||
|
grande que se encuentre dentro de la caja (box).
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
==========================================
|
|||
|
============ Label (etiqueta) ============
|
|||
|
==========================================
|
|||
|
|
|||
|
JWidget jlabel_new (const char *text);
|
|||
|
Crea una nueva widget de tipo etiqueta (label) con el texto "text".
|
|||
|
Las etiquetas sirven para mostrar un mensaje, o indicar qu<71>
|
|||
|
significa un widget de al lado.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
========================================
|
|||
|
============ Button (bot<6F>n) ============
|
|||
|
========================================
|
|||
|
|
|||
|
Un bot<6F>n es un widget que al ser presionado cierra la ventana donde
|
|||
|
est<73>, <20> ejecuta alguna acci<63>n o comando (como abrir otra nueva ventana).
|
|||
|
|
|||
|
Un bot<6F>n, sin que usted intercepte ninguna se<73>al, ni mensaje,
|
|||
|
siempre cerrar<61> la ventana, tal es as<61>, que luego puede preguntar
|
|||
|
por jwindow_get_killer() y le devolver<65> un puntero a dicho bot<6F>n.
|
|||
|
|
|||
|
Hay muchas formas de cambiar este comportamiento por defecto, la m<>s
|
|||
|
c<>moda es utilizando las funciones ji_button_add_command, as<61> la
|
|||
|
ventana no ser<65> cerrada y en su lugar se llamar<61> al comando
|
|||
|
especificado. Tambi<62>n, utilizando jwidget_add_hook() puede
|
|||
|
interceptar el mensaje JM_SIGNAL cuando se env<6E>a la se<73>al
|
|||
|
JI_SIGNAL_BUTTON_SELECT.
|
|||
|
|
|||
|
Para que no queden dudas, cuando un bot<6F>n es presionado:
|
|||
|
|
|||
|
Primero se env<6E>a la se<73>al JI_SIGNAL_BUTTON_SELECT
|
|||
|
|
|||
|
Si retorna FALSE, significa que la se<73>al no fue utilizada, por lo
|
|||
|
tanto debemos ejecutar el comportamiento por defecto: si se agregaron
|
|||
|
comandos al bot<6F>n mediante jbutton_add_command(), se ejecutar<61>n los
|
|||
|
comandos, ahora, si el bot<6F>n no tiene comando alguno, se cerrar<61> la
|
|||
|
ventana.
|
|||
|
|
|||
|
JWidget jbutton_new (const char *text);
|
|||
|
Crea un nuevo bot<6F>n con el texto "text". Recuerde que por defecto,
|
|||
|
si es que no agrega ning<6E>n comando, los botones cierran la ventana
|
|||
|
|
|||
|
Puede saber que bot<6F>n cerr<72> la ventana utilizando jwindow_get_killer.
|
|||
|
|
|||
|
void jbutton_set_icon (JWidget button, struct BITMAP *icon);
|
|||
|
|
|||
|
void jbutton_set_icon_align (JWidget button, int icon_align);
|
|||
|
|
|||
|
void jbutton_set_bevel (JWidget button, int b0, int b1, int b2, int b3);
|
|||
|
|
|||
|
void jbutton_get_bevel (JWidget button, int *b4);
|
|||
|
|
|||
|
void jbutton_add_command (JWidget button,
|
|||
|
void (*command) (JWidget button));
|
|||
|
|
|||
|
void jbutton_add_command_data (JWidget button,
|
|||
|
void (*command) (JWidget button,
|
|||
|
void *data),
|
|||
|
void *data);
|
|||
|
|
|||
|
JI_SIGNAL_BUTTON_SELECT
|
|||
|
-----------------------
|
|||
|
|
|||
|
Esta se<73>al se env<6E>a a los handlers del bot<6F>n cuando el mismo es
|
|||
|
presionado (seleccionado). Deber<65> retornar TRUE para indicar que
|
|||
|
utiliz<69> dicha se<73>al, si es que no quiere ejecutar el comportamiento
|
|||
|
por defecto del bot<6F>n: llamar los comandos si es que existen o
|
|||
|
cerrar la ventana en caso contrario.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
======================================================
|
|||
|
============ Check (caja de comprobaci<63>n) ============
|
|||
|
======================================================
|
|||
|
|
|||
|
JWidget jcheck_new (const char *text);
|
|||
|
Crea una nueva caja de comprobaci<63>n. Sirven para representar
|
|||
|
opciones booleanas (valores verdadero o falso).
|
|||
|
|
|||
|
void jcheck_set_icon_align (JWidget check, int icon_align);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
======================================
|
|||
|
============ Theme (tema) ============
|
|||
|
======================================
|
|||
|
|
|||
|
|
|||
|
|
|||
|
======================================
|
|||
|
============ Archivos JID ============
|
|||
|
======================================
|
|||
|
|
|||
|
En un archivo .jid puede definir la estructura de una ventana (o de
|
|||
|
cualquier tipo de widget).
|
|||
|
|
|||
|
Ejemplo:
|
|||
|
|
|||
|
En "archivo.jid":
|
|||
|
|
|||
|
<window desktop name="ventana1" text="Mi Ventana">
|
|||
|
<box vertical>
|
|||
|
<label expansive name="mensaje" text="Su mensaje" />
|
|||
|
<box horizontal homogeneous>
|
|||
|
<button text="&Aceptar" name="boton_aceptar" />
|
|||
|
<button text="&Cancelar" />
|
|||
|
</box>
|
|||
|
</box>
|
|||
|
</window>
|
|||
|
|
|||
|
En un "archivo.c":
|
|||
|
|
|||
|
JWidget ventana1 = ji_load_widget ("archivo.jid", "ventana1");
|
|||
|
JWidget boton_aceptar = jwidget_find_name (ventana1, "boton_aceptar");
|
|||
|
|
|||
|
jwindow_open_fg (ventana1);
|
|||
|
if (jwindow_get_killer (ventana1) == boton_aceptar) {
|
|||
|
...
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
JWidget ji_load_widget (const char *filename, const char *name);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
=======================================
|
|||
|
============ Font (fuente) ============
|
|||
|
=======================================
|
|||
|
|
|||
|
FONT *ji_font_load (const char *filepathname);
|
|||
|
|
|||
|
int ji_font_get_size (FONT *f);
|
|||
|
|
|||
|
int ji_font_set_size (FONT *f, int height);
|
|||
|
|
|||
|
int ji_font_get_aa_mode (FONT *f);
|
|||
|
|
|||
|
int ji_font_set_aa_mode (FONT *f, int mode);
|
|||
|
|
|||
|
bool ji_font_is_fixed (FONT *f);
|
|||
|
bool ji_font_is_scalable (FONT *f);
|
|||
|
|
|||
|
const int *ji_font_get_available_fixed_sizes (FONT *f, int *n);
|
|||
|
|
|||
|
int ji_font_get_char_extra_spacing (FONT *f);
|
|||
|
|
|||
|
void ji_font_set_char_extra_spacing (FONT *f, int spacing);
|
|||
|
|
|||
|
int ji_font_char_len (FONT *f, int chr);
|
|||
|
Retorna la longitud (ancho) de un caracter en pixeles.
|
|||
|
|
|||
|
int ji_font_text_len (FONT *f, const char *text);
|
|||
|
Retorna la longitud (ancho) del texto "text" en pixeles. Recuerde
|
|||
|
que esta funci<63>n interpreta el caracter '&' como un subrayado.
|
|||
|
Ejemplo: La longitud "&OK" es igual a la de "OK".
|
|||
|
|
|||
|
|
|||
|
|
|||
|
==================================================
|
|||
|
============ JList - Listas Enlazadas ============
|
|||
|
==================================================
|
|||
|
|
|||
|
Las listas enlazadas se manejan a trav<61>s de los punteros JList:
|
|||
|
|
|||
|
typedef struct jlist *JList;
|
|||
|
|
|||
|
La estructura jlist se define:
|
|||
|
|
|||
|
struct jlist
|
|||
|
{
|
|||
|
void *data;
|
|||
|
JList next;
|
|||
|
JList prev;
|
|||
|
};
|
|||
|
|
|||
|
La mayor<6F>a de funciones reciben como primer par<61>metro el puntero al
|
|||
|
primer elemento de la lista (el cual puede estar apuntado a NULL) y
|
|||
|
devuelven un nuevo puntero (por las dudas si la cabecera cambi<62>).
|
|||
|
|
|||
|
Por ejemplo:
|
|||
|
|
|||
|
JList lista = NULL;
|
|||
|
lista = jlist_append (lista, (void *)2);
|
|||
|
lista = jlist_append (lista, (void *)3);
|
|||
|
lista = jlist_prepend (lista, (void *)1);
|
|||
|
jlist_free (lista);
|
|||
|
|
|||
|
Generar<61> la lista (1, 2, 3).
|
|||
|
|
|||
|
(Nota: si alguna vez program<61> con la librer<65>a GLib, las funciones
|
|||
|
g_list_* hacen ex<65>ctamente lo mismo que sus respectivas jlist_*).
|
|||
|
|
|||
|
JList jlist_alloc (void);
|
|||
|
|
|||
|
void jlist_free (JList list);
|
|||
|
Libera la memoria utilizada por toda la lista "list". Esta funci<63>n no
|
|||
|
borra los datos contenidos en cada nodo (se supone que antes de
|
|||
|
llamar esta rutina, usted ya se encarg<72> de eso).
|
|||
|
|
|||
|
void jlist_free_1 (JList list);
|
|||
|
Libera la memoria utilizada <20>nicamente por el nodo "list". Esta
|
|||
|
funci<63>n no borra los datos contenidos en el puntero list->data.
|
|||
|
|
|||
|
JList jlist_append (JList list, void *data);
|
|||
|
Agrega un nuevo elemento con los datos "data" al final de la lista.
|
|||
|
|
|||
|
JList jlist_prepend (JList list, void *data);
|
|||
|
Agrega un nuevo elemento con los datos "data" al comienzo de la lista.
|
|||
|
|
|||
|
JList jlist_insert (JList list, void *data, int position);
|
|||
|
|
|||
|
JList jlist_insert_sorted (JList list, void *data, JCompareFunc func);
|
|||
|
|
|||
|
JList jlist_insert_before (JList list, JList sibling, void *data);
|
|||
|
|
|||
|
JList jlist_concat (JList list1, JList list2);
|
|||
|
|
|||
|
JList jlist_remove (JList list, const void *data);
|
|||
|
Remueve la primer ocurrencia de "data" en la lista recorri<72>ndola
|
|||
|
hacia delante. El nodo es eliminado (mediante free), los datos no.
|
|||
|
|
|||
|
JList jlist_remove_all (JList list, const void *data);
|
|||
|
Remueve todas las ocurrencias de "data" en la lista recorri<72>ndola
|
|||
|
hacia delante. Los nodos son eliminados (mediante free), los datos
|
|||
|
no.
|
|||
|
|
|||
|
JList jlist_remove_link (JList list, JList llink);
|
|||
|
Remueve el nodo "llink" de la lista "list". El nodo NO es liberado
|
|||
|
(aqu<71> se supone que luego usted llamar<61> un jlist_free_1).
|
|||
|
|
|||
|
JList jlist_delete_link (JList list, JList link);
|
|||
|
Remueve el nodo "link" de la lista "list". El nodo ser<65> eliminado,
|
|||
|
los datos no.
|
|||
|
|
|||
|
JList jlist_reverse (JList list);
|
|||
|
|
|||
|
JList jlist_copy (JList list);
|
|||
|
Copia la lista generando una completamente nueva con cada elemento
|
|||
|
apuntado a los mismos datos que la anterior lista.
|
|||
|
|
|||
|
JList jlist_nth (JList list, unsigned int n);
|
|||
|
|
|||
|
JList jlist_nth_prev (JList list, unsigned int n);
|
|||
|
|
|||
|
JList jlist_find (JList list, const void *data);
|
|||
|
Busca el nodo en el cual se encuentra los datos "data".
|
|||
|
|
|||
|
Esta funci<63>n recorre desde "list" hacia delante.
|
|||
|
|
|||
|
JList jlist_find_custom (JList list, const void *data, JCompareFunc func);
|
|||
|
|
|||
|
int jlist_position (JList list, JList llink);
|
|||
|
Devuelve la posici<63>n (el <20>ndice) en que se encuentra el nodo
|
|||
|
"llink". Siendo list la posici<63>n 0, list->next la 1,
|
|||
|
list->next->next la 2, etc.
|
|||
|
|
|||
|
Retorna -1 si no se encontr<74>.
|
|||
|
|
|||
|
int jlist_index (JList list, const void *data);
|
|||
|
Devuelve el <20>ndice en que se encuentra el nodo con los datos
|
|||
|
"data". Siendo list el <20>ndice 0, list->next el 1, list->next->next
|
|||
|
el 2, etc.
|
|||
|
|
|||
|
Retorna -1 si no se encontr<74>.
|
|||
|
|
|||
|
JList jlist_last (JList list);
|
|||
|
Retorna un puntero al <20>ltimo elemento de la lista (puede devolver
|
|||
|
NULL si list es NULL).
|
|||
|
|
|||
|
JList jlist_first (JList list);
|
|||
|
Retorna el primer elemento de la lista (esta funci<63>n est<73> hecha por
|
|||
|
las dudas si "list" no apunta ya al primer elemento).
|
|||
|
|
|||
|
unsigned int jlist_length (JList list);
|
|||
|
Retorna la cantidad de nodos que contiene la lista "list".
|
|||
|
|
|||
|
void jlist_foreach (JList list, JFunc func, void *user_data);
|
|||
|
Por cada nodo de la lista "list" llamar<61> a la funci<63>n "func".
|
|||
|
El Ejemplo:
|
|||
|
|
|||
|
void mi_funcion (void *data, void *user_data)
|
|||
|
{
|
|||
|
printf ("%d\n", (int)data);
|
|||
|
}
|
|||
|
|
|||
|
...
|
|||
|
|
|||
|
JList lista = NULL;
|
|||
|
lista = jlist_append (lista, (void *)2);
|
|||
|
lista = jlist_append (lista, (void *)3);
|
|||
|
lista = jlist_prepend (lista, (void *)1);
|
|||
|
jlist_foreach (lista, mi_funcion, NULL);
|
|||
|
jlist_free (lista);
|
|||
|
|
|||
|
Imprime:
|
|||
|
|
|||
|
1
|
|||
|
2
|
|||
|
3
|
|||
|
|
|||
|
JList jlist_sort (JList list, JCompareFunc compare_func);
|
|||
|
|
|||
|
JList jlist_sort_with_data (JList list,
|
|||
|
JCompareDataFunc compare_func,
|
|||
|
void *user_data);
|
|||
|
|
|||
|
void *jlist_nth_data (JList list, unsigned int n);
|
|||
|
|
|||
|
#define jlist_previous(list)
|
|||
|
#define jlist_next(list)
|
|||
|
Devuelve el anterior o el siguiente nodo del elemento "list" de una
|
|||
|
lista cualquiera. Utilizar esta funci<63>n es lo mismo que usar
|
|||
|
list->prev o list->next, con la <20>nica diferencia que antes se hace
|
|||
|
un chequeo de que list sea distinto de NULL.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
=============================================
|
|||
|
============ JRect - Rect<63>ngulos ============
|
|||
|
=============================================
|
|||
|
|
|||
|
|
|||
|
struct jrect
|
|||
|
{
|
|||
|
int x, y, w, h;
|
|||
|
};
|
|||
|
|
|||
|
JRect jrect_new (int x, int y, int w, int h);
|
|||
|
|
|||
|
JRect jrect_new_copy (const JRect rect);
|
|||
|
|
|||
|
void jrect_free (JRect rect);
|
|||
|
|
|||
|
void jrect_copy (JRect dst, const JRect src);
|
|||
|
|
|||
|
void jrect_replace (JRect rect, int x, int y, int w, int h);
|
|||
|
|
|||
|
void jrect_add (JRect rect, const JRect other);
|
|||
|
|
|||
|
bool jrect_intersect (JRect rect, const JRect other);
|
|||
|
|
|||
|
void jrect_shrink (JRect rect, int border);
|
|||
|
|
|||
|
void jrect_stretch (JRect rect, int border);
|
|||
|
|
|||
|
#define jrect_has_intersection(rect, other)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
============================================
|
|||
|
============ JRegion - Regiones ============
|
|||
|
============================================
|
|||
|
|
|||
|
En Jinete, una regi<67>n es un conjunto de rect<63>ngulos, una lista
|
|||
|
enlazada de rect<63>ngulos.
|
|||
|
|
|||
|
typedef struct jregion JRegion;
|
|||
|
|
|||
|
struct jregion
|
|||
|
{
|
|||
|
JList rects;
|
|||
|
};
|
|||
|
|
|||
|
JRegion jregion_new (void);
|
|||
|
Crea una nueva regi<67>n vac<61>a. Usted deber<65> eliminar la regi<67>n
|
|||
|
devuelta mediante jregion_free.
|
|||
|
|
|||
|
JRegion jregion_new_copy (const JRegion region);
|
|||
|
Crea una nueva copia de region. Usted deber<65> eliminar la regi<67>n
|
|||
|
devuelta mediante jregion_free.
|
|||
|
|
|||
|
void jregion_free (JRegion region);
|
|||
|
|
|||
|
void jregion_clear (JRegion region);
|
|||
|
|
|||
|
void jregion_move (JRegion region, int x, int y);
|
|||
|
|
|||
|
void jregion_join (JRegion region, JRegion other);
|
|||
|
|
|||
|
void jregion_add (JRegion region, const JRect rect);
|
|||
|
|
|||
|
void jregion_subtract (JRegion region, const JRect rect);
|
|||
|
|
|||
|
void jregion_intersect (JRegion region, const JRect rect);
|
|||
|
|
|||
|
void jregion_add2 (JRegion region, const JRegion other);
|
|||
|
|
|||
|
void jregion_subtract2 (JRegion region, const JRegion other);
|
|||
|
|
|||
|
void jregion_intersect2 (JRegion region, const JRegion other);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
============================================
|
|||
|
============ Funciones Internas ============
|
|||
|
============================================
|
|||
|
|
|||
|
JWidget _ji_get_widget_by_id (JID widget_id);
|
|||
|
|
|||
|
JWidget *_ji_get_widget_array (int *nwidgets);
|
|||
|
Devuelve un puntero al arreglo interno que maneja todos los widgets.
|
|||
|
A "nwidgets" le ser<65> asignado la cantidad de elementos del arreglo de
|
|||
|
widgets.
|
|||
|
|
|||
|
JWidget _ji_get_new_widget (void);
|
|||
|
|
|||
|
void _ji_free_widget (JWidget widget);
|
|||
|
Libera el widget para que pueda ser utilizado por otro nuevo
|
|||
|
widget. Esta funci<63>n no borra nada del widget, es utilizada por
|
|||
|
jwidget_free, as<61> que no deber<65>a utilizarla NUNCA.
|
|||
|
|
|||
|
void _ji_free_all_widgets (void);
|
|||
|
Libera la memoria utilizada por todas las widgets. Nunca llame esta
|
|||
|
funci<63>n directamente. Usted no deber<65>a preocuparse por utilizarla
|
|||
|
debido a que se llama internamente cuando sea necesario (cuando se
|
|||
|
elimina el primer "manager" creado).
|
|||
|
|
|||
|
bool _ji_is_valid_widget (JWidget widget);
|
|||
|
|
|||
|
int _ji_system_init (void);
|
|||
|
void _ji_system_exit (void);
|
|||
|
|
|||
|
int _ji_font_init (void);
|
|||
|
void _ji_font_exit (void);
|
|||
|
|
|||
|
bool _jwindow_is_moving (void);
|
|||
|
Devuelve TRUE si en este momento el usuario est<73> moviendo una
|
|||
|
ventana.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
=========================================
|
|||
|
============ Actualizaciones ============
|
|||
|
=========================================
|
|||
|
|
|||
|
Jinete comenz<6E> con Allegro Sprite Editor (ASE) y continuar<61> muy cerca
|
|||
|
de <20>l. Vea la p<>gina de ASE para tener noticias sobre esta librer<65>a:
|
|||
|
|
|||
|
http://ase.sourceforge.net/
|
|||
|
|
|||
|
Si quiere saber m<>s sobre el autor:
|
|||
|
|
|||
|
http://www.davidcapello.com.ar/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
=========================================
|
|||
|
============ Agradecimientos ============
|
|||
|
=========================================
|
|||
|
|
|||
|
Gracias a:
|
|||
|
|
|||
|
Shawn Hargreaves y a todos los que ayudaron con Allegro.
|
|||
|
|
|||
|
Richard M. Stallman y todo el mundo que participa en las proyectos GNU
|
|||
|
como GCC, Emacs, etc.
|
|||
|
|
|||
|
David Turner, Robert Wilhelm, y Werner Lemberg por The FreeType library.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|