all repos — min @ 81b57d7290fad6152fac6ef93a5328a7534642bf

A small but practical concatenative programming language.

minpkg/lib/min_gui.nim

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 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", height.newVal)
        win = i.dset(win, "width", width.newVal)
        win = i.dset(win, "fps", fps.newVal)
        win.objType = "window"
        win.obj = winRef[].addr
        i.push win

    def.symbol("loop") do (i: In):
        var vals = i.expect("quot", "dict:window")
        var win = vals[1].toFenster
        while win.loop:
            i.dequote vals[0]
    
    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("quot", "dict:window")
        i.reqQuotationOfIntegers(vals[0])
        i.push vals[1].toFenster.pixel(vals[0].qVal[0].intVal, vals[1].qVal[0].intVal).int.newVal

    def.symbol("draw") do (i: In):
        var vals = i.expect("int", "quot", "dict:window")
        vals[2].toFenster.pixel(vals[1].qVal[0].intVal, vals[1].qVal[1].intVal) = vals[0].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("int", "dict:window")
        vals[1].toFenster.sleep(vals[0].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")