8th ohjelmointikielen mukaan on integroitu tuki Nuklear pohjaisen graafisen käyttöliittymän toteuttamiseen. Kirjoittelin yksinkertaisen esimerkin, mikä näyttää miten helppo on työsäikeeltä välittää tietoa pää eli GUI säikeelle. Tämä onnistuu helposti käyttämättä lukkoja. Esimerkissä työ säie antaa random arvoja GUI säikeelle, mikä näyttää kyseisiä tuloksia liikuteltavaan ikkkunaan piirrettyihin rumiin mittareihin. Ohjelmaan on toteutettu taustakuva ja yksinkertainen valikko mistä saa näytettyä ruudulle tietoja ikkunan.
"logo.png" app:asset img:new var, logo-img
needs nk/gui
needs nk/widgets
needs map/iter
libbin font/Roboto-Regular.ttf
\ Gauge widgets and values
\ uses numbers as names but could be more descriptive
{ 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0, 10: 0 } constant gauges
\ Order to iterate gauges
' >s 1 10 a:generate constant gauge-keys
var task
800 constant WIDTH
600 constant HEIGHT
: new-win
{
name: "main",
wide: @WIDTH,
high: @HEIGHT,
resizable: false,
fonts: {
f1: {
font: @font/Roboto-Regular.ttf
}
},
fontheight: 18,
font: "f1",
title: "Test"
}
nk:win ;
: center-rect \ r1 r2 -- r3
nk:rect>size >r
dup nk:rect>pos
swap
nk:rect>size r@
( n:- 2 n:/ ) a:2map
' n:+ a:2map
r> a:+ ;
: random-value \ -- n
rand-pcg n:abs 400 n:mod 600 n:+ 1000 n:/ ;
\ Simulate reading of some measurement values and pass results to main GUI task
: update-task
repeat
m:new
( random-value m:! ) 1 10 loop
"cb" ( gauges swap m:+ drop ) m:!
nk:do
0.35 sleep
again ;
\ Really ugly gauge widget. Takes value between 0 to 1 as param.
: gauge \ n --
0 1 n:clamp
nk:widget drop \ n widget-bound-rect
\ background
dup 0 "lightgray" nk:fill-rect
\ frame
dup 0 1 "black" nk:stroke-rect
\ arc
0 a:@ swap 2 a:@ 2 n:/ rot n:+ over 1 a:@ swap 3 a:@ nip n:+ 2 a:close dup >r
over 2 a:@ swap 3 a:@ nip 0.8 n:* n:min dup 0.86 n:* >r
180 deg>rad 360 deg>rad 2 a:close
1
"black"
nk:stroke-arc
\ indicator
180 rot n:* 180 n:+ deg>rad dup n:cos r@ n:* swap n:sin r> n:* 2 a:close
r> swap over ' n:+ a:2map
2
"red"
nk:stroke-line
drop ;
var show-about
: about-window
{
title: "About",
bounds: ` [ 0, 0, @WIDTH, @HEIGHT ] [ 0, 0, 320, 120] center-rect ` ,
padding: [ 8, 8 ],
flags: [ @nk:WINDOW_TITLE, @nk:WINDOW_NO_SCROLLBAR, @nk:WINDOW_MOVABLE, @nk:WINDOW_CLOSABLE ]
}
show-about @ if
nk:(begin) dup show-about ! if
150 1 nk:layout-row-dynamic
"Simple demo of passing data between worker task and main GUI task." "white" nk:label-wrap-colored
then
nk:(end)
else
drop
then ;
: measurement-window
{
title: "Measurements",
bounds: ` [ 0, 0, @WIDTH, @HEIGHT ] [ 0, 0, 400, 150 ] center-rect ` ,
padding: [ 8, 8 ],
flags: [ @nk:WINDOW_TITLE , @nk:WINDOW_NO_SCROLLBAR , @nk:WINDOW_MOVABLE ]
}
nk:begin
40 5 nk:layout-row-dynamic
gauges gauge-keys ( m:@ gauge ) m:iter drop
nk:end ;
: menu-window
{
title: "Menu",
bounds: [ 0, 0, @WIDTH, 32 ],
padding: [ 0, 0 ],
flags: [ @nk:WINDOW_NO_SCROLLBAR ]
}
nk:begin
nk:menubar-begin
nk:STATIC nk:get-row-height 2 nk:layout-row-begin
50 nk:layout-row-push
"Help" nk:TEXT_LEFT [120,200] nk:menu-begin if
nk:get-row-height 1 nk:layout-row-dynamic
"About" nk:TEXT_LEFT ( true show-about ! "About" nk:win-focus ) nk:menu-item-label
nk:menu-end then
nk:menubar-end
nk:end ;
: background-window
{
title: "Background",
bg: "gray",
flags: [ @nk:WINDOW_BACKGROUND, @nk:WINDOW_NO_INPUT, @nk:WINDOW_NO_SCROLLBAR ]
}
nk:begin
nk:win-content-bounds [ 0, 0, 400, 400 ] center-rect logo-img @ "white" nk:draw-image
nk:end ;
: main-render
background-window
menu-window
about-window
measurement-window ;
: app:main
' update-task t:task task !
new-win ' main-render -1 nk:render-loop ;Aihe on jo aika vanha, joten et voi enää vastata siihen.