Mantendo a Sanidade com o Glade

Embed Size (px)

Citation preview


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