Botones

GtkButton

Existen varias formas de crear botones. Se puede usar la función gtk_button_new_with_label() o gtk_button_new_with_mnemonic() para crear un botón con etiqueta, gtk_button_new_with_stock() para crear un botón que contenga la imagen y el texto desde un stock item, o gtk_button_new() para crear un botón en blanco. Si se desea, se puede añadir una etiqueta o una imagen en este nuevo botón. Para hacerlo, se crea una nueva caja, se empaquetan los objetos en la caja usando gtk_box_pack_start(), y se usa gtk_container_add() para incluir la caja en el botón.

Aquí se muestra un ejemplo de uso de gtk_button_new(), para crear un botón que contenga una imagen y una etiqueta. Se ha separado la parte del código para crear una caja, para poder reusarlo otros programas. Habrá ejemplos más específicos del uso de imágenes, a medida que se avanza en el libro.

      

La función xpm_label_box() puede ser usada para empaquetar imágenes y etiquetas en cualquier widget que pueda ser un contenedor.

El widget GtkButton, dispone de las siguiente señales:

  • pressed - emitido cuando el puntero es pulsado en el widget GtkButton.

  • released - emitido cuando el puntero es levantado del widget GtkButton.

  • clicked - emitido cuando el puntero el pulsado y levantado del widget GtkButton.

  • enter - emitido cuando el puntero entra en el widget GtkButton.

  • leave - emitido cuando el puntero abandona el widget GtkButton.

GtkToggleButton

Este tipo de botones derivan de los normales y son muy similares, con la execepción que siempre estarán en un estado de los dos posibles, alternados mediante un click. Puede estar pulsado, y cuando se vuelva a hacer click de nuevo, se despulsará. Un nuevo click, y volverá a estar pulsado.

El widget GtkToggleButton es la base para los widgets GtkCheckButton y GtkRadioButton, de tal forma, que muchas de las llamadas del GtkToggleButton son heredadas por estos.

Para crear un GtkButtonToggle, se usan las siguientes funciones:

	 GtkWidget*	gtk_toogle_button_new			(void);
	 GtkWidget*	gtk_toogle_button_new_with_label	(const gchar *label);
	 GtkWidget*	gtk_toogle_button_new_with_mnemonic	(const gchar *label);
	

Como se puede ver, estas funciones son similares a las de los botones normales. La primera crea un botón, mientras que la segunda crea un botón con una etiqueta ya empaquetada. La variante _mnemonic analiza la etiqueta, para incluir caracteres mnemotécnicos.

Para saber cual es el estado de un GtkToggleButton, incluidos GtkRadioButton y GtkCheckButton, se usa una de las macros del siguiente ejemplo. Estas comprueban el estado del GtkToggleButton accediendo a un campo de la estructura del botón, despues de usar la macro GTK_TOGGLE_BUTTON, para moldear el puntero a widget, a un puntero a GtkToggleButton. La señal de interés emitida por el GtkToggleButton y sus hijos, es la señal toggled. Para comprobar el estado de estos botones, normalmente se utiliza un capturador para la señal toggled y se accede a la estructura para determinar su estado. La función de callback, será algpo parecido a:

	void toggle_button_callback (GtkWidget *widget, gpointer data)
	{
		if (gtk_toggle_button_get_activate (GTK_TOGGLE_BUTTON (widget)))
		{
			/* Si el control llega aquí, es que el botón se encuentra pulsado */
		} else {
			/* Si se llega aquí, el botón no está pulsado */
		}
	}
	

Para forzar el estado de un GtkToggleButton, se usa la siguiente función:

	void gtk_toggle_button_set_activate (GtkToggleButton *toggle_button,
					     gboolean        is_activate);
	

El primer argumento es el botón al que se quiere imponer un estado, y el segundo será TRUE cuando se quiere que el botón esté pulsado, o FALSE cuando no lo esté. Por defecto será no pulsado o FALSE.

Cabe resaltar, que cuando se usa la función gtk_toogle_button_set_activate (), y se cambia el estado actual, hace que el botón emita las señales clicked y toggled, según corresponda.

	gboolean gtk_toogle_button_get_activate (GtkToggleButton *toggle_button);
	

