mantendo a sanidade com o glade
TRANSCRIPT
Mantendo a Sanidade Com o Glade
Marcelo Lira dos Santos
INdT Recife
"horrores que o homem no deveria saber que existem"
"horrores que o homem no deveria saber que existem"
Processo de criao de uma aplicao grfica:
Criar a interface com alguma aplicao visual
Gerar cdigo
Alterar cdigo gerado
Precisar alterar a interface
Gerar mais cdigo
Re-inserir alteraes no novo cdigo gerado
Voltar indefinidamente ao passo 4
Perder o juzo
"horrores que o homem no deveria saber que existem"
Preliminares
GTK+
Toolkit grfico multiplataforma
Linux, Windows, MacOS X
Escrito em C
Usado por
GNOME
XFCE
Maemo
OLPC
OpenMoko
Widgets
Elemento da interface com o qual o usurio interage
Widget: Window Gadget
Propriedades importantes de um widget:
Identificao (nome)
Estmulos aos quais ele responde
Instrues para disposio (layout)
GTK+
GTK+GDKGLib(all your)
Widgets(are belong to us)Abstrao das funes primitivas de desenho da
plataformaOrientao a Objetos para C
(uau!)
Bindings
C++(gtkmm)Python(PyGTK)Java(Java-GNOME)C#(GTK#/Mono)ValaPHP(PHP-GTK)Perl(gtk2-perl)Haskell(Gtk2Hs)Ruby(Ruby-GNOME2)Lua(lua-gtk)D(DUI)Ada(GtkAda)GTK+Zilhes de bindings
Vantagem: use sua linguagem preferida
Dissecando a Estrutura
Uma aplicao simples num simples ambiente grfico
Dissecando a Estrutura
Servidor X
Gerenciador de Janelas
Janela GDK
Widget da Janela
Demais widgets
Descrevendo a Estrutura
XML
Boa para descrever estrutura
Analisando o Comportamento
Conceitos
Eventos
Main Loop
Sinais
Callbacks
Main Loop, eventos, sinais e callbacks.
Dvidas possveis:
diferena entre sinais e eventos;
propagao de eventos
Camadas
Dizem que uma boa prtica de programao!
Codando
Codando Interfaces
(em C)
#include
void on_button_clicked(GtkWidget *button) { g_print("Botao
clicado.\n"); }
int main(int argc, char *argv[]) {
GtkWidget *window;
GtkWidget *vbox;
GtkWidget *label;
GtkWidget *button;
gtk_init(&argc, &argv);
g_set_application_name("Perdendo a sanidade...");
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
vbox = gtk_vbox_new(FALSE, 2);
label = gtk_label_new("Sou um label!");
gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
button = gtk_button_new_with_label("Me clique!");
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);
g_signal_connect(G_OBJECT(button), "clicked",
G_CALLBACK(on_button_clicked), G_OBJECT(label));
gtk_container_add(GTK_CONTAINER(window), vbox);
g_signal_connect(G_OBJECT(window), "delete_event",
G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
Codando Interfaces
(em Vala)
using GLib;
using Gtk;
public class Hello : Window {
[Widget] protected VBox vbox;
[Widget] protected Label label;
[Widget] protected Button button;
void on_button_clicked(Button button) { stdout.printf("Botao
clicado.\n"); }
construct {
label = new Label("Sou um label!");
button = new Button.with_label("Me clique!");
button.clicked += on_button_clicked;
vbox = new VBox(false, 2);
vbox.pack_start(label, true, true, 0);
vbox.pack_start(button, false, true, 0);
add(vbox);
delete_event += Gtk.main_quit;
}
static int main (string[] args) {
Gtk.init(out args);
Environment.set_application_name("Perdendo a sanidade...");
Hello hello = new Hello();
hello.show_all();
Gtk.main();
return 0;
}
}
Codando Interfaces
(em Python)
setanta@poe:~/mantendoasanidade$ python
>>> import gtk
>>> window = gtk.Window()
>>> vbox = gtk.VBox()
>>> label = gtk.Label("Sou um label!")
>>> button = gtk.Button("Me clique!")
>>> vbox.pack_start(label)
>>> vbox.pack_start(button)
>>> window.add(vbox)
>>> def on_button_clicked(button):
... print button
...
>>> button.connect("clicked", on_button_clicked)
7L
>>> window.show_all()
>>> gtk.main()
DevHelp
(pra no ter de lembrar de tudo e esquecer seu nome)
Usando o Glade
(a aplicaco)
Arquivo Glade
Usando a LibGlade
Constri a interface a partir do XML contido:
num arquivo
numa string
Conectando sinais e eventos
conexo individual
autoconnect
diferencas de uso nas vrias linguagens
Usando a LibGlade
(em C)
// file: hello_glade.c
#include
#include
void on_button_clicked(GtkWidget *button) { g_print("Botao
clicado.\n"); }
int main(int argc, char *argv[]) {
GladeXML *widget_tree;
GtkWidget *window;
gtk_init(&argc, &argv);
g_set_application_name("Perdendo a sanidade...");
widget_tree = glade_xml_new("simple.glade", NULL, NULL);
window = glade_xml_get_widget(widget_tree, "window1");
glade_xml_signal_autoconnect(widget_tree);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
----- para compilar:
gcc -rdynamic `pkg-config --libs --cflags gtk+-2.0 libglade-2.0`
hello_glade.c -o hello_glade
Codando Interfaces
(em Python)
setanta@poe:~/mantendoasanidade$ python
>>> import gtk
>>> import gtk.glade
>>> class Sample:
... def __init__(self):
... self.widget_tree = gtk.glade.XML("sample.glade")
... self.window = self.widget_tree.get_widget("window1")
... self.widget_tree.signal_autoconnect(self)
... self.window.show_all()
... gtk.main()
... def on_apply_button_clicked(self, button):
... print "Botao clicado."
...
>>> sample = Sample()
Possibilidades
GtkBuilder
A partir de GTK+ 2.12, pode-se usar GtkBuilder para construir interfaces a partir de descries em XML
Ainda est um tanto incompleta em relao libglade
E se...?
O XML de uma interface criada no Glade poderia ser convertido para HTML+CSS+JavaScript
Referncias
http://www.gtk.org
GTK+ em Win32
http://gladewin32.sourceforge.net/modules/news/
http://www.pygtk.org/
Mantendo a Sanidade com o Glade
http://www.cin.ufpe.br/~cinlug/wiki/index.php/Mantendo_A_Sanidade_Com_O_Glade
Notas (para mim mesmo) -- APAGUE
escolha um ponto para mencionar o DevHelp e os pacotes -doc
mencione os pacotes -dev quando comecar a programar
Atribuio-Compartilhamento pela mesma licena 2.5
(http://creativecommons.org/licenses/by-sa/2.5/deed.pt)
Voc pode:
copiar, distribuir, exibir e executar a obra
criar obras derivadas
fazer uso comercial da obra
Sob as seguintes condies:
Atribuio. Voc deve dar crdito ao autor original, da forma especificada pelo autor ou licenciante.
Compartilhamento pela mesma Licena. Se voc alterar, transformar, ou criar outra obra com base nesta, voc somente poder distribuir a obra resultante sob uma licena idntica a esta.
Para cada novo uso ou distribuio, voc deve deixar claro para outros os termos da licena desta obra.
Qualquer uma destas condies podem ser renunciadas, desde que Voc obtenha permisso do autor.
Qualquer direito de uso legtimo (ou "fair use") concedido por lei, ou qualquer outro direito protegido pela legislao local, no so em hiptese alguma afetados pelo disposto acima.
Este um sumrio para leigos da Licena Jurdica
(na ntegra:
http://creativecommons.org/licenses/by-sa/2.5/br/legalcode).
Termo de exonerao de responsabilidade:
http://creativecommons.org/licenses/disclaimer-popup?lang=pt
Click to edit the title text format
Click to edit the title text format