RuGUI

Postador por Tiago Damasceno

Feed
Assine nosso Feed ou receba os artigos por email
RuGUI

Então você quer começar a brincar com GTK e Ruby mas ainda não sabe por onde começar? Não tenha medo, estamos aqui para ajudá-lo. Existem muitos exemplos de programas “Olá, Mundo!” com Ruby/GTK. Bem, ambos Ruby e GTK são excelentes escolhas para a construção de aplicações desktop. Ruby é uma linguagem dinâmica com características incríveis como closures e, é claro, uma extensa biblioteca própria. GTK, por sua vez, é um framework amplamente utilizado, com muitas widgets úteis além de ter uma API ótima para impressão, exibição de vídeos, reprodução de áudio, etc. Combine esses dois elementos e você chega ao Ruby/GTK, um ótimo framework… uhmmm… framework?

Deixe-me perguntar algumas questões para você. Suponha que você esteja começando a escrever uma nova aplicação desktop em Ruby/GTK, uma que seja realmente grande, com muitos casos de uso e pequenos detalhes. Como você desenharia sua estrutura de diretórios? E se você quisesse personalizar o estilo de um botão, ou alterar a cor de fundo de um TextView? E se sua aplicação fosse um tipo de servidor, e você quisesse exibir uma mensagem toda vez que um usuário se conectasse? E se você quisesse alterar a mensagem na barra de status, além de adicionar um ícone para o cliente numa IconView?

É claro que tudo isso poderia ser feito manualmente por você… Ou você poderia utilizar o RuGUI, que lhe oferece:

  • Uma abordagem MVC para aplicações desktop
  • Uma estrutura de diretórios, pronta para uso, similar ao que se tem em aplicações Ruby on Rails
  • Uma maneira mais fácil de personalizar widgets do que em aplicações Ruby/GTK normais
  • ActiveSupport - bem, alguém poderia dizer que isso é um requerimento/dependência, mas eu penso nisso mais como uma funcionalidade extra, uma vez que você acaba tendo uma API ruby muito mais rica e útil com ActiveSupport :)

Vejamos ele em ação com um simples “Hello, World”:

Gerando o esqueleto da sua aplicação

O RuGUI já cria essa aplicação Hello World para nós. Na verdade este é o ponto de partida de cada aplicação que você virá a fazer com o RuGUI. Uma vez instalado com uma gem vá para um diretório de sua escolha e digite num terminal:

  rugui helloworld

Isso irá gerar uma aplicação em {SEU_DIRETORIO}/helloworld. A estrutura de diretórios será assim:

Estrutura de Diretórios de uma Aplicação RuGUI

Para rodar a aplicação, entre no diretório helloworld e digite:

  ./bin/helloworld

Você poderia ter digitado também:

  rake run

Ou, se você precisar:

  ruby app/main.rb

A aplicação deve ser similar a isso:

Hello, World!

Se você clicar no botão, verá o texto acima sendo alterado. Como tudo isso funcionou?

Hello world passo a passo

Vamos analisar a aplicação passo a passo:

Quando você roda a aplicação, de qualquer forma (todas as três formas de iniciar a aplicação acabam por fazer a mesma coisa), o script app/main.rb é chamado. Aqui está o conteúdo desse arquivo:

01.#! /usr/bin/ruby
02.
03.# You can run this application by running this file.
04.# Do not modify it, unless you know what you are doing.
05.
06.require File.join(File.dirname(__FILE__), '..', 'config', 'environment')
07.
08.main_controller = MainController.new
09.main_controller.run

Como você pode ver, a primeira coisa que fazemos é carregar o arquivo config/environment.rb. Isto irá inicializar a aplicação *RuGUI* com o ambiente padrão — development. Você poderia ter especificado um ambiente diferente configurando a variável de ambiente RUGUI_ENV. Esse procedimento de inicialização é muito similar ao procedimento de inicialização do Rails, ele foi basicamente copiado e adaptado.

Em seguida nós instanciamos o MainController e chamamos o método run. Simples, não?

Agora sobre o MainController. O quê que ele é mesmo? Ao contrário de aplicações web, todas as aplicações desktop possuem um conceito de loop principal. Basicamente, a aplicação é toda configurada antes de ser exibida. Ela então entra num loop infinito, que é responsável por exibir as widgets, disparar eventos conforme vão acontecendo (cliques em botões, apertos de teclas, tráfego de rede, operações de impressão, etc). Esses eventos podem alterar a aparência de widgets, os dados exibidos, ou qualquer outra coisa que você queira que seja feito.

