GUI - Events e actors



Eventos:

Clicar no mouse, passar o cursor sobre alguma coisa, apertar teclas etc., são eventos que muitas vezes devem ser associados com código. No último capítulo nós vimos que existe algo chamado action facet que executa código quando disparado por algum evento. Você pode adicionar mais blocos associados a eventos usando o seguinte leiaute:

Existe uma extensa lista de eventos possíveis na documentação. Ela está copiada no fim deste capítulo para referência.

Cada face aceita um conjunto de eventos, isto é, nem todos eventos se aplicam a todas as faces.

Eu fiz uma lista curta de eventos. Eu não vejo razão para dar um exemplo de cada evento existente, uma vez que a lógica é a mesma:

down - botão esquerdo do mouse foi pressionado; 

over - cursor so mouse passando sobre uma face;

Red [needs: view]

view [

       t: area 40x40 blue

       on-down [quit]

       on-over [either t/color = red [t/color: blue][t/color: red]]

]


wheel - roda do mouse sendo acionada;

Red [needs: view]


list: ["first" "second" "third" "fourth"]

view [

       t: text "Place your cursor over here and roll the wheel"

               on-wheel [

                       t/text: first list

                       list: next list

                       if tail? list [list: head list]

               ]                

]



key-down - uma tecla foi pressionada:

Red [needs: view]


list: ["key" "another key" "one more key"]

view [

       below

       text "Click inside field and press a key"

       t: text 100

       a: field

               on-key-down [

                       t/text: first list

                       list: next list

                       if tail? list [list: head list]

               ]

]





time - o tempo ajustado da facet  rate da face expirou.

O próximo exemplo "pisca" um texto com um tempo de 1 segundo (veja rate no capítulo  GUI- Tópicos avançados):

Red [needs: view]


view [

       t: text "Now you see..." rate 1

               on-time [either t/text = "" [t/text: "Now you see..."][t/text: ""]]

]


close - este é um evento de janela (window) disparado quando a janela é fechada. É útil para incluir código que deve ser executado quando o usuário encerra o script.

Red [needs: view]


view [

       on-close [print "bye!"]        

       button [print "click"]

]

 Actors

Actors como se chamam as funções de tratamento de eventos (event handling functions, ou event hadlers) no Red, isto é, o código dentro do bloco depois de  on-<event> . Então porque não chamá-los de event handlers como quase todas as outras linguagens? Eu acho que é porque eles são um objeto dentro da face, como você pode ver se rodar o código abaixo e clicar na face area:

Red [Needs: view]

view [

       t: area 40x40 blue on-down [print t] ;click to quit

       on-over [either t/color = red [t/color: blue][t/color: red]]

]


Você vai ver no console, perto do fim da impressão, um objeto com os actors descritos:

(...)

edge: none

para: none

font: none

actors: make object! [

   on-down: func [face [object!] event [event! none!]][print t]

   on-over: func [face [object!] event [event! none!]][either t/color = red [t/color: blue] [t/color: red]]

]

extra: none

draw: none

(...)


Lista de nomes de eventos names:

Name

Origem

Causa

down

mouse

Botão esquerdo do mouse pressionado.

up

mouse

Botão esquerdo do mouse solto.

mid‑down

mouse

Botão central do mouse pressionado.

mid‑up

mouse

Botão central do mouse solto.

alt‑down

mouse

Botão direito do mouse pressionado.

alt‑up

mouse

Botão direito do mouse solto.

aux‑down

mouse

Botão auxiliar do mouse pressionado.

aux‑up

mouse

Botão auxiliar do mouse solto.

drag‑start

mouse

Início do arrastar (drag) de uma face.

drag

mouse

Face sendo arrastada.

drop

mouse

Uma face arrastada foi solta.

click

mouse

Click do botão esquerdo do mouse (apenas na face button).

dbl‑click

mouse

Duplo-click esquerdo do mouse.

over

mouse

Cursor do mouse passando sobre uma face. Este evento é disparado uma vez quando o cursor entra na face e outra vez quando o cursor sai da face. Se a facet flags tem a flag all‑over , então todos os eventos intermediários são criados também.

move

mouse

Uma janela foi movimentada.

resize

mouse

Uma janela foi redimensionada.

moving

mouse

Uma janela está sendo movimentada.

resizing

mouse

Uma janela está sendo redimensionada.

wheel

mouse

A roda do mouse está sendo movimentada.

zoom

touch

Um gesto de zoom (pinching) foi reconhecido.

pan

touch

Um gesto de pan (sweeping) foi reconhecido.

rotate

touch

Um gesto de rotação foi reconhecido.

two‑tap

touch

Um gesto de duplo toque (double tapping) for reconhecido.

press‑tap

touch

Um gesto de  press-and-tap foi reconhecido.

key‑down

keyboard

Uma tecla foi pressionada.

key

keyboard

Foi dada entrada em um caracter ou uma tecla especial foi pressionada (exceto control, shift ou menu).

key‑up

keyboard

Uma tecla pressionad foi solta.

enter

keyboard

Tecla Enter foi pressionada.

focus

any

A face recebeu o foco.

unfocus

any

A face perdeu o foco.

select

any

Uma seleção foi feita em uma face com múltiplas escolhas.

change

any

Uma mudança ocorreu em uma face que aceita entradas de dados do usuário (input de texot ou seleção em uma lista).

menu

any

Uma entrada do menu foi escolhida..

close

any

Uma janela foi fechada.

time

timer

O delay determinado para o rate de uma face expirou.

Notas:

  • Eventos touch não estão disponíveis para Windows XP.+
  • Um ou mais eventos  moving sempre precedem um do tipo  move .
  • Um ou mais eventos  resizing sempre precedem um do tipo resize.