Home > Guide veloci, programmazione > Guida Gtk+ a puntate ( VIII parte )

Guida Gtk+ a puntate ( VIII parte )

Bene, questo post sarà il mio trampolino di lancio per le prossime puntate.. il primo post scritto direttamente nel blog e al momento.
Proviamo, speriamo che non esca un obbrobrio.

In questa puntata vedremo i dialoghi di assistenza, conosciuti nelle gtk+ come GtkAssistant che sono molto utili nelle procedure guidate. Iniziamo.

Dialoghi di Assistenza

I dialoghi di assistenza sono dei dialoghi composti da tante pagine che possono essere cambiate tramite dei pulsanti in fondo al dialogo che possono essere: Avanti, Indietro, Ultimo, Applica, Annulla, Primo.
Proprio per questa particolarità quando operiamo con un dialogo di questo tipo ci dobbiamo un po’ incasinare la vita con le funzioni, ma sono semplicissime da gestire. Innanzitutto vediamo com’è composta la funzione principale per la creazione di questo dialogo.

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
void main_assistant (void)
{
 static GtkWidget *assistant = NULL;
 int i = 0;
 
 if ( !assistant ) {
      assistant = gtk_assistant_new ();
      gtk_window_set_default_size (GTK_WINDOW (assistant), 460, 235);
      gtk_window_set_modal (GTK_WINDOW (assistant), TRUE);
 
      g_signal_connect (G_OBJECT (assistant), "cancel", G_CALLBACK (on_assistant_close_cancel), NULL);
      g_signal_connect (G_OBJECT (assistant), "close",  G_CALLBACK (on_assistant_close_cancel), NULL);
      g_signal_connect (G_OBJECT (assistant), "apply",  G_CALLBACK (on_assistant_apply), assistant);
      g_signal_connect (G_OBJECT (assistant), "prepare", G_CALLBACK (on_assistant_prepare), NULL);
 
      make_page_one (GTK_ASSISTANT (assistant));
      make_page_two (GTK_ASSISTANT (assistant));
      /* Etc.. etc.. */
 }
 
 if ( !GTK_WIDGET_VISIBLE (assistant) )
      gtk_widget_show (assistant);
 else {
      gtk_widget_destroy (assistant);
      assistant = NULL;
 }
}

Dopodichè si possono creare le varie pagine.. e adesso vediamo come.

La creazione di una nuova pagina è molto semplice  innanzitutto si crea tutta la tabella o box nei quali inserire i vari widget ecc… cioè si crea il contenuto dopodichè si visualizza tutto con gtk_widget_show_all passato al widget superiore e infine si inserisce nel dialogo di assistenza in questo modo:

1
2
3
4
5
6
7
 gtk_assistant_insert_page (assistant, table, i);
 gtk_assistant_set_page_title (assistant, table, "Pagina di test");
 gtk_assistant_set_page_complete (assistant, table, TRUE);
 gtk_assistant_set_page_type (assistant, table, GTK_ASSISTANT_PAGE_CONTENT);
 pixbuf = gtk_widget_render_icon (GTK_WIDGET (assistant), GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG, NULL);
 gtk_assistant_set_page_header_image (assistant, table, pixbuf);
 g_object_unref (pixbuf);

Dunque andiamo per righe:

  1. Abbiamo inserito nel posto “i“  il widget principale, in questo caso una tabella, nel nostro dialogo.
  2. Abbiamo impostato alla pagina dell’assistent contenente come widget principale la tabella il titolo “Pagina di test”
  3. Abbiamo impostato la pagina come completa, cioè si può andare avanti alla pagina successiva o fare applica, di solito una pagina è completa a priori quando contiene parametri facoltativi. La si può impostare in un secondo momento come attiva o non attiva tramite la funzione gtk_assistant_set_page_complete che riceve come parametri il nostro dialogo di assistenza, il widget che corrisponde alla pagina interessata e infine TRUE o FALSE per indicare se la pagina è completa o meno.
  4. Abbiamo impostato il tipo di pagina, i tipi impostabili li si può trovare QUI.
  5. Abbiamo creato una nuova immagine da inserire come “HEADER” ( intestazione ) della pagina.
  6. L’abbiamo inserita.
  7. Abbiamo liberato la memoria occupata da pixbuf.

Ora andiamo a vedere invece come usare tutte le funzioni collegate ai vari segnali che abbiamo visto prima.

La prima è on_assistant_close_cancel che viene chiamata quando il dialogo viene chiuso o annullato.

1
2
3
4
5
static void
on_assistant_close_cancel (GtkWidget *widget, gpointer data)
{
 gtk_widget_hide (widget);
}

In questo caso io ho semplicemente nascosto il dialogo di assistenza, perchè quando si richiama la funzione applica dopo aver recuperato i dati setto tutti i widget com’erano di default.

La seconda è  on_assistant_apply che è inutile vederla dato che dipende da caso a caso cosa andare a recuperare e cosa fare.. viene chiamata solo quando la procedura è finita quindi non ci son molte cose da fare col dialogo di assistenza.

La terza e ultima è on_assistant_prepare che come abbiamo detto viene chiamata quando si passa da una pagina ad un’altra. Queste funzioni naturalmente possono essere usate un po’ come si vuole, io questa qui l’ho usato per impostare il numero della fase corrente sulle fasi totali come titolo del dialogo.

1
2
3
4
5
6
7
8
9
10
11
12
13
static void
on_assistant_prepare (GtkWidget *widget, GtkWidget *page, gpointer data)
{
  gint current_page, n_pages;
  gchar *title;
 
  current_page = gtk_assistant_get_current_page (GTK_ASSISTANT (widget));
  n_pages = gtk_assistant_get_n_pages (GTK_ASSISTANT (widget));
 
  title = g_strdup_printf ("Inserimento Cliente (%d of %d)", current_page + 1, n_pages);
  gtk_window_set_title (GTK_WINDOW (widget), title);
  g_free (title);
}

E con questo è tutto. Abbiamo finito col GtkAssistant.

Fine Ottava Puntata
Ordunque, sembra venuta bene questa puntata.. pensavo peggio. Ora abbiamo finito di occuparci delle finestra, la prossima volta ci occuperemo dei contenitori.
Ciauz ;)

  1. Nessun commento ancora...
  1. Nessun trackback ancora...