Paola Magillo, Univestita' di Genova, Corso di Interfacce Utente per Informatica, a.a. 2002-2003.

STRUTTURA E FUNZIONAMENTO DI UN'INTERFACCIA UTENTE

Richiamo

Finestra finestra = qualsiasi area sullo schermo che viene gestita come risorsa individuale

Le finestre sono organizzate in gerarchia di contenimento, ci sono finestre a top-level (gestite dal window manager) e sottofinestre.

Struttura di un'interfaccia

Una interfaccia utente grafica e' costituita da:

Da qui in poi per finestre intendiamo (dove non specificato) finestre top-level.

Alcuni usano il termine componenti di interfaccia per indicare sia le finestre che i dispositivi, altri solo per i dispositivi.

Dispositivi di un'interfaccia

Oggetti con aspetto grafico e sensibilita' a particolari eventi che "popolano" una finestra e permettono interazione con l'utente.

Sono costruiti dal programmatore usando la libreria API del sistema a finestre (WMS) oppure (di solito) sono forniti da un toolkit per sviluppo di interfacce.

Terminologia:

Alcuni usano lo stesso termine per indicare sia le finestre che i dispositivi.

Tipi di dispositivi

I dispositivi forniti da un toolkit si classificano in diversi tipi (o classi), ciascun tipo con certe caratteristiche di aspetto / comportamento.

Programmazione guidata da eventi
(o Event-driven programming)

Il comportamento di un programma dotato di interfaccia utente grafica e' di tipo reattivo.

Sono le azioni compiute dell'utente sui dispositivi di input a determinare il flusso del programma.

Il comportamento del programma consiste in reazioni agli eventi prodotti dal WMS a seguito delle azioni dell'utente.

Compito dell'interfaccia e' raccogliere l'evento e scatenare la reazione.

La reazione ad un evento puo' comportare:

Funzionamento

Schema del funzionamento interno di un'applicazione guidata da eventi.

NOTA:
Il codice del programma che realizza un'interfaccia che usi direttamente la API del WMS e' composto di queste parti.
Se l'interfaccia e' realizzata con un toolkit, il codice del programma che realizza l'interfaccia non conterra' tutte queste parti. Molte saranno implementate all'interno del toolkit in modo trasparente al programmatore.

  1. Inizializzazione

  2. Ciclo degli eventi. Ad ogni giro:

Interazione bloccante e non bloccante

Riguarda la gestione del ciclo degli eventi.

In alcuni pacchetti l'interazione non bloccante e' gestita introducendo uno speciale evento nullo:

Toolkit per lo sviluppo di interfacce grafiche

In generale si possono scrivere interfacce usando la API del WMS, ma e' lungo, noioso e facile a errori.

Esempio

Per creare una finestra contenente un bottone, dove quando l'utente preme il bottone l'applicazione termina, devo:

Difficile scrivere interfacce complesse con la API del WMS, troppo di basso livello.
L'alternativa e' usare un toolkit.

Toolkit: pacchetto che fornisce insieme di elementi di interfaccia pronti all'uso e insieme di funzioni (API) per utilizzarli nella creazione di un'interfaccia.

La API del toolkit e' di livello piu' alto rispetto alla API della libreria di base fornita dal WMS.

Scrivere interfacce usando un toolkit e' piu' facile e veloce:

Procedure callback

Scopo: stabilire che quando accade un certo tipo di evento in un certo widget deve si compiere una certa reazione.

Senza un toolkit, il programmatore dovrebbe gestire a mano il ciclo degli eventi.
Ad ogni evento verificatosi, dovrebbe eseguire una selezione (switch) in base al tipo di evento e alla finestra in cui e' avvenuto:

Fattibile solo in programmi piccoli.

I toolkit per sviluppo di interfacce grafiche forniscono un meccanismo piu' comodo.

Callback: procedura dell'applicazione che viene registrata per essere eseguita automaticamente dal sistema al verificarsi di un dato evento in un dato widget.

Le procedure callback specificano il comportamento dei widget.

