From 71222b81e48f805054ef8c3d42d24888e3d76e69 Mon Sep 17 00:00:00 2001 From: Bogdan Popa Date: Mon, 9 Oct 2023 08:37:15 +0300 Subject: [PATCH] view,menu: add #:enabled? to menu{,-bar}, #:help to menu --- examples/menu.rkt | 47 ++++++++++++------- gui-easy-lib/gui/easy/private/view/menu.rkt | 33 +++++++++---- gui-easy-lib/gui/easy/view.rkt | 11 ++++- gui-easy/gui/easy/scribblings/reference.scrbl | 17 ++++++- 4 files changed, 79 insertions(+), 29 deletions(-) diff --git a/examples/menu.rkt b/examples/menu.rkt index 250a4d0..3055b97 100644 --- a/examples/menu.rkt +++ b/examples/menu.rkt @@ -1,25 +1,38 @@ #lang racket/gui/easy - +(define/obs @menu-bar-enabled? #t) +(define/obs @file-menu-enabled? #t) (define/obs @can-save? #t) (render (window #:size '(800 600) (menu-bar - (menu "&File" - (menu-item "&New File") - (menu-item "&Open..." (λ () (gui:get-file))) - (menu-item - "&Save..." - #:enabled? @can-save? - #:help "Saves the file" - #:shortcut (if (eq? (system-type 'os) 'macosx) - '(cmd #\s) - '(ctl #\s))) - (menu-item-separator) - (menu-item "&Print..."))) - (button - "Toggle Save" - (lambda () - (@can-save? . <~ . not))))) + #:enabled? @menu-bar-enabled? + (menu + "&File" + #:enabled? @file-menu-enabled? + (menu-item "&New File") + (menu-item "&Open..." (λ () (gui:get-file))) + (menu-item + "&Save..." + #:enabled? @can-save? + #:help "Saves the file" + #:shortcut (if (eq? (system-type 'os) 'macosx) + '(cmd #\s) + '(ctl #\s))) + (menu-item-separator) + (menu-item "&Print..."))) + (vpanel + (button + "Toggle Menu Bar" + (lambda () + (@menu-bar-enabled? . <~ . not))) + (button + "Toggle File Menu" + (lambda () + (@file-menu-enabled? . <~ . not))) + (button + "Toggle Save" + (lambda () + (@can-save? . <~ . not)))))) diff --git a/gui-easy-lib/gui/easy/private/view/menu.rkt b/gui-easy-lib/gui/easy/private/view/menu.rkt index 350248e..c212e49 100644 --- a/gui-easy-lib/gui/easy/private/view/menu.rkt +++ b/gui-easy-lib/gui/easy/private/view/menu.rkt @@ -52,21 +52,27 @@ (define menu-bar% (class* container% (menu-bar-view<%>) (inherit-field children) + (init-field @enabled?) (inherit add-child update-children destroy-children child-dependencies) (super-new) (define/public (dependencies) - (child-dependencies)) + (remove-duplicates + (append (filter obs? (list @enabled?)) + (child-dependencies)))) (define/public (create parent) (define the-menu-bar (new (context-mixin gui:menu-bar%) [parent parent])) (begin0 the-menu-bar + (send the-menu-bar enable (peek @enabled?)) (for ([c (in-list children)]) (add-child the-menu-bar c (send c create the-menu-bar))))) (define/public (update v what val) + (case/dep what + [@enabled? (send v enable val)]) (update-children v what val)) (define/public (destroy v) @@ -82,26 +88,30 @@ (define menu% (class* container% (menu-view<%>) (inherit-field children) - (init-field @label) + (init-field @label @enabled? @help) (inherit add-child update-children destroy-children child-dependencies) (super-new) (define/public (dependencies) (remove-duplicates - (append (filter obs? (list @label)) + (append (filter obs? (list @label @enabled? @help)) (child-dependencies)))) (define/public (create parent) (define the-menu (new (context-mixin gui:menu%) [parent parent] + [help-string (peek @help)] [label (peek @label)])) (begin0 the-menu + (send the-menu enable (peek @enabled?)) (for ([c (in-list children)]) (add-child the-menu c (send c create the-menu))))) (define/public (update v what val) (case/dep what + [@enabled? (send v enable val)] + [@help (send v set-help-string val)] [@label (send v set-label val)]) (update-children v what val)) @@ -120,13 +130,13 @@ (define the-item (new gui:menu-item% [parent parent] - [help-string (obs-peek @help)] + [help-string (peek @help)] [label (peek @label)] [callback (λ (_self _event) (action))])) (begin0 the-item - (send the-item enable (obs-peek @enabled?)) - (set-shortcut the-item (obs-peek @shortcut)))) + (send the-item enable (peek @enabled?)) + (set-shortcut the-item (peek @shortcut)))) (define/public (update v what val) (case/dep what @@ -168,13 +178,20 @@ (new popup-menu% [children children])) -(define (menu-bar . children) +(define (menu-bar #:enabled? [@enabled? (obs #t)] + . children) (new menu-bar% + [@enabled? @enabled?] [children children])) -(define (menu @label . children) +(define (menu @label + #:enabled? [@enabled? (obs #t)] + #:help [@help (obs #f)] + . children) (new menu% [@label @label] + [@enabled? @enabled?] + [@help @help] [children children])) (define (menu-item @label [action void] diff --git a/gui-easy-lib/gui/easy/view.rkt b/gui-easy-lib/gui/easy/view.rkt index 3097a11..58d89b0 100644 --- a/gui-easy-lib/gui/easy/view.rkt +++ b/gui-easy-lib/gui/easy/view.rkt @@ -33,8 +33,15 @@ ;; Menus & Menu Items [popup-menu (-> view/c ... (is-a?/c popup-menu-view<%>))] - [menu-bar (-> view/c ... (is-a?/c menu-bar-view<%>))] - [menu (-> (maybe-obs/c maybe-label/c) view/c ... (is-a?/c menu-view<%>))] + [menu-bar (->* () + (#:enabled? (maybe-obs/c any/c)) + #:rest (listof view/c) + (is-a?/c menu-bar-view<%>))] + [menu (->* ((maybe-obs/c maybe-label/c)) + (#:enabled? (maybe-obs/c any/c) + #:help (maybe-obs/c (or/c #f string?))) + #:rest (listof view/c) + (is-a?/c menu-view<%>))] [menu-item (->* ((maybe-obs/c maybe-label/c)) ((-> any) #:enabled? (maybe-obs/c any/c) diff --git a/gui-easy/gui/easy/scribblings/reference.scrbl b/gui-easy/gui/easy/scribblings/reference.scrbl index 7eb74fe..6bb4740 100644 --- a/gui-easy/gui/easy/scribblings/reference.scrbl +++ b/gui-easy/gui/easy/scribblings/reference.scrbl @@ -116,7 +116,8 @@ ] } -@defproc[(menu-bar [menu-or-item (is-a?/c view<%>)] ...) (is-a?/c view<%>)]{ +@defproc[(menu-bar [#:enabled? enabled? (maybe-obs/c any/c) #t] + [menu-or-item (is-a?/c view<%>)] ...) (is-a?/c view<%>)]{ Returns a representation of a menu-bar menu. @racketblock[ @@ -131,17 +132,29 @@ "Help" (menu-item "Getting Started"))) ] + + @history[ + #:changed "0.15" @elem{The @racket[#:enabled?] argument.} + ] } @defproc[(menu [label (maybe-obs/c maybe-label/c)] + [#:enabled? enabled? (maybe-obs/c any/c) #t] + [#:help help-text (maybe-obs/c (or/c #f string?)) #f] [item (is-a?/c view<%>)] ...) (is-a?/c view<%>)]{ Returns a representation of a menu with @racket[item]s as children. + + @history[ + #:changed "0.15" @elem{ + The @racket[#:enabled?] and @racket[#:help] arguments. + } + ] } @defproc[(menu-item [label (maybe-obs/c maybe-label/c)] [action (-> any) void] - [#:enabled? enabled? (maybe-obs/c boolean?) #t] + [#:enabled? enabled? (maybe-obs/c any/c) #t] [#:help help-text (maybe-obs/c (or/c #f string?)) #f] [#:shortcut shortcut (maybe-obs/c (or/c #f (*list/c (or/c 'alt 'cmd 'meta 'ctl 'shift 'option)