Adding Text Write option that atomically replaces the text content.

This commit is contained in:
Jakub Sobon 2019-02-15 00:40:15 -05:00
parent d4b68e905b
commit 38a2a36234
No known key found for this signature in database
GPG Key ID: F2451A77FB05D3B7
3 changed files with 37 additions and 1 deletions

View File

@ -85,7 +85,11 @@ func New(opts ...Option) (*Text, error) {
func (t *Text) Reset() {
t.mu.Lock()
defer t.mu.Unlock()
t.reset()
}
// reset implements Reset, caller must hold t.mu.
func (t *Text) reset() {
t.buff.Reset()
t.givenWOpts = nil
t.wOptsTracker = attrrange.NewTracker()
@ -109,8 +113,13 @@ func (t *Text) Write(text string, wOpts ...WriteOption) error {
return err
}
opts := newWriteOptions(wOpts...)
if opts.replace {
t.reset()
}
pos := t.buff.Len()
t.givenWOpts = append(t.givenWOpts, newWriteOptions(wOpts...))
t.givenWOpts = append(t.givenWOpts, opts)
wOptsIdx := len(t.givenWOpts) - 1
if err := t.wOptsTracker.Add(pos, pos+len(text), wOptsIdx); err != nil {
return err

View File

@ -133,6 +133,24 @@ func TestTextDraws(t *testing.T) {
return ft
},
},
{
desc: "multiple writes replace when requested",
canvas: image.Rect(0, 0, 12, 1),
writes: func(widget *Text) error {
if err := widget.Write("hello", WriteReplace()); err != nil {
return err
}
return widget.Write("world", WriteReplace())
},
want: func(size image.Point) *faketerm.Terminal {
ft := faketerm.MustNew(size)
c := testcanvas.MustNew(ft.Area())
testdraw.MustText(c, "world", image.Point{0, 0})
testcanvas.MustApply(c, ft)
return ft
},
},
{
desc: "reset clears the content",
canvas: image.Rect(0, 0, 12, 1),

View File

@ -29,6 +29,7 @@ type WriteOption interface {
// writeOptions stores the provided options.
type writeOptions struct {
cellOpts *cell.Options
replace bool
}
// newWriteOptions returns new writeOptions instance.
@ -56,3 +57,11 @@ func WriteCellOpts(opts ...cell.Option) WriteOption {
wOpts.cellOpts = cell.NewOptions(opts...)
})
}
// WriteReplace instructs the text widget to replace the entire text content on
// this write instead of appending.
func WriteReplace() WriteOption {
return writeOption(func(wOpts *writeOptions) {
wOpts.replace = true
})
}