some improvements to color schemes

- better overview docs (now in the drracket manual)
- something inside the drracket gui to get the list of the
  available style names and to send you to the new docs
This commit is contained in:
Robby Findler 2013-09-09 17:02:38 -05:00
parent 590d53f9c9
commit da4bb5991f
6 changed files with 172 additions and 54 deletions

View File

@ -3,6 +3,7 @@
(require string-constants (require string-constants
racket/contract racket/contract
racket/class racket/class
racket/pretty
drracket/private/drsig drracket/private/drsig
"frame-icon.rkt" "frame-icon.rkt"
mred mred
@ -13,7 +14,12 @@
racket/dict racket/dict
racket/set racket/set
browser/external browser/external
setup/plt-installer) setup/plt-installer
scribble/tag
setup/xref
scribble/xref
net/url)
(import [prefix drracket:app: drracket:app^] (import [prefix drracket:app: drracket:app^]
[prefix drracket:unit: drracket:unit^] [prefix drracket:unit: drracket:unit^]
@ -33,7 +39,9 @@
(define (drr:set-default name val predicate) (define (drr:set-default name val predicate)
(preferences:set-default (preferences:set-default
name val predicate name val predicate
#:aliases (list (string->symbol (regexp-replace #rx"^drracket:" (symbol->string name) "drscheme:"))))) #:aliases (list (string->symbol (regexp-replace #rx"^drracket:"
(symbol->string name)
"drscheme:")))))
(frame:current-icon todays-icon) (frame:current-icon todays-icon)
@ -76,10 +84,13 @@
(listof (listof symbol?))))) (listof (listof symbol?)))))
(preferences:set-default 'drracket:defs/ints-labels #t boolean?) (preferences:set-default 'drracket:defs/ints-labels #t boolean?)
(drr:set-default 'drracket:language-dialog:hierlist-default #f (λ (x) (or (not x) (and (list? x) (andmap string? x))))) (drr:set-default 'drracket:language-dialog:hierlist-default #f
(preferences:set-default 'drracket:language-dialog:teaching-hierlist-default #f (λ (x) (or (not x) (and (list? x) (andmap string? x))))) (λ (x) (or (not x) (and (list? x) (andmap string? x)))))
(preferences:set-default 'drracket:language-dialog:teaching-hierlist-default #f
(λ (x) (or (not x) (and (list? x) (andmap string? x)))))
(drr:set-default 'drracket:create-executable-gui-type 'stand-alone (λ (x) (memq x '(launcher stand-alone distribution)))) (drr:set-default 'drracket:create-executable-gui-type 'stand-alone
(λ (x) (memq x '(launcher stand-alone distribution))))
(drr:set-default 'drracket:create-executable-gui-base 'racket (λ (x) (memq x '(racket gracket)))) (drr:set-default 'drracket:create-executable-gui-base 'racket (λ (x) (memq x '(racket gracket))))
(drr:set-default 'drracket:logger-gui-tab-panel-level 0 (λ (x) (and (exact-integer? x) (<= 0 x 5)))) (drr:set-default 'drracket:logger-gui-tab-panel-level 0 (λ (x) (and (exact-integer? x) (<= 0 x 5))))
@ -263,7 +274,50 @@
(drracket:font:setup-preferences) (drracket:font:setup-preferences)
(color-prefs:add-color-scheme-preferences-panel) (color-prefs:add-color-scheme-preferences-panel
#:extras
(λ (parent)
(define hp (new horizontal-panel%
[alignment '(center center)]
[parent parent]
[stretchable-height #f]))
(new button%
[label (string-constant design-your-own-color-schemes)]
[callback
(λ args
(define xref (load-collections-xref))
(define-values (path tag)
(xref-tag->path+anchor
xref
(make-section-tag "color-scheme"
#:doc '(lib "scribblings/drracket/drracket.scrbl"))))
(define url (path->url path))
(define url2 (if tag
(make-url (url-scheme url)
(url-user url)
(url-host url)
(url-port url)
(url-path-absolute? url)
(url-path url)
(url-query url)
tag)
url))
(send-url (url->string url2)))]
[parent hp])
(new button%
[label (string-constant style-and-color-names)]
[callback
(λ args
(define sp (open-output-string))
(define-values (color-names style-names) (color-prefs:get-color-scheme-names))
(fprintf sp "color names:\n")
(pretty-write (sort (set->list color-names) symbol<?) sp)
(fprintf sp "style names:\n")
(pretty-write (sort (set->list style-names) symbol<?) sp)
(message-box (string-constant drracket)
(get-output-string sp)))]
[parent hp])))
(color-prefs:add-background-preferences-panel) (color-prefs:add-background-preferences-panel)
(racket:add-preferences-panel) (racket:add-preferences-panel)
(racket:add-coloring-preferences-panel) (racket:add-coloring-preferences-panel)
@ -385,17 +439,17 @@
(or/c false/c string?) (or/c false/c string?)
#f) #f)
(drracket:language:register-capability 'drscheme:special:insert-fraction (flat-contract boolean?) #t) (drracket:language:register-capability 'drscheme:special:insert-fraction boolean? #t)
(drracket:language:register-capability 'drscheme:special:insert-large-letters (flat-contract boolean?) #t) (drracket:language:register-capability 'drscheme:special:insert-large-letters boolean? #t)
(drracket:language:register-capability 'drscheme:special:insert-lambda (flat-contract boolean?) #t) (drracket:language:register-capability 'drscheme:special:insert-lambda boolean? #t)
(drracket:language:register-capability 'drscheme:special:insert-image (flat-contract boolean?) #t) (drracket:language:register-capability 'drscheme:special:insert-image boolean? #t)
(drracket:language:register-capability 'drscheme:special:insert-comment-box (flat-contract boolean?) #t) (drracket:language:register-capability 'drscheme:special:insert-comment-box boolean? #t)
(drracket:language:register-capability 'drscheme:language-menu-title (drracket:language:register-capability 'drscheme:language-menu-title
(flat-contract string?) (flat-contract string?)
(string-constant scheme-menu-name)) (string-constant scheme-menu-name))
(drracket:language:register-capability 'drscheme:teachpack-menu-items (drracket:language:register-capability 'drscheme:teachpack-menu-items
(or/c false/c (flat-contract drracket:unit:teachpack-callbacks?)) (or/c #f (flat-contract drracket:unit:teachpack-callbacks?))
#f) #f)
(handler:current-create-new-window (handler:current-create-new-window
@ -439,10 +493,13 @@
(when exprs-pref (when exprs-pref
(trim (second exprs-pref) (trim (second exprs-pref)
(λ (trimmed) (λ (trimmed)
(put-preferences (list 'plt:framework-prefs) (put-preferences
(list (dict-set framework-prefs 'drscheme:console-previous-exprs (list trimmed))) (list 'plt:framework-prefs)
void))))))) (list (dict-set framework-prefs 'drscheme:console-previous-exprs (list trimmed)))
(trim (get-preference 'plt:framework-pref:drscheme:console-previous-exprs #:timeout-lock-there (λ (x) #f)) void)))))))
(trim (get-preference 'plt:framework-pref:drscheme:console-previous-exprs
#:timeout-lock-there
(λ (x) #f))
(λ (trimmed) (λ (trimmed)
(put-preferences (list 'plt:framework-pref:drscheme:console-previous-exprs) (put-preferences (list 'plt:framework-pref:drscheme:console-previous-exprs)
(list trimmed) (list trimmed)

View File

@ -1,7 +1,8 @@
#lang scribble/doc #lang scribble/doc
@(require "common.rkt" @(require "common.rkt"
scribble/decode scribble/eval scribble/struct scribble/racket scribble/decode scribble/eval scribble/struct scribble/racket
(for-label racket/gui/base)) (for-label racket/gui/base framework)
setup/getinfo racket/pretty string-constants)
@(define (ioinputfont . s) @(define (ioinputfont . s)
(apply tt s)) (apply tt s))
@ -765,6 +766,74 @@ A module browser window contains a square for each
what you type will turn green in the module window. This bar is only visible what you type will turn green in the module window. This bar is only visible
in the stand alone module browser window (via the @onscreen{Racket} menu) in the stand alone module browser window (via the @onscreen{Racket} menu)
@section[#:tag "color-scheme"]{Color Schemes}
DrRacket comes with three different color schemes, available in the preferences dialog's
@onscreen{color} panel.
You can add your own color schemes to DrRacket, too. The first step is to
create a pkg (see @secref["how-to-create" #:doc '(lib "pkg/scribblings/pkg.scrbl")])
and add an @filepath{info.rkt} file to it. The file should define
@racket[framework:color-schemes] as a list of hashes that describe the color schemes.
@(define example-key #f)
As an example, this is the specification of the @racket["Modern"] style:
@(let ()
(define pth (collection-file-path "info.rkt" "drracket"))
(define-values (base name dir?) (split-path pth))
(define info (get-info/full base))
(unless info (error 'framework/main.rkt "could not find example for modern color scheme"))
(define key 'framework:color-schemes)
(define datum (info key))
(define name-as-string-datum
(let loop ([datum datum])
(cond
[(list? datum)
(for/list ([datum (in-list datum)])
(loop datum))]
[(hash? datum)
(for/hash ([(k v) (in-hash datum)])
(if (and (equal? k 'name) (string-constant? v))
(values k (dynamic-string-constant v))
(values k (loop v))))]
[(and (symbol? datum)
(regexp-match #rx"framework:" (symbol->string datum)))
(unless example-key (set! example-key datum))
datum]
[else datum])))
(define sp (open-output-string))
(parameterize ([pretty-print-columns 60]
[current-output-port sp])
(pretty-write
`(define ,key
',name-as-string-datum)))
(codeblock
(string-append "#lang info\n"
(get-output-string sp))))
Each of the keys, e.g., @code[(format "~s" `',example-key)], maps to a color and possibly to
some style information. All keys accept colors (the vectors shown
above represent colors in r/g/b format), but only some accept style information. To
find out which are which and to get a complete list of the possible keys, click the button
labeled @onscreen[(regexp-replace #rx"&&" (string-constant style-and-color-names) "&")]
at the bottom of the
@onscreen[(string-constant color-schemes)] tab of the
@onscreen[(string-constant preferences-colors)] tab in the preferences dialog.
If one can accept style information, then you may include any of the symbols @racket['bold],
@racket['underline], or @racket['italic] in the list with the color.
Full details on the specification of the info files can be found in the documentation
for the function @racket[color-prefs:register-info-based-color-schemes].
You may have to restart DrRacket (and, at least the first time after you add the @filepath{info.rkt}
file, re-run @tt{raco setup}) to see changes to your color scheme.
Color schemes are not limited only to the colors that DrRacket already knows about.
If you are adding your own plugin to DrRacket, you can add new names that can be
mapped in the color scheme. See @racket[color-prefs:register-color-preference] for
more information.
@section[#:tag "create-exe"]{Creating Executables} @section[#:tag "create-exe"]{Creating Executables}
DrRacket's @onscreen{Create Executable...} menu item lets you create DrRacket's @onscreen{Create Executable...} menu item lets you create

View File

@ -4,6 +4,7 @@
racket/unit racket/unit
racket/class racket/class
racket/gui/base racket/gui/base
racket/set
mred/mred-unit mred/mred-unit
framework/framework-unit framework/framework-unit
framework/private/sig framework/private/sig
@ -1871,10 +1872,15 @@
If @racket[style] is provided, a new style is registered; if not a color is If @racket[style] is provided, a new style is registered; if not a color is
registered.}) registered.})
(proc-doc (proc-doc/names
color-prefs:add-color-scheme-preferences-panel color-prefs:add-color-scheme-preferences-panel
(-> void?) (->* () (#:extras (-> (is-a?/c panel%) any)) void?)
@{Adds a panel for choosing a color-scheme to the preferences dialog.}) (() ((extras void)))
@{Adds a panel for choosing a color-scheme to the preferences dialog.
The @racket[extras] argument is called after the color schemes have been added
to the preferences panel. It is passed the panel containing the color schemes
and can add items to it.})
(proc-doc (proc-doc
color-prefs:register-info-based-color-schemes color-prefs:register-info-based-color-schemes
@ -1913,37 +1919,7 @@
is called, it logs the active set of color names and style names to the @tt{color-scheme} is called, it logs the active set of color names and style names to the @tt{color-scheme}
logger at the info level. So, for example, starting up DrRacket like this: logger at the info level. So, for example, starting up DrRacket like this:
@tt{racket -W info@"@"color-scheme -l drracket} will print out the styles used in your @tt{racket -W info@"@"color-scheme -l drracket} will print out the styles used in your
version of DrRacket. version of DrRacket.})
As an example, this is the specification of the @racket["Modern"] style:
@(let ()
(define pth (collection-file-path "info.rkt" "drracket"))
(define-values (base name dir?) (split-path pth))
(define info (get-info/full base))
(unless info (error 'framework/main.rkt "could not find example for modern color scheme"))
(define key 'framework:color-schemes)
(define datum (info key))
(define name-as-string-datum
(let loop ([datum datum])
(cond
[(list? datum)
(for/list ([datum (in-list datum)])
(loop datum))]
[(hash? datum)
(for/hash ([(k v) (in-hash datum)])
(if (and (equal? k 'name) (string-constant? v))
(values k (dynamic-string-constant v))
(values k (loop v))))]
[else datum])))
(define sp (open-output-string))
(parameterize ([pretty-print-columns 60]
[current-output-port sp])
(pretty-write
`(define ,key
',name-as-string-datum)))
(codeblock
(string-append "#lang info\n"
(get-output-string sp))))})
(proc-doc/names (proc-doc/names
color-prefs:set-current-color-scheme color-prefs:set-current-color-scheme
@ -2020,6 +1996,14 @@
If @racket[weak?] is @racket[#t], the @racket[fn] argument is held If @racket[weak?] is @racket[#t], the @racket[fn] argument is held
onto weakly; otherwise it is held onto strongly.}) onto weakly; otherwise it is held onto strongly.})
(proc-doc
color-prefs:get-color-scheme-names
(-> (values set? set?))
@{Returns two sets; the first is the known color scheme names that are just colors
and the second is the known color scheme names that are styles.
These are all of the names that have been passed to @racket[color-prefs:add-color-scheme-entry].})
) )

View File

@ -622,6 +622,8 @@
(define known-color-names (set)) (define known-color-names (set))
(define known-style-names (set)) (define known-style-names (set))
(define (get-color-scheme-names) (values known-color-names known-style-names))
(define-logger color-scheme) (define-logger color-scheme)
(define (register-info-based-color-schemes) (define (register-info-based-color-schemes)
@ -972,7 +974,7 @@
(editor:set-standard-style-list-delta style-name sd))) (editor:set-standard-style-list-delta style-name sd)))
(editor:set-standard-style-list-delta style-name (lookup-in-color-scheme name)))) (editor:set-standard-style-list-delta style-name (lookup-in-color-scheme name))))
(define (add-color-scheme-preferences-panel) (define (add-color-scheme-preferences-panel #:extras [extras void])
(preferences:add-panel (preferences:add-panel
(list (string-constant preferences-colors) (list (string-constant preferences-colors)
(string-constant color-schemes)) (string-constant color-schemes))
@ -1011,7 +1013,9 @@
(color-scheme-name color-scheme)))]))) (color-scheme-name color-scheme)))])))
(define wid (apply max (map (λ (x) (send x get-width)) buttons))) (define wid (apply max (map (λ (x) (send x get-width)) buttons)))
(for ([b (in-list buttons)]) (for ([b (in-list buttons)])
(send b min-width wid))))) (send b min-width wid))
(extras vp)
(void))))
(define (color-scheme->style-list color-scheme) (define (color-scheme->style-list color-scheme)
(define style-list (new style-list%)) (define style-list (new style-list%))

View File

@ -440,7 +440,8 @@
set-in-color-scheme set-in-color-scheme
register-color-scheme-entry-change-callback register-color-scheme-entry-change-callback
add-color-scheme-entry add-color-scheme-entry
register-info-based-color-schemes)) register-info-based-color-schemes
get-color-scheme-names))
(define-signature racket-class^ (define-signature racket-class^
(text<%> (text<%>

View File

@ -558,6 +558,9 @@ please adhere to these guidelines:
(classic-color-scheme "Classic") ;; formerly called 'black on white' (classic-color-scheme "Classic") ;; formerly called 'black on white'
(modern-color-scheme "Modern") ;; an attempt to be more color-blind friendly (modern-color-scheme "Modern") ;; an attempt to be more color-blind friendly
(white-on-black-color-scheme "White on Black") ;; clicking the buttons changes the color schemes to some defaults that've been set up. (white-on-black-color-scheme "White on Black") ;; clicking the buttons changes the color schemes to some defaults that've been set up.
; drracket additions to the color scheme dialog; two buttons
(design-your-own-color-schemes "Design Your Own Color Schemes") ; pointer to (english-only) docs
(style-and-color-names "Style && Color Names")
(add-spacing-between-lines "Add one pixel of extra space between lines") (add-spacing-between-lines "Add one pixel of extra space between lines")