Então o MainController do RuGUI é o ponto de partida real da programação de sua aplicação. Algo como a raiz de sua aplicação. Melhor ainda, todos os controles são filhos desse MainController, ou filhos de controles que são filhos do MainController. Isso está ficando complicado, mas com o tempo você irá entender.

Neste exemplo, nós temos apenas um controle, e ele é o MainController. Não criamos outro controle por simplicidade. Aqui está seu código:

01.class MainController < RuGUI::BaseMainController
02. # Add your stuff here.
03.
04. def setup_views
05. register_view :main_view
06. end
07.
08. def on_main_window_delete_event(widget, event)
09. quit
10. end
11.end

Ele configura a view principal e adiciona um manipulador para o evento em que a janela principal é fechada, que é usado para fechar a aplicação. Este manipulador de eventos é configurado no arquivo main_view.glade. Todo controle pode observar eventos configurados por widgets em arquivos glade de todas as views registradas nele.

A view principal utiliza um arquivo glade para simplificar a criação e o posicionamento de widgets. Nós poderíamos ter criado as widgets manualmente, mas teriámos perdido muitas das funcionalidades como a conexão automática de manipuladores de eventos, além de ter de escrever muito mais código do que foi escrito:

01.class MainView < ApplicationView
02. use_glade
03. # Add your stuff here.
04.
05. def on_hello_button_clicked(widget)
06. puts "Hello button clicked."
07. self.message_label.text = "You clicked me!"
08. end
09.end

Aqui nós colocamos um manipulador de evento para o clique do botão hello_button. Ele imprime uma mensagem no console, e altera o texto da widget message_label. Algumas notas aqui:

  • Todas as widgets criadas em arquivos glade possuem acessores de leitura para elas
  • Uma vez que estamos utilizando a nomeclatura e a estrutura de diretórios padrão não tivemos que especificar o arquivo glade para a view, mas poderíamos fazê-lo se quiséssemos. Ele foi meramente deduzido a partir do nome da classe (MainView => main_view).
  • A view também funciona como um observador para manipuladores de eventos de suas widgets. O manipulador do evento de clique de botão para o hello_button poderia ter sido declaro no controle, mas nós decidimos declará-lo aqui para mostrar isso.

Isso é basicamente tudo o que há!

Mas, peraí, eu consigo fazer isso em menos linhas!

É claro que sim, aqui está:

01.#! /usr/bin/ruby
02.
03.require 'libglade2'
04.
05.class MainViewGlade
06. include GetText
07. attr :glade
08.
09. def initialize(path_or_data, root = nil, domain = nil, localedir = nil, flag = GladeXML::FILE)
10. bindtextdomain(domain, localedir, nil, "UTF-8")
11. @glade = GladeXML.new(path_or_data, root, domain, localedir, flag) {|handler| method(handler)}
12. end
13.
14. def on_main_window_delete_event(widget, arg0)
15. Gtk.main_quit
16. end
17.
18. def on_hello_button_clicked(widget)
19. puts "Hello button clicked."
20. @glade['message_label'].text = "You clicked me!"
21. end
22.end
23.
24.# Main program
25.if __FILE__ == $0
26. # Set values as your own application.
27. PROG_PATH = "main_view.glade"
28. PROG_NAME = "Hello World!"
29. MainViewGlade.new(PROG_PATH, nil, PROG_NAME)
30. Gtk.main
31.end

No entanto, você muito provavelmente terá uma grande dor de cabeça quando precisar adicionar mais funcionalidades à aplicação. RuGUI procura te ajudar ao deixar você separar a sua aplicação em camadas bem definidas, cada uma com suas responsabilidades. Dessa forma fica muito mais fácil fazer com que sua aplicação evolua sem problemas na sua manutenção.

Está ficando animado? Comece a usá-lo agora mesmo!

Fonte: IntelitivaBlog

2 comentários:

  1. Anônimo disse...

    Oi Tiago.
    Qual é a versão do Joomla que vc usa e qual é o mambot que vc usa para exibir código fonte nos seus posts que tem programação envolvidos.

  2. Tiago Damasceno disse...

    Almeida C.

    Primeiramente queria agradecer pelo comentário, a versão que uso é a 1.5.8 estou migrando para 1.5.9 após o carnaval!!!

    Em relação ao mambot que você pediu opinião veja se esse esses módulos resolveem seu problema:

    http://extensions.joomla.org/extensions/3771/details

    Se não gostou do primeiro vai ai outros dois:
    http://extensions.joomla.org/extensions/5730/details

    http://www.kksou.com/php-gtk2/Joomla/Include-Code-Listing-plugin.php#manual

Postar um comentário