diff --git a/gui.rkt b/gui.rkt index 655a3d5..16e09fd 100644 --- a/gui.rkt +++ b/gui.rkt @@ -103,6 +103,100 @@ ;;--------------------------------------------------------------------------- +(struct horizontal-layout (key) #:transparent) +(struct vertical-layout (key) #:transparent) +(struct tabular-layout (row col) #:transparent) + +(struct requested-layout-size (container-id size) #:transparent) +(struct computed-layout-size (container-id size) #:transparent) +(struct layout-solution (container-id + spec + size + rectangle) #:transparent) + +(struct layout-item (spec size) #:transparent) + +(define (layout-item-spec-key li) + (define v (layout-item-spec li)) + (if (number? v) (exact->inexact v) v)) + +(actor #:name 'layout-driver + (during/actor (observe (layout-solution $container-id (horizontal-layout _) _ _)) + #:name (list 'horizontal-layout container-id) + (solve-hv-layout #f container-id)) + (during/actor (observe (layout-solution $container-id (vertical-layout _) _ _)) + #:name (list 'vertical-layout container-id) + (solve-hv-layout #t container-id)) + (during/actor (observe (layout-solution $container-id (tabular-layout _ _) _ _)) + #:name (list 'tabular-layout container-id) + (solve-tabular-layout container-id))) + +(define (solve-hv-layout vertical? container-id) + (define ctor (if vertical? vertical-layout horizontal-layout)) + (define/query-set items + (observe (layout-solution container-id (ctor $key) $size _)) + (layout-item key size)) + (define/dataflow ordered-items (sort (set->list (items)) + (order-list (items)))) + (row-count (+ 1 (apply max -1 (map car specs)))) + (col-count (+ 1 (apply max -1 (map cdr specs)))) + (mtx (for/vector [(r row-count)] (make-vector col-count #f)))) + (for [(item (items))] + (vector-set! (vector-ref mtx (car (layout-item-spec item))) + (cdr (layout-item-spec item)) + item)) + mtx)) + (define/dataflow table + (for/list [(row (items-table))] + (for/list [(item row)] + (if item (layout-item-size item) weak-fill-box-size)))) + + (solve-layout* container-id + table + (lambda (layout) + (define mtx (list->vector (map list->vector layout))) + (for [(item (items))] + (match-define (cons row col) (layout-item-spec item)) + (assert! (layout-solution container-id + (tabular-layout row col) + (layout-item-size item) + (vector-ref (vector-ref mtx row) col))))))) + +;;--------------------------------------------------------------------------- + (struct pop-up-menu-trigger (menu-id x y x-pin y-pin release-event) #:transparent) (struct menu-separator (menu-id order) #:transparent) (struct menu-item (menu-id order image message) #:transparent) @@ -111,82 +205,63 @@ (on (message (pop-up-menu-trigger $menu-id $x $y $x-pin $y-pin $release-event)) (run-pop-up-menu menu-id x y x-pin y-pin release-event))) -(define (menu-item-order-key i) - (define v (cond [(menu-item? i) (menu-item-order i)] - [(menu-separator? i) (menu-separator-order i)])) - (if (number? v) - (exact->inexact v) - v)) - (define (run-pop-up-menu menu-id pop-up-cursor-x pop-up-cursor-y x-pin y-pin release-event) (define instance-id (list menu-id (gensym 'instance))) (define pad (theme-menu-item-padding)) (define pad2 (* pad 2)) + (define normal (i:rectangle 1 1 "solid" (theme-menu-item-background-color))) (define highlight (i:rectangle 1 1 "solid" (theme-menu-item-selected-background-color))) (define separator (i:rectangle 1 1 "solid" (theme-menu-separator-color))) (actor #:name instance-id - (define/query-set items ($ i (menu-item menu-id _ _ _)) i) - (define/query-set separators ($ s (menu-separator menu-id _)) s) - (define/dataflow ordered-items (sort (append (set->list (items)) - (set->list (separators))) - (order-