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<%>)))))
;; pre: (can-show-keybindings?) = #t
(define/private (get-keybindings-to-show)
(define edit-object (get-edit-target-object))
(define keymap (send edit-object get-keymap))
(define menu-names (get-menu-bindings))
(define table (send keymap get-map-function-table))
(define bindings (hash-map table list))
(define w/menus
(append (hash-map menu-names list)
(filter (λ (binding) (not (bound-by-menu? binding menu-names)))
bindings)))
(sort
w/menus
(λ (x y) (string-ci<=? (cadr x) (cadr y)))))
(define/private (show-keybindings) (define/private (show-keybindings)
(if (can-show-keybindings?) (if (can-show-keybindings?)
(let* ([edit-object (get-edit-target-object)] (show-keybindings-to-user (get-keybindings-to-show) this)
[keymap (send edit-object get-keymap)]
[menu-names (get-menu-bindings)]
[table (send keymap get-map-function-table)]
[bindings (hash-map table list)]
[w/menus
(append (hash-map menu-names list)
(filter (λ (binding) (not (bound-by-menu? binding menu-names)))
bindings))]
[structured-list
(sort
w/menus
(λ (x y) (string-ci<=? (cadr x) (cadr y))))])
(show-keybindings-to-user structured-list 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
[label (string-constant keybindings-frame-title)] (set! the-keybindings-frame
[width (car (preferences:get 'drracket:keybindings-window-size))] (new keybindings-frame%
[height (cdr (preferences:get 'drracket:keybindings-window-size))] [label (string-constant keybindings-frame-title)]
[bindings bindings]) [width (car (preferences:get 'drracket:keybindings-window-size))]
show #t)) [height (cdr (preferences:get 'drracket:keybindings-window-size))]
[bindings bindings])))
(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