GUI - Visão geral



Os próximos capítulos vão descrever em detalhes cada um dos elementos do View Graphic Engine e do dialeto VID do Red  (faces, facets, definições do container, comandos de layout refinamentos do view) mas eu acho que ter uma visão geral de como o Red cria GUIs ajuda a entender melhor como esses elementos se relacionam.

Um começo simples:

O Red cria GUIs descrevendo-as em um bloco de view. Essa descrição é simples e direta e, em sua forma mais simples, seria assim:

Se você vai compilar o seu script, você precisa adicionar "needs: view" no header do Red. Se você for rodar o script do console GUI, isto não é estritamente necessário, uma vez que o módulo View já está presente.

An example code of that:

Red [needs: view]  ; "needs: view" é necessário se o script for ser compilado.


view[

       base

       button

       field

]


A GUI resultante:


A documentoação do Red chama coisas como botões e campos de "faces" (chamados "widgets" em algumas linguagens). Essas faces são colocadas em um layout dentro de um container (window)

Existem palavras pré-definidas (comandos de layout) que definem como as faces serão exibidad neste layout. Estes comandos devem ser colocados antes das faces que eles alteram:

No exemplo a seguir, below (um comando de layout) diz ao Red para colocar as faces embaixo uma da outra, ao invés do default across do exemplo anterior:

Red [needs: view]        ; "needs: view" is needed if the script is going to be compiled


view[

       below        ; layout command

       base        ; face (widget)

       button        ; face (widget)

       field        ; face (widget)

]


A GUI resultante:


Existem ainda os as definições do container, que descrevem como a própria janela deve parecer. E ambos, definições de container e comandos de layout podem permitir maior detalhamento, como tamanho, cor etc. As faces não apenas permitem esse detalhamento (chamado facets no jargão do Red), como ainda permitem a inclusão de um bloco de comandos a ser executado pela face (chamado "action facet") em caso de um evento, como o clicar de um botão.

   

Código de exemplo:

Red [needs: view]


view[

       backdrop blue        ;definição de container

       below                        ; comando de layout

       base 20x20                ; face e facet

       button 50x20 "press me" [quit]        ; face, facets  e action facet

       field red "field"                ; face e facets

]


E a GUI resultante:

O Red entende o que fazer com uma facet simplesmente pelo seu  datatype!. Assim, se ele vê um pair! , ele sabe que é o tamanho da face, se ele vê um string! ele sabe que é o texto a ser exibido. Uma consequência interessante disso é que...

button 50x20 "press me" [quit]
button "press me" [quit] 50x20
button [quit] 50x20 "press me"

... são todos a mesma coisa, isto é, they result in the same GUI.


A palavra pré-definida (comando)  view permite refinamentos que vão mudar a própria janela (não o layout dentro dela). Os refinamentos são descritos em blocos codificados após o bloco principal da view e devem ser codificados na mesma ordem que foram declarados naquele comando.

No script a seguir, flags diz ao Red que a janela é do tipo modal e redimensionável, enquanto o refinamento options faz a janela aparecer no topo esquerdo da tela, 50 pixels para baixo e 50 pixels para a esquerda:

Red [needs: view]


view/flags/options[

       size 300x100        ;container setting

       below                        ; layout command

       base 20x20                ; face and facet

       button 50x20 "press me" [quit]        ; face, facets  and actor

       field red "field"                ; face and facets

]['modal 'resize] [offset: 50x50] ; flags and options


A GUI resultante: