(use (prefix glfw3 glfw:) (prefix opengl-glew gl:) (prefix nuklear nk:) (rename format (format cl-format)) srfi-1 posix) (require-library nuklear-glfw-opengl2) (import (prefix nuklear-glfw-opengl2 backend:)) (define width 1200) (define height 800) (glfw:init) (glfw:make-window width height "Overview") (glfw:make-context-current (glfw:window)) (set!-values (width height) (glfw:get-window-size (glfw:window))) (define context (backend:init! (glfw:window) #t)) (backend:init-font!) (define background (nk:rgb->color 28 48 62)) (define show-menu? #t) (define titlebar? #t) (define border? #t) (define scalable? #t) (define movable? #t) (define no-scrollbar? #f) (define minimizable? #t) (define closable? #t) (define menu-progress 60) (define menu-slider 10) (define menu-check #t) (define progress 40) (define slider 10) (define check #t) (define A 0) (define B 1) (define C 2) (define checkbox #f) (define option 0) (define int-slider 5) (define float-slider 2.5) (define prog-value 40) (define property-float 2) (define property-int 10) (define property-neg 10) (define range-float-min 0) (define range-float-max 100) (define range-float-value 50) (define range-int-min 0) (define range-int-value 2048) (define range-int-max 4096) (define ratio '(120 150)) (define selected-list (make-vector 4 #f)) (define selected-grid (make-vector 16 #f)) (define (vector-for-each proc vec) (let loop ((i 0)) (when (< i (vector-length vec)) (proc i (vector-ref vec i)) (loop (add1 i))))) (define (vector-toggle! vec n) (let ((value (vector-ref vec n))) (vector-set! vec n (not value)))) (define chart-selection 8) (define check-values (make-list 4 #f)) (define position '(0 0 0)) (define combo-color (nk:make-color 130 50 50 255)) (define combo-color2 (nk:make-color 130 180 50 255)) (define use-hsva? #f) (define prog-a 20) (define prog-b 40) (define prog-c 10) (define prog-d 90) (define weapons '("Fist" "Pistol" "Shotgun" "Plasma" "BFG")) (define current-weapon (car weapons)) (define time-selected? #f) (define date-selected? #f) (define selected-time #f) (define selected-date #f) (define text (make-vector 8 "")) (define field-buffer "") (define box-buffer "") (define (mask-text text) (make-string (string-length text) #\*)) (define pi (* 2 (asin 1))) (define col-index -1) (define line-index -1) (define selected (make-list 4 #f)) (define color (nk:make-color 255 0 0 255)) (define popup-active? #f) (define group-titlebar? #f) (define group-border? #t) (define group-no-scrollbar? #f) (define (group-flags) (append (if group-titlebar? '(title) '()) (if group-border? '(border) '()) (if group-no-scrollbar? '(no-scrollbar) '()))) (define group-width 320) (define group-height 200) (define selected-group (make-list 16 #f)) (define left-selected-group (make-list 32 #f)) (define top-right-selected-group (make-list 4 #f)) (define center-right-selected-group (make-list 4 #f)) (define bottom-right-selected-group (make-list 4 #f)) (define vertical-a 100) (define vertical-b 100) (define vertical-c 100) (define horizontal-a 100) (define horizontal-b 100) (define horizontal-c 100) (define (window-flags) (append (if border? '(border) '()) (if scalable? '(scalable) '()) (if movable? '(movable) '()) (if no-scrollbar? '(no-scrollbar) '()) (if minimizable? '(minimizable) '()) (if closable? '(closable) '()))) (nk:style-window-header-align-set! (nk:context-style context) #t) (define show-app-about? #f) (define layout (nk:make-panel)) (define menu-layout (nk:make-panel)) (define popup-layout (nk:make-panel)) (define combo-layout (nk:make-panel)) (define tab-layout (nk:make-panel)) (define sub-layout (nk:make-panel)) (let loop () (when (and (not (glfw:window-should-close (glfw:window)))) (glfw:poll-events) (backend:new-frame) (when (nk:window-begin context layout "Overview" (nk:make-rect 10 10 400 750) (window-flags)) (when show-menu? (nk:menubar-begin context) (nk:layout-row-begin context #f 25 2) (nk:layout-row-push context 45) (when (nk:menu-begin-label context menu-layout "MENU" 'left 120) (nk:layout-row-dynamic context 25 1) (when (nk:menu-item-label context "Hide" 'left) (set! show-menu? #f)) (when (nk:menu-item-label context "About" 'left) (set! show-app-about? #t)) (set! progress (nk:progressbar context progress 100 #t)) (set! slider (nk:slider-int context 0 slider 16 1)) (set! check (nk:checkbox-label context "check" check)) (nk:menu-end context)) (nk:layout-row-push context 70) (set! menu-progress (nk:progressbar context menu-progress 100 #t)) (set! menu-slider (nk:slider-int context 0 menu-slider 16 1)) (set! menu-check (nk:checkbox-label context "check" menu-check)) (nk:menubar-end context)) (when show-app-about? (if (nk:popup-begin context popup-layout #f "About" 'closable (nk:make-rect 20 100 300 190)) (begin (nk:layout-row-dynamic context 20 1) (nk:label context "Nuklear" 'left) (nk:label context "By Micha Mettke" 'left) (nk:label context "nuklear is licensed under the public domain License" 'left) (nk:popup-end context)) (set! show-app-about? #f))) (when (nk:tree-push context #t "Window" #f) (nk:layout-row-dynamic context 30 2) (set! titlebar? (nk:checkbox-label context "Titlebar" titlebar?)) (set! show-menu? (nk:checkbox-label context "Menu" show-menu?)) (set! border? (nk:checkbox-label context "Border" border?)) (set! scalable? (nk:checkbox-label context "Resizable" scalable?)) (set! movable? (nk:checkbox-label context "Movable" movable?)) (set! no-scrollbar? (nk:checkbox-label context "No Scrollbar" no-scrollbar?)) (set! minimizable? (nk:checkbox-label context "Minimizable" minimizable?)) (set! closable? (nk:checkbox-label context "Closable" closable?)) (nk:tree-pop context)) (when (nk:tree-push context #t "Widgets" #f) (when (nk:tree-push context #f "Text" #f) (nk:layout-row-dynamic context 20 1) (when (nk:button-label context "GC") (gc #t)) (nk:label context "Label aligned left" 'left) (nk:label context "Label aligned centered" 'centered) (nk:label context "Label aligned right" 'right) (nk:label-colored context "Blue text" 'left (nk:rgb->color 0 0 255)) (nk:label-colored context "Yellow text" 'left (nk:rgb->color 255 255 0)) ;; NOTE: no nk:text because passing strings with NULL is ;; hard and might end up forbidden in strings in CHICKEN 5 (nk:layout-row-static context 100 200 1) (nk:label-wrap context "This is a very long line to hopefully get this text to be wrapped into multiple lines to show line wrapping") (nk:layout-row-dynamic context 100 1) (nk:label-wrap context "This is another long text to show dynamic window changes on multiline text") (nk:tree-pop context)) (when (nk:tree-push context #f "Button" #f) (nk:layout-row-static context 30 100 3) (when (nk:button-label context "Button") (printf "Button pressed!\n")) (when (nk:button-label context "Repeater" #t) (printf "Repeater is being pressed!\n")) (nk:button-color context (nk:rgb->color 0 0 255)) (nk:layout-row-static context 20 20 8) (nk:button-symbol context 'circle) (nk:button-symbol context 'circle-filled) (nk:button-symbol context 'rect) (nk:button-symbol context 'rect-filled) (nk:button-symbol context 'triangle-up) (nk:button-symbol context 'triangle-down) (nk:button-symbol context 'triangle-left) (nk:button-symbol context 'triangle-up) (nk:layout-row-static context 30 100 2) (nk:button-symbol-label context 'triangle-left "prev" 'right) (nk:button-symbol-label context 'triangle-right "prev" 'left) (nk:tree-pop context)) (when (nk:tree-push context #f "Basic" #f) (nk:layout-row-static context 30 100 1) (set! checkbox (nk:checkbox-label context "Checkbox" checkbox)) (nk:layout-row-static context 30 80 3) (set! option (if (nk:option-label context "optionA" (= option A)) A option)) (set! option (if (nk:option-label context "optionB" (= option B)) B option)) (set! option (if (nk:option-label context "optionC" (= option C)) C option)) (nk:layout-row context #f 30 ratio) (nk:label context "Slider int" 'left) (set! int-slider (nk:slider-int context 0 int-slider 10 1)) (nk:label context "Slider float" 'left) (set! float-slider (nk:slider-float context 0 float-slider 5 0.5)) (nk:label context (format "Progressbar: ~a" prog-value) 'left) (set! prog-value (nk:progressbar context prog-value 100 #t)) (nk:layout-row context #f 25 ratio) (nk:label context "Property float:" 'left) (set! property-float (nk:property-float context "Float:" 0 property-float 64 0.1 0.2)) (nk:label context "Property int:" 'left) (set! property-int (nk:property-int context "Int:" 0 property-int 100 1 1)) (nk:label context "Property neg:" 'left) (set! property-neg (nk:property-int context "Neg:" -10 property-neg 10 1 1)) (nk:layout-row-dynamic context 25 1) (nk:label context "Range:" 'left) (nk:layout-row-dynamic context 25 3) (set! range-float-min (nk:property-float context "#min:" 0 range-float-min range-float-max 1 0.2)) (set! range-float-value (nk:property-float context "#float:" range-float-min range-float-value range-float-max 1 0.2)) (set! range-float-max (nk:property-float context "#max:" range-float-min range-float-max 100 1 0.2)) (set! range-int-min (nk:property-int context "#min:" -32767 range-int-min range-int-max 1 10)) (set! range-int-value (nk:property-int context "#neg:" range-int-min range-int-value range-int-max 1 10)) (set! range-int-max (nk:property-int context "#max:" range-int-min range-int-max 32767 1 10)) (nk:tree-pop context)) (when (nk:tree-push context #f "Selectable" #f) (when (nk:tree-push context #f "List" #f) (nk:layout-row-static context 18 100 1) (vector-set! selected-list 0 (nk:selectable-label context "Selectable" 'left (vector-ref selected-list 0))) (vector-set! selected-list 1 (nk:selectable-label context "Selectable" 'left (vector-ref selected-list 1))) (nk:label context "Not selectable" 'left) (vector-set! selected-list 2 (nk:selectable-label context "Selectable" 'left (vector-ref selected-list 2))) (vector-set! selected-list 3 (nk:selectable-label context "Selectable" 'left (vector-ref selected-list 3))) (nk:tree-pop context)) (when (nk:tree-push context #f "Grid" #f) (nk:layout-row-static context 50 50 4) (vector-for-each (lambda (i x) (receive (value clicked?) (nk:selectable-label context "Z" 'centered x) (vector-set! selected-grid i value) (when clicked? (let ((x (modulo i 4)) (y (quotient i 4))) (when (> x 0) (vector-toggle! selected-grid (sub1 i))) (when (< x 3) (vector-toggle! selected-grid (add1 i))) (when (> y 0) (vector-toggle! selected-grid (- i 4))) (when (< y 3) (vector-toggle! selected-grid (+ i 4))))))) selected-grid) (nk:tree-pop context)) (nk:tree-pop context)) (when (nk:tree-push context #f "Combo" #f) (nk:layout-row-static context 25 200 1) (when (nk:combo-begin-label context combo-layout current-weapon (nk:combo-items-height context (length weapons) 25)) (nk:layout-row-dynamic context 25 1) (for-each (lambda (weapon) (when (nk:combo-item-label context weapon 'left) (set! current-weapon weapon))) weapons) (nk:combo-end context)) (when (nk:combo-begin-color context combo-layout combo-color 200) (nk:layout-row context #t 30 '(0.15 0.85)) (nk:label context "R:" 'left) (nk:color-r-set! combo-color (nk:slider-int context 0 (nk:color-r combo-color) 255 5)) (nk:label context "G:" 'left) (nk:color-g-set! combo-color (nk:slider-int context 0 (nk:color-g combo-color) 255 5)) (nk:label context "B:" 'left) (nk:color-b-set! combo-color (nk:slider-int context 0 (nk:color-b combo-color) 255 5)) (nk:label context "A:" 'left) (nk:color-a-set! combo-color (nk:slider-int context 0 (nk:color-a combo-color) 255 5)) (nk:combo-end context)) (when (nk:combo-begin-color context combo-layout combo-color2 400) (nk:layout-row-dynamic context 120 1) (set! combo-color2 (nk:color-picker context combo-color2)) (nk:layout-row-dynamic context 25 2) (set! use-hsva? (if (nk:option-label context "RGB" (not use-hsva?)) #f use-hsva?)) (set! use-hsva? (if (nk:option-label context "HSV" use-hsva?) #t use-hsva?)) (nk:layout-row-dynamic context 25 1) (if use-hsva? (let* ((hsva-values (nk:color->hsva-ints combo-color2)) (hsva-values* (map (lambda (value label) (nk:property-int context label 0 value 255 1 1)) hsva-values '("#H:" "#S:" "#V:" "#A:")))) (set! combo-color2 (apply nk:hsva->color hsva-values*))) (begin (nk:color-r-set! combo-color2 (nk:property-int context "#R:" 0 (nk:color-r combo-color2) 255 1 1)) (nk:color-g-set! combo-color2 (nk:property-int context "#G:" 0 (nk:color-g combo-color2) 255 1 1)) (nk:color-b-set! combo-color2 (nk:property-int context "#B:" 0 (nk:color-b combo-color2) 255 1 1)) (nk:color-a-set! combo-color2 (nk:property-int context "#A:" 0 (nk:color-a combo-color2) 255 1 1)))) (nk:combo-end context)) (let ((sum (+ prog-a prog-b prog-c prog-d))) (when (nk:combo-begin-label context combo-layout (number->string sum) 200) (nk:layout-row-dynamic context 30 1) (set! prog-a (nk:progressbar context prog-a 100 #t)) (set! prog-b (nk:progressbar context prog-b 100 #t)) (set! prog-c (nk:progressbar context prog-c 100 #t)) (set! prog-d (nk:progressbar context prog-d 100 #t)) (nk:combo-end context))) (let ((sum (count identity check-values))) (when (nk:combo-begin-label context combo-layout (number->string sum) 200) (nk:layout-row-dynamic context 30 1) (set! check-values (map (lambda (checked? weapon) (nk:checkbox-label context weapon checked?)) check-values weapons)) (nk:combo-end context))) (let ((label (cl-format #f "~{~,2f~^, ~}" position))) (when (nk:combo-begin-label context combo-layout label 200) (nk:layout-row-dynamic context 25 1) (set! position (map (lambda (component label) (nk:property-float context label -1024 component 1024 1 0.5)) position '("#X:" "#Y:" "#Z:"))) (nk:combo-end context))) (let ((label (cl-format #f "~,2f" chart-selection))) (when (nk:combo-begin-label context combo-layout label 250) (nk:layout-row-dynamic context 150 1) (let* ((values #(26 13 30 15 25 10 20 40 12 8 22 28 5)) (size (vector-length values))) (nk:chart-begin context #f size 0 50) (vector-for-each (lambda (_i x) (let ((events (nk:chart-push context x))) (when (memv 'clicked events) (set! chart-selection x) (nk:combo-close context)))) values) (nk:chart-end context)) (nk:combo-end context))) (when (not time-selected?) (set! selected-time (seconds->local-time))) (when (not date-selected?) (set! selected-date (seconds->local-time))) (let ((label (time->string selected-time "%H:%M:%S"))) (when (nk:combo-begin-label context combo-layout label 400) (set! time-selected? #t) (nk:layout-row-dynamic context 25 1) (vector-set! selected-time 0 (nk:property-int context "#S:" 0 (vector-ref selected-time 0) 59 1 1)) (vector-set! selected-time 1 (nk:property-int context "#M:" 0 (vector-ref selected-time 1) 59 1 1)) (vector-set! selected-time 2 (nk:property-int context "#S:" 0 (vector-ref selected-time 2) 23 1 1)) (nk:combo-end context))) (nk:layout-row-static context 25 350 1) (let ((label (time->string selected-date "%d-%m-%Y"))) (when (nk:combo-begin-label context combo-layout label 400) (let* ((month (vector-ref selected-date 4)) (months #("January" "February" "March" "April" "May" "June" "July" "August" "September" "October" "November" "December")) (month-label (vector-ref months month)) (week-days #("SUN" "MON" "TUE" "WED" "THU" "FRI" "SAT")) (month-days #(31 28 31 30 31 30 31 31 30 31 30 31)) (year (+ (vector-ref selected-date 5) 1900)) (leap-year? (or (and (zero? (modulo year 4)) (not (zero? (modulo year 100)))) (zero? (modulo year 400)))) (days (vector-ref month-days month)) (days (if (and (= month 1) leap-year?) (add1 days) days))) (set! date-selected? #t) (nk:layout-row-begin context #t 20 3) (nk:layout-row-push context 0.05) (when (nk:button-symbol context 'triangle-left) (if (zero? month) (begin (vector-set! selected-date 4 11) (vector-set! selected-date 5 (max 0 (sub1 (vector-ref selected-date 5))))) (vector-set! selected-date 4 (sub1 month)))) (nk:layout-row-push context 0.9) (nk:label context (format "~a ~a" month-label year) 'centered) (nk:layout-row-push context 0.05) (when (nk:button-symbol context 'triangle-right) (if (= month 11) (begin (vector-set! selected-date 4 0) (vector-set! selected-date 5 (add1 (vector-ref selected-date 5)))) (vector-set! selected-date 4 (add1 month)))) (nk:layout-row-end context) (let* ((year-n (if (< month 2) (sub1 year) year)) (y (modulo year-n 100)) (c (quotient year-n 100)) (y4 (floor (/ y 4))) (c4 (floor (/ c 4))) (m (floor (- (* 2.6 (add1 (modulo (+ month 10) 12))) 0.2))) (week-day (modulo (+ (modulo (- (+ 1 m y y4 c4) (* 2 c)) 7) 7) 7))) (nk:layout-row-dynamic context 35 7) (vector-for-each (lambda (_i x) (nk:label context x 'centered)) week-days) (when (> week-day 0) (nk:spacing context (inexact->exact week-day))) (let loop ((i 1)) (when (<= i days) (when (nk:button-label context (number->string i)) (vector-set! selected-date 3 i) (nk:combo-close context)) (loop (add1 i)))))) (nk:combo-end context))) (nk:tree-pop context)) (when (nk:tree-push context #f "Input" #f) (nk:layout-row context #f 25 '(120 150)) (nk:label context "Default:" 'left) (vector-set! text 0 (nk:edit-string context 'simple (vector-ref text 0) 64)) (nk:label context "Int:" 'left) (vector-set! text 1 (nk:edit-string context 'simple (vector-ref text 1) 64 'decimal)) (nk:label context "Float:" 'left) (vector-set! text 2 (nk:edit-string context 'simple (vector-ref text 2) 64 'float)) (nk:label context "Hex:" 'left) (vector-set! text 3 (nk:edit-string context 'simple (vector-ref text 3) 64 'hex)) (nk:label context "Octal:" 'left) (vector-set! text 4 (nk:edit-string context 'simple (vector-ref text 4) 64 'oct)) (nk:label context "Binary:" 'left) (vector-set! text 5 (nk:edit-string context 'simple (vector-ref text 5) 64 'binary)) (nk:label context "Password:" 'left) (let* ((password (vector-ref text 6)) (buffer (mask-text password)) (old-length (string-length buffer)) (buffer (nk:edit-string context 'field buffer 64)) (new-length (string-length buffer))) (cond ((> new-length old-length) (vector-set! text 6 (string-append password (substring buffer old-length new-length)))) ((< new-length old-length) (vector-set! text 6 (substring password 0 new-length))))) (nk:label context "Field:" 'left) (set! field-buffer (nk:edit-string context 'field field-buffer 64)) (nk:label context "Box:" 'left) (nk:layout-row-static context 180 278 1) (set! box-buffer (nk:edit-string context 'box box-buffer 512)) (nk:layout-row context #f 25 '(120 150)) (receive (value edit-events) (nk:edit-string context '(field sig-enter) (vector-ref text 7) 64 'ascii) (vector-set! text 7 value) (when (or (nk:button-label context "Submit") (memv 'committed edit-events)) (set! box-buffer (string-append box-buffer value "\n")) (vector-set! text 7 ""))) (nk:layout-row-end context) (nk:tree-pop context)) (nk:tree-pop context)) (when (nk:tree-push context #t "Chart" #f) (let ((step (/ (* 2 pi) 32))) (nk:layout-row-dynamic context 100 1) (let ((id 0) (index -1)) (when (nk:chart-begin context #t 32 -1 1) (let loop ((i 0)) (when (< i 32) (let ((events (nk:chart-push context (cos id)))) (when (memv 'hovering events) (set! index (floor i))) (when (memv 'clicked events) (set! line-index (floor i))) (set! id (+ id step))) (loop (add1 i)))) (nk:chart-end context)) (when (not (= index -1)) (let ((value (cos (* index step)))) (nk:tooltip context (cl-format #f "Value: ~,2f" value)))) (when (not (= line-index -1)) (nk:layout-row-dynamic context 20 1) (let ((value (cos (* line-index step)))) (nk:label context (cl-format #f "Selected value: ~,2f" value) 'left)))) (nk:layout-row-dynamic context 100 1) (let ((id 0) (index -1)) (when (nk:chart-begin context #f 32 0 1) (let loop ((i 0)) (when (< i 32) (let ((events (nk:chart-push context (abs (sin id))))) (when (memv 'hovering events) (set! index (floor i))) (when (memv 'clicked events) (set! col-index (floor i))) (set! id (+ id step))) (loop (add1 i)))) (nk:chart-end context)) (when (not (= index -1)) (let ((value (abs (sin (* step index))))) (nk:tooltip context (cl-format "Value: ~,2f" value)))) (when (not (= col-index -1)) (nk:layout-row-dynamic context 20 1) (let ((value (abs (sin (* step col-index))))) (nk:label context (cl-format "Selected value: ~,2f" value) 'left)))) (nk:layout-row-dynamic context 100 1) (when (nk:chart-begin context #f 32 0 1) (nk:chart-add-slot context #t 32 -1 1) (nk:chart-add-slot context #t 32 -1 1) (let loop ((i 0) (id 0)) (when (< i 32) (nk:chart-push-slot context (abs (sin id)) 0) (nk:chart-push-slot context (cos id) 1) (nk:chart-push-slot context (sin id) 2) (loop (add1 i) (+ id step))))) (nk:chart-end context) (nk:layout-row-dynamic context 100 1) (when (nk:chart-begin-colored context #t (nk:rgb->color 255 0 0) (nk:rgb->color 150 0 0) 32 0 1) (nk:chart-add-slot-colored context #t (nk:rgb->color 0 0 255) (nk:rgb->color 0 0 150) 32 -1 1) (nk:chart-add-slot-colored context #t (nk:rgb->color 0 255 0) (nk:rgb->color 0 150 0) 32 -1 1) (let loop ((i 0) (id 0)) (when (< i 32) (nk:chart-push-slot context (abs (sin id)) 0) (nk:chart-push-slot context (cos id) 1) (nk:chart-push-slot context (sin id) 2) (loop (add1 i) (+ id step))))) (nk:chart-end context)) (nk:tree-pop context)) (when (nk:tree-push context #t "Popup" #f) (let ((bounds #f)) (nk:layout-row-static context 30 150 1) (set! bounds (nk:widget-bounds context)) (nk:label context "Right click me for menu" 'left) (when (nk:contextual-begin context menu-layout #f (nk:make-vec2 100 300) bounds) (nk:layout-row-dynamic context 25 1) (set! show-menu? (nk:checkbox-label context "Menu" show-menu?)) (set! progress (nk:progressbar context progress 100 #t)) (set! slider (nk:slider-int context 0 slider 16 1)) (when (nk:contextual-item-label context "About" 'centered) (set! show-app-about? #t)) (set! selected (map (lambda (value) (nk:selectable-label context (if value "Unselect" "Select") 'left value)) selected)) (nk:contextual-end context)) (nk:layout-row-begin context #f 30 2) (nk:layout-row-push context 100) (nk:label context "Right Click here:" 'left) (nk:layout-row-push context 50) (set! bounds (nk:widget-bounds context)) (nk:button-color context color) (nk:layout-row-end context) (when (nk:contextual-begin context menu-layout #f (nk:make-vec2 350 60) bounds) (nk:layout-row-dynamic context 30 4) (nk:color-r-set! color (nk:property-int context "#r:" 0 (nk:color-r color) 255 1 1)) (nk:color-g-set! color (nk:property-int context "#g:" 0 (nk:color-g color) 255 1 1)) (nk:color-b-set! color (nk:property-int context "#b:" 0 (nk:color-b color) 255 1 1)) (nk:color-a-set! color (nk:property-int context "#a:" 0 (nk:color-a color) 255 1 1)) (nk:contextual-end context)) (nk:layout-row-begin context #f 30 2) (nk:layout-row-push context 100) (nk:label context "Popup:" 'left) (nk:layout-row-push context 50) (when (nk:button-label context "Popup") (set! popup-active? #t)) (nk:layout-row-end context) (if popup-active? (when (nk:popup-begin context popup-layout #f "Error" 'dynamic (nk:make-rect 20 100 220 150)) (nk:layout-row-dynamic context 25 1) (nk:label context "A terrible error has occurred" 'left) (nk:layout-row-dynamic context 25 2) (when (nk:button-label context "OK") (set! popup-active? #f) (nk:popup-close context)) (when (nk:button-label context "Cancel") (set! popup-active? #f) (nk:popup-close context)) (nk:popup-end context)) (set! popup-active? #f)) (nk:layout-row-static context 30 150 1) (set! bounds (nk:widget-bounds context)) (nk:label context "Hover me for tooltip" 'left) (when (nk:input-mouse-hovering-in-rect? (nk:context-input context) bounds) (nk:tooltip context "This is a tooltip"))) (nk:tree-pop context)) (when (nk:tree-push context #t "Layout" #f) (when (nk:tree-push context #f "Widget" #f) (nk:layout-row-dynamic context 30 1) (nk:label context "Dynamic fixed column layout with generated position and size:" 'left) (nk:layout-row-dynamic context 30 3) (nk:button-label context "button") (nk:button-label context "button") (nk:button-label context "button") (nk:layout-row-dynamic context 30 1) (nk:label context "static fixed column layout with generated position and size:" 'left) (nk:layout-row-static context 30 100 3) (nk:button-label context "button") (nk:button-label context "button") (nk:button-label context "button") (nk:layout-row-dynamic context 30 1) (nk:label context "Dynamic list-based custom column layout with generated position and custom size:" 'left) (nk:layout-row context #t 30 '(0.2 0.6 0.2)) (nk:button-label context "button") (nk:button-label context "button") (nk:button-label context "button") (nk:layout-row-dynamic context 30 1) (nk:label context "Static list-based custom column layout with generated position and custom size:" 'left) (nk:layout-row context #f 30 '(100 200 50)) (nk:button-label context "button") (nk:button-label context "button") (nk:button-label context "button") (nk:layout-row-dynamic context 30 1) (nk:label context "Dynamic immediate mode custom column layout with generated position and custom size:" 'left) (nk:layout-row-begin context #t 30 3) (nk:layout-row-push context 0.2) (nk:button-label context "button") (nk:layout-row-push context 0.6) (nk:button-label context "button") (nk:layout-row-push context 0.2) (nk:button-label context "button") (nk:layout-row-end context) (nk:layout-row-dynamic context 30 1) (nk:label context "Static immediate mode custom column layout with generated position and custom size:" 'left) (nk:layout-row-begin context #f 30 3) (nk:layout-row-push context 100) (nk:button-label context "button") (nk:layout-row-push context 200) (nk:button-label context "button") (nk:layout-row-push context 50) (nk:button-label context "button") (nk:layout-row-end context) (nk:layout-row-dynamic context 30 1) (nk:label context "Static free space with custom position and custom size:" 'left) (nk:layout-space-begin context #f 120 4) (nk:layout-space-push context (nk:make-rect 100 0 100 30)) (nk:button-label context "button") (nk:layout-space-push context (nk:make-rect 0 15 100 30)) (nk:button-label context "button") (nk:layout-space-push context (nk:make-rect 200 15 100 30)) (nk:button-label context "button") (nk:layout-space-push context (nk:make-rect 100 30 100 30)) (nk:button-label context "button") (nk:layout-space-end context) (nk:tree-pop context)) (when (nk:tree-push context #f "Group" #f) (nk:layout-row-dynamic context 30 3) (set! group-titlebar? (nk:checkbox-label context "Titlebar" group-titlebar?)) (set! group-border? (nk:checkbox-label context "Border" group-border?)) (set! group-no-scrollbar? (nk:checkbox-label context "No Scrollbar" group-no-scrollbar?)) (nk:layout-row-begin context #f 22 2) (nk:layout-row-push context 50) (nk:label context "size:" 'left) (nk:layout-row-push context 130) (set! group-width (nk:property-int context "#Width:" 100 group-width 500 10 1)) (nk:layout-row-push context 130) (set! group-height (nk:property-int context "#Height:" 100 group-height 500 10 1)) (nk:layout-row-end context) (nk:layout-row-static context group-height group-width 2) (when (nk:group-begin context tab-layout "Group" (group-flags)) (nk:layout-row-static context 18 100 1) (set! selected-group (map (lambda (value) (nk:selectable-label context (if value "Selected" "Unselected") 'centered value)) selected-group)) (nk:group-end context)) (nk:tree-pop context)) (when (nk:tree-push context #f "Simple" #f) (nk:layout-row-dynamic context 300 2) (when (nk:group-begin context tab-layout "Group_Without_Border" #f) (nk:layout-row-static context 18 150 1) (let loop ((i 0)) (when (< i 64) (nk:label context (cl-format #f "0x~2,'0x" i) 'left) (loop (add1 i)))) (nk:group-end context)) (when (nk:group-begin context tab-layout "Group_With_Border" 'border) (nk:layout-row-dynamic context 25 2) (let loop ((i 0)) (when (< i 64) (let ((x (+ (bitwise-xor (* (modulo i 7) 10) 32) 64 (* (modulo i 2) 2)))) (nk:button-label context (cl-format #f "~8,'0d" x)) (loop (add1 i))))) (nk:group-end context)) (nk:tree-pop context)) (when (nk:tree-push context #f "Complex" #f) (nk:layout-space-begin context #f 500 64) (nk:layout-space-push context (nk:make-rect 0 0 150 500)) (when (nk:group-begin context tab-layout "Group_left" 'border) (nk:layout-row-static context 18 100 1) (set! left-selected-group (map (lambda (value) (nk:selectable-label context (if value "Selected" "Unselected") 'centered value)) left-selected-group)) (nk:group-end context)) (nk:layout-space-push context (nk:make-rect 160 0 150 240)) (when (nk:group-begin context tab-layout "Group_top" 'border) (nk:layout-row-dynamic context 25 1) (nk:button-label context "#FFAA") (nk:button-label context "#FFBB") (nk:button-label context "#FFCC") (nk:button-label context "#FFDD") (nk:button-label context "#FFEE") (nk:button-label context "#FFFF") (nk:group-end context)) (nk:layout-space-push context (nk:make-rect 160 250 150 250)) (when (nk:group-begin context tab-layout "Group_bottom" 'border) (nk:layout-row-dynamic context 25 1) (nk:button-label context "#FFAA") (nk:button-label context "#FFBB") (nk:button-label context "#FFCC") (nk:button-label context "#FFDD") (nk:button-label context "#FFEE") (nk:button-label context "#FFFF") (nk:group-end context)) (nk:layout-space-push context (nk:make-rect 320 0 150 150)) (when (nk:group-begin context tab-layout "Group_right_top" 'border) (nk:layout-row-static context 18 100 1) (set! top-right-selected-group (map (lambda (value) (nk:selectable-label context (if value "Selected" "Unselected") 'centered value)) top-right-selected-group)) (nk:group-end context)) (nk:layout-space-push context (nk:make-rect 320 160 150 150)) (when (nk:group-begin context tab-layout "Group_right_center" 'border) (nk:layout-row-static context 18 100 1) (set! center-right-selected-group (map (lambda (value) (nk:selectable-label context (if value "Selected" "Unselected") 'centered value)) center-right-selected-group)) (nk:group-end context)) (nk:layout-space-push context (nk:make-rect 320 320 150 150)) (when (nk:group-begin context tab-layout "Group_right_bottom" 'border) (nk:layout-row-static context 18 100 1) (set! bottom-right-selected-group (map (lambda (value) (nk:selectable-label context (if value "Selected" "Unselected") 'centered value)) bottom-right-selected-group)) (nk:group-end context)) (nk:layout-space-end context) (nk:tree-pop context)) (when (nk:tree-push context #f "Splitter" #f) (let ((input (nk:context-input context))) (nk:layout-row-static context 20 310 1) (nk:label context "Use slider and spinner to change tile size" 'left) (nk:label context "Drag the space between tiles to change tile ratio" 'left) (when (nk:tree-push context #f "Vertical" #f) (let ((row-layout (list vertical-a 8 vertical-b 8 vertical-c)) (bounds #f)) (nk:layout-row-static context 30 100 2) (nk:label context "left:" 'left) (set! vertical-a (nk:slider-float context 10 vertical-a 200 10)) (nk:label context "middle:" 'left) (set! vertical-b (nk:slider-float context 10 vertical-b 200 10)) (nk:label context "right:" 'left) (set! vertical-c (nk:slider-float context 10 vertical-c 200 10)) (nk:layout-row context #f 200 row-layout) (when (nk:group-begin context sub-layout "left" '(border no-scrollbar)) (nk:layout-row-dynamic context 25 1) (nk:button-label context "#FFAA") (nk:button-label context "#FFBB") (nk:button-label context "#FFCC") (nk:button-label context "#FFDD") (nk:button-label context "#FFEE") (nk:button-label context "#FFFF") (nk:group-end context)) (set! bounds (nk:widget-bounds context)) (nk:spacing context 1) (when (and (or (nk:input-mouse-hovering-in-rect? input bounds) (nk:input-mouse-previously-hovering-in-rect? input bounds)) (nk:input-mouse-down? input 'left)) (let ((delta (nk:mouse-delta (nk:input-mouse input)))) (set! vertical-a (+ (car row-layout) (nk:vec2-x delta))) (set! vertical-b (- (list-ref row-layout 2) (nk:vec2-x delta))))) (when (nk:group-begin context sub-layout "center" '(border no-scrollbar)) (nk:layout-row-dynamic context 25 1) (nk:button-label context "#FFAA") (nk:button-label context "#FFBB") (nk:button-label context "#FFCC") (nk:button-label context "#FFDD") (nk:button-label context "#FFEE") (nk:button-label context "#FFFF") (nk:group-end context)) (set! bounds (nk:widget-bounds context)) (nk:spacing context 1) (when (and (or (nk:input-mouse-hovering-in-rect? input bounds) (nk:input-mouse-previously-hovering-in-rect? input bounds)) (nk:input-mouse-down? input 'left)) (let ((delta (nk:vec2-x (nk:mouse-delta (nk:input-mouse input))))) (set! vertical-b (+ (list-ref row-layout 2) delta)) (set! vertical-c (- (list-ref row-layout 4) delta)))) (when (nk:group-begin context sub-layout "right" '(border no-scrollbar)) (nk:layout-row-dynamic context 25 1) (nk:button-label context "#FFAA") (nk:button-label context "#FFBB") (nk:button-label context "#FFCC") (nk:button-label context "#FFDD") (nk:button-label context "#FFEE") (nk:button-label context "#FFFF") (nk:group-end context))) (nk:tree-pop context)) (when (nk:tree-push context #f "Horizontal" #f) (let ((bounds #f)) (nk:layout-row-static context 30 100 2) (nk:label context "top:" 'left) (set! horizontal-a (nk:slider-float context 10 horizontal-a 200 10)) (nk:label context "middle:" 'left) (set! horizontal-b (nk:slider-float context 10 horizontal-b 200 10)) (nk:label context "bottom:" 'left) (set! horizontal-c (nk:slider-float context 10 horizontal-c 200 10)) (nk:layout-row-dynamic context horizontal-a 1) (when (nk:group-begin context sub-layout "top" '(no-scrollbar border)) (nk:layout-row-dynamic context 25 3) (nk:button-label context "#FFAA") (nk:button-label context "#FFBB") (nk:button-label context "#FFCC") (nk:button-label context "#FFDD") (nk:button-label context "#FFEE") (nk:button-label context "#FFFF") (nk:group-end context)) (nk:layout-row-dynamic context 8 1) (set! bounds (nk:widget-bounds context)) (nk:spacing context 1) (when (and (or (nk:input-mouse-hovering-in-rect? input bounds) (nk:input-mouse-previously-hovering-in-rect? input bounds)) (nk:input-mouse-down? input 'left)) (let ((delta (nk:vec2-y (nk:mouse-delta (nk:input-mouse input))))) (set! horizontal-a (+ horizontal-a delta)) (set! horizontal-b (- horizontal-b delta)))) (nk:layout-row-dynamic context horizontal-b 1) (when (nk:group-begin context sub-layout "middle" '(no-scrollbar border)) (nk:layout-row-dynamic context 25 3) (nk:button-label context "#FFAA") (nk:button-label context "#FFBB") (nk:button-label context "#FFCC") (nk:button-label context "#FFDD") (nk:button-label context "#FFEE") (nk:button-label context "#FFFF") (nk:group-end context)) (nk:layout-row-dynamic context 8 1) (set! bounds (nk:widget-bounds context)) (when (and (or (nk:input-mouse-hovering-in-rect? input bounds) (nk:input-mouse-previously-hovering-in-rect? input bounds)) (nk:input-mouse-down? input 'left)) (let ((delta (nk:vec2-y (nk:mouse-delta (nk:input-mouse input))))) (set! horizontal-b (+ horizontal-b delta)) (set! horizontal-c (- horizontal-c delta)))) (nk:layout-row-dynamic context horizontal-c 1) (when (nk:group-begin context sub-layout "bottom" '(no-scrollbar border)) (nk:layout-row-dynamic context 25 3) (nk:button-label context "#FFAA") (nk:button-label context "#FFBB") (nk:button-label context "#FFCC") (nk:button-label context "#FFDD") (nk:button-label context "#FFEE") (nk:button-label context "#FFFF") (nk:group-end context))) (nk:tree-pop context))) (nk:tree-pop context)) (nk:tree-pop context))) (nk:window-end context) (let-values (((width height) (glfw:get-window-size (glfw:window)))) (gl:viewport 0 0 width height)) (gl:clear gl:+color-buffer-bit+) (apply gl:clear-color (nk:color->rgba-floats background)) (backend:render!) (glfw:swap-buffers (glfw:window)) (loop))) (backend:shutdown!) (glfw:terminate)