Mantendo a Sanidade Com o Glade Marcelo Lira dos Santos INdT Recife
"horrores que o homem não deveria saber que existem"
"horrores que o homem não deveria saber que existem" Processo de criação de uma aplicação gráfica: Criar a interface com alguma aplicação visual Gerar código Alterar código gerado Precisar alterar a interface Gerar mais código Re-inserir alterações no novo código gerado Voltar indefinidamente ao passo 4 Perder o juízo
"horrores que o homem não deveria saber que existem"
Preliminares
GTK+ Toolkit gráfico multiplataforma Linux, Windows, MacOS X Escrito em C Usado por GNOME XFCE Maemo OLPC OpenMoko
Widgets Elemento da interface com o qual o usuário interage Widget: Window Gadget Propriedades importantes de um widget: Identificação (nome) Estímulos aos quais ele responde Instruções para disposição (layout)
GTK+ GTK+ GDK GLib (all your) Widgets (are belong to us) Abstração das funções primitivas de desenho da plataforma Orientação a Objetos para C (uau!)
Bindings Zilhões de bindings Vantagem: use sua linguagem preferida C++ (gtkmm) Python (PyGTK) Java (Java-GNOME) C# (GTK#/Mono) Vala PHP (PHP-GTK) Perl (gtk2-perl) Haskell (Gtk2Hs) Ruby (Ruby-GNOME2) Lua (lua-gtk) D (DUI) Ada (GtkAda) GTK+
Dissecando a Estrutura Uma aplicação simples num simples ambiente gráfico
Dissecando a Estrutura Servidor X Gerenciador de Janelas Janela GDK Widget da Janela Demais widgets
Descrevendo a Estrutura XML Boa para descrever estrutura <janela> <caixadetexto/>   <botao/> </janela>
Analisando o Comportamento Conceitos Eventos Main Loop Sinais Callbacks
Camadas Dizem que é uma boa prática de programação!
Codando
Codando Interfaces (em C) #include <gtk/gtk.h> void on_button_clicked(GtkWidget *button) { g_print(&quot;Botao clicado.\n&quot;); } int main(int argc, char *argv[]) {   GtkWidget *window;   GtkWidget *vbox;   GtkWidget *label;   GtkWidget *button;   gtk_init(&argc, &argv);   g_set_application_name(&quot;Perdendo a sanidade...&quot;);   window = gtk_window_new(GTK_WINDOW_TOPLEVEL);   vbox = gtk_vbox_new(FALSE, 2);   label = gtk_label_new(&quot;Sou um label!&quot;);   gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);   button = gtk_button_new_with_label(&quot;Me clique!&quot;);   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);   g_signal_connect(G_OBJECT(button), &quot;clicked&quot;,   G_CALLBACK(on_button_clicked), G_OBJECT(label));   gtk_container_add(GTK_CONTAINER(window), vbox);   g_signal_connect(G_OBJECT(window), &quot;delete_event&quot;,   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(&quot;Botao clicado.\n&quot;); }   construct {   label = new Label(&quot;Sou um label!&quot;);   button = new Button.with_label(&quot;Me clique!&quot;);   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(&quot;Perdendo a sanidade...&quot;);   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(&quot;Sou um label!&quot;) >>> button = gtk.Button(&quot;Me clique!&quot;) >>> vbox.pack_start(label) >>> vbox.pack_start(button) >>> window.add(vbox) >>> def on_button_clicked(button): ...  print button ...  >>> button.connect(&quot;clicked&quot;, on_button_clicked) 7L >>> window.show_all() >>> gtk.main()
DevHelp (pra não ter de lembrar de tudo e esquecer seu nome)
Usando o Glade (a aplicacão)
Arquivo Glade
Usando a LibGlade Constrói a interface a partir do XML contido: num arquivo numa string Conectando sinais e eventos conexão individual autoconnect diferencas de uso nas várias linguagens
Usando a LibGlade (em C) // file: hello_glade.c #include <gtk/gtk.h> #include <glade/glade.h> void on_button_clicked(GtkWidget *button) { g_print(&quot;Botao clicado.\n&quot;); } int main(int argc, char *argv[]) {   GladeXML *widget_tree;   GtkWidget *window;   gtk_init(&argc, &argv);   g_set_application_name(&quot;Perdendo a sanidade...&quot;);   widget_tree = glade_xml_new(&quot;simple.glade&quot;, NULL, NULL);   window = glade_xml_get_widget(widget_tree, &quot;window1&quot;);   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(&quot;sample.glade&quot;) ...  self.window = self.widget_tree.get_widget(&quot;window1&quot;) ...  self.widget_tree.signal_autoconnect(self) ...  self.window.show_all() ...  gtk.main() ...  def on_apply_button_clicked(self, button): ...  print &quot;Botao clicado.&quot; ...  >>> sample = Sample()
Possibilidades
GtkBuilder A partir de GTK+ 2.12, pode-se usar  GtkBuilder  para construir interfaces a partir de descrições em XML Ainda está um tanto incompleta em relação à  libglade
E se...? O XML de uma interface criada no Glade poderia ser convertido para HTML+CSS+JavaScript
Referências 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
Atribuição-Compartilhamento pela mesma licença 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 condições: Atribuição.  Você deve dar crédito ao autor original, da forma especificada pelo autor ou licenciante. Compartilhamento pela mesma Licença.  Se você alterar, transformar, ou criar outra obra com base nesta, você somente poderá distribuir a obra resultante sob uma licença idêntica a esta. Para cada novo uso ou distribuição, você deve deixar claro para outros os termos da licença desta obra. Qualquer uma destas condições podem ser renunciadas, desde que Você obtenha permissão do autor. Qualquer direito de uso legítimo (ou &quot;fair use&quot;) concedido por lei, ou qualquer outro direito protegido pela legislação local, não são em hipótese alguma afetados pelo disposto acima. Este é um sumário para leigos da Licença Jurídica (na íntegra:  http://creativecommons.org/licenses/by-sa/2.5/br/legalcode ). Termo de exoneração de responsabilidade:  http://creativecommons.org/licenses/disclaimer-popup?lang=pt

Mantendo a Sanidade com o Glade

  • 1.
    Mantendo a SanidadeCom o Glade Marcelo Lira dos Santos INdT Recife
  • 2.
    &quot;horrores que ohomem não deveria saber que existem&quot;
  • 3.
    &quot;horrores que ohomem não deveria saber que existem&quot; Processo de criação de uma aplicação gráfica: Criar a interface com alguma aplicação visual Gerar código Alterar código gerado Precisar alterar a interface Gerar mais código Re-inserir alterações no novo código gerado Voltar indefinidamente ao passo 4 Perder o juízo
  • 4.
    &quot;horrores que ohomem não deveria saber que existem&quot;
  • 5.
  • 6.
    GTK+ Toolkit gráficomultiplataforma Linux, Windows, MacOS X Escrito em C Usado por GNOME XFCE Maemo OLPC OpenMoko
  • 7.
    Widgets Elemento dainterface com o qual o usuário interage Widget: Window Gadget Propriedades importantes de um widget: Identificação (nome) Estímulos aos quais ele responde Instruções para disposição (layout)
  • 8.
    GTK+ GTK+ GDKGLib (all your) Widgets (are belong to us) Abstração das funções primitivas de desenho da plataforma Orientação a Objetos para C (uau!)
  • 9.
    Bindings Zilhões debindings Vantagem: use sua linguagem preferida C++ (gtkmm) Python (PyGTK) Java (Java-GNOME) C# (GTK#/Mono) Vala PHP (PHP-GTK) Perl (gtk2-perl) Haskell (Gtk2Hs) Ruby (Ruby-GNOME2) Lua (lua-gtk) D (DUI) Ada (GtkAda) GTK+
  • 10.
    Dissecando a EstruturaUma aplicação simples num simples ambiente gráfico
  • 11.
    Dissecando a EstruturaServidor X Gerenciador de Janelas Janela GDK Widget da Janela Demais widgets
  • 12.
    Descrevendo a EstruturaXML Boa para descrever estrutura <janela> <caixadetexto/> <botao/> </janela>
  • 13.
    Analisando o ComportamentoConceitos Eventos Main Loop Sinais Callbacks
  • 14.
    Camadas Dizem queé uma boa prática de programação!
  • 15.
  • 16.
    Codando Interfaces (emC) #include <gtk/gtk.h> void on_button_clicked(GtkWidget *button) { g_print(&quot;Botao clicado.\n&quot;); } int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *vbox; GtkWidget *label; GtkWidget *button; gtk_init(&argc, &argv); g_set_application_name(&quot;Perdendo a sanidade...&quot;); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); vbox = gtk_vbox_new(FALSE, 2); label = gtk_label_new(&quot;Sou um label!&quot;); gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0); button = gtk_button_new_with_label(&quot;Me clique!&quot;); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0); g_signal_connect(G_OBJECT(button), &quot;clicked&quot;, G_CALLBACK(on_button_clicked), G_OBJECT(label)); gtk_container_add(GTK_CONTAINER(window), vbox); g_signal_connect(G_OBJECT(window), &quot;delete_event&quot;, G_CALLBACK(gtk_main_quit), NULL); gtk_widget_show_all(window); gtk_main(); return 0; }
  • 17.
    Codando Interfaces (emVala) 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(&quot;Botao clicado.\n&quot;); } construct { label = new Label(&quot;Sou um label!&quot;); button = new Button.with_label(&quot;Me clique!&quot;); 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(&quot;Perdendo a sanidade...&quot;); Hello hello = new Hello(); hello.show_all(); Gtk.main(); return 0; } }
  • 18.
    Codando Interfaces (emPython) setanta@poe:~/mantendoasanidade$ python >>> import gtk >>> window = gtk.Window() >>> vbox = gtk.VBox() >>> label = gtk.Label(&quot;Sou um label!&quot;) >>> button = gtk.Button(&quot;Me clique!&quot;) >>> vbox.pack_start(label) >>> vbox.pack_start(button) >>> window.add(vbox) >>> def on_button_clicked(button): ... print button ... >>> button.connect(&quot;clicked&quot;, on_button_clicked) 7L >>> window.show_all() >>> gtk.main()
  • 19.
    DevHelp (pra nãoter de lembrar de tudo e esquecer seu nome)
  • 20.
    Usando o Glade(a aplicacão)
  • 21.
  • 22.
    Usando a LibGladeConstrói a interface a partir do XML contido: num arquivo numa string Conectando sinais e eventos conexão individual autoconnect diferencas de uso nas várias linguagens
  • 23.
    Usando a LibGlade(em C) // file: hello_glade.c #include <gtk/gtk.h> #include <glade/glade.h> void on_button_clicked(GtkWidget *button) { g_print(&quot;Botao clicado.\n&quot;); } int main(int argc, char *argv[]) { GladeXML *widget_tree; GtkWidget *window; gtk_init(&argc, &argv); g_set_application_name(&quot;Perdendo a sanidade...&quot;); widget_tree = glade_xml_new(&quot;simple.glade&quot;, NULL, NULL); window = glade_xml_get_widget(widget_tree, &quot;window1&quot;); 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
  • 24.
    Codando Interfaces (emPython) setanta@poe:~/mantendoasanidade$ python >>> import gtk >>> import gtk.glade >>> class Sample: ... def __init__(self): ... self.widget_tree = gtk.glade.XML(&quot;sample.glade&quot;) ... self.window = self.widget_tree.get_widget(&quot;window1&quot;) ... self.widget_tree.signal_autoconnect(self) ... self.window.show_all() ... gtk.main() ... def on_apply_button_clicked(self, button): ... print &quot;Botao clicado.&quot; ... >>> sample = Sample()
  • 25.
  • 26.
    GtkBuilder A partirde GTK+ 2.12, pode-se usar GtkBuilder para construir interfaces a partir de descrições em XML Ainda está um tanto incompleta em relação à libglade
  • 27.
    E se...? OXML de uma interface criada no Glade poderia ser convertido para HTML+CSS+JavaScript
  • 28.
    Referências 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
  • 29.
    Notas (para mimmesmo) -- APAGUE escolha um ponto para mencionar o DevHelp e os pacotes -doc mencione os pacotes -dev quando comecar a programar
  • 30.
    Atribuição-Compartilhamento pela mesmalicença 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 condições: Atribuição. Você deve dar crédito ao autor original, da forma especificada pelo autor ou licenciante. Compartilhamento pela mesma Licença. Se você alterar, transformar, ou criar outra obra com base nesta, você somente poderá distribuir a obra resultante sob uma licença idêntica a esta. Para cada novo uso ou distribuição, você deve deixar claro para outros os termos da licença desta obra. Qualquer uma destas condições podem ser renunciadas, desde que Você obtenha permissão do autor. Qualquer direito de uso legítimo (ou &quot;fair use&quot;) concedido por lei, ou qualquer outro direito protegido pela legislação local, não são em hipótese alguma afetados pelo disposto acima. Este é um sumário para leigos da Licença Jurídica (na íntegra: http://creativecommons.org/licenses/by-sa/2.5/br/legalcode ). Termo de exoneração de responsabilidade: http://creativecommons.org/licenses/disclaimer-popup?lang=pt