ProgramacionGTKenC/CapituloV

De Wiki GNOME Chile
Saltar a: navegación, buscar

Contenido

Widgets Misceláneos

Ahora veremos algunos widgets bastante interesantes.

Tooltip

Un tooltip es una indicación de texto cuando se desplaza el mouse sobre algun control, o alguna zona de pantalla.

Tooltip.jpg

El funcionamiento es muy simple. En vez de crear una variable GtkWidget, se crea una variable de tipo GtkTooltips. Luego, se puede asociar algun texto con respecto a un control en particular.

Veamos el ejemplo.

 #include <gtk/gtk.h>

int main (int argc, char * argv[])
{
	GtkWidget *ventana;
	GtkWidget *boton;
	GtkTooltips *tooltip;
	
	gtk_init (&argc, &argv);

	ventana = gtk_window_new (GTK_WINDOW_TOPLEVEL);
	boton = gtk_button_new_with_label ("Click me!");
	tooltip = gtk_tooltips_new ();

	gtk_tooltips_set_tip (tooltip, 
			      boton, 
			      "Por favor, haz click!", 
			      NULL);

	gtk_container_add ((GtkContainer *) ventana, boton);
	gtk_widget_show_all (ventana);
	gtk_main();
}

Al desplazar el mouse sobre el boton, se vera algo así:

Tooltip2.jpg

Una de las cosas interesantes del control de tooltip es que es reciclable. Es decir, se puede usar el mismo tooltip para distintos controles.

#include <gtk/gtk.h>

int main (int argc, char * argv[])
{
	GtkWidget *ventana;
	GtkWidget *caja;
	GtkWidget *boton1;
	GtkWidget *boton2;
	GtkTooltips *tooltip;
	
	gtk_init(&argc, &argv);

	ventana = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	boton1 = gtk_button_new_with_label("Click me first!");
	boton2 = gtk_button_new_with_label("Click me next!");
	caja = gtk_hbox_new(TRUE, 3);
	tooltip = gtk_tooltips_new();

	gtk_box_pack_start ((GtkBox *) caja,
			    boton1,
			    TRUE,
			    TRUE,
			    2);

	gtk_box_pack_start ((GtkBox *) caja,
			    boton2,
			    TRUE,
			    TRUE,
			    2);


	gtk_tooltips_set_tip (tooltip, 
			     boton1, 
			     "Por favor, haz click!", 
			     NULL);

	gtk_tooltips_set_tip (tooltip,
			      boton2,
			      "Y despuez, click aca!",
			      NULL);

	gtk_container_add((GtkContainer *) ventana, caja);
	gtk_widget_show_all(ventana);
	gtk_main();
}

Barra de Progreso

Las barras de progreso se usan para mostrar el estado de una operacion (sobre todo en operaciones lentas).

#include <gtk/gtk.h>

static gboolean funcion_progreso (gpointer data)
{
	gdouble fraccion;

	fraccion = gtk_progress_bar_get_fraction((GtkProgressBar *) data);

	fraccion+= 0.01;

	if (fraccion > 1.0)
		fraccion = 0.0;

	gtk_progress_bar_set_fraction((GtkProgressBar*) data, fraccion);

}

int main (int argc, char * argv[])
{
	GtkWidget * ventana;
	GtkWidget * progreso;

	gtk_init(&argc, &argv);

	ventana = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	progreso = gtk_progress_bar_new();

	gtk_container_add((GtkContainer *) ventana, progreso);

	// para el dibujado del progreso, vamos a usar un timeout
	g_timeout_add(100, funcion_progreso, progreso);
	
	gtk_widget_show_all(ventana);
	gtk_main();
}

Estos sirven para mostrar una informacion rapida para el usuario, o bien para pedir confirmacion para una accion.

La solucion tipica seria crear una ventana para mostrar estos datos, pero usar un cuadro de dialogo es una solucion mucho mas elegante.

Este ejemplo tiene algunas cosas que es preferible destripar a futuro dentro de este curso, y es que algunos widgets poseen widgets dentro.

Veamos este ejemplo:

#include <gtk/gtk.h>

void accion_boton (GtkButton * boton, gpointer data)
{
	GtkWidget * dialogo;

	dialogo = (GtkWidget *) data;

	if (GTK_WIDGET_VISIBLE(dialogo))
	{
		gtk_widget_hide_all(dialogo);
	}
	else
	{
		gtk_widget_show_all(dialogo);
	}	

}


void accion_dialogo (GtkDialog * dialogo, gint response, gpointer data)
{
	switch(response)
	{
		case GTK_RESPONSE_ACCEPT:
			printf("Planeta destruido :) \n");
			break;
		case GTK_RESPONSE_REJECT:
			printf("Destruccion cancelada :) \n");
			break;
		default:	
			break;
	}

	gtk_main_quit();

}

int main (int argc, char * argv[])
{
	
	GtkWidget * ventana;
	GtkWidget * boton;
	GtkWidget * dialogo;
	GtkWidget * etiqueta;

	gtk_init(&argc, &argv);

	ventana = gtk_window_new (GTK_WINDOW_TOPLEVEL);
	boton = gtk_button_new_with_label ("Click Me!");
	dialogo = gtk_dialog_new_with_buttons("Destruir el planeta?",
					      (GtkWindow *) ventana,
					      GTK_DIALOG_DESTROY_WITH_PARENT,
					      "_Destruir", GTK_RESPONSE_ACCEPT,
					      "_Abortar", GTK_RESPONSE_REJECT,
					      NULL);

	etiqueta = gtk_label_new("Desea destruir el planeta? \n\
Por favor, tenga en cuenta que la aniquilacion de un planeta \n\
es raramente considerado un acto amistoso.");

	gtk_dialog_set_default_response((GtkDialog *) dialogo, 
					GTK_RESPONSE_REJECT);


	gtk_box_pack_start((GtkBox *) ((GtkDialog *) dialogo)->vbox,
			   etiqueta,
			   TRUE,
			   TRUE,
			   0);

	g_signal_connect((GObject *) dialogo, 
			 "response", 
			 (GCallback ) accion_dialogo, 
			 NULL);

	g_signal_connect((GObject *) boton,
			 "clicked",
			 (GCallback) accion_boton,
			  dialogo);


	gtk_container_add((GtkContainer *) ventana,
			  boton);

	gtk_widget_show_all(ventana);
	gtk_main();
}

Herramientas personales
Espacios de nombres

Variantes
Acciones
Navegación
Herramientas