Change the keybindings dialog to be a frame, and make it react
to changes in focus closes PR 12474
This commit is contained in:
parent
e0275b95ba
commit
3bc1e8f3c0
|
@ -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:<%>)
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user