all repos — min @ e81c461c65dee6441cfd26b20a5509f0e8a218d3

A small but practical concatenative programming language.

Implemented simple gui module based on fenster API.
h3rald h3rald@h3rald.com
Tue, 29 Oct 2024 10:01:47 +0100
commit

e81c461c65dee6441cfd26b20a5509f0e8a218d3

parent

f28cc1c9ec53d7afc90851e4fd066664bece962e

3 files changed, 105 insertions(+), 0 deletions(-)

jump to
M min.nimblemin.nimble

@@ -18,3 +18,4 @@ requires "zippy >= 0.5.6 & < 0.6.0"

requires "nimquery >= 2.0.1 & < 3.0.0" requires "minline >= 0.1.2 & < 0.2.0" requires "htmlparser >= 0.1.0 & < 0.2.0" +requires "https://github.com/h3rald/fenstim"
M minpkg/core/stdlib.nimminpkg/core/stdlib.nim

@@ -23,6 +23,7 @@ min_xml,

min_http, min_net, min_crypto, + min_gui, min_math] var customPrelude* {.threadvar.}: string

@@ -48,6 +49,7 @@ i.net_module

i.math_module i.http_module i.xml_module + i.gui_module if customPrelude != "": try: i.eval customPrelude.readFile, customPrelude
A minpkg/lib/min_gui.nim

@@ -0,0 +1,102 @@

+import std/sequtils + +import pkg/fenstim + +import + ../core/parser, + ../core/interpreter, + ../core/value, + ../core/utils + +type Window = ref Fenster + +proc toFenster(q: MinValue): var Fenster = + return cast[var Fenster](q.obj) + +proc gui_module*(i: In) = + let def = i.define() + + def.symbol("window") do (i: In): + let vals = i.expect("dict") + var d = vals[0] + var title = "min" + var height = 400 + var width = 400 + var fps = 60 + if d.dhas("title"): + title = i.dget(d, "title").getString + if d.dhas("height"): + height = i.dget(d, "height").intVal + if d.dhas("width"): + width = i.dget(d, "width").intVal + if d.dhas("fps"): + fps = i.dget(d, "fps").intVal + var app = Fenster.init(title, width, height, fps) + var winRef = Window(raw: app.raw, targetFps: app.targetFps, lastFrameTime: app.lastFrameTime, fps: app.fps) + var win = newDict(i.scope) + win = i.dset(win, "title", title.newVal) + win = i.dset(win, "height", title.newVal) + win = i.dset(win, "width", title.newVal) + win = i.dset(win, "fps", title.newVal) + win.objType = "window" + win.obj = winRef[].addr + i.push win + + def.symbol("loop") do (i: In): + var vals = i.expect("dict:window", "quot") + while vals[0].toFenster.loop: + i.dequote vals[1] + + def.symbol("close") do (i: In): + var vals = i.expect("dict:window") + vals[0].toFenster.close() + + def.symbol("pixel") do (i: In): + var vals = i.expect("dict:window", "quot") + i.reqQuotationOfIntegers(vals[1]) + i.push vals[0].toFenster.pixel(vals[1].qVal[0].intVal, vals[1].qVal[0].intVal).int.newVal + + def.symbol("draw") do (i: In): + var vals = i.expect("dict:window", "quot", "int") + i.reqQuotationOfIntegers(vals[1]) + vals[0].toFenster.pixel(vals[1].qVal[0].intVal, vals[1].qVal[0].intVal) = vals[2].intVal.uint32 + + def.symbol("width") do (i: In): + var vals = i.expect("dict:window") + i.push vals[0].toFenster.width.newVal + + def.symbol("height") do (i: In): + var vals = i.expect("dict:window") + i.push vals[0].toFenster.height.newVal + + def.symbol("keys") do (i: In): + var vals = i.expect("dict:window") + i.push vals[0].toFenster.keys.mapIt(it.int.newVal).newVal + + def.symbol("modkey") do (i: In): + var vals = i.expect("dict:window") + i.push vals[0].toFenster.modkey.newVal + + def.symbol("mouse") do (i: In): + var vals = i.expect("dict:window") + var win = vals[0].toFenster + var mouse = newDict(i.scope) + i.dset(mouse, "x", win.mouse.pos.x.newVal) + i.dset(mouse, "y", win.mouse.pos.y.newVal) + i.dset(mouse, "click", win.mouse.mclick.mapIt(it.int.newVal).newVal) + i.dset(mouse, "hold", win.mouse.mhold.mapIt(it.int.newVal).newVal) + i.push mouse + + def.symbol("sleep") do (i: In): + var vals = i.expect("dict:window", "int") + vals[0].toFenster.sleep(vals[1].intVal) + + def.symbol("time") do (i: In): + var vals = i.expect("dict:window") + i.push vals[0].toFenster.time.newVal + + def.symbol("clear") do (i: In): + var vals = i.expect("dict:window") + vals[0].toFenster.clear() + + def.finalize("gui")