Esta función devuelve el estado del GtkToggleButton, mediante un valor gboolean TRUE o FALSE.

GtkCheckButton

El GtkCheckButton hereda muchas funciones y propiedades del GtkToggleButton anterior, pero tiene diferente apariencia. En vez de ser botones con el texto incluido, son pequeños cuadrados con el texto a su derecha. Son usados normalmente para seleccionar o quitar opciones en las aplicaciones.

Las funciones para crearlos son similares a las usadas para el GtkButton

	GtkWidget*	gtk_check_button_new			(void);
	GtkWidget*	gtk_check_button_new_with_label		(const gchar *label);
	GtkWidget*	gtk_check_button_new_with_mnemonic	(const gchar *label);
	

La función gtk_check_button_with_label() crea un botón con la etiqueta a su derecha.

Para comprobar el estado de un GtkCheckButton se usan las mismas funciones que para el GtkToggleButton.

GtkRadioButton

GtkRadioButton es similar a GtkCheckButton salvo porque éstos se encuentran agrupados de tal forma que sólo uno de ellos puede estar seleccionado. Esto sirve para aplicaciones donde se tiene que seleccionar una opción dentro de una lista.

Para crear un GtkRadioButton se usa una de las siguientes funciones:

	 GtkWidget*	gtk_radio_button_new			(GSList *group );
	 GtkWidget*	gtk_radio_button_new_from_widget	(GtkRadioButton *group );
	 GtkWidget*	gtk_radio_button_new_with_label		(GSList *group,
			 const gchar  *label );
	 GtkWidget*	gtk_radio_button_new_with_label_from_widget	(GtkRadioButton *group,
		 const gchar    *label );
	 GtkWidget*	gtk_radio_button_new_with_mnemonic	(GSList *group,
		 const gchar  *label );
	 GtkWidget*	gtk_radio_button_new_with_mnemonic_from_widget	(GtkRadioButton *group,
		 const gchar  *label );
	 

Hay que resaltar que hay un nuevo argumento en estas funciones. Necesitan una lista para poder funcionar correctamente. La primera vez que se llame a gtk_radio_button_new () o gtk_radio_button_new_with_label (), se le debe pasar NULL como primer argumento. Luego, se creará un grupo usando la función:

	 GSList*	gtk_radio_button_get_group(	GtkRadioButton *radio_button);
	 

Lo más importante que hay recordar aquí es que gtk_radio_button_get_group debe ser usada cada vez que se añada un nuevo botón, con el botón nuevo previamente usado como argumento. El resultado, es utilizado para la siguiente llamada a gtk_radio_button_new () o gtk_radio_button_new_with_label (). Esto permite establecer una cadena de botones. El siguiente ejemplo debería de aclarar esto.

Se puede suprimir todo esto usando la siguiente sintaxis, que elimina la necesidad de la variable para mantener la lista de botones.

	button2 = gtk_radio_button_new_with_label(
				gtk_radio_button_get_group (GTK_RADIO_BUTTON (button1)),
			        "button2");
	

La variante _from_widget de las funciones de creación permite acortar esto más aún, omitiendo la llamada a gtk_radio_button_get_group. Esta forma es usada en el ejemplo para crear el tercer botón.

	button2 = gtk_radio_button_new_with_label_from_widget(
	                  GTK_RADIO_BUTTON (button1),
			  "button2");
	

Es también una buena idea establecer el botón que debe de estar por defecto pulsado con:

	void gtk_toggle_button_set_active( GtkToggleButton *toggle_button,
	                                   gboolean        state );
	

Esto se describe en la zona de GtkToggleButton y funciona exactamente de la misma forma. Una vez que los GtkRadioButton están agrupados, sólo uno del grupo debe de estar seleccionado. Si el usuario selecciona otro GtkRadioButton, y luego en otro, el primero emitirá la señal toggled (para indicar que ha sido desactivado) y el segundo la señal toggled (para indicar que ha sido activado).

El siguiente ejemplo muestra la creación de un grupo de tres GtkRadioButtons: