GUI - Piškoty (faces)



Piškoty neboli faces (neboli widgets), jsou základní stavební kameny grafického rozhraní.  Interní součástí každého piškotu je sada 23 aspektů (facets), jimiž jsou určovány jednotlivé parametry piškotu. Těmito parametry je určován nejen vzhed piškotů, ale i jejich odezva na různé události a souvislost s jinými piškoty.

Seznam aspektů (facets)

Facet

Datatype

Povinné?

Použití

Popis

type

word!

yes

all

Typ grafické komponenty

offset

pair!

yes

all

Ofset reflektovaného kurzoru od počátku vlevo nahoře

size

pair!

yes

all

Velikost piškotu

text

string!

no

all

Popisek, zobrazený v piškotu

image

image!

no

some

Obraz na pozadí piškotu

color

tuple!

no

some

Barva pozadí ve formátu R.G.B nebo R.G.B.A.

menu

block!

no

all

Lišta menu nebo kontextuální nabídky.

data

any-type!

no

all

Data o piškotu.

enable?

logic!

yes

all

Povolit nebo zakázat události v piškotu

visible?

logic!

yes

all

Zobrazit či skrýt piškot.

selected

integer!

no

some

Index aktuálně vybraného elementu seznamu.

flags

block!, word!

no

some

Klíčová slova, měnící zobrazení nebo chování piškotu.

options

block!

no

some

Další vlastnost piškotu ve formátu [name: value]

parent

object!

no

all

Odkaz na rodičovský piškot, pokud existuje.

pane

block!

no

some

Seznam dětí, zobrazených uvnitř piškotu.

state

block

no

all

Info o interním stavu piškotu (pouze u View engine).

rate

integer!, time!

no

all

Časovač piškotu. Integer udává frequenci, time udá- vá trvání, none zastavuje.

edge

object!

no

all

(reserved for future use)

para

object!

no

all

Pokyny pro umístění textu.

font

object!

no

all

Nastavení atributů fontu

actors

object!

no

all

Uživatelsky vytvořené ovladače událostí.

extra

any-type!

no

all

Volitelná uživatelská data připojená k piškotu.

draw

block!

no

all

Seznam příkazů Draw, jež mají být provedeny.


Datové typy hodnot aspektů:

Hodnoty aspektů se zadávají přímo, bez uvedení jejich určení, které interně provádí interpret na základě jejich datového typu.


Datový typ

Aspekt

Účel použití

integer!

rate, selected

Určuje šířku piškotu, výška zůstává implicitní. U panelů udává počet řad či sloupců.

pair!

offset, size

Určuje šířku a výšku piškotu.

tuple!

color

Určuje barvu pozadí piškotu ve formátu rgb, např. 211.9.84.

issue!

color

Určuje barvu pozadí piškotu použitím hexadecimálního zápisu,   například #d30954.

word!

color

Určuje barvu pozadí piškotu slovem, např. aqua

string!

text

Určuje text, zobrazovaný piškotem.

percent!


Nastavuje aspekt data (užitečné pro piškoty  progress a slider).

logic!


Nastavuje aspekt data (užitečné pro piškoty check a radio).

image!

image

Nastavuje obrázek, zobrazený jako pozadí piškotu.

url!


Načte zdroj, na nějž URL ukazuje.

block!


Udává akci pro implicitní či deklarovanou událost piškotu. U panelů určuje obsah.

get-word!


Jako aktéra používá existující funkci.

time!


Určuje časový úsek delší než 1 sec v aspektu rate


Příklad aplikace aspektů:

Red [needs: view]


view [

       base "HELLO!" 130x100 %balloon.jpeg   ; base je piškot, následují hodnoty  aspektů text, size, image

]

                                                                                         

(soubor %baloon.jpeg musí být uložen ve stejném adresáři jako prováděčka red.exe)



Atributy aspektu font

Aspekt font má 9 předdefinovaných formátovacích atributů: name, size, style, angle, color, anti-alias?, shadow, state, parent. Prostřednictvím atributu parent mohou na daný aspekt odkazovat i jiné piškoty.

Při deklaraci se název atributu uvádí za pomlčkou, například font-name.


Pole

Datový typ

Povinné?

Popis

- name

string!

ne

Název fontu, instalovaného v OS

- size

string!

ne

Velikost fontu v bodech (points)

- style

word!, block!

ne

Styly fontů:                                                      bold, italic, underline a strike

- angle

integer!

ano

Sklon textu ve stupních

- color

tuple!

ano

Barva fontu ve formátu RGB nebo RGBA

- anti-alias?

logic!, word!

ne

Režim vyhlazení

- shadow

(reserved)

ne

(reserved for future use)

- state

block!

ne

Interní stav piškotu (pouze ve View)

- parent

block!

ne

Interní odkaz na rodičovský piškot

Příklad použití:

Red [needs: view]


view [

       text "hello" font-name "algerian" font-size 18 font-color red bold

       text "hello" font-name "algerian" font-size 18 font-color blue

       text "hello" font-name "broadway" font-size 15 font-color green strike

       text "hello" font-name "arial" font-size 12 font-color cyan underline

]  ; piškot, aspekt, atributy fontu, příslovce




Klíčová slova (keywords):

Klíčovými slovy (typu word!) se přiřazují slovní hodnoty různým aspektům (text, extra, data, draw, font, para, select) Jsou to tato slova:

left, center, right, top, middle, bottom, bold, italic, underline, strike, extra, data, draw, font, para, wrap, no-wrap, font-size, font-color, font-name, react, loose, all-over, hidden, disabled, select, focus, hint, rate, default.

Případně slouží jako hodnoty upřesnění při formování piškotu (window):

  • /flags   ::  modal, resize, no-title, no-border, no-min, no-max, no-buttons, popup  
  • /options:: on-(enter, change, select, key)


Aktéři - actors

Slovo actors (aktéři) je název jednoho z aspektů a rovněž společné označení funkcí pro ošetření událostí.  Aktér (actor) je funkce, která popisuje aktivitu piškotu při výskytu jisté události - viz další kapitola.


Piškoty - faces

Knihovna view disponuje těmito piškoty: area, base, button,  camera, check, drop-down, drop-list,  field, group-box,  panel, tab-panel,  progress, radio, slider, screen,  text, text-list, window, . Jednotlivé piškoty jsou v následujcím textu podrobněji popsány.

Rozšířením piškotu text jsou piškoty h1h5, rozšířením piškotu base jsou piškoty box a image.

Nejvýše postaveným objekty jsou diskrétní piškoty screen a window. Tyto piškoty se nedají samostatně deklarovat. Jsou však automaticky přítomny při každé vizualizaci bloku funkcí view, například i  prázdného:

Red [needs: view]        ; "needs: view" je potřebné pouze při kompilaci skriptu


view []





Aktivita piškotů

Většina piškotů (vyjímaje screen a window) si ví rady s výskytem nějaké události. Tou událostí může být kliknutí myší klávesy, stisknutí klávesy na klávesnici nebo provedení výběru. Výpis těchto událostí je uveden na počátku další kapitoly. Implicitně nastavené události (ovladače) jsou dále uvedeny u každého piškotu.

Pro tlačítka (buttons) je touto implicitně ošetřenou událostí stisk levé klávesy myši  (down) a v následující ukázce spouští příkaz  quit, který končí program. Místo funkce [quit] lze použít  například  [print "Tornado Loo"].

Red [needs: view]


view [

       button 50x40 "click me" [quit] ; piškot, aspekt, aspekt, aktér

]


Citlivost piškotu na událost se projeví jen v tom případě, je-li deklarace piškotu doplněna blokem s názvem definované funkce nebo s definicí uživatelské funkce - neboli aktérem.


Přehled piškotů


     base (on-down)

Piškot base  bez parametru zobrazí uvnitř piškotu window (jehož rodičem je piškot screen) tmavošedý (128.128.128) čtverec (80x80 px) bez ohraničení.

Red [needs: view]        


view [

       base

]




     button (on-click)

Red [needs: view]


view [

       button

]



       check (on-change)

Piškot reaguje na změnu stavu zatržení uživatelem.

Red [needs: view]

view [

       check

]



Aktuální stav zatržítka je uložen v aspektu data (true nebo false)



     radio (on-change)

Událost, registrující u piškotu vstup textu nebo výběr ze seznamu, se nazývá change.

Při každé volbě (zde on, off, uh?) umožní realizaci příslušného aktéra - příslušného bloku.

Piškoty radio tvoří obsah kontejneru window. V kontejneru může být zatrženo pouze jedno výběrové tlačítko radio.

Red [needs: view]

view [

       r1: radio "on" [t/text: "on"]

       t: text "none"     ; jen před první volbou

       return

       below

       r2: radio "off" [t/text: "off"]

       r3: radio "uh?" [t/text: "uh?"]

]  ; proměnná, piškot, aspekt, aktér






     field (on-enter)

Piškot field slouží k vložení textu.

Text v poli piškotu field je uložen v aspektu data. Chodí to však obojím směrem. Změníte-li obsah aspektu data (.../data value), změní se zobrazený text v poli.

Red [needs: view]

view [

       field

]



V této ukázce se vytiskne zápis v poli do konzoly při (každém) stisku Enter:

Red [needs: view]

view [

       f: field [print f/text]

]  ; proměnná, piškot, aktér


Piškot field podporuje flag no-border :

Red [needs: view]


view [field no-border]




     area (on-change)

Text uvnitř piškotu area  je uložen v aspektu textDo zobrazeného okna lze psát víceřádkový text:

Red [needs: view]

view [

       area

]



Živější aplikaci vytvoříme připojením aktéra [print a/text], který tiskne aktuální obsah aspektu text do konzoly.  Aktér je aktivován stiskem každé klávesy na klávesnici, včetně příkazu Enter:



     text-list (on-change)

Procházené řetězce jsou uloženy v aspektu data. Index vybraného řetězce je v aspektu selected:

Red [needs: view]

view [

       tl: text-list 100x100 data[

       "Nenad" "Gregg" "Qtxie"        "Rebolek"

       "Speedy G." "Myke" "Toomas"

       "Alan" "Nick" "Peter" "Carl"]

       [print tl/selected ]

]




3     ; index vybrané položky se vytiskne do konzoly      


===

To use the string selected, the code snippet could be:  nevím, jak to připojit

pick face/data face/selected

   [ t/text: pick face/data face/selected ] viz drop-down

This would be the same as : pick ["Nenad" "Greg" "Qtxie" "Rebolek" (...)] 3

===

     progress (on-change)

Aktuální stav posuvníku je uložen v aspektu data, jako hodnota typu percent! nebo float! v rozsahu mezi 0 a 1.

Red [needs: view]

view [

       below

       text "Enter float"

       text "0 - 1 (float):"

       field [p/data: to percent! face/data]

       p: progress

]






     slider (on-change)

Aktuální procentní hodnota je uložena v aspektu data jako datový typ percent! nebo float!.

Red [needs: view]

view [

       title "slider"

       t: text "Percentage"

       slider 100x20 data 10% [t/text: to string! face/data]

]    ; označení aspektu 'data' je nadbytečné ale užitečné pro porozumnění kódu        


Pohybem jazýčku měníte hodnotu procenta. Implicitně nastavená hodnota je 10% :



Všimneme si zde, jak je zadána hodnota aspektu data. V tomto případě by šlo slovo 'data' vynechat - na rozdíl od deklarace piškotu text-list, kde přiřazovanou hodnotou k aspektu data byl blok.


     panel (on-down)

Vytváří společný piškot (uvnitř piškotu window a screen) pro umístění dalších piškotů.

Red [needs: view]

view [

       panel red [size 100x120 below text "Panel 1" check button "Quit 1" [quit]]

       panel gray [size 100x120 below text "Panel 2" check button "Quit 2" [quit]]

]  





     group-box (on-down)

Group-box je kontejner podobný kontejneru panel. Rovněž slouží pro umístění dalších piškotů. Uvažuje se, že se zruší po zavedení aspektu edge.

Red [needs: view]

view [

       group-box [size 110x120 below text "box1" check button "Quit 1" [quit]]

       group-box gray [size 110x120 below text "box2" check button "Quit 2" [quit]]

]




     tab-panel (on-select)

Vytvoří sadu karet s oušky, formou překrývajících se panelů v piškotu window. Každý panel může obsahovat více piškotů. Informace o sestavě jsou uloženy v těchto aspektech:

<tab-panel>/data - blok s názvy oušek (string!).
<tab-panel>/pane - odkaz na dětské piškoty (block!).
<tab-panel>/selected - index vybraného panelu nebo hodnota none .

Na rozdíl od piškotu group-box je piškot tab-panel expilicitně deklarován jen jednou:

Red [needs: view]

view [

       Title "Tab-panels"

       tab-panel 200x100 [

               "Tab 1 " [text "First panel"]

               "Tab 2 " [text "Second panel"]

               "Tab 3 " [text "Third panel"]

       ]

]



Ukázka karty s více piškoty:

Red [needs: view]

view [

       Title "Tab-panels"

       tab-panel 110x140 [

               "Tab 1 " [

               below

               text font-color blue "First panel"

               button "quit" [quit]

               check "check to quit" [quit]

               ]

               "Tab 2 " [text "Second panel"]

       ]

]






     drop-down (on-select, on-change, on-enter)

Roletka s vertikálním seznamem řetězců. Aspekt  data příjímá jakékoli hodnoty ale pouze řetězce jsou přidávány do seznamu a zobrazeny. Neřetězcové hodnoty lze použít pro vytvoření asociativních řad (arrays) s použitím řetězců jako klíčů.

Aspekt  selected obsahuje celočíselný index vybrané položky. Aspekt  text obsahuje aktuálně vybranou položku. Zobrazí se při stisku Enter.

Red [needs: view]


view [

         t: text "-->"

         drop-down "Choose one" data [     ; piškot, aspekt text, aspekt data

                "First" "Second" "Third" ] [

       t/text: pick face/data face/selected ]                    ; aktér

    ]        






     drop-list (on-change)

Stejné jako drop-down, akorát že se nezobrazí řetězec aspektu text a název položky se projeví hned po jejím výběru v roletce.



     text (on-down)

