diff --git a/example1/example.rkt b/example1/example.rkt index 7fe71bd..bf7a966 100644 --- a/example1/example.rkt +++ b/example1/example.rkt @@ -34,8 +34,16 @@ (menu-item 'm-auto "Processes" #:submenu (menu (menu-item 'm-start "Start counter") + (menu-item 'm-sub "Submenu" + #:submenu + (menu (menu-item 'm-sub1 "Submenu 1") + (menu-item 'm-sub2 "Submenu 2") + (menu-item 'm-sub3 "Submenu 3") + ) + ) (menu-item 'm-stop "Stop counter") - )) + ) + ) )) (define example-1-dialog% diff --git a/info.rkt b/info.rkt index 3891108..212570f 100644 --- a/info.rkt +++ b/info.rkt @@ -1,7 +1,7 @@ #lang info (define pkg-authors '(hnmdijkema)) -(define version "0.2.18") +(define version "0.2.19") (define license 'MIT) (define collection "web-racket") (define pkg-desc "web-racket - A Web Based GUI library, based on webui-wire") diff --git a/private/menu.rkt b/private/menu.rkt index 3941673..31e5df9 100644 --- a/private/menu.rkt +++ b/private/menu.rkt @@ -10,6 +10,8 @@ menu-set-title! menu->json with-menu-item + menu-for-each + ww-menu-item-callback ) @@ -81,6 +83,21 @@ (hash-set! h 'menu r) h))) + (define (menu-for-each menu cb) + (let ((items (ww-menu-items menu))) + (letrec ((f (λ (items) + (if (null? items) + #t + (let ((item (car items))) + (let ((submenu (ww-menu-item-submenu item))) + (if (eq? submenu #f) + (cb item) + (menu-for-each submenu cb)))) + ) + ) + )) + (f items)))) + (define (menu->json menu) (let ((o (open-output-string))) (write-json (menu->hash menu) o) diff --git a/private/web-racket.rkt b/private/web-racket.rkt index 434fa46..27c0921 100644 --- a/private/web-racket.rkt +++ b/private/web-racket.rkt @@ -609,6 +609,20 @@ (define/public (popup-menu menu-def x y) (ww-popup-menu win-id menu-def x y) + (let* ((ids (list)) + (clear-connections (λ () + (for-each (λ (id) + (send this disconnect-menu! id)) + ids)))) + (menu-for-each menu-def + (λ (item) + (let ((cb (ww-menu-item-callback item)) + (id (ww-menu-item-id item))) + (set! ids (cons id ids)) + (send this connect-menu! id (λ () + (clear-connections) + (cb)))))) + ) ) ; files and directories