all repos — min @ fa0c7f70eb9f24a463bd4f9de1f3d3c419a6ce16

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
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
import std/sequtils

import pkg/fenstim, fenstim_audio

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

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

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

proc audio(i: In, v: MinValue): var FensterAudio =
    return AUDIO[i.dget(v, "ref").intVal]

proc close(i: In, v: MinValue) =
    i.window(v).close()
    let r = i.dget(v, "ref").intVal
    WINDOWS.delete(r)

proc stop(i: In, v: MinValue) =
    i.audio(v).close()
    let r = i.dget(v, "ref").intVal
    AUDIO.delete(r)

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("quot", "dict:window")
        while i.window(vals[1]).loop:
            i.dequote vals[0]

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

    def.symbol("pixel") do (i: In):
        var vals = i.expect("quot", "dict:window")
        i.push i.window(vals[1]).pixel(vals[0].qVal[0].intVal, vals[0].qVal[
                1].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.symbol("audio") do (i: In):
        var audio = FensterAudio.init()
        var aud = newDict(i.scope)
        aud = i.dset(aud, "ref", AUDIO.len.newVal)
        aud.objType = "audio"
        AUDIO.add audio
        i.push aud

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

    def.symbol("play") do (i: In):
        var vals = i.expect("quot", "dict:audio")
        i.audio(vals[1]).write(vals[0].qVal.mapIt(it.floatVal.float32))

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

    def.finalize("gui")