====== 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:
[[http://www.abenga.com/postseries/introduction-to-gtk+-programming-using-vala/|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 [[https://wiki.gnome.org/Projects/Vala/GTKSample#Loading_User_Interface_from_XML_File|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**
gui.xml
**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