Skip to content

Commit

Permalink
view,menu: add #:enabled? to menu{,-bar}, #:help to menu
Browse files Browse the repository at this point in the history
  • Loading branch information
Bogdanp committed Oct 9, 2023
1 parent 4c1b7d3 commit 71222b8
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 29 deletions.
47 changes: 30 additions & 17 deletions examples/menu.rkt
Original file line number Diff line number Diff line change
@@ -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))))))
33 changes: 25 additions & 8 deletions gui-easy-lib/gui/easy/private/view/menu.rkt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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))

Expand All @@ -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
Expand Down Expand Up @@ -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]
Expand Down
11 changes: 9 additions & 2 deletions gui-easy-lib/gui/easy/view.rkt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
17 changes: 15 additions & 2 deletions gui-easy/gui/easy/scribblings/reference.scrbl
Original file line number Diff line number Diff line change
Expand Up @@ -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[
Expand All @@ -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)
Expand Down

0 comments on commit 71222b8

Please sign in to comment.