(import scheme) (import (chicken base)) (import (chicken bitwise)) (import (chicken format)) (import (rename format (format cl-format))) (import (prefix glfw3 glfw:)) (import (prefix epoxy gl:)) (import (prefix nuklear-glfw3-opengl2 nk:)) (import (prefix nuklear nk:)) (define width 1200) (define height 800) (glfw:init) (glfw:make-window width height "Calculator") (glfw:make-context-current (glfw:window)) (set!-values (width height) (glfw:get-window-size (glfw:window))) (define ctx (nk:init (glfw:window))) (nk:init-default-font ctx) (define state 0) (define cache 0) (define action 0) (define total 0.0) (define bg (nk:make-color 0.1 0.18 0.24 1.0)) (define ->flag bitwise-ior) (let loop () (when (and (not (glfw:window-should-close (glfw:window)))) (glfw:poll-events) (nk:new-frame) (when (nk:window-begin ctx "Calculator" (nk:make-rect 10 10 180 250) (->flag nk:window/border nk:window/no-scrollbar nk:window/movable)) (let ((solve #f) (operator-key (lambda () (when (zero? state) (case action ((1) (set! cache (+ cache total)) (set! total cache)) ((2) (set! cache (- cache total)) (set! total cache)) ((3) (set! cache (* cache total)) (set! total cache)) ((4) (set! cache (/ cache total)) (set! total cache))))))) (nk:layout-row-dynamic ctx 35 1) (let* ((buffer (cl-format #f "~,2f" total)) (buffer (nk:edit-string ctx nk:edit/simple buffer 255 nk:filter-float))) (set! total (string->number buffer))) (nk:layout-row-dynamic ctx 35 4) (for-each (lambda (item) (if (char-numeric? item) (let* ((label (format "~c" item)) (digit (string->number label))) (when (nk:button-label ctx label) (if (or (= total 0) (> state 0)) (begin (set! cache total) (set! total digit)) (set! total (+ (* total 10.0) digit))) (set! state 0))) (when (nk:button-label ctx (format "~c" item)) (case item ((#\+ #\- #\* #\/ #\=) (case item ((#\+) (operator-key) (set! action 1)) ((#\-) (operator-key) (set! action 2)) ((#\*) (operator-key) (set! action 3)) ((#\/) (operator-key) (set! action 4)) ((#\=) (operator-key) (set! action 0))) (set! state (+ state 1))) ((#\C) (set! total 0) (set! state 0) (set! action 0) (set! cache 0)))))) '(#\7 #\8 #\9 #\+ #\4 #\5 #\6 #\- #\1 #\2 #\3 #\* #\C #\0 #\= #\/)))) (nk:window-end ctx) (let-values (((width height) (glfw:get-window-size (glfw:window)))) (gl:viewport 0 0 width height)) (gl:clear gl:+color-buffer-bit+) (gl:clear-color (nk:color-r bg) (nk:color-g bg) (nk:color-b bg) (nk:color-a bg)) (nk:render nk:anti-aliasing/on) (glfw:swap-buffers (glfw:window)) (loop))) (nk:shutdown) (glfw:terminate)