vai alla Homepage di Apogeonline

 



Cos'è OpenPress
Glossario
Linux-FAQ
Documenti:

Open Source Definition

GNU General Public License

La cattedrale e il bazaar

Colonizzare la noosfera

Il calderone magico


Libri:

Italian crackdown

Open Sources

MediaMorfosi

GTK+/GNOME
sviluppo applicazioni


Telematica per la pace

Linux HOWTO: Installazione e configurazione

Linux HOWTO: Networking


Risorse
Feedback
vai alla Homepage di Apogeo Editore

Vai alla homepage di OpenPress

GTK+ / Gnome Sviluppo di Applicazioni


Finestre di dialogo modali

Talvolta è necessario prevenire l'interazione con il resto dell'applicazione quando l'utente sta modificando una finestra di dialogo. I dialoghi che bloccano il resto dell'applicazione in questo modo vengono chiamati modali.

È in corso un dibattito molto acceso sulle modalità di uso dei dialoghi modali. Alcuni utenti nutrono un odio particolare per questi, ma in alcuni casi sono strettamente necessari. Sfortunamente, è molto più semplice scrivere un dialogo modale, poichè ci possiamo fermare nel bel mezzo di una funzione, aspettare la risposta dell'utente, e poi continuare. Con i dialoghi non modali invece tornate immediatamente al flusso principale dell'applicazione, e creare le callback che gestire ciò che avete già abbandonato, una volta che l'utente termina l'interazione con la finestra. Se implementate una complessa sequenza di finestre il risultato sarà un orrendo spaghetti-code. Questa è una tentazione che porta gli sviluppatori ad usare sempre dialoghi modali, o per lo meno la maggior parte delle volte. Allontantate la tentazione, e gli utenti vi ringrazieranno.

Evitate i dialoghi modali se l'utente può voler far riferimento alle informazioni contenuto nella finestra principale durante l'uso di questi, oppure se desiderano eseguire una operazione di taglia & incolla tra la finestra principale e il dialogo. Le finestre "Proprietà" devono essere solitamente non modali, in modo che l'utente possa sperimentare gli effetti delle modifiche che apporta, senza dover chiudere ogni volta la finestra.

Sono siete spaventati dall'uso dei dialoghi modali se esiste una vera ragione per utilizzarli. Ad esempio, ho scritto una applicazione per il gestore di pacchetti di Debian, chiamato gnome-apt. La finestra principale permette di selezionare i pacchetti da installare o rimuovere, quindi una serie di dialoghi chiedono conferma ed eseguono le modifiche. Questi dialoghi sono modali, poichè non avrebbe senso cambiare il tipo di richieste mentre questa viene effettuata. Un altro esempio: la finestra "Proprietà del File" del File Manager di Gnome è modale, poichè l'utente potrebbe eliminare il file mentre ne cambia le proprietà: una situazione molto, molto strana. Utilizzate il vostro giudizio personale per ogni dialogo, pensando a tutte le operazione che l'utente può effettuare.

Detto questo, creiamo un dialogo modale, in modo molto semplice. In GTK+ qualunque finestra può essere resa modale attraverso l'uso di gtk_window_set_modal() ( Figura 5 ).

#include <gtk/gtkwindow.h>

gtk_window_set_modal(GtkWindow* window, gboolean modality);

Figura 5. Finestre modali

Dato che GnomeDialog è una sottoclasse di GtkWindow, questa funzione funziona perfettamente. Semplicemente elimina la possibilità di interagire con tutte le finestre all'infuori che quella modale.

Tipicamente si desidera andare ben oltre, aspettando che l'utente prema uno dei pulsanti del dialogo senza creare svariate callback. In GTK+ questa operazione viene eseguita avviando una seconda istanza di gtk_main(), entrano in un ciclo di eventi annidato. Quando questo secondo ciclo termina, il controllo di flusso torna alla prima chiamata di gtk_main().

	  #include <libgnomeui/gnome-dialog.h>

gint gnome_dialog_run(GnomeDialog* dialog);

gint gnome_dialog_run_and_close(GnomeDialog* dialog);

Figura 6. Avviare un dialogo

Queste due funzioni eseguono il blocco finchè l'utente non preme un pulsante del dialogo, il pulsante di chiusura del gestore di finestre o l'equivalente tramite tastiera. Se un pulsante è premuto, queste ritornano il numero del pulsante. Ricordate che i pulsanti di GnomeDialog sono numerati da sinistra a destra iniziando da 0. Se nessun pulsante viene premuto (es. quando la finestra è chiusa tramite il gestore di finestre), queste tornano il valore -1.

Il dialogo è reso automaticamente modale per la durata della chiamata, altrimenti regnerebbe il caos più completo. (Ad esempio, chiamare gtk_main_quit() dal codice principale dell'applicazione chiuderebbe il gtk_main() annidato piuttosto che il ciclo primario). Ad ogni modo, se intendete lasciare aperto il dialogo dopo il ritorno di gnome_dialog_run(), e che resti sempre modale, dovete manualmente renderlo modale. gnome_dialog_run() modificherà la modalità del dialogo solo temporaneamente.

È una vostra responsabilità di gestire la chiusura del dialogo prima di chiamare gnome_dialog_run(). Potete impostare questo in modo che nessuna azione da parte dell'utente possa eliminarlo, quindi eliminarlo manualmente dopo che la la funzione gnome_dialog_run() è ritornata. Oppure potete fare in modo che qualunque azione dell'utente lo elimini, quindi dimenticarvene dopo il ritorno della chiamata a gnome_dialog_run(). È inoltre possibile scrivere un ciclo, chiamando gnome_dialog_run() ripetutamente finchè l'utente non fornisce un input valido, e chiudere il dialogo solo dopo la fine del ciclo. Se scrivete un ciclo, prestate molta attenzione a rendere, manualmente, il dialogo modale, altrimenti otterrete dei brevi intervalli dove non ci devono essere.

gnome_dialog_run_and_close() monitorizza i segnali del dialogo "close" e "destroy", e chiude il dialogo se e solo se non viene chiuso correttamente in risposta ad un input da parte dell'utente. L'utilizzo di questa funzione garantisce che gnome_dialog_close() venga chiamata una unica volta prima che questa ritorni, a meno che non vengano associate a questa delle funzioni callback tremendamente maligne e perfide, al fine di sabotare il processo. gnome_dialog_run_and_close() non è, nella mia opinione, utile. Non è niente più che un altro modo per evitare di pensare a come venga chiusa una finestre di dialogo.


Copyright © 1995-1999 Apogeo srl, Milano