clarify the way the undoable? flag in begin-edit-sequence works
This commit is contained in:
parent
bf6adf0c4a
commit
f311676096
|
@ -1,5 +1,9 @@
|
||||||
#lang scribble/doc
|
#lang scribble/doc
|
||||||
@(require "common.rkt")
|
@(require "common.rkt"
|
||||||
|
scribble/eval)
|
||||||
|
|
||||||
|
@(define editor-eval (make-base-eval))
|
||||||
|
@(editor-eval '(require racket/class))
|
||||||
|
|
||||||
@definterface/title[editor<%> ()]{
|
@definterface/title[editor<%> ()]{
|
||||||
|
|
||||||
|
@ -206,7 +210,52 @@ See also @method[editor<%> refresh-delayed?] and @method[editor<%>
|
||||||
|
|
||||||
If the @racket[undoable?] flag is @racket[#f], then the changes made
|
If the @racket[undoable?] flag is @racket[#f], then the changes made
|
||||||
in the sequence cannot be reversed through the @method[editor<%>
|
in the sequence cannot be reversed through the @method[editor<%>
|
||||||
undo] method. This flag is only effective for the outermost
|
undo] method. To accomplish this, the editor just does not add
|
||||||
|
entries to the undo log when in an edit sequence where the
|
||||||
|
@racket[undoable?] flag is @racket[#f]. So, for example, if an
|
||||||
|
@litchar{a} is inserted into the editor and then a @litchar{b}
|
||||||
|
is inserted, and then an un-undoable edit-sequence begins,
|
||||||
|
and the @litchar{a} is colored red, and then the edit-sequence ends,
|
||||||
|
then an undo will remove the @litchar{b}, leaving the @litchar{a}
|
||||||
|
colored red.
|
||||||
|
|
||||||
|
This behavior also means that editors can get confused. Consider
|
||||||
|
this program:
|
||||||
|
@examples[#:eval
|
||||||
|
editor-eval
|
||||||
|
(eval:alts (define t (new text%))
|
||||||
|
;; this is a pretty horrible hack, but
|
||||||
|
;; the sequence of calls below behaves
|
||||||
|
;; the way they are predicted to as of
|
||||||
|
;; the moment of this commit
|
||||||
|
(define t
|
||||||
|
(new (class object%
|
||||||
|
(define/public (set-max-undo-history x) (void))
|
||||||
|
(define/public (insert . args) (void))
|
||||||
|
(define/public (begin-edit-sequence a b) (void))
|
||||||
|
(define/public (end-edit-sequence) (void))
|
||||||
|
(define/public (undo) (void))
|
||||||
|
(define first? #t)
|
||||||
|
(define/public (get-text)
|
||||||
|
(cond
|
||||||
|
[first?
|
||||||
|
(set! first? #f)
|
||||||
|
"cab"]
|
||||||
|
[else "cb"]))
|
||||||
|
(super-new)))))
|
||||||
|
(send t set-max-undo-history 'forever)
|
||||||
|
(send t insert "a")
|
||||||
|
(send t insert "b")
|
||||||
|
(send t begin-edit-sequence #f #f)
|
||||||
|
(send t insert "c" 0 0)
|
||||||
|
(send t end-edit-sequence)
|
||||||
|
(send t get-text)
|
||||||
|
(send t undo)
|
||||||
|
(send t get-text)]
|
||||||
|
You might hope that the undo would remove the @litchar{b}, but it removes
|
||||||
|
the @litchar{a}.
|
||||||
|
|
||||||
|
The @racket[undoable?] flag is only effective for the outermost
|
||||||
@method[editor<%> begin-edit-sequence] when nested sequences are
|
@method[editor<%> begin-edit-sequence] when nested sequences are
|
||||||
used. Note that, for a @racket[text%] object, the character-inserting
|
used. Note that, for a @racket[text%] object, the character-inserting
|
||||||
version of @method[text% insert] interferes with sequence-based undo
|
version of @method[text% insert] interferes with sequence-based undo
|
||||||
|
|
Loading…
Reference in New Issue
Block a user