In fase di inizializzazione, la procedura viene definita e registrata cioe' collegata al widget e all'evento in questione.

Il ciclo degli eventi e' gestito automaticamente, dal toolkit: all'occorrere di un evento in un widget, chiama la callback registrata per quell'evento e quel widget (se ne e' stata registrata una).

Il programmatore deve solo:

Il toolkit gestira' al suo interno, in modo trasparente all'applicazione, il ciclo degli eventi:

Schema di funzionamento rivisto

Con l'uso di un toolkit, lo schema dell'applicazione diventa:

  1. Inizializzazione

  2. Ciclo degli eventi.

Esempio

Per creare una finestra contenente un bottone, dove quando l'utente preme il bottone l'applicazione termina (stesso esempio visto prima), devo:

Il toolkit si preoccupa di eseguire la serie di richieste al server necessaria per realizzare il bottone e per gestire gli eventi su di esso.

La comunicazione col server avviene internamente al toolkit, in modo trasparente per l'applicazione.

Collocazione del toolkit nello schema client-server:

+-------------------------------+           +--------------+
|            CLIENT             |           |              |
| +------------+      +-------+ |   (rete)  |              |
| |applicazione|------|toolkit|----------------  SERVER    |
| +------------+ API  +-------+ |    API    |              |
|            del toolkit        |  del WMS  |              |
+-------------------------------+           +--------------+

Interazione non bloccante

Lo schema visto sopra corrisponde a interazione bloccante. Come si realizza interazione non bloccante, cioe' come posso eseguire operazioni anche in assenza di eventi ?

Widgets ed eventi

Toolkit fornisce oggetti di finestra o widget (= window object). Questi sono gli elementi di interfaccia pronti all'uso (bottoni, menu'...).

Dal punto di vista dell'utente dell'interfaccia un widget e' caratterizzato da:

Dal punto di vista del programmatore un widget e' caratterizzato da:

Esempi:

Due categorie fondamentali di widget:

Mediante i contenitori si struttura la gerarchia di annidamento dell'interfaccia. Meccanismo a scatole cinesi. Con contenitori posso raggruppare widget concettualmente collegati, disegnare bordi e cornici.

In genere widget di un toolkit sono organizzati in classi secondo la filosofia object oriented (questo anche se il toolkit e' scritto in un linguaggio non object-oriented).
C'e' una classe per ciascun tipo di widget fornito dal toolkit. Creare un widget = creare un'istanza della classe opportuna.

Gestione degli eventi nei widget

Event dispatching: in un programma realizzato tramite un toolkit, gli eventi inviati dal WMS non sono visibili direttamente, ma solo attraverso i widget.

Il toolkit gestisce direttamente la coda degli eventi tramite un event loop.

Quando arriva un evento dal WMS, il toolkit attiva il widget a cui l'evento si riferisce (cioe' il widget che corrisponde alla event window).

Widget puo' gestire un evento come:

Nota: evento di widget puo' essere causato anche da una sequenza di eventi del WMS (es. doppio click).

Esempi

Un widget bottone del tipo che si evidenzia quando l'utente ci passa sopra col mouse e scatta quando preme:

Un widget di tipo campo testuale (per l'immissione di una stringa di testo):

In un widget di tipo "slider" (barra di scorrimento per l'immissione di un valore numerico in un certo intervallo):

Eventi del toolkit

Gli eventi che toolkit passa all'applicazione non sono necessariamente gli stessi eventi del sistema a finestre (WMS).

Molti sono eventi a piu' alto livello di astrazione. Esempi:

Inoltre ci sono eventi che non hanno controparte nel WMS. Esempio: evento generato da timer (ved. interazione non bloccante).

GUI Designer

Un toolkit puo' fornire un GUI Designer. Programma interattivo che permette la progettazione di interfacce grafiche basate su tale toolkit.

Il GUI Designer produce il codice relativo all'interfaccia.

Il programmatore deve solo riempire il corpo delle procedure callback associate ai widget.