Indice

Introduzione al linguaggio Vala

Autore: Fabio Di Matteo
Ultima revisione: 05/06/2015 - 12:58

In questo articolo si trova una minimale introduzione al linguaggio Vala usando le librerie Gtk+-3.0 .
Andremo a caricare un'interfaccia realizzata con glade e utilizzeremo il sistema di callback per implementare una specie di contatore di click su di un bottone.

Tutorial interessanti: Introduction to GTK+ Programming Using Vala

Codice

simple.vala

using Gtk;
 
 
//variabili globali
static Entry txt;
static int c=0;
 
public void on_button1_clicked (Button source) {
 
    //implemento un contatore sull'etichetta del bottone
    c++;
    string testo= txt.get_text()+" "+ c.to_string();
    source.label = testo;
 
}
 
 
 
int main (string[] args) {
    Gtk.init (ref args);
 
 
    try { //Provo a leggere il file della gui 
 
        //Carico la gui
        var builder = new Builder ();
        builder.add_from_file ("gui.ui");
 
        //Autoconnetto i segnali alla callbacks
        builder.connect_signals (null);
 
        //Prelevo il puntatore ad una casella di testo dell'interfaccia (entry1)
        txt = builder.get_object ("entry1") as Entry;
        txt.set_text("Prova vala sul campo... ");  //assegno del testo
 
 
        //Prelevo il puntatore alla finestra principale (window1)
        var window = builder.get_object ("window1") as Window;
 
 
        //Mostro la finestra principale
        window.show_all ();
        Gtk.main ();
 
    } catch (Error e) {
        stderr.printf ("Problemi nel leggere il file della gui: %s\n", e.message);
        return 1;
    }
 
    return 0;
}

Makefile

CPP = valac
OPTS = --pkg gtk+-3.0 --pkg gmodule-2.0 

all:
	$(CPP)  simple.vala  $(OPTS) -o simple

clean:
	rm simple

Versione orientata agli oggetti dell'esempio precedente (con builder.connect_signals )

intermedio.vala

using Gtk;
 
 
 
public class finestraPrincipale : GLib.Object {
 
    /* Campi */
    public static Entry txt;
    public static Button btn;
	private static int c=0;
 
    /* Attenzione !!!  Callbacks 
     * 
     * Attenzione perche' in glade il nome della callback da collegare
     * diventa "finestra_principale_on_button1_clicked", da notare la
     * trasformazione del camelcase. Tutto deve essere trasformato in 
     * minuscolo e tra la lettera minuscola e quella maiuscola viene 
     * aggiunto un underscore "_"  . 
     * 
     * Dunque "finestraPrincipale.on_button1_clicked()" diventa nel 
     * gestore dei segnali di Glade: "finestra_principale_on_button1_clicked" 
     * 
     * */
    public void on_button1_clicked ()  
    {
		//implemento un contatore sull'etichetta del bottone
		c++;
		string testo= txt.get_text()+" "+ c.to_string();
		btn.label = testo;
    }
 
 
    /* Construttore */
    public finestraPrincipale() 
    {
 
    }
 
	public void show()
	{
			try { //Provo a leggere il file della gui 
 
			//Carico la gui
			var builder = new Builder ();
			builder.add_from_file ("gui.ui");
 
			//Autoconnetto i segnali alla callbacks
			builder.connect_signals (null);
 
			//Prelevo il puntatore ad una casella di testo dell'interfaccia (entry1)
			txt = builder.get_object ("entry1") as Entry;
			txt.set_text("Prova vala sul campo... ");  //assegno del testo
 
			btn=builder.get_object ("button1") as Button;
 
			//Prelevo il puntatore alla finestra principale (window1)
			var window = builder.get_object ("window1") as Window;
 
 
			//Mostro la finestra principale
			window.show_all ();
 
 
		} catch (Error e) {
			stderr.printf ("Problemi nel leggere il file della gui: %s\n", e.message);
 
		}
	}
 
}
 
 
 
 
int main (string[] args) {
    Gtk.init (ref args);
    finestraPrincipale myWin = new finestraPrincipale();
    myWin.show();
 
	//Ciclo principale Gtk
	Gtk.main ();
 
 
    return 0;
}

Il makefile è praticamente lo stesso a quello usato per il primo esempio.
In merito al commento sulla trasformazione del nome della callbac su glade potete consultare anche la documentazione ufficiale Loading_User_Interface_from_XML_File .

Includere il file della gui gtkbuilder dentro l'eseguibile

main.vala

using Gtk;
 
 
 
public class finestraPrincipale : GLib.Object {
 
	public static Button btn;
	public static Window window;
 
 
    public void on_button1_clicked ()  
    {
		window.set_title("Hai cliccato");
		print("Hai cliccato!");
    }
 
 
    /* Construttore */
    public finestraPrincipale() 
    {
 
    }
 
	public void show()
	{
			try { //Provo a leggere il file della gui 
 
			//Carico la gui
			var builder = new Builder ();
			builder.add_from_resource("/myapp/risorse/gui.xml");
 
			//Connetto i segnali alla callbacks
			builder.connect_signals (null);
 
			//Button1
			btn=builder.get_object ("button1") as Button;
			btn.clicked.connect(on_button1_clicked);
 
			//Prelevo il puntatore alla finestra principale (window1)
			window = builder.get_object ("window1") as Window;
			window.destroy.connect(Gtk.main_quit);
 
			//Mostro la finestra principale
			window.show_all ();
 
 
		} catch (Error e) {
			stderr.printf ("Problemi nel leggere il file della gui: %s\n", e.message);
 
		}
	}
 
}
 
 
 
 
int main (string[] args) {
    Gtk.init (ref args);
    finestraPrincipale myWin = new finestraPrincipale();
    myWin.show();
 
	//Ciclo principale Gtk
	Gtk.main ();
 
 
    return 0;
}

risorse.xml

<?xml version="1.0" encoding="UTF-8"?>
<gresources>
  <gresource prefix="/myapp/risorse">
    <file preprocess="xml-stripblanks">gui.xml</file>
  </gresource>
</gresource>

makefile

CPP = valac-0.30
OPTS = --pkg gtk+-3.0 --pkg gmodule-2.0 

all:
	glib-compile-resources --generate-source risorse.xml
	$(CPP)  main.vala  risorse.c $(OPTS) -o main

clean:
	rm main