Inspired by Daves’s great looking calculator… I tested building UI for a simple calculator program using 8th. Supports only the very basic calculator stuff and uses default Nuklear widgets, so it’s not too pretty.
I would love to see SwiftUI version…
\ Calculator demo
needs nk/gui
32 constant FONTHEIGHT
1.2 FONTHEIGHT n:* constant ROWHEIGHT
FONTHEIGHT font:system font:new "font1" font:atlas! drop
: new-win
{
name: "main",
wide: 240,
high: 250,
bg: "white",
title: "Calculator"
} nk:win ;
: +n \ nk n --
>r
"num" nk:m@ 10 n:*
r> n:+ "num" swap nk:m! ;
: mathop \ nk w -- nk
"op" swap nk:m!
"num" nk:m@ "a" swap nk:m!
"num" 0 nk:m! ;
\ calculator display
: display
"num" nk:m@ 0 ?: >s 32 nk:EDIT_SELECTABLE nk:EDIT_CLIPBOARD n:bor nk:PLUGIN_FILTER_FLOAT
edit-string drop >n "num" swap nk:m! ;
\ calculator keys
: keys
nk:widget if
{ rows: 4, cols: 4, rgap: 4, cgap: 4, margin: 4 } nk:layout-grid-begin
\ the button labels:
[ "7", "8", "9", "+" ,
"4", "5", "6", "-" ,
"1", "2", "3", "*" ,
"C", "0", "=", "/" ]
( \ nk n s
swap dup >r \ save the button index
4 n:/mod swap 1 tuck nk:grid nk:rect>local nk:grid-push \ handle grid layout
( \ act based on what the index is
r@
[ ( 7 +n ) , ( 8 +n ) , ( 9 +n ) , ( ' n:+ mathop ) ,
( 4 +n ) , ( 5 +n ) , ( 6 +n ) , ( ' n:- mathop ) ,
( 1 +n ) , ( 2 +n ) , ( 3 +n ) , ( ' n:* mathop ) ,
( "a" 0 nk:m! "num" 0 nk:m! ) , ( 0 +n ) , ( "eq" true nk:m! ) , ( ' n:/ mathop )
] case
"eq" nk:m@ if
"eq" false nk:m!
"op" nk:m@ >r
"num" nk:m@ >r
"a" nk:m@ r> r> w:exec
"num" swap nk:m!
"a" 0 nk:m!
then
) nk:button-label rdrop
) a:each drop
nk:layout-grid-end
else
drop
then ;
: main-render
{
title: "calc",
bg: "white",
flags: [ @nk:WINDOW_NO_SCROLLBAR ],
padding: [0,0]
}
nk:begin
null { rows: [ @ROWHEIGHT, -1], cols: 1, rgap:4, cgap:4, margin: 4 } nk:layout-grid-begin
0 1 0 1 nk:grid nk:rect>local nk:grid-push
display
1 1 0 1 nk:grid nk:rect>local nk:grid-push
keys
1 1 0 1 nk:grid
2 2 "black" nk:stroke-rect
nk:layout-grid-end
nk:end ;
: app:main
new-win ' main-render -1 nk:render-loop ;