Change the keybindings dialog to be a frame, and make it react

to changes in focus

closes PR 12474
This commit is contained in:
Robby Findler 2012-01-08 06:55:50 -06:00
parent e0275b95ba
commit 3bc1e8f3c0
2 changed files with 40 additions and 22 deletions

View File

@ -26,6 +26,14 @@
(define basics-mixin (define basics-mixin
(mixin (frame:standard-menus<%>) (drracket:frame:basics<%>) (mixin (frame:standard-menus<%>) (drracket:frame:basics<%>)
(define/override (on-subwindow-focus win on?)
(when the-keybindings-frame
(when on?
(send the-keybindings-frame set-bindings
(if (can-show-keybindings?)
(get-keybindings-to-show)
'())))))
(define/override (on-subwindow-char receiver event) (define/override (on-subwindow-char receiver event)
(let ([user-key? (send (keymap:get-user) (let ([user-key? (send (keymap:get-user)
handle-key-event handle-key-event
@ -109,6 +117,7 @@
ht ht
(λ (x y) (hash-set! res x y))) (λ (x y) (hash-set! res x y)))
res)) res))
(define/private (can-show-keybindings?) (define/private (can-show-keybindings?)
(let ([edit-object (get-edit-target-object)]) (let ([edit-object (get-edit-target-object)])
(and edit-object (and edit-object
@ -116,22 +125,24 @@
(let ([keymap (send edit-object get-keymap)]) (let ([keymap (send edit-object get-keymap)])
(is-a? keymap keymap:aug-keymap<%>))))) (is-a? keymap keymap:aug-keymap<%>)))))
(define/private (show-keybindings) ;; pre: (can-show-keybindings?) = #t
(if (can-show-keybindings?) (define/private (get-keybindings-to-show)
(let* ([edit-object (get-edit-target-object)] (define edit-object (get-edit-target-object))
[keymap (send edit-object get-keymap)] (define keymap (send edit-object get-keymap))
[menu-names (get-menu-bindings)] (define menu-names (get-menu-bindings))
[table (send keymap get-map-function-table)] (define table (send keymap get-map-function-table))
[bindings (hash-map table list)] (define bindings (hash-map table list))
[w/menus (define w/menus
(append (hash-map menu-names list) (append (hash-map menu-names list)
(filter (λ (binding) (not (bound-by-menu? binding menu-names))) (filter (λ (binding) (not (bound-by-menu? binding menu-names)))
bindings))] bindings)))
[structured-list
(sort (sort
w/menus w/menus
(λ (x y) (string-ci<=? (cadr x) (cadr y))))]) (λ (x y) (string-ci<=? (cadr x) (cadr y)))))
(show-keybindings-to-user structured-list this))
(define/private (show-keybindings)
(if (can-show-keybindings?)
(show-keybindings-to-user (get-keybindings-to-show) this)
(bell))) (bell)))
(define/private (bound-by-menu? binding menu-table) (define/private (bound-by-menu? binding menu-table)
@ -526,8 +537,8 @@
(λ () (λ ()
(delete-file tmp-filename))))))) (delete-file tmp-filename)))))))
(define keybindings-dialog% (define keybindings-frame%
(class dialog% (class frame%
(init-field bindings) (init-field bindings)
(define/override (on-size w h) (define/override (on-size w h)
@ -594,13 +605,17 @@
(send bp2 set-alignment 'right 'center) (send bp2 set-alignment 'right 'center)
(update-bindings))) (update-bindings)))
(define the-keybindings-frame #f)
(define (show-keybindings-to-user bindings frame) (define (show-keybindings-to-user bindings frame)
(send (new keybindings-dialog% (unless the-keybindings-frame
(set! the-keybindings-frame
(new keybindings-frame%
[label (string-constant keybindings-frame-title)] [label (string-constant keybindings-frame-title)]
[width (car (preferences:get 'drracket:keybindings-window-size))] [width (car (preferences:get 'drracket:keybindings-window-size))]
[height (cdr (preferences:get 'drracket:keybindings-window-size))] [height (cdr (preferences:get 'drracket:keybindings-window-size))]
[bindings bindings]) [bindings bindings])))
show #t)) (send the-keybindings-frame show #t))
(define -mixin (define -mixin
(mixin (frame:editor<%> frame:text-info<%> drracket:frame:basics<%>) (drracket:frame:<%>) (mixin (frame:editor<%> frame:text-info<%> drracket:frame:basics<%>) (drracket:frame:<%>)

View File

@ -11,6 +11,9 @@
. DrRacket no longer shows a stacktrace for syntax errors in the REPL. . DrRacket no longer shows a stacktrace for syntax errors in the REPL.
. The keybindings window is no longer a modal dialog (and its contents
will change to reflect where the keyboard focus currently is)
. The preference that makes a single "(" keystroke insert "()" (and . The preference that makes a single "(" keystroke insert "()" (and
similarly for [ { " and |) now only takes effect in Racket mode, similarly for [ { " and |) now only takes effect in Racket mode,
instead of taking effect in all of the modes, as it used to. This instead of taking effect in all of the modes, as it used to. This