Forms: review r3 fix
This commit is contained in:
3 files changed
+82
-7
No files matched your search
+20
-7
@@ -172,14 +172,27 @@ func InputGroup(c *ui.Context, value *string, opts InputGroupOptions) InputGroup
|
|||||||
return parts
|
return parts
|
||||||
}
|
}
|
||||||
|
|
||||||
// inputGroupEditor builds the input; a disabled one edits a copy, so queued input cannot reach value.
|
// inputGroupLock remembers locks so an unlocked input starts afresh.
|
||||||
|
type inputGroupLock struct {
|
||||||
|
locked bool
|
||||||
|
gen int
|
||||||
|
}
|
||||||
|
|
||||||
|
// inputGroupEditor builds the input, or plain selectable text while locked, so no edit command runs.
|
||||||
func inputGroupEditor(c *ui.Context, box *ui.Element, value *string, locked bool) *ui.Element {
|
func inputGroupEditor(c *ui.Context, box *ui.Element, value *string, locked bool) *ui.Element {
|
||||||
if !locked {
|
lk := ui.Local(box, "lock", func() inputGroupLock { return inputGroupLock{} })
|
||||||
return ui.TextInputBase(c, value)
|
if lk.locked && !locked {
|
||||||
|
// A new identity drops the edits queued in the old editor while locked.
|
||||||
|
lk.gen++
|
||||||
}
|
}
|
||||||
shown := ui.Local(box, "locked", func() string { return *value })
|
lk.locked = locked
|
||||||
*shown = *value
|
var in *ui.Element
|
||||||
in := ui.TextInputBase(c, shown)
|
ui.Row(c).Key(lk.gen).FillWidth().MinWidth(0).Children(func() {
|
||||||
*shown = *value
|
if locked {
|
||||||
|
in = ui.Text(c, *value).SingleLine().Selectable()
|
||||||
|
} else {
|
||||||
|
in = ui.TextInputBase(c, value)
|
||||||
|
}
|
||||||
|
})
|
||||||
return in
|
return in
|
||||||
}
|
}
|
||||||
@@ -141,3 +141,33 @@ func TestInputGroupHitAreasCompact(t *testing.T) {
|
|||||||
t.Fatalf("button %v", r)
|
t.Fatalf("button %v", r)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Cut and paste after disabling a field with a selection change neither value nor clipboard.
|
||||||
|
func TestInputGroupDisabledEditCommands(t *testing.T) {
|
||||||
|
value, disabled, changes := "secret", false, 0
|
||||||
|
tt := ui.NewTester(func(c *ui.Context) {
|
||||||
|
Use(c, Settings{})
|
||||||
|
if InputGroup(c, &value, InputGroupOptions{Label: "Code", Disabled: disabled}).Changed() {
|
||||||
|
changes++
|
||||||
|
}
|
||||||
|
}, 400, 100)
|
||||||
|
_ = tt.Click("Code")
|
||||||
|
tt.Key(ui.Cmd, ui.KeyA)
|
||||||
|
tt.SetClipboard("clip")
|
||||||
|
disabled = true
|
||||||
|
tt.Frame()
|
||||||
|
tt.Key(ui.Cmd, ui.KeyX)
|
||||||
|
tt.Command("cut")
|
||||||
|
tt.Command("paste")
|
||||||
|
tt.Command("undo")
|
||||||
|
tt.Frame()
|
||||||
|
if value != "secret" || tt.Clipboard() != "clip" || changes != 0 {
|
||||||
|
t.Fatalf("value %q clipboard %q changes %d", value, tt.Clipboard(), changes)
|
||||||
|
}
|
||||||
|
disabled = false
|
||||||
|
tt.Frame()
|
||||||
|
tt.Frame()
|
||||||
|
if value != "secret" || tt.Clipboard() != "clip" || changes != 0 {
|
||||||
|
t.Fatalf("after enabling: value %q clipboard %q", value, tt.Clipboard())
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -144,3 +144,35 @@ func TestTagsInputDisabledAfterFocus(t *testing.T) {
|
|||||||
t.Fatalf("tags %q changes %d", tags, n)
|
t.Fatalf("tags %q changes %d", tags, n)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Cut and paste after disabling with a selected draft change neither draft nor clipboard.
|
||||||
|
func TestTagsInputDisabledEditCommands(t *testing.T) {
|
||||||
|
tags, n, seen := []string{}, 0, ""
|
||||||
|
opts := TagsInputOptions{Label: "Tags", Validate: func(s string) string { seen = s; return "" }}
|
||||||
|
tt := ui.NewTester(func(c *ui.Context) {
|
||||||
|
Use(c, Settings{})
|
||||||
|
if TagsInput(c, &tags, opts).Changed() {
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
}, 520, 200)
|
||||||
|
_ = tt.Click("Tags")
|
||||||
|
tt.Type("ivy")
|
||||||
|
tt.Key(ui.Cmd, ui.KeyA)
|
||||||
|
tt.SetClipboard("clip")
|
||||||
|
opts.Disabled = true
|
||||||
|
tt.Frame()
|
||||||
|
tt.Key(ui.Cmd, ui.KeyX)
|
||||||
|
tt.Command("cut")
|
||||||
|
tt.Command("paste")
|
||||||
|
tt.Frame()
|
||||||
|
if tt.Clipboard() != "clip" || n != 0 {
|
||||||
|
t.Fatalf("clipboard %q changes %d", tt.Clipboard(), n)
|
||||||
|
}
|
||||||
|
opts.Disabled = false
|
||||||
|
tt.Frame()
|
||||||
|
_ = tt.Click("Tags")
|
||||||
|
tt.Key(0, ui.KeyEnter)
|
||||||
|
if seen != "ivy" || tt.Clipboard() != "clip" || len(tags) != 1 {
|
||||||
|
t.Fatalf("draft %q clipboard %q tags %q", seen, tt.Clipboard(), tags)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user