Piškot text  je autonomní entita s rodiči window a screen  (případně panel, případně jiný piškot).

Red [needs: view]


view [

       text "Hello"        ; piškot text plus hodnota aspektu text

]



     camera (on-down)            Nutno doplnit komentář


     box (on-down)        image (on-down)

Piškoty box a image jsou variantami piškotu base (type: ´base).

box  bez parametru vymezí v nadřazeném piškotu window transparentní čtverec (80x80 px) bez ohraničení

image  bez parametru vymezí v nadřazeném piškotu window bílý čtverec (100x100 px) bez ohraničení. Image s odkazem na soubor vrátí zobrazení tohoto souboru.

Red [needs: view]        


view [

       base

       box

       image

       image %smallballoon.jpeg

]


     h1 až h5 (on-down)

Piškoty h1, h2, h3, h4 a h5 jsou variantami piškotu text (type: ´text).

Red [needs view]


view [

       below

       h1 "Hello"

       h2 "Hello"

       h3 "Hello"

       h4 "Hello"

       h5 "Hello" [print "Halali"]    ; jediný aktivní piškot

]



Introspekcí kódu lze zjistit, že i tyto piškoty jsou deklarovány stejnými sadami 23 aspektů, stejně jako základní piškoty.



Aspekt text

Aspekt text je pole piškotu pro uložení textu.

Red [needs: view]        


view [

       button "hello"               ; piškot button plus hodnota aspektu text

       button "bold" bold           ; dtto plus klíčové slovo

       button "underline" underline

       button "strike" strike

       return

       button "top" 70x70 top       ; hodnoty aspektů text, size plus keyword

       button "middle" 70x70 middle ; dtto

       button "bottom" 70x70 bottom

       return

       button "left" 70x70 left

       button "center" 70x70 center

       button "right" 70x70 right

       return

       button "mix1" 70x70 top left

       button "mix2" 70x70 top center

       button "mix3" 70x70 top right

       return

       button "No" 70x70 right bold       ; right nechodí!

]



Aspekt color

K zadání barvy pozadí slouží aspekt color. Jeho hodnotu lze zadat jako literál ve formátu word! (např. aqua) nebo tuple! (0.255.255) či issue! (#00ffff) - bez uvedení názvu aspektu. V následující ukázce vidíme deklaraci 32 piškotů base uvnitř automaticky generovaného piškotu window:

Red [needs: view]

view [

       base 30x30 aqua  text "aqua"       base 30x30 beige text "beige"  

       base 30x30 black text "black"     base 30x30 blue   text "blue"                

       return

       base 30x30 brick text "brick"      base 30x30 brown text "brown"  

       base 30x30 coal text "coal"       base 30x30 coffee   text "coffee"              

       return

       base 30x30 crimson text "crimson"  base 30x30 cyan text "cyan"    

       base 30x30 forest text "forest"   base 30x30 gold text "gold"                  

       return

       base 30x30 gray text "gray"        base 30x30 green text "green"  

       base 30x30 ivory text "ivory"     base 30x30 khaki text "khaki"                  

       return

       base 30x30 leaf text "leaf"        base 30x30 linen text "linen"  

       base 30x30 magenta text "magenta" base 30x30 maroon  text "maroon"              

       return

       base 30x30 mint text "mint"        base 30x30 navy text  "navy"    

       base 30x30 oldrab text "oldrab"   base 30x30 olive text "olive"                  

       return

       base 30x30 orange text "orange"    base 30x30 papaya text "papaya"

       base 30x30 pewter text "pewter"   base 30x30 pink text "pink"                  

       return

       base 30x30 purple text "purple"    base 30x30 reblue text "reblue"

       base 30x30 rebolor text "rebolor"  base 30x30 red text "red"

]


Dostaneme tuto pěknou paletu. Kdybychom popis barev v uvozovkách použili bez anotace text, šlo by o aplikaci aspektu text a popisky by byly uvnitř barevných polí. Takto jde o deklaraci piškotu text se zadanou hodnotou aspektu text.

 


Dynamická změna aspektů

Při běhu programu lze měnit hodnoty jejich aspektů (facets):


Všimněte si, že při deklaraci jednotlivých aspektů piškotu zadáváme přímo jejich příslušné hodnoty (50x20 "click me"), zatímco při změně hodnot (zde v hranatých závorkách) uvádíme rovněž název příslušného aspektu (b/text: "Ouch!"), přičemž můžeme uplatnit i aspekt původně nepoužitý (t/color: red), případně můžeme odkázat na aspekt jiného piškotu, například:


   b: button 50x20 "click me" [b/text: "Au!" t/size: 60x50]     ;vyzkoušejte si to


 Na objekt piškotu se lze také odkázat slovem face/<attribute>: