sexta-feira, 17 de abril de 2009

Layout Managers: Introdução

Em uma interface gráfica de usuário, é muito importante que layout seja bem atrativo. Informar manualmente as posições e dimensões de cada objeto dá ao programador total controle sobre a interface. Entretanto, essa abordagem tem duas desvantagens seriíssimas:
  • é uma tarefa tediosa e que consome muito tempo
  • se o tamanho da tela mudar, os objetos devem se adaptar a essas mudanças; se suas posições e dimensões forem absolutas, eles não se modificarão junto com a tela
Devido a isso, a maneira mais recomendada de se posicionarem objetos é utilizando os chamados Gerenciadores de Layout (Layout Managers). A tarefa principal de um gerenciador de layout é arrumar os objetos que estão dentro dele de alguma maneira específica. Existem diferentes gerenciadores, que organizam seus objetos de cima para baixo, da esquerda para direita, em forma de grade e até um por cima do outro. A maioria deles permite, também, que as posições e dimensões sejam informadas explicitamente.

As vantagens de se utilizarem os gerenciadores de layout incluem:
  1. Evita a tarefa chata de posicionar os controles
  2. Os controles são rearrumados automaticamente quando há mudanças no layout (por exemplo, o usuário aumenta o tamanho da fonte)
  3. O layout é recalculado automática e inteligentemente quando o usuário redimensiona a janela
  4. Fica mais fácil adicionar controles que são criados automaticamente dependendo do controle do programa, como por exemplo interfaces criadas com base em bancos de dados

Todos os gerenciadores de layout do FOX Toolkit são derivados de FXComposite. Isso significa que é possível aninhá-los arbitrariamente. Esse aninhamento dos gerenciadores adequados, junto com as opções de layout passadas tanto para os próprios gerenciadores quanto para os objetos que ficarão dentro deles é que definirá o arranjo da interface.

Gerenciadores de layout básicos

O FOX Toolkit vem com alguns gerenciadores de layout de propósito geral. Os principais são:
  • FXPacker: posiciona os objetos dentro de seu retângulo, grudandos-os a um dos lados (esquerdo, direito, superior ou inferior) e reduzindo o tamanho disponível de acordo. Por exemplo, se um objeto é posicionado à esquerda ou direita, a largura é reduzida; se for posicionado em cima ou embaixo, a altura é reduzida.
  • FXTopWindow: opera da mesma forma que o FXPacker; entretanto, não é utilizado diretamente, pois não tem um construtor público. É utilizado indiretamente através de FXMainWindow e FXDialogBox (duas subclasses diretas). Resumindo, toda janela que for criada (seja a principal ou uma caixa de diálogo) vai ter esse comportamento.
  • FXHorizontalFrame: organiza os filhos horizontalmente da esquera para direita (padrão) ou da direita para esquerda.
  • FXVerticalFrame: organiza os filhos verticalmente de cima para baixo (padrão) ou de baixo para cima.
  • FXMatrix: organiza os filhos em forma de grade, com linhas e colunas.
  • FXSwitcher: posiciona os filhos exatamente um em cima do outro, deixando apenas um deles visível
  • FXGroupBox: provê a mesma funcionalidade do FXPacker, além de adicionar bordas ao redor do conteúdo e um rótulo (label) opcional.
  • FXSplitter: divide a tela horizontal ou verticalmente em duas áreas; a divisão pode ser movida pelo usuário.
  • FX4Splitter: divide a tela em quatro partes; da mesma forma, o usuário pode modificar as divisões.
  • FXSpring: tipicamente colocada dentro de um FXHorizontalFrame ou FXVerticalFrame. A grande diferença do FXSpring para outros gerenciadores é que ele permite uma divisão da tela em proporções fixas, por exemplo, dividir uma janela em três partes nas proporções 1:2:1 (a janela do meio sempre será o dobro das outras duas).

Continua...

Esta é apenas a primeira parte de uma séries de tópicos relacionados aos gerenciadores de layout. Este é um assunto muito extenso, que ainda tem muito a ser discutido. Existem vários detalhes a respeito deles, e haverá tópicos específicos para cada gerenciador mostrado acima.

2 comentários:

eduardo4jesus disse...
Este comentário foi removido pelo autor.
eduardo4jesus disse...

Olá Edgar,

Acho que já comentei isso com você pelo messenger, mas não tenho certeza.

Tipo:
Há a possibilidade de eu ter um botão na minha janela, que quando eu clico nesse botão, ele expande um determinado frame, isto é, se houver essa possibilidade de existir um frame meio que "miniminizado" (escondido) na janela.

Há um exemplo na biblioteca do Fox, o BitMapviewer.cpp

Lá tem uma espécie de botão, que quando clicado faz com que a Widget( Me confirma se esse é a classificação geral de todas os objetos do Fox em que se pode colocar algo dentro - botões e etc- tipo Frames, GroupBox's .Enfim...) toolbar que é um FXToolBar* aparecer ou não.

Só que eu observei que o evento lançado não modifica o tamanho da janela central (MainWindow) mesmo que eu a redimensione para um tamanho inferior ao toolbar, entende?

Para exemplificar a idéia que quero passar, imagine que eu tenho um player de Mp3 e existe uma setinha para exibir, ou não, a lista de reprodução. Mas no caso, quero fazer isso com um frame que tem várias coisas dentro dele.

Abraços