From ab8d9318c3df7da22af075fc054641d847b0daf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E7=94=B5=E8=8A=BD=E8=A1=A3?= Date: Mon, 5 Oct 2026 12:33:01 -0400 Subject: [PATCH] Inputs: review r1 fixes --- button.go | 25 ++- button_group.go | 5 +- checkbox.go | 41 ++-- docs/components/021-button.md | 6 +- docs/components/023-button-group.md | 2 +- docs/components/024-text-input.md | 2 +- docs/components/025-text-area.md | 8 +- docs/components/026-number-input.md | 4 +- docs/components/028-search-input.md | 1 + docs/components/029-checkbox.md | 2 +- docs/components/030-radio-group.md | 4 +- input_review_test.go | 187 ++++++++++++++++++ number_input.go | 30 ++- number_input_test.go | 79 +++++++- password_input.go | 6 +- radio_group.go | 45 +++-- search_input.go | 12 +- .../darwin/button-comfortable-dark.png | Bin 11237 -> 10367 bytes .../darwin/button-comfortable-light.png | Bin 10937 -> 10109 bytes .../snapshots/darwin/button-compact-dark.png | Bin 11338 -> 10243 bytes .../snapshots/darwin/button-compact-light.png | Bin 11075 -> 9964 bytes testdata/snapshots/darwin/button-dark.png | Bin 11165 -> 10119 bytes testdata/snapshots/darwin/button-light.png | Bin 10867 -> 9919 bytes .../snapshots/darwin/icon_button-dark.png | Bin 3561 -> 3477 bytes .../snapshots/darwin/icon_button-light.png | Bin 3551 -> 3478 bytes testdata/snapshots/darwin/spinner-dark.png | Bin 4516 -> 3453 bytes testdata/snapshots/darwin/spinner-light.png | Bin 4219 -> 3365 bytes text_area.go | 18 +- text_input.go | 24 +-- 29 files changed, 417 insertions(+), 84 deletions(-) create mode 100644 input_review_test.go diff --git a/button.go b/button.go index 27b6d0c..83cfa26 100644 --- a/button.go +++ b/button.go @@ -25,12 +25,15 @@ type ButtonOptions struct { Icon *ui.SVG Loading bool Disabled bool - // Label names an icon-only button for assistive technology. + // Label names an icon-only button for assistive technology; required without a label. Label string } // Button is a push button. Loading keeps its size and blocks clicks. func Button(c *ui.Context, label string, opts ButtonOptions) *ui.Element { + if label == "" && opts.Label == "" { + panic("mujica: Button without a label needs Label to name it") + } k := Tokens(c) d := Density(c) b := ui.ButtonBase(c).MinHeight(d.ControlHeight()).MinWidth(theme.MinHitSize). @@ -46,13 +49,25 @@ func Button(c *ui.Context, label string, opts ButtonOptions) *ui.Element { b.Border(theme.BorderWidth, border) } b.Children(func() { - if opts.Loading { - Spinner(c, SpinnerOptions{Size: 14, Color: fg}) - } else if opts.Icon != nil { + switch { + case opts.Loading && opts.Icon != nil: + // The spinner takes the icon's 16 DIP slot. + Spinner(c, SpinnerOptions{Size: 16, Color: fg}) + case opts.Loading && label == "": + Spinner(c, SpinnerOptions{Size: 16, Color: fg}) + case opts.Loading: + // Over the hidden label, so the width stays. + ui.Box(c).Absolute().Left(0).Top(0).Right(0).Bottom(0).Center().Children(func() { + Spinner(c, SpinnerOptions{Size: 16, Color: fg}) + }) + case opts.Icon != nil: ui.Icon(c, opts.Icon).Size(16, 16) } if label != "" { - ui.Text(c, label).SingleLine() + t := ui.Text(c, label).SingleLine() + if opts.Loading && opts.Icon == nil { + t.TextColor(fg.Alpha(0)) + } } }) return b diff --git a/button_group.go b/button_group.go index b3de134..ab3d6b8 100644 --- a/button_group.go +++ b/button_group.go @@ -9,7 +9,7 @@ import ( "mujicaui/theme" ) -// ButtonGroupItem is one button of a ButtonGroup. Give Label, Icon or both. +// ButtonGroupItem is one button of a ButtonGroup. Give Label, Icon or both; icon-only needs Name. type ButtonGroupItem struct { Label string Icon *ui.SVG @@ -55,6 +55,9 @@ func ButtonGroup(c *ui.Context, items []ButtonGroupItem, opts ButtonGroupOptions if it.Label == "" && it.Icon == nil { panic("mujica: ButtonGroupItem needs a Label or an Icon") } + if it.Label == "" && it.Name == "" { + panic("mujica: icon-only ButtonGroupItem needs a Name") + } b := ui.ButtonBase(c).Key(i).MinHeight(d.ControlHeight()).MinWidth(d.ControlHeight()). Padding(0, d.Unit()*3).Gap(d.Unit() * 2).Disabled(it.Disabled) internal.Ring(b, k.Focus, theme.ControlRadius) diff --git a/checkbox.go b/checkbox.go index de9b5a4..c294aea 100644 --- a/checkbox.go +++ b/checkbox.go @@ -26,7 +26,15 @@ func Checkbox(c *ui.Context, value *bool, label string, opts CheckboxOptions) *u } k := Tokens(c) d := Density(c) - row := ui.CheckboxBase(c, value).Gap(d.Unit() * 2).MinHeight(d.ControlHeight()).FocusRing(false).Disabled(opts.Disabled) + // Disabled on a wrapper blocks the base's click before it toggles. + var row *ui.Element + wrap := ui.Row(c).Shrink(0).Disabled(opts.Disabled) + wrap.Children(func() { + row = ui.CheckboxBase(c, value).Gap(d.Unit() * 2).MinHeight(d.ControlHeight()).FocusRing(false) + }) + if opts.Disabled && wrap.FocusWithin() { + wrap.FocusRing(false).Focus() + } if row.Changed() && opts.Indeterminate && !*value { // From mixed, a click always checks. *value = true @@ -37,17 +45,9 @@ func Checkbox(c *ui.Context, value *bool, label string, opts CheckboxOptions) *u on, mixed := *value, opts.Indeterminate hover, pressed := row.Hovered(), row.Pressed() row.Children(func() { - box := ui.Box(c).Size(checkboxSize, checkboxSize).Shrink(0).Radius(theme.ControlRadius) - switch { - case on || mixed: - box.Background(k.Accent).Border(theme.BorderWidth, k.AccentText) - case pressed: - box.Background(k.Selection).Border(theme.BorderWidth, k.AccentText) - case hover: - box.Background(k.SurfaceHover).Border(theme.BorderWidth, k.AccentText) - default: - box.Background(k.Surface).Border(theme.BorderWidth, k.ControlBorder) - } + bg, border := checkboxColors(k, on || mixed, hover, pressed) + box := ui.Box(c).Size(checkboxSize, checkboxSize).Shrink(0).Radius(theme.ControlRadius). + Background(bg).Border(theme.BorderWidth, border) box.Transition(textInputFade) box.DrawOver(func(p *ui.Painter, r ui.Rect) { switch { @@ -72,6 +72,23 @@ func Checkbox(c *ui.Context, value *bool, label string, opts CheckboxOptions) *u return row } +// checkboxColors gives a check box or radio mark its fill and edge. +func checkboxColors(k theme.Tokens, on, hover, pressed bool) (bg, border ui.Color) { + switch { + case on && pressed: + return k.AccentPressed, k.Text + case on && hover: + return k.AccentHover, k.Text + case on: + return k.Accent, k.AccentText + case pressed: + return k.Selection, k.AccentText + case hover: + return k.SurfaceHover, k.AccentText + } + return k.Surface, k.ControlBorder +} + // CheckboxItem is one box of a CheckboxGroup. type CheckboxItem struct { Label string diff --git a/docs/components/021-button.md b/docs/components/021-button.md index 02824ad..ec90fe8 100644 --- a/docs/components/021-button.md +++ b/docs/components/021-button.md @@ -18,12 +18,12 @@ if mujica.Button(c, "Save", mujica.ButtonOptions{Icon: icons.Must("check")}).Cli | 字段 | 类型 | 默认值 | 含义 | | --- | --- | --- | --- | -| `label` | `string` | 必填(仅图标时可为空) | 按钮文字。 | +| `label` | `string` | 必填(仅图标时可为空) | 按钮文字;为空时必须提供 `Label`,否则 panic。 | | `Variant` | `ButtonVariant` | `Primary` | `Primary`、`Secondary`、`Outline`、`Ghost`、`Danger`。 | | `Icon` | `*ui.SVG` | `nil` | 文字前的 16 DIP 图标。 | -| `Loading` | `bool` | `false` | 以菱形加载标记替换图标,保留尺寸与文字,阻止点击。 | +| `Loading` | `bool` | `false` | 有图标时加载标记占用图标位置;纯文字时标记居中覆盖在隐藏的文字上,宽度不变;阻止点击。 | | `Disabled` | `bool` | `false` | 不可点击、不进入 Tab 序列。 | -| `Label` | `string` | `""` | 无文字按钮的无障碍名称。 | +| `Label` | `string` | `""` | 无障碍名称;`label` 为空时必填。 | ## 状态 diff --git a/docs/components/023-button-group.md b/docs/components/023-button-group.md index c394325..db7a2fd 100644 --- a/docs/components/023-button-group.md +++ b/docs/components/023-button-group.md @@ -23,7 +23,7 @@ if i := mujica.ButtonGroup(c, items, mujica.ButtonGroupOptions{Label: "Range"}). | --- | --- | --- | --- | | `Label` | `string` | `""` | 文字;与 `Icon` 至少给一个,否则 panic。 | | `Icon` | `*ui.SVG` | `nil` | 图标。 | -| `Name` | `string` | `""` | 仅图标项的无障碍名称。 | +| `Name` | `string` | `""` | 仅图标项的无障碍名称;仅图标且为空时 panic。 | | `Disabled` | `bool` | `false` | 单项禁用;方向键跳过该项。 | `ButtonGroupOptions` diff --git a/docs/components/024-text-input.md b/docs/components/024-text-input.md index 88649a9..d363468 100644 --- a/docs/components/024-text-input.md +++ b/docs/components/024-text-input.md @@ -32,7 +32,7 @@ if r.Submitted() { ## 状态 -默认(Surface 底、ControlBorder 边)、悬停(边框加深)、聚焦(边框 Focus 色;键盘聚焦另加焦点环)、只读(Background 底、Border 边)、错误、禁用。颜色变化 120 毫秒过渡,减少动画时直接切换。 +默认(Surface 底、ControlBorder 边)、悬停(边框加深)、聚焦(边框 Focus 色;键盘聚焦另加焦点环)、只读(Background 底、Border 边)、错误、禁用。聚焦时被禁用会放弃焦点,已排队的按键不再修改值、不触发事件。颜色变化 120 毫秒过渡,减少动画时直接切换。 ## 事件 diff --git a/docs/components/025-text-area.md b/docs/components/025-text-area.md index 32205d8..c4f1b51 100644 --- a/docs/components/025-text-area.md +++ b/docs/components/025-text-area.md @@ -25,14 +25,14 @@ if r.Submitted() { | `MinHeight` | `float32` | `0`(三行) | 编辑区最小高度,DIP。 | | `MaxHeight` | `float32` | `0`(随内容增长) | 编辑区最大高度,超出后滚动;小于 `MinHeight` 时 panic。 | | `MaxLength` | `int` | `0`(不显示) | 显示“当前 / 上限”字数(按 Unicode 字符计);超出时变红并提示超出数量。 | -| `SubmitKey` / `SubmitMods` | `ui.Key` / `ui.Modifiers` | Cmd+Enter(非 macOS 为 Ctrl+Enter) | 提交快捷键;`SubmitKey` 为零时使用默认值。 | +| `SubmitKey` / `SubmitMods` | `ui.Key` / `ui.Modifiers` | Cmd+Enter(非 macOS 为 Ctrl+Enter) | 提交快捷键;`SubmitKey` 为零时使用默认值。可设为不带修饰键的 Enter,此时 Shift+Enter 换行。 | | `Disabled` | `bool` | `false` | 禁用。 | | `ReadOnly` | `bool` | `false` | 只读,可选择复制。 | | `Error` | `string` | `""` | 错误文字;为空且超出 `MaxLength` 时自动显示超出提示。 | ## 状态 -默认、悬停、聚焦、只读、错误、禁用,表现同 TextInput。 +默认、悬停、聚焦、只读、错误、禁用,表现同 TextInput;聚焦时被禁用会放弃焦点,之后的输入与提交都不生效。 ## 事件 @@ -40,10 +40,10 @@ if r.Submitted() { ## 键盘操作 -Enter 与 Shift+Enter 换行;提交快捷键提交;方向键、PageUp/PageDown 移动光标并滚动;撤销、剪贴板与输入法同 TextInput。 +未配置为提交键时 Enter 与 Shift+Enter 换行;提交快捷键在编辑器处理前被截获并提交,不插入换行;方向键、PageUp/PageDown 移动光标并滚动;撤销、剪贴板与输入法同 TextInput。 ## 限制 - `MaxLength` 只提示,不截断输入,以免打断输入法组合与粘贴。 -- 提交快捷键不能是不带修饰键的 Enter:MyGo 编辑器先接收 Enter 并插入换行(`editor.go:161`)。 +- 输入法组合期间无法阻止提交快捷键:MyGo 不公开组合状态,组合文本存在未导出的 `editor.compose`(`ui/editor.go:73`),带编辑器的元素收不到 `InputCompose` 事件(`ui/input.go:689`)。各平台输入法在组合时通常自己消费 Enter;只有未被输入法消费的按键会触发提交。 - 只读实现方式同 TextInput。 diff --git a/docs/components/026-number-input.md b/docs/components/026-number-input.md index 82865f7..2c67ff0 100644 --- a/docs/components/026-number-input.md +++ b/docs/components/026-number-input.md @@ -21,7 +21,7 @@ if mujica.NumberInput(c, &copies, mujica.NumberInputOptions{Min: 1, Max: 99, Lab | `value` | `*float64` | 必填 | 数值;空值用 `math.NaN()` 表示,仅在 `AllowEmpty` 时允许。 | | `Min` / `Max` | `float64` | 都为 0 | 范围;相等(含零值)表示不限范围;`Min > Max` 时 panic。 | | `Step` | `float64` | `1` | 方向键与按钮的步长;负数 panic。 | -| `Precision` | `int` | 取 `Step` 的小数位 | 保留与显示的小数位。 | +| `Precision` | `int` | 取 `Step` 的小数位 | 保留与显示的小数位。范围边界向内取到该精度上(如 [0.11, 0.29] 精度 1 时有效值只有 0.2);范围内没有任何该精度的值时 panic。 | | `AllowEmpty` | `bool` | `false` | 允许清空,值变为 NaN;从空值步进时从 0(夹在范围内)开始。 | | `StepperOnly` | `bool` | `false` | 只显示数值与上下箭头,不可输入;必须给出 `Min < Max`,且不能与 `AllowEmpty` 同用。 | | `Placeholder` | `string` | `""` | 空值时的占位。 | @@ -31,7 +31,7 @@ if mujica.NumberInput(c, &copies, mujica.NumberInputOptions{Min: 1, Max: 99, Lab ## 状态 -输入模式同 TextInput;输入非数字或超出范围时显示内置错误(“请输入数字”“请输入 a 到 b 之间的数字”),值保持上一次有效值;失去焦点后文本恢复为当前值并清除该错误。到达边界时对应按钮禁用。 +输入模式同 TextInput;输入非数字或超出范围时显示内置错误(“请输入数字”“请输入 a 到 b 之间的数字”),值保持上一次有效值;失去焦点后错误文本与提示保留,直到用户改正,或调用方从外部改变了值。值在聚焦期间被外部修改时,输入框立即显示新值。到达边界时对应按钮禁用。 ## 事件 diff --git a/docs/components/028-search-input.md b/docs/components/028-search-input.md index 8d074bc..afec587 100644 --- a/docs/components/028-search-input.md +++ b/docs/components/028-search-input.md @@ -48,4 +48,5 @@ if r.Moved() { ## 限制 - MyGo 单行编辑器把 Shift+Enter 当作普通提交且不公开修饰键(`editor.go:489`,`submitMods` 未导出),组件用 `HandleInput` 先截获 Shift+Enter。 +- 输入法组合期间无法阻止提交与匹配跳转:MyGo 不公开组合状态,组合文本存在未导出的 `editor.compose`(`ui/editor.go:73`),带编辑器的元素收不到 `InputCompose` 事件(`ui/input.go:689`)。各平台输入法在组合时通常自己消费 Enter;只有未被输入法消费的按键会触发提交或跳转。 - 没有“完成/关闭”按钮;是否显示查找栏由调用方决定。 diff --git a/docs/components/029-checkbox.md b/docs/components/029-checkbox.md index 2e88b84..d71bae6 100644 --- a/docs/components/029-checkbox.md +++ b/docs/components/029-checkbox.md @@ -33,7 +33,7 @@ func CheckboxGroup(c *ui.Context, label string, items []CheckboxItem, opts Check ## 状态 -未选(Surface 底、ControlBorder 边)、悬停与按下(AccentText 边)、选中(酒红底、象牙白勾)、半选(酒红底、象牙白横线)、键盘聚焦(方框外焦点环)、禁用。行高不低于密度控件高度。 +未选(Surface 底、ControlBorder 边)、悬停与按下(AccentText 边)、选中(酒红底、象牙白勾;悬停与按下时底色加深、边框变为正文色)、半选(酒红底、象牙白横线)、键盘聚焦(方框外焦点环)、禁用。行高不低于密度控件高度。 全选框:全部选中为选中,部分选中为半选,全不选为未选。点击时若可用项未全选则全部勾选,否则全部清除;禁用项保持不变。 diff --git a/docs/components/030-radio-group.md b/docs/components/030-radio-group.md index f421a8e..85e7886 100644 --- a/docs/components/030-radio-group.md +++ b/docs/components/030-radio-group.md @@ -37,7 +37,7 @@ if mujica.RadioGroup(c, &size, items, mujica.RadioGroupOptions{Label: "Size"}).C ## 状态 -未选(空心圆)、悬停与按下(AccentText 边)、选中(酒红实心圆与象牙白圆点)、键盘聚焦、禁用。 +未选(空心圆)、悬停与按下(AccentText 边)、选中(酒红实心圆与象牙白圆点;悬停与按下时底色加深、边框变为正文色)、键盘聚焦、禁用。 ## 事件 @@ -49,4 +49,6 @@ Tab 进入组并落在已选项;Up/Down/Left/Right 移动并直接选择,循 ## 限制 +- 每个选项以 `Value` 为键,选项重新排序后焦点仍跟随原来的值。 + - 方向键对横向与纵向组都同时响应上下左右(MyGo `RadioGroup` 固定使用 `Horizontal|Vertical`)。 diff --git a/input_review_test.go b/input_review_test.go new file mode 100644 index 0000000..df53518 --- /dev/null +++ b/input_review_test.go @@ -0,0 +1,187 @@ +package mujica + +import ( + "bytes" + "testing" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" +) + +func TestButtonLoadingKeepsWidth(t *testing.T) { + for _, icon := range []*ui.SVG{nil, icons.Must("check")} { + loading := false + var w float32 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Row(c).Children(func() { + w = Button(c, "Save", ButtonOptions{Icon: icon, Loading: loading}).Bounds().W + }) + }, 300, 200) + tt.Frame() + before := w + loading = true + tt.Frame() + tt.Frame() + if w != before || !tt.HasText("Save") { + t.Fatalf("icon %v: width %v -> %v, texts %q", icon != nil, before, w, tt.Texts()) + } + } +} + +func inputReviewPanics(t *testing.T, name string, view func(c *ui.Context)) { + t.Helper() + defer func() { + if recover() == nil { + t.Errorf("%s: no panic", name) + } + }() + ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + view(c) + }, 200, 100) +} + +func TestIconOnlyButtonsNeedNames(t *testing.T) { + inputReviewPanics(t, "Button", func(c *ui.Context) { + Button(c, "", ButtonOptions{Icon: icons.Must("x")}) + }) + inputReviewPanics(t, "ButtonGroup", func(c *ui.Context) { + ButtonGroup(c, []ButtonGroupItem{{Icon: icons.Must("bold")}}, ButtonGroupOptions{}) + }) +} + +func TestTextInputDisabledWhileFocused(t *testing.T) { + s, off, focused, changes := "", false, false, 0 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + r := TextInput(c, &s, TextInputOptions{Label: "Name", Disabled: off}) + focused = r.Input.Focused() + if r.Changed() || r.Submitted() { + changes++ + } + }, 400, 200) + _ = tt.Click("Name") + tt.Type("a") + off = true + tt.Type("b") + tt.Key(0, ui.KeyEnter) + tt.Frame() + if s != "a" || changes != 1 || focused { + t.Fatalf("value %q events %d focused %v", s, changes, focused) + } +} + +func TestTextAreaDisabledWhileFocused(t *testing.T) { + s, off := "", false + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + TextArea(c, &s, TextAreaOptions{Label: "Notes", Disabled: off}) + }, 400, 300) + _ = tt.Click("Notes") + off = true + tt.Type("late") + if s != "" { + t.Fatalf("disabled area took %q", s) + } +} + +func TestCheckboxDisabledWhileFocused(t *testing.T) { + on, off, focused := false, false, false + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + focused = Checkbox(c, &on, "Sync", CheckboxOptions{Disabled: off}).Focused() + }, 300, 200) + tt.Key(0, ui.KeyTab) + off = true + tt.Key(0, ui.KeySpace) + tt.Frame() + if on || focused { + t.Fatalf("checked %v focused %v", on, focused) + } +} + +func TestRadioGroupDisabledWhileFocused(t *testing.T) { + v, off := "a", false + items := []RadioItem[string]{{Value: "a", Label: "A"}, {Value: "b", Label: "B"}} + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + RadioGroup(c, &v, items, RadioGroupOptions{Disabled: off}) + }, 300, 200) + tt.Key(0, ui.KeyTab) + off = true + tt.Key(0, ui.KeyDown) + tt.Key(0, ui.KeySpace) + if v != "a" { + t.Fatalf("disabled group chose %q", v) + } +} + +func TestTextAreaPlainEnterSubmits(t *testing.T) { + s, submits := "", 0 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + if TextArea(c, &s, TextAreaOptions{Label: "Chat", SubmitKey: ui.KeyEnter}).Submitted() { + submits++ + } + }, 400, 300) + _ = tt.Click("Chat") + tt.Type("hi") + tt.Key(0, ui.KeyEnter) + tt.Key(ui.Shift, ui.KeyEnter) + if submits != 1 || s != "hi\n" { + t.Fatalf("submits %d value %q", submits, s) + } +} + +func TestRadioGroupFocusFollowsValue(t *testing.T) { + v := "" + items := []RadioItem[string]{{Value: "a", Label: "A"}, {Value: "b", Label: "B"}} + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + RadioGroup(c, &v, items, RadioGroupOptions{}) + }, 300, 200) + tt.Key(0, ui.KeyTab) + items[0], items[1] = items[1], items[0] + tt.Frame() + tt.Key(0, ui.KeySpace) + if v != "a" { + t.Fatalf("Space after reordering chose %q, want a", v) + } +} + +// inputReviewStates renders view plain, hovered and pressed at the named element. +func inputReviewStates(t *testing.T, name string, view func(c *ui.Context)) (plain, hover, pressed []byte) { + t.Helper() + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{Mode: Dark}) + view(c) + }, 300, 200) + tt.SetPreferences(ui.Preferences{ReduceMotion: true, TextScale: 1}) + r, ok := tt.Find(name) + if !ok { + t.Fatalf("no %q", name) + } + plain = encode(t, tt.Image()) + tt.Move(r.X+r.W/2, r.Y+r.H/2) + hover = encode(t, tt.Image()) + tt.Press(r.X+r.W/2, r.Y+r.H/2) + pressed = encode(t, tt.Image()) + return +} + +func TestCheckedMarksShowHoverAndPress(t *testing.T) { + on, v := true, "a" + for name, view := range map[string]func(c *ui.Context){ + "Sync": func(c *ui.Context) { Checkbox(c, &on, "Sync", CheckboxOptions{}) }, + "A": func(c *ui.Context) { + RadioGroup(c, &v, []RadioItem[string]{{Value: "a", Label: "A"}}, RadioGroupOptions{}) + }, + } { + plain, hover, pressed := inputReviewStates(t, name, view) + if bytes.Equal(plain, hover) || bytes.Equal(hover, pressed) { + t.Errorf("%s: checked state hides hover (%v) or press (%v)", name, bytes.Equal(plain, hover), bytes.Equal(hover, pressed)) + } + } +} diff --git a/number_input.go b/number_input.go index a781378..efed56a 100644 --- a/number_input.go +++ b/number_input.go @@ -47,12 +47,15 @@ func (s numberInputSpec) format(v float64) string { return strconv.FormatFloat(v, 'f', s.decimals, 64) } -// clamp bounds v and rounds it to the precision. +// clamp rounds v to the precision, then bounds it; the bounds sit on that grid. func (s numberInputSpec) clamp(v float64) float64 { p := math.Pow(10, float64(s.decimals)) - return math.Round(math.Max(s.lo, math.Min(s.hi, v))*p) / p + return math.Max(s.lo, math.Min(s.hi, math.Round(v*p)/p)) } +// numberInputSame reports equal values, counting NaN (empty) as equal. +func numberInputSame(a, b float64) bool { return a == b || math.IsNaN(a) && math.IsNaN(b) } + func numberInputResolve(opts NumberInputOptions) numberInputSpec { s := numberInputSpec{lo: opts.Min, hi: opts.Max, step: opts.Step, decimals: opts.Precision} if s.lo > s.hi { @@ -75,6 +78,13 @@ func numberInputResolve(opts NumberInputOptions) numberInputSpec { s.decimals = len(t) - strings.IndexByte(t, '.') - 1 } } + // Bounds move inward onto the precision grid, so clamped values keep both. + p := math.Pow(10, float64(s.decimals)) + s.lo = math.Ceil(math.Round(s.lo*p*1e6)/1e6) / p + s.hi = math.Floor(math.Round(s.hi*p*1e6)/1e6) / p + if s.lo > s.hi { + panic("mujica: NumberInput has no value in range at this precision") + } return s } @@ -114,12 +124,18 @@ func NumberInput(c *ui.Context, value *float64, opts NumberInputOptions) InputRe r.Element, r.Input = textInputFrame(c, look, func(frame *ui.Element) *ui.Element { text := ui.Local(frame, "text", func() string { return s.format(*value) }) invalid := ui.Local(frame, "invalid", func() string { return "" }) - in := ui.TextInputBase(c, text).Grow(1).MinWidth(Density(c).Unit() * 12). + seen := ui.Local(frame, "seen", func() float64 { return *value }) + if !numberInputSame(*seen, *value) { + // Set from outside: the text follows, and a typing error goes. + *text, *invalid = s.format(*value), "" + } + in := textInputEditor(c, frame, text, opts.Disabled, ui.TextInputBase).Grow(1).MinWidth(Density(c).Unit() * 12). Placeholder(opts.Placeholder).Label(opts.Label) - if in.Changed() { + if in.Changed() && !opts.Disabled { *invalid = numberInputParse(c, s, *text, opts.AllowEmpty, set) } switch { + case opts.Disabled: case in.Shortcut(0, ui.KeyUp): stepBy(1) *text, *invalid = s.format(*value), "" @@ -127,9 +143,11 @@ func NumberInput(c *ui.Context, value *float64, opts NumberInputOptions) InputRe stepBy(-1) *text, *invalid = s.format(*value), "" } - if !in.Focused() { - *text, *invalid = s.format(*value), "" + if !in.Focused() && *invalid == "" { + // Leaving shows the value rounded; invalid text stays to be fixed. + *text = s.format(*value) } + defer func() { *seen = *value }() for _, b := range []struct { name string icon string diff --git a/number_input_test.go b/number_input_test.go index 5259557..1109778 100644 --- a/number_input_test.go +++ b/number_input_test.go @@ -63,8 +63,81 @@ func TestNumberInputTypingPrecisionAndErrors(t *testing.T) { t.Fatalf("out of range: value %v texts %q", v, tt.Texts()) } _ = tt.Click("Elsewhere") - if tt.HasText("Enter a number") { - t.Fatal("error stays after leaving the field, which shows the value again") + if v != 1.25 || !tt.HasText("Enter a number from 0.00 to 2.00") { + t.Fatalf("leaving dropped the error: value %v texts %q", v, tt.Texts()) + } +} + +func TestNumberInputKeepsInvalidTextAfterBlur(t *testing.T) { + v, n := 1.0, 0 + tt := numberInputTester(&v, &n, NumberInputOptions{Label: "Count"}) + _ = tt.Click("Count") + tt.Command("selectAll") + tt.Type("abc") + _ = tt.Click("Elsewhere") + if !tt.HasText("Enter a number") || v != 1 { + t.Fatalf("after blur: value %v texts %q", v, tt.Texts()) + } + _ = tt.Click("Count") + tt.Command("selectAll") + tt.Command("copy") + if tt.Clipboard() != "abc" { + t.Fatalf("invalid text replaced by %q", tt.Clipboard()) + } + tt.Type("4") + if v != 4 || tt.HasText("Enter a number") { + t.Fatalf("correction: value %v texts %q", v, tt.Texts()) + } +} + +func TestNumberInputSyncsExternalValue(t *testing.T) { + v, n := 1.0, 0 + tt := numberInputTester(&v, &n, NumberInputOptions{Label: "Level"}) + _ = tt.Click("Level") + v = 9 + tt.Frame() + tt.Command("selectAll") + tt.Command("copy") + if tt.Clipboard() != "9" { + t.Fatalf("focused field shows %q after the value became 9", tt.Clipboard()) + } + tt.Key(0, ui.KeyUp) + if v != 10 { + t.Fatalf("Up after external change gave %v", v) + } +} + +func TestNumberInputRangeOnPrecisionGrid(t *testing.T) { + v, n := 0.2, 0 + tt := numberInputTester(&v, &n, NumberInputOptions{Min: 0.11, Max: 0.29, Step: 0.1, Label: "Fine"}) + _ = tt.Click("Fine") + tt.Key(0, ui.KeyUp) + if v != 0.2 { + t.Fatalf("stepping up left the range: %v", v) + } + tt.Key(0, ui.KeyDown) + if v != 0.2 { + t.Fatalf("stepping down left the range: %v", v) + } +} + +func TestNumberInputDisabledWhileFocused(t *testing.T) { + v, n, off, focused := 5.0, 0, false, false + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + r := NumberInput(c, &v, NumberInputOptions{Label: "Live", Disabled: off}) + if r.Changed() { + n++ + } + focused = r.Input.Focused() + }, 400, 300) + _ = tt.Click("Live") + off = true + tt.Key(0, ui.KeyUp) + tt.Type("7") + tt.Frame() + if v != 5 || n != 0 || focused { + t.Fatalf("disabled while focused: value %v changes %d focused %v", v, n, focused) } } @@ -112,7 +185,7 @@ func TestNumberInputDisabled(t *testing.T) { } func TestNumberInputBadOptionsPanic(t *testing.T) { - for _, opts := range []NumberInputOptions{{Min: 3, Max: 1}, {StepperOnly: true}, {Step: -1}} { + for _, opts := range []NumberInputOptions{{Min: 3, Max: 1}, {StepperOnly: true}, {Step: -1}, {Min: 0.11, Max: 0.19, Precision: 1}} { func() { defer func() { if recover() == nil { diff --git a/password_input.go b/password_input.go index 25d07ca..4c025c1 100644 --- a/password_input.go +++ b/password_input.go @@ -36,14 +36,14 @@ func PasswordInput(c *ui.Context, value *string, opts PasswordInputOptions) Inpu mode = "shown" } ui.Row(c).Key(mode).Grow(1).Children(func() { - in = ui.TextInputBase(c, value).Grow(1).MinWidth(Density(c).Unit() * 10). + in = textInputEditor(c, frame, value, opts.Disabled, ui.TextInputBase).Grow(1).MinWidth(Density(c).Unit() * 10). Placeholder(opts.Placeholder).Label(opts.Label) if !*shown { in.Password() } }) - r.changed = in.Changed() - r.submitted = in.Submitted() + r.changed = in.Changed() && !opts.Disabled + r.submitted = in.Submitted() && !opts.Disabled if passwordInputToggle(c, *shown) { *shown = !*shown slog.Debug("mujica: password_input reveal", "shown", *shown) diff --git a/radio_group.go b/radio_group.go index df0b3d4..b0ac1a8 100644 --- a/radio_group.go +++ b/radio_group.go @@ -43,37 +43,44 @@ func RadioGroup[T comparable](c *ui.Context, value *T, items []RadioItem[T], opt k := Tokens(c) d := Density(c) var r InputResult - r.Element = ui.RadioGroup(c, func() { - for _, it := range items { - if radioGroupItem(c, k, d, value, it) { - r.changed = true - slog.Debug("mujica: radio_group choose", "label", it.Label) + // Disabled on a wrapper blocks the bases' clicks before they choose. + wrap := ui.Box(c).Shrink(0).Disabled(opts.Disabled) + wrap.Children(func() { + r.Element = ui.RadioGroup(c, func() { + for _, it := range items { + if radioGroupItem(c, k, d, value, it) { + r.changed = true + slog.Debug("mujica: radio_group choose", "label", it.Label) + } } - } - }).Label(opts.Label).Disabled(opts.Disabled).Gap(0) + }).Label(opts.Label).Gap(0) + }) if opts.Horizontal { r.Element.Row().Gap(d.Unit() * 6) } + if opts.Disabled && wrap.FocusWithin() { + wrap.FocusRing(false).Focus() + } return r } // radioGroupItem builds one radio and reports whether it was chosen. func radioGroupItem[T comparable](c *ui.Context, k theme.Tokens, d theme.Density, value *T, it RadioItem[T]) bool { - row := ui.RadioBase(c, value, it.Value).Gap(d.Unit() * 2).MinHeight(d.ControlHeight()).FocusRing(false).Disabled(it.Disabled) + // Keyed by value so focus follows the item, not its position. + var row *ui.Element + item := ui.Box(c).Key(it.Value).Disabled(it.Disabled) + item.Children(func() { + row = ui.RadioBase(c, value, it.Value).Gap(d.Unit() * 2).MinHeight(d.ControlHeight()).FocusRing(false) + }) + if it.Disabled && item.FocusWithin() { + item.FocusRing(false).Focus() + } on := *value == it.Value hover, pressed := row.Hovered(), row.Pressed() row.Children(func() { - dot := ui.Box(c).Size(checkboxSize, checkboxSize).Shrink(0).Radius(checkboxSize / 2) - switch { - case on: - dot.Background(k.Accent).Border(theme.BorderWidth, k.AccentText) - case pressed: - dot.Background(k.Selection).Border(theme.BorderWidth, k.AccentText) - case hover: - dot.Background(k.SurfaceHover).Border(theme.BorderWidth, k.AccentText) - default: - dot.Background(k.Surface).Border(theme.BorderWidth, k.ControlBorder) - } + bg, border := checkboxColors(k, on, hover, pressed) + dot := ui.Box(c).Size(checkboxSize, checkboxSize).Shrink(0).Radius(checkboxSize/2). + Background(bg).Border(theme.BorderWidth, border) dot.Transition(textInputFade) dot.DrawOver(func(p *ui.Painter, r ui.Rect) { if on { diff --git a/search_input.go b/search_input.go index 7a1af8f..176b042 100644 --- a/search_input.go +++ b/search_input.go @@ -60,7 +60,7 @@ func SearchInput(c *ui.Context, query *string, opts SearchInputOptions) SearchIn } var r SearchInputResult step := func(d int) { - if opts.Matches == 0 { + if opts.Matches == 0 || opts.Disabled { return } *opts.Current = (*opts.Current + d + opts.Matches) % opts.Matches @@ -83,8 +83,8 @@ func SearchInput(c *ui.Context, query *string, opts SearchInputOptions) SearchIn r.Element, r.Input = textInputFrame(c, look, func(frame *ui.Element) *ui.Element { ui.Icon(c, icons.Must("search")).Size(16, 16).Shrink(0).TextColor(k.TextMuted) back := ui.Local(frame, "back", func() bool { return false }) - in := ui.TextInputBase(c, query).Grow(1).MinWidth(Density(c).Unit() * 10).Placeholder(place).Label(name) - r.changed = in.Changed() + in := textInputEditor(c, frame, query, opts.Disabled, ui.TextInputBase).Grow(1).MinWidth(Density(c).Unit() * 10).Placeholder(place).Label(name) + r.changed = in.Changed() && !opts.Disabled if opts.Find { // Shift+Enter would reach the editor as a plain submit. in.HandleInput(func(ev ui.InputEvent) bool { @@ -102,9 +102,9 @@ func SearchInput(c *ui.Context, query *string, opts SearchInputOptions) SearchIn step(1) } } else { - r.submitted = in.Submitted() + r.submitted = in.Submitted() && !opts.Disabled } - if *query != "" && textInputClear(c, in) { + if *query != "" && !opts.Disabled && textInputClear(c, in) { *query = "" r.changed = true slog.Debug("mujica: search_input clear") @@ -127,7 +127,7 @@ func searchInputFindControls(c *ui.Context, query string, matches, current int, case matches > 0: status = fmt.Sprintf(msg(c, "search_input.count"), current+1, matches) } - ui.Text(c, status).TextColor(k.TextMuted).FontSize(theme.CaptionSize).FontFeatures("tnum"). + ui.Text(c, status).TextColor(k.TextMuted).FontSize(FontSize(c, theme.CaptionSize)).FontFeatures("tnum"). SingleLine().Shrink(0).Role(ui.RoleStatus) ui.Box(c).Width(theme.BorderWidth).Height(16).Background(k.Border).Shrink(0) opts := IconButtonOptions{Variant: Ghost, Disabled: matches == 0} diff --git a/testdata/snapshots/darwin/button-comfortable-dark.png b/testdata/snapshots/darwin/button-comfortable-dark.png index 6167924ba821c21f80d3cb5d2d9a9b33d650138a..afce442a4038da3cb842dcc7613e5ae749623c9f 100644 GIT binary patch delta 3106 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

PN+tHp2AD=Df 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 delta 4088 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 JIunlv{{j!7suutN diff --git a/testdata/snapshots/darwin/button-compact-dark.png b/testdata/snapshots/darwin/button-compact-dark.png index 73e1a88ed013849f898b767833825b09ccedbf32..e0868f369261fd49bde96f3c2ba348f544d6e6e4 100644 GIT binary patch literal 10243 zcmeHtWl$Z>w)Vyyb^-*~kl-35KyY`0!^Ryp?(PuWU4y&3I|PT|4#8pL?jPsWJ@0vc zp6|!4x>fhqS~b(v)3WBNUTdCSJt6Y4Vras*0z3i)v8C5ii!q>oEOra z>nva>a8`tck?Db?ZMg1BEKJRNL;5E>=jWVCbs{{7qW|+p=4Vh$!{N00Zc;kS3Ba#r!Wxt?KJvr;3PgF|pr%rAtTe;tQnyrrRCl=Ik zIQCD{N_aCao1T=jH_YSn>fCG-kC*~Fh-Jk5TbeE+v~wQR)7xW@^-Ji491Q}QPj2!I*Fu0#ucwaS3rfio|p>4QxrNaC#lRY zb7d4~7#q<>hy3(?wst#3=xzFmCTf zWo!FB>+PNyemFQ$%b0X{eeq|=-kbJLciI-@v=NnGi1G!U!#}uae#LgFhhzl(sT#lp zfO*q1M8NK!!vknt0Q^660#F98Y|RMx*Aj(r`Uq)I@g~^)VP*#WR~rEQ1}6O1yg>cp zfU;jfM*3BJsKo4D)hK(PQJTkTS=gutUg_N%NyAekE_cGh>w=q!` zA?nP;=FJC?KLnL)&b%Mt*G3S{E^$yekdx@Pq%pi@t}ez*Xzuk%flculUYCJ5m<=Ca zw(Cqx-9G7*VUL(mI_--Rk4ei6j0BF449kX`S4$`uo!{IK62H53IArPB6((PE4YZUB zzfEhtnOqSRS#bneeb!0!R$C$3?lZ7QQT}KV+WqQ$KQIgFPj4b{>U}v45W~^=-GiW$ z0Yv1bkT7!O zKOIW8rBcOGV30M~@>sjo3=9I*Yb-ywp3XKj-l~9SRZ9Irp^+$Cp@oZ)RsO{*Gtmx|5jf1=YI`-=6 zeejzNzIS()Xu`_H?mA+n=iyl)}-3<)e^HW)^o}!**k{XPEIl+s#!oO+(JM8v)=kNW4VxTAe&1;vuyM^ z84Se5=x?XBb@UTNJi(UNs*aT^_-tBhS2T#esC^J-vM#OSoI1<`ZjW6Nl;n?n#e8E(Hcf8x+@yv&9tP58q3V-JgY0u?R0bp zt~ixu^-C)#^8nzT;#Gz?J`A9g;^GAVN^+mB{FD4I0jW45e-Be9_U~zm+@U4kFnh2C zZTp9=7EDx(+Rg(N=s-@}85I{??ukhet+mn9DpwO(AE$}!kE^A+XPO!n7v|eh5IWz`7`lBSQ@iWR&1LUCIjfL?+aQ+d zX;xFptwZrGF~zGK`8mPNaQLQwB-fL2x_D-IZr5A8xoa~w@)H66bHohWyEQK$>}*{< z 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 Z+^i>Se1&J~?feBGAtEbWA*k#3{{S7d+}{8I literal 11338 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 Gi2ngsi%cZ| diff --git a/testdata/snapshots/darwin/button-compact-light.png b/testdata/snapshots/darwin/button-compact-light.png index 6eab1a07a8e246dc03c3e1f5d3610e074cf6eaad..8afc2baa0cf4af69efc573b3e31dac2d3bff98e1 100644 GIT binary patch literal 9964 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 SLpJ}hJF-%Wk`>}#1OEqM)OB3| diff --git a/testdata/snapshots/darwin/button-dark.png b/testdata/snapshots/darwin/button-dark.png index df1f5e4c49c85428038885829cfe0315ecb2f396..365330b6a076bb152658ecf0cb9efa3fc023b6ca 100644 GIT binary patch literal 10119 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 b4MYIm*T=EBNRz66ys99pB2z8(CFH*W0=Ufy literal 11165 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 a9moKou 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 Lkt&z?5b%Eh!6Qx{ literal 10867 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 DC!R#Y diff --git a/testdata/snapshots/darwin/icon_button-dark.png b/testdata/snapshots/darwin/icon_button-dark.png index ff1961b86f207444990a1c6eba6e81ab337d4f44..c4e2187d232211abd2b02d51cf4d87ca485f817f 100644 GIT binary patch literal 3477 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 diff --git a/testdata/snapshots/darwin/icon_button-light.png b/testdata/snapshots/darwin/icon_button-light.png index 6a4ca9bad08db334cd27e3b9d60c1bfa7fde53d6..79e03301551527face11f0d2f5395d2ebf96f081 100644 GIT binary patch delta 3048 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 Dx~Dn+ literal 4516 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 diff --git a/testdata/snapshots/darwin/spinner-light.png b/testdata/snapshots/darwin/spinner-light.png index be8951af7984538a0ee3b0a5e89189e164c4df48..aed49d0c2c1d4ed24ce50fa267f262f97ad97793 100644 GIT binary patch literal 3365 zcmeH~={FP(7sm%vMm3XB*$q-zGyQB$#zZ0pjeQ$3*|IZs*^2C9lv1*kC1d#^gptu; zFlvO7eb2s(t&pXe$L~4Mo991xUOeaAbMJj|?>YB-&wcT^iAES5@Cm^a0001t*3~ir z0N7lQawib`k-wmTx(xuFT19K!Fbm0E9S<`)voOKA;c|7@$&tt5A&>{e*KoqFc>@dg z!i^@?Ee~OI4lI!6OT#Isg%(JF=zF;Cn<~^d?XSSJ>8nyAkN9tQnBCIk} zz9N&qG;$yS5W8lmsl+q&=5e;8)u>NBlq+q!F6>RDGXkbBKjfGKAONX*Q+VW^rWD4J z-Q^r&3ySGYwTgRW`sgnk{+ig+K?tuP;+NEV0OY8AN>rFlnJfg-9)}RWM3&_-EN%)N zb+kPcar(O(ZjgHW%01bME#3~#9O0~H8z`6({*G^$< zl;-Ig&!C>97G258cbh$_-S?{1lg!Dp)T>aE#(U<1bYl7=5y~h;VRfCmA0MP;369~u z2qiv0Yoc`f>-+li&>7UpqO(8$@q(HR(%4OMpS|fVWp}@FDVe^;ouvJHBdz_@P?pT{{;P^UzY<#! zLe_!-{gb~s`2p#`-G5>}aGC_`aB{nLA5)^A8|ue)F`I3%trVdMFaLyLMBJ-GI^uUw+TCEdSJ3xZX{%!l3lbHW|&{vI8?&cD34 zq{gaTz0Eq)1|iT)&5diBE!+FGp--%yrM-Md#@~;Y5jTDwGTSHdsGie*%P*WWzci^d zt_)n3WEpYzf?%CduKZo_qoR_sN=bVE=a9F-Yo8bu%#R~RZU~#Ofg$HEtBf1^i{6gA zRT4Bkm=yFxtbbE)_mC`IR#sL9{wE+YzgX~Qir2S{j3+7w=YDcQqA#5LB!j(FYvaX+ zEQ(w)$jN!~GOs2jYYZdl&4HMYdUR@!IH;!d&CGbgsR-pe`<L zY*Ww6=bNABV(DDby0`Vc$OD}br^dW@;b2PP+c5R6g5Xy(nQ1vMZl?3m9eez=H&OD?8~A&agwf?n-fmy$$)@y2$f6XR$_nV-^_6xtf_v3PPG2$@Hr$## ziG_z*el?%ucoGFGR8~XWX&tQb1n$pW-D;-(_X3>GQn+5N#Delxyat0A!|mYI4Cl+p zfGO_l!dp59ouR^KFUyaZ%UDWw_H$`B>Pd%=oD~z144Y5ieY&NXzNPqjZ?=gWgFZen z$P$VZ+tR=4YSFbv_Mhw4sblUbNB^o^2kmY5`d0sNsnZL;Dz(|~f@;t#*r)VNTDqDk zF8iNrH)&^H-KA{q2ocsp#^(G4WWcmk*iSpkC28yQvHf+67$XmTk9!tH4kgizOtU+s zl=SQ(N9&;Qa5AOxwev7JT8(wnp?rSt#cM;|?1s9zH9qD5OGr}+ImoJfRftY9ZJVav z7a5qzB%xOQ5VjCn8^eAb$Dfs(*X`Zcn=m@ZEH9_RmTBg_GbAF6b5~$qhN&LzR4X2% zWrA*oR7B&Tukh=mX2vc8FmT1KW=M#r5hSGkUMd&TM9Bvk3h@ty`l z(9S>A)aSj7i`)zK)?G2rON3N*RK2?1j{|f9rl-&!Wq+}=#cGgO9E>qWZ1H}JxE2;Ds%^}K|Ke`3`#n{}nO^%z0qZq#xC}B!=x=UU)Yigb1uEbBbkg3cBHb_JIoh-fehb-!l$%}Q0Xhz1gF1^4l!}c zWU6f)ldkubClQ02@=3gF&HCII1&dd@(ZGC8+{}&DKL145g!soXm5?&X?~cu~(HDg` z=_r%?UbD9}l|`{Anr(@dnD4k!J`fPqk^BAq_vXG#ZOe}R<6WkgbnJ^;8}szcIyYDr zJw1;N`|#;kn3-L0>=*M95 z&Ue|*MW;LTHkYv1i(9sl8Y$NO533iG@Lwm{2n*J4G!pxHX7B(3jpJ!htb)UXV)iJF z*0cZM7pE`~>Iokc=~;sup<4(WZCuu3dhK`kf55M8%Ze$X>d+9tro-_M3HuW8u9ovj zGfoqf-gEktY_4cAG**1DqAPO%a3aBc{loBm2?(3 literal 4219 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 diff --git a/text_area.go b/text_area.go index e87274b..7dc8eac 100644 --- a/text_area.go +++ b/text_area.go @@ -55,7 +55,7 @@ func TextArea(c *ui.Context, value *string, opts TextAreaOptions) InputResult { var r InputResult look := &textInputLook{disabled: opts.Disabled, readOnly: opts.ReadOnly, err: errMsg, area: true} r.Element, r.Input = textInputFrame(c, look, func(frame *ui.Element) *ui.Element { - in := textInputEditor(c, frame, value, opts.ReadOnly, true).Grow(1).Padding(d.Unit()*2, d.Unit()*3). + in := textInputEditor(c, frame, value, opts.ReadOnly || opts.Disabled, ui.TextAreaBase).Grow(1).Padding(d.Unit()*2, d.Unit()*3). Placeholder(opts.Placeholder).Label(opts.Label) if opts.MinHeight > 0 { in.MinHeight(opts.MinHeight) @@ -63,8 +63,18 @@ func TextArea(c *ui.Context, value *string, opts TextAreaOptions) InputResult { if opts.MaxHeight > 0 { in.MaxHeight(opts.MaxHeight) } - r.changed = in.Changed() && !opts.ReadOnly - r.submitted = in.Shortcut(mods, key) + r.changed = in.Changed() && !opts.ReadOnly && !opts.Disabled + // Taken before the editor, which would make a plain Enter a newline. + submit := ui.Local(frame, "submit", func() bool { return false }) + in.HandleInput(func(ev ui.InputEvent) bool { + if ev.Kind == ui.InputKeyDown && ev.Key == key && ev.Mods == mods { + *submit = true + return true + } + return false + }) + r.submitted = *submit && !opts.Disabled + *submit = false return in }, count) return r @@ -82,7 +92,7 @@ func textAreaCount(c *ui.Context, n, max int) func() { if over { color = k.Danger } - ui.Text(c, fmt.Sprintf("%d / %d", n, max)).TextColor(color).FontSize(theme.CaptionSize). + ui.Text(c, fmt.Sprintf("%d / %d", n, max)).TextColor(color).FontSize(FontSize(c, theme.CaptionSize)). FontFeatures("tnum").Shrink(0).Label(fmt.Sprintf(msg(c, "text_area.count"), n, max)) } } diff --git a/text_input.go b/text_input.go index 07107cc..acacf0d 100644 --- a/text_input.go +++ b/text_input.go @@ -53,10 +53,10 @@ func TextInput(c *ui.Context, value *string, opts TextInputOptions) InputResult if opts.Leading != nil { opts.Leading() } - in := textInputEditor(c, frame, value, opts.ReadOnly, false).Grow(1).MinWidth(Density(c).Unit() * 10). + in := textInputEditor(c, frame, value, opts.ReadOnly || opts.Disabled, ui.TextInputBase).Grow(1).MinWidth(Density(c).Unit() * 10). Placeholder(opts.Placeholder).Label(opts.Label) - r.changed = in.Changed() && !opts.ReadOnly - r.submitted = in.Submitted() + r.changed = in.Changed() && !opts.ReadOnly && !opts.Disabled + r.submitted = in.Submitted() && !opts.Disabled if opts.Clearable && *value != "" && !opts.ReadOnly && !opts.Disabled { if textInputClear(c, in) { *value = "" @@ -95,6 +95,10 @@ func textInputFrame(c *ui.Context, look *textInputLook, build func(frame *ui.Ele } frame.Children(func() { in = build(frame) }) in.FocusRing(false) + if look.disabled && outer.FocusWithin() { + // A field disabled while focused gives the focus up. + outer.FocusRing(false).Focus() + } if look.err != "" { in.Error(look.err) } @@ -125,7 +129,7 @@ func textInputFrame(c *ui.Context, look *textInputLook, build func(frame *ui.Ele } ui.Row(c).Gap(d.Unit() * 2).AlignItems(ui.Start).Children(func() { if look.err != "" { - ui.Text(c, look.err).TextColor(k.Danger).FontSize(theme.CaptionSize).Grow(1) + ui.Text(c, look.err).TextColor(k.Danger).FontSize(FontSize(c, theme.CaptionSize)).Grow(1) } else { ui.Spacer(c) } @@ -137,16 +141,12 @@ func textInputFrame(c *ui.Context, look *textInputLook, build func(frame *ui.Ele return outer, in } -// textInputEditor builds the MyGo editor; read-only edits are undone. -func textInputEditor(c *ui.Context, frame *ui.Element, value *string, readOnly, area bool) *ui.Element { - base := ui.TextInputBase - if area { - base = ui.TextAreaBase - } - if !readOnly { +// textInputEditor builds the MyGo editor; a locked one edits a copy, undone at once. +func textInputEditor(c *ui.Context, frame *ui.Element, value *string, locked bool, base func(*ui.Context, *string) *ui.Element) *ui.Element { + if !locked { return base(c, value) } - shown := ui.Local(frame, "readonly", func() string { return *value }) + shown := ui.Local(frame, "locked", func() string { return *value }) *shown = *value in := base(c, shown) *shown = *value