I wrote the first version of my tileui library. I will use it to create my own node based GUI builder tool. It will work as a hybrid of declarative and programmatic paradigms. It will generate JSON for UI.
Below is a calculator sample program:
needs nk/gui
needs nk/tileui
32 constant FONTHEIGHT
FONTHEIGHT 1.75 n:* constant ROWHEIGHT
FONTHEIGHT font:system font:new "font1" font:atlas! drop
: +n \ nk n --
>r
"calculator.display:num" tileui:data@ 10 n:*
r> n:+ "calculator.display:num" swap tileui:data! ;
: mathop \ nk w -- nk
"calculator:op" swap tileui:data!
"calculator.display:num" tileui:data@ "calculator:a" swap tileui:data!
"calculator.display:num" 0 tileui:data! ;
{
name: "calculator",
grid: null,
layout: { rows: [ @ROWHEIGHT, -1], cols: 1, rgap: 4, cgap: 4, margin: 4 },
data: { },
cb: null ,
tiles: [
{
name: "display",
grid: { row: 0, rows: 1, col: 0, cols: 1 },
data: { num: 0 },
cb: ( nk:rect>local nk:grid-push
"num" m:@ >s 32 nk:EDIT_SELECTABLE nk:EDIT_CLIPBOARD n:bor
nk:PLUGIN_FILTER_FLOAT edit-string drop >n "num" m:_! drop )
},
{
name: "keypad",
grid: { row: 1, rows: 1, col: 0, cols: 1 },
layout: { rows: 4, cols: 4, rgap: 4, cgap: 4, margin: 4 },
data: { },
cb: ( 2 2 "black" nk:stroke-rect drop ),
tiles: [
{
name: "7",
grid: { row: 0, rows: 1, col: 0, cols: 1 },
data: { },
cb: ( nk:rect>local nk:grid-push "7" ( 7 +n ) nk:button-label drop )
},
{
name: "8",
grid: { row: 0, rows: 1, col: 1, cols: 1 },
data: { },
cb: ( nk:rect>local nk:grid-push "8" ( 8 +n ) nk:button-label drop )
},
{
name: "9",
grid: { row: 0, rows: 1, col: 2, cols: 1 },
data: { },
cb: ( nk:rect>local nk:grid-push "9" ( 9 +n ) nk:button-label drop )
},
{
name: "+",
grid: { row: 0, rows: 1, col: 3, cols: 1 },
data: { },
cb: ( nk:rect>local nk:grid-push "+" ( ' n:+ mathop ) nk:button-label drop )
},
{
name: "4",
grid: { row: 1, rows: 1, col: 0, cols: 1 },
data: { },
cb: ( nk:rect>local nk:grid-push "4" ( 4 +n ) nk:button-label drop )
},
{
name: "5",
grid: { row: 1, rows: 1, col: 1, cols: 1 },
data: { },
cb: ( nk:rect>local nk:grid-push "5" ( 5 +n ) nk:button-label drop )
},
{
name: "6",
grid: { row: 1, rows: 1, col: 2, cols: 1 },
data: { },
cb: ( nk:rect>local nk:grid-push "6" ( 6 +n ) nk:button-label drop )
},
{
name: "-",
grid: { row: 1, rows: 1, col: 3, cols: 1 },
data: { },
cb: ( nk:rect>local nk:grid-push "-" ( ' n:- mathop ) nk:button-label drop )
},
{
name: "1",
grid: { row: 2, rows: 1, col: 0, cols: 1 },
data: { },
cb: ( nk:rect>local nk:grid-push "1" ( 1 +n ) nk:button-label drop )
},
{
name: "2",
grid: { row: 2, rows: 1, col: 1, cols: 1 },
data: { },
cb: ( nk:rect>local nk:grid-push "2" ( 2 +n ) nk:button-label drop )
},
{
name: "3",
grid: { row: 2, rows: 1, col: 2, cols: 1 },
data: { },
cb: ( nk:rect>local nk:grid-push "3" ( 3 +n ) nk:button-label drop )
},
{
name: "*",
grid: { row: 2, rows: 1, col: 3, cols: 1 },
data: { },
cb: ( nk:rect>local nk:grid-push "*" ( ' n:* mathop ) nk:button-label drop )
},
{
name: "C",
grid: { row: 3, rows: 1, col: 0, cols: 1 },
data: { },
cb: ( nk:rect>local nk:grid-push "C"
( "calculator:a" 0 tileui:data! "calculator.display:num" 0 tileui:data! )
nk:button-label drop
)
},
{
name: "0",
grid: { row: 3, rows: 1, col: 1, cols: 1 },
data: { },
cb: ( nk:rect>local nk:grid-push "0" ( 0 +n ) nk:button-label drop )
},
{
name: "=",
grid: { row: 3, rows: 1, col: 2, cols: 1 },
data: { },
cb: ( nk:rect>local nk:grid-push "=" ( "calculator:op" tileui:data@ >r
"calculator.display:num" tileui:data@ >r
"calculator:a" tileui:data@ r> r> w:exec
"calculator.display:num" swap tileui:data!
"calculator:a" 0 tileui:data! ) nk:button-label drop )
},
{
name: "/",
grid: { row: 3, rows: 1, col: 3, cols: 1 },
data: { },
cb: ( nk:rect>local nk:grid-push "/" ( ' n:/ mathop ) nk:button-label drop )
}
]
}
]
} constant UI
: init-window-size
mobile? if
hw:displaysize?
else
240 260
then ;
init-window-size constant HEIGHT constant WIDTH
: new-win
{
name: "main",
wide: @WIDTH,
high: @HEIGHT,
resizable: true,
title: "Calculator"
}
nk:win ;
: main-render
{
name: "main",
title: "main",
bg: "white",
padding: [0,0],
flags: [ @nk:WINDOW_NO_SCROLLBAR ]
}
nk:begin
UI tileui:render
nk:end ;
: app:main
UI tileui:init
new-win ' main-render -1 nk:render-loop ;
