all repos — min @ f075ee29b9f6a8727ad5fc0a6ea1e5a941107d28

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
 103
 104
 105
 106
 107
 108
 109
 110
 111
import std/sequtils

import pkg/fenstim

import
    ../core/parser,
    ../core/interpreter,
    ../core/value,
    ../core/utils

var WINDOWS*: seq[Fenster] = @[]

proc window(i: In, v: MinValue): var Fenster =
    return WINDOWS[i.dget(v, "ref").intVal]

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 window = Fenster.init(title, width, height, 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 = i.dset(win, "ref", WINDOWS.len.newVal)
        win.objType = "window"
        WINDOWS.add window
        i.push win

    def.symbol("loop") do (i: In):
        var vals = i.expect("dict:window")
        i.push i.window(vals[0]).loop.newVal

    def.symbol("close") do (i: In):
        var vals = i.expect("dict:window")
        i.window(vals[0]).close()
        WINDOWS.delete(vals[0].intVal)

    def.symbol("pixel") do (i: In):
        var vals = i.expect("quot", "dict:window")
        i.reqQuotationOfIntegers(vals[0])
        i.push i.window(vals[1]).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")
        var f = i.window(vals[2])
        let x = vals[1].qVal[0].intVal
        let y = vals[1].qVal[1].intVal
        let v = vals[0].intVal.uint32
        f.pixel(x, y) = v

    def.symbol("width") do (i: In):
        var vals = i.expect("dict:window")
        i.push i.window(vals[0]).width.newVal

    def.symbol("height") do (i: In):
        var vals = i.expect("dict:window")
        i.push i.window(vals[0]).height.newVal

    def.symbol("keys") do (i: In):
        var vals = i.expect("dict:window")
        i.push i.window(vals[0]).keys.mapIt(it.int.newVal).newVal

    def.symbol("modkey") do (i: In):
        var vals = i.expect("dict:window")
        i.push i.window(vals[0]).modkey.newVal

    def.symbol("mouse") do (i: In):
        var vals = i.expect("dict:window")
        var win = i.window(vals[0])
        var mouse = newDict(i.scope)
        # Double quote quotations
        let click = @[win.mouse.mclick.mapIt(
                it.int.newVal).newVal].newVal
        let hold = @[win.mouse.mhold.mapIt(
                it.int.newVal).newVal].newVal
        i.dset(mouse, "x", win.mouse.pos.x.newVal)
        i.dset(mouse, "y", win.mouse.pos.y.newVal)
        i.dset(mouse, "click", click)
        i.dset(mouse, "hold", hold)
        i.push mouse

    def.symbol("sleep") do (i: In):
        var vals = i.expect("int", "dict:window")
        i.window(vals[1]).sleep(vals[0].intVal)

    def.symbol("time") do (i: In):
        var vals = i.expect("dict:window")
        i.push i.window(vals[0]).time.newVal

    def.symbol("clear") do (i: In):
        var vals = i.expect("dict:window")
        i.window(vals[0]).clear()

    def.finalize("gui")