From a1ae2e77c280eb539616dda40ff8088716ba4616 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:37:22 -0400 Subject: [PATCH 1/8] CI: enforce 500-line file limit --- .github/workflows/ci.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 93a881a..440a800 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -33,6 +33,11 @@ jobs: - name: Format if: runner.os == 'Linux' run: test -z "$(gofmt -l .)" || { gofmt -l .; exit 1; } + - name: File size limit + if: runner.os == 'Linux' + run: | + big=$(git ls-files '*.go' '*.html' | xargs wc -l | awk '$2!="total" && $1>500') + test -z "$big" || { echo "$big"; exit 1; } - name: Build and vet every platform if: runner.os == 'Linux' run: | From a7404c5930be6e8f071ccc6006502bc17c160680 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:37:56 -0400 Subject: [PATCH 2/8] Forms: review r1 fixes --- color_picker.go | 15 ++-- color_picker_test.go | 33 ++++++++ docs/components/041-form.md | 4 +- docs/components/042-form-field.md | 16 ++-- example_form_test.go | 4 +- examples/gallery/pages_form.go | 10 ++- file_drop_zone.go | 7 +- file_picker.go | 9 +- form.go | 49 ++++++----- form_field.go | 78 ++++++++++++++---- form_field_test.go | 53 +++++++++--- form_test.go | 70 +++++++++++++++- input_group.go | 3 +- messages_form.go | 1 + pin_input.go | 7 +- tags_input.go | 8 +- tags_input_test.go | 9 ++ .../snapshots/darwin/color_picker-dark.png | Bin 26924 -> 26892 bytes .../snapshots/darwin/color_picker-light.png | Bin 26953 -> 26868 bytes testdata/snapshots/darwin/form-dark.png | Bin 17134 -> 17144 bytes testdata/snapshots/darwin/form-light.png | Bin 17089 -> 17110 bytes testdata/snapshots/darwin/form_field-dark.png | Bin 12502 -> 12026 bytes .../snapshots/darwin/form_field-light.png | Bin 11877 -> 11461 bytes testdata/snapshots/darwin/tags_input-dark.png | Bin 10757 -> 10783 bytes .../snapshots/darwin/tags_input-light.png | Bin 10519 -> 10545 bytes transfer.go | 14 +++- transfer_test.go | 12 +++ 27 files changed, 305 insertions(+), 97 deletions(-) diff --git a/color_picker.go b/color_picker.go index a4f6724..de993b6 100644 --- a/color_picker.go +++ b/color_picker.go @@ -51,8 +51,7 @@ type colorPickerState struct { bad string } -// ColorPicker is a swatch button opening a panel to pick *color: a saturation and -// brightness square, hue and opacity sliders, HEX, RGB and opacity fields, and presets. +// ColorPicker is a swatch button opening a panel that picks *color. func ColorPicker(c *ui.Context, color *ui.Color, opts ColorPickerOptions) ColorPickerParts { k := Tokens(c) d := Density(c) @@ -92,7 +91,9 @@ func ColorPicker(c *ui.Context, color *ui.Color, opts ColorPickerOptions) ColorP st.sync(*color) } } - if trigger.Clicked() { + if opts.Disabled { + st.open = false + } else if trigger.Clicked() { st.open = !st.open } border := k.ControlBorder @@ -139,7 +140,7 @@ func ColorPicker(c *ui.Context, color *ui.Color, opts ColorPickerOptions) ColorP ui.Grid(c).ColumnTracks(ui.Fr(1), ui.Fr(1), ui.Fr(1), ui.Fr(1), ui.Fr(1), ui.Fr(1)).Gap(d.Unit() * 1.5).Children(func() { for _, sw := range presets { hex := strings.ToUpper(colorPickerHex(sw)) - b := ui.ButtonBase(c).Height(d.Unit()*6).Radius(theme.ControlRadius).Border(theme.BorderWidth, k.Border).Label(hex).Clip() + b := ui.ButtonBase(c).Height(theme.MinHitSize).Radius(theme.ControlRadius).Border(theme.BorderWidth, k.Border).Label(hex).Clip() internal.Ring(b, k.Focus, theme.ControlRadius) chosen := *color == sw b.Selected(chosen).Draw(func(p *ui.Painter, r ui.Rect) { @@ -159,7 +160,7 @@ func ColorPicker(c *ui.Context, color *ui.Color, opts ColorPickerOptions) ColorP } }) }) - if st.wasOpen && !st.open { + if st.wasOpen && !st.open && !opts.Disabled { trigger.Focus() } st.wasOpen = st.open @@ -269,7 +270,7 @@ func colorPickerFields(c *ui.Context, st *colorPickerState, color *ui.Color, set }{{"R", msg(c, "color_picker.red"), &st.r}, {"G", msg(c, "color_picker.green"), &st.g}, {"B", msg(c, "color_picker.blue"), &st.b}, {"A %", msg(c, "color_picker.percent"), &st.alpha}} { ui.Column(c).Gap(d.Unit()).Children(func() { - ui.Text(c, f.name).FontSize(theme.CaptionSize).TextColor(k.TextMuted) + ui.Text(c, f.name).FontSize(FontSize(c, theme.CaptionSize)).TextColor(k.TextMuted) in := InputGroup(c, f.text, InputGroupOptions{Label: f.label, Invalid: st.bad == f.name}) editing = editing || in.Input.Focused() if !in.Changed() { @@ -296,7 +297,7 @@ func colorPickerFields(c *ui.Context, st *colorPickerState, color *ui.Color, set st.sync(*color) } if st.bad != "" { - ui.Text(c, msg(c, "color_picker.invalid")).FontSize(theme.CaptionSize).TextColor(k.Danger).Role(ui.RoleStatus) + ui.Text(c, msg(c, "color_picker.invalid")).FontSize(FontSize(c, theme.CaptionSize)).TextColor(k.Danger).Role(ui.RoleStatus) } }) } diff --git a/color_picker_test.go b/color_picker_test.go index b5dc1a5..1b5e3d0 100644 --- a/color_picker_test.go +++ b/color_picker_test.go @@ -124,3 +124,36 @@ func TestColorPickerSnapshot(t *testing.T) { }) }) } + +// Disabling an open picker closes it before keys can change the color. +func TestColorPickerDisabledWhileOpen(t *testing.T) { + col, n := ui.Hex("#808080"), 0 + opts := ColorPickerOptions{Label: "Shade"} + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + if ColorPicker(c, &col, opts).Changed() { + n++ + } + }, 400, 560) + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyEnter) + if !tt.Focused("Saturation and brightness") { + t.Fatal("not open") + } + opts.Disabled = true + tt.Key(0, ui.KeyUp) + tt.Key(0, ui.KeyRight) + if col != ui.Hex("#808080") || n != 0 || tt.HasText("HEX") { + t.Fatalf("disabled picker changed to %v", col) + } +} + +func TestColorPickerSwatchHitArea(t *testing.T) { + col, n := ui.Hex("#7D2034"), 0 + tt := colorPickerTester(&col, ColorPickerOptions{Label: "Accent"}, &n) + _ = tt.Click("Accent") + r, ok := tt.Find("#355E80") + if !ok || r.W < 28 || r.H < 28 { + t.Fatalf("swatch %v", r) + } +} diff --git a/docs/components/041-form.md b/docs/components/041-form.md index fa36aa6..f2efe30 100644 --- a/docs/components/041-form.md +++ b/docs/components/041-form.md @@ -29,7 +29,7 @@ ui.Render(view, 400, 300, 1) | 字段 | 类型 | 默认值 | 含义 | | --- | --- | --- | --- | -| `FormOptions.Horizontal` | `bool` | false | 标签放在控件左侧一列,右对齐(MyGo `ui.Form` 布局)。 | +| `FormOptions.Horizontal` | `bool` | false | 标签放在控件左侧一列,右对齐。 | | `FormOptions.SubmitLabel` | `string` | 内置“Submit/提交” | 提交按钮文字。 | | `FormOptions.ResetLabel` | `string` | 内置“Reset/重置” | 重置按钮文字。 | | `FormItemOptions[T].Label` | `string` | 必填 | 字段标签;空值 panic。 | @@ -56,4 +56,4 @@ Tab / Shift+Tab 在字段间移动,离开字段即校验。提交失败后焦 - 控件由调用方构建,`FormItem` 的 control 回调必须返回可获取焦点的元素,用于错误定位。 - 校验在失焦与提交时触发;已触碰字段在值变化时重新同步校验,异步校验只在下一次失焦或提交时重跑。 - 异步结果以版本号对齐:值变化后旧版本的 `Resolve` 返回 false 并被丢弃。`FormState` 的方法只能在界面线程调用,后台任务需经 `Window.Update` 回到界面线程。 -- 必填标记以“ *”附在标签文字后,屏幕阅读器会一起读出;MyGo 的 Field 标签不支持富文本,无法单独着色。 +- 必填标记“*”只作视觉显示,辅助技术通过说明“必填”获知。 diff --git a/docs/components/042-form-field.md b/docs/components/042-form-field.md index 9e3f6e0..eaca697 100644 --- a/docs/components/042-form-field.md +++ b/docs/components/042-form-field.md @@ -4,7 +4,7 @@ ## 用途 -为单个控件提供标签、必填标记、说明与错误文字。标签通过 MyGo `ui.Field` 关联控件:屏幕阅读器以标签命名控件,并读出说明与错误;点击标签聚焦控件。 +为单个控件提供标签、必填标记、说明与错误文字。标签、说明与错误显式关联到 control 返回的元素:屏幕阅读器以标签命名该元素并读出说明、必填与错误;点击标签聚焦该元素。 ## 最小示例 @@ -12,8 +12,8 @@ email := "" view := func(c *ui.Context) { mujica.Use(c, mujica.Settings{}) - mujica.FormField(c, "Email", mujica.FormFieldOptions{Required: true, Description: "For receipts."}, func() { - mujica.InputGroup(c, &email, mujica.InputGroupOptions{}) + mujica.FormField(c, "Email", mujica.FormFieldOptions{Required: true, Description: "For receipts."}, func() *ui.Element { + return mujica.InputGroup(c, &email, mujica.InputGroupOptions{}).Input }) } ui.Render(view, 400, 300, 1) @@ -24,11 +24,11 @@ ui.Render(view, 400, 300, 1) | 字段 | 类型 | 默认值 | 含义 | | --- | --- | --- | --- | | `label` | `string` | 必填 | 标签文字;空值 panic。 | -| `FormFieldOptions.Required` | `bool` | false | 在标签后加“ *”。 | +| `FormFieldOptions.Required` | `bool` | false | 在标签后显示危险色“*”,并向辅助技术说明“必填”。 | | `FormFieldOptions.Description` | `string` | "" | 控件下方的说明。 | | `FormFieldOptions.Error` | `string` | "" | 控件下方的错误,并把控件标记为无效。 | | `FormFieldOptions.Horizontal` | `bool` | false | 标签在左、控件在右。 | -| `control` | `func()` | 必填 | 构建控件;其中第一个可获取焦点的元素即被关联的控件。 | +| `control` | `func() *ui.Element` | 必填 | 构建控件并返回要关联的可聚焦元素(如 `InputGroupParts.Input`);返回 nil 时 panic。 | ## 状态 @@ -44,6 +44,6 @@ Tab 直接到达控件;点击标签聚焦控件,或切换复选框、开关 ## 限制 -- 标签、说明与错误文字由 MyGo `ui.Field` 绘制,使用主题颜色(文字、TextMuted、Danger);字号与间距跟随 MyGo。 -- 错误只把边框染红的效果对 MyGo 自带输入框生效;MujicaUI 的 InputGroup 等需同时传入 `Invalid: true`。 -- 左右布局时多个字段需放在同一个 `ui.Form` 或 MujicaUI `Form(Horizontal)` 中才能对齐标签宽度;单独使用时只按自身标签宽度排列。 +- control 返回的元素的 Label 会被字段标签覆盖。 +- Error 只把元素标记为无效;InputGroup 等的红色边框需同时传入 `Invalid: true`。 +- 左右布局时多个字段需放在 MujicaUI `Form(Horizontal)` 中才能对齐标签宽度;单独使用时只按自身标签宽度排列。 diff --git a/example_form_test.go b/example_form_test.go index 0873135..e580dcf 100644 --- a/example_form_test.go +++ b/example_form_test.go @@ -30,8 +30,8 @@ func ExampleFormField() { email := "" view := func(c *ui.Context) { mujica.Use(c, mujica.Settings{}) - mujica.FormField(c, "Email", mujica.FormFieldOptions{Required: true, Description: "For receipts."}, func() { - mujica.InputGroup(c, &email, mujica.InputGroupOptions{}) + mujica.FormField(c, "Email", mujica.FormFieldOptions{Required: true, Description: "For receipts."}, func() *ui.Element { + return mujica.InputGroup(c, &email, mujica.InputGroupOptions{}).Input }) } ui.Render(view, 400, 300, 1) diff --git a/examples/gallery/pages_form.go b/examples/gallery/pages_form.go index fbab963..9adba88 100644 --- a/examples/gallery/pages_form.go +++ b/examples/gallery/pages_form.go @@ -177,10 +177,12 @@ var formPages = []page{ e = "This name is already in the guest list." } mujica.FormField(c, "Guest name", mujica.FormFieldOptions{Required: d.required, Horizontal: d.horizontal, - Description: "As written on the invitation.", Error: e}, func() { - if mujica.InputGroup(c, &d.value, mujica.InputGroupOptions{Invalid: d.withError}).Changed() { + Description: "As written on the invitation.", Error: e}, func() *ui.Element { + g := mujica.InputGroup(c, &d.value, mujica.InputGroupOptions{Invalid: d.withError}) + if g.Changed() { log(fmt.Sprintf("value %q", d.value)) } + return g.Input }) }}, {ID: "043", Name: "InputGroup", ZhName: "输入组合", Category: "Forms", Code: formCode["InputGroup"], @@ -346,8 +348,8 @@ ui.Render(view, 400, 300, 1)`, "FormField": `email := "" view := func(c *ui.Context) { mujica.Use(c, mujica.Settings{}) - mujica.FormField(c, "Email", mujica.FormFieldOptions{Required: true, Description: "For receipts."}, func() { - mujica.InputGroup(c, &email, mujica.InputGroupOptions{}) + mujica.FormField(c, "Email", mujica.FormFieldOptions{Required: true, Description: "For receipts."}, func() *ui.Element { + return mujica.InputGroup(c, &email, mujica.InputGroupOptions{}).Input }) } ui.Render(view, 400, 300, 1)`, diff --git a/file_drop_zone.go b/file_drop_zone.go index 8b1a588..1f0a979 100644 --- a/file_drop_zone.go +++ b/file_drop_zone.go @@ -65,8 +65,7 @@ type fileDropZoneState struct { rejected []fileDropZoneReject } -// FileDropZone takes files dropped from the system or chosen with its Browse button, -// checks type, count and size, and lists them in *files. It never reads or uploads them. +// FileDropZone checks dropped or browsed files and lists them; it never reads or uploads them. func FileDropZone(c *ui.Context, files *[]DroppedFile, opts FileDropZoneOptions) FileDropZoneParts { if opts.MaxFiles < 0 || opts.MaxSize < 0 { panic("mujica: FileDropZone limits must not be negative") @@ -172,7 +171,7 @@ func FileDropZone(c *ui.Context, files *[]DroppedFile, opts FileDropZoneOptions) zone.Children(func() { ui.Icon(c, icons.Must("upload")).Size(24, 24).TextColor(k.AccentText) ui.Text(c, hint).TextAlign(ui.Center) - ui.Text(c, fileDropZoneRules(c, opts)).TextColor(k.TextMuted).FontSize(theme.CaptionSize).TextAlign(ui.Center) + ui.Text(c, fileDropZoneRules(c, opts)).TextColor(k.TextMuted).FontSize(FontSize(c, theme.CaptionSize)).TextAlign(ui.Center) b := Button(c, msg(c, "file_drop_zone.browse"), ButtonOptions{Variant: Outline, Loading: st.browse != nil, Disabled: opts.Disabled}) if b.Clicked() { ch := make(chan filePickerResult, 1) @@ -221,7 +220,7 @@ func fileDropZoneList(c *ui.Context, st *fileDropZoneState, files *[]DroppedFile BorderWidth(0, 0, theme.BorderWidth, 0).BorderColor(k.Border).Children(func() { ui.Icon(c, icons.Must(icon)).Size(16, 16).TextColor(color) ui.Text(c, name).SingleLine().Ellipsis("…").MinWidth(0).Shrink(1) - ui.Text(c, detail).TextColor(color).FontSize(theme.CaptionSize).SingleLine().Grow(1) + ui.Text(c, detail).TextColor(color).FontSize(FontSize(c, theme.CaptionSize)).SingleLine().Grow(1) if remove != nil { x := ui.ButtonBase(c).Size(28, 28).Radius(theme.ControlRadius).TextColor(k.TextMuted). Label(fmt.Sprintf(msg(c, "file_drop_zone.remove"), name)).Disabled(disabled) diff --git a/file_picker.go b/file_picker.go index 44942e8..ffd2b91 100644 --- a/file_picker.go +++ b/file_picker.go @@ -55,8 +55,7 @@ type filePickerState struct { err string } -// FilePicker opens the system file or folder dialog and stores the chosen paths in *paths. -// The dialog runs off the UI thread; the button shows loading until it closes. +// FilePicker opens the system file dialog off the UI thread and stores the chosen paths. func FilePicker(c *ui.Context, paths *[]string, opts FilePickerOptions) FilePickerParts { for _, f := range opts.Filters { for _, ext := range f.Extensions { @@ -118,16 +117,16 @@ func FilePicker(c *ui.Context, paths *[]string, opts FilePickerOptions) FilePick } switch { case st.err != "": - ui.Text(c, st.err).TextColor(k.Danger).FontSize(theme.CaptionSize).Role(ui.RoleStatus) + ui.Text(c, st.err).TextColor(k.Danger).FontSize(FontSize(c, theme.CaptionSize)).Role(ui.RoleStatus) case len(*paths) == 0: - ui.Text(c, msg(c, "file_picker.none")).TextColor(k.TextMuted).FontSize(theme.CaptionSize) + ui.Text(c, msg(c, "file_picker.none")).TextColor(k.TextMuted).FontSize(FontSize(c, theme.CaptionSize)) default: ui.Column(c).Gap(d.Unit()).Children(func() { for _, p := range *paths { ui.Row(c).Key(p).Gap(d.Unit() * 2).AlignItems(ui.Center).Children(func() { ui.Icon(c, icon).Size(14, 14).TextColor(k.TextMuted) ui.Text(c, filepath.Base(p)).SingleLine() - ui.Text(c, filepath.Dir(p)).TextColor(k.TextMuted).FontSize(theme.CaptionSize).SingleLine().Ellipsis("…").MinWidth(0).Shrink(1) + ui.Text(c, filepath.Dir(p)).TextColor(k.TextMuted).FontSize(FontSize(c, theme.CaptionSize)).SingleLine().Ellipsis("…").MinWidth(0).Shrink(1) }) } }) diff --git a/form.go b/form.go index 278e916..bb89323 100644 --- a/form.go +++ b/form.go @@ -9,8 +9,7 @@ import ( "github.com/egoist/mygo/ui" ) -// FormState is a form's validation and submit state; keep it beside the form's values. -// Its methods run on the UI thread: deliver async results through Window.Update. +// FormState is a form's check and submit state; use it on the UI thread only. type FormState struct { fields map[string]*formFieldState order []string @@ -22,6 +21,7 @@ type FormState struct { requested bool focus string formError string + generation int } type formFieldState struct { @@ -33,6 +33,7 @@ type formFieldState struct { asyncFor uint64 asyncErr string pending bool + hasAsync bool check func() string startAsync func() } @@ -45,8 +46,7 @@ func (s *FormState) Version(name string) uint64 { return 0 } -// Resolve delivers the async check of name's value at version; "" means valid. -// It reports false and drops the result when the value has changed since. +// Resolve delivers name's async result for version, "" if valid; stale versions return false. func (s *FormState) Resolve(name string, version uint64, err string) bool { f := s.fields[name] if f == nil || f.version != version { @@ -98,8 +98,9 @@ type FormOptions struct { // FormScope registers a Form's fields with FormItem. type FormScope struct { - c *ui.Context - st *FormState + c *ui.Context + st *FormState + horizontal bool } // FormParts are the parts of a Form. @@ -127,8 +128,7 @@ type FormItemOptions[T any] struct { Async func(v T, version uint64) } -// Form lays out the fields that fields registers, validates them on blur and submit, -// and shows submit and reset buttons. It never stores or sends the values itself. +// Form lays out and checks its fields and shows submit and reset buttons. func Form(c *ui.Context, st *FormState, opts FormOptions, fields func(f *FormScope)) FormParts { if st.fields == nil { st.fields = map[string]*formFieldState{} @@ -139,13 +139,16 @@ func Form(c *ui.Context, st *FormState, opts FormOptions, fields func(f *FormSco parts := FormParts{} col := ui.Column(c).Gap(d.Unit() * 5) parts.Element = col - scope := &FormScope{c: c, st: st} + scope := &FormScope{c: c, st: st, horizontal: opts.Horizontal} col.Children(func() { - if opts.Horizontal { - ui.Form(c, func() { fields(scope) }) - } else { - ui.Column(c).Gap(d.Unit() * 4).Children(func() { fields(scope) }) - } + // A new key after Reset drops the controls' drafts and errors. + ui.Box(c).Key(st.generation).Children(func() { + if opts.Horizontal { + formFieldGrid(c, func() { fields(scope) }) + } else { + ui.Column(c).Gap(d.Unit() * 4).Children(func() { fields(scope) }) + } + }) if st.formError != "" { ui.Text(c, st.formError).TextColor(k.Danger).Role(ui.RoleStatus) } @@ -198,7 +201,12 @@ func formSettle(c *ui.Context, st *FormState) bool { if st.Error(name) != "" && first == "" { first = name } - pending = pending || st.fields[name].pending + f := st.fields[name] + // A value edited since its check owes a new one. + if f.hasAsync && f.err == "" && f.asyncFor != f.version { + f.startAsync() + pending = true + } } switch { case first != "": @@ -221,12 +229,12 @@ func formReset(st *FormState) { r() } st.fields = map[string]*formFieldState{} + st.generation++ st.tried, st.awaiting, st.requested, st.focus, st.formError = false, false, false, "", "" slog.Debug("mujica: form reset") } -// FormItem registers field name, labels the control that control returns, and shows its error. -// control must return the element to focus when the field has the first error. +// FormItem registers field name around the focusable element control returns. func FormItem[T any](f *FormScope, name string, value *T, opts FormItemOptions[T], control func() *ui.Element) *ui.Element { c, st := f.c, f.st if name == "" || opts.Label == "" { @@ -243,6 +251,7 @@ func FormItem[T any](f *FormScope, name string, value *T, opts FormItemOptions[T fs = &formFieldState{snapshot: snap, version: st.seq} st.fields[name] = fs } + fs.hasAsync = opts.Async != nil fs.check = func() string { if opts.Required && formEmpty(*value) { return msg(c, "form.required") @@ -273,12 +282,10 @@ func FormItem[T any](f *FormScope, name string, value *T, opts FormItemOptions[T desc = msg(c, "form.checking") } var ctrl *ui.Element - field := formFieldBuild(c, opts.Label, FormFieldOptions{Required: opts.Required, Description: desc, Error: st.Error(name)}, func() { + field := formFieldBuild(c, opts.Label, FormFieldOptions{Required: opts.Required, Description: desc, Error: st.Error(name)}, f.horizontal, func() *ui.Element { ctrl = control() + return ctrl }) - if ctrl == nil { - panic("mujica: FormItem " + name + ": control returned nil") - } focused := ctrl.FocusWithin() if fs.focused && !focused { fs.touched = true diff --git a/form_field.go b/form_field.go index 517840f..47f9e8c 100644 --- a/form_field.go +++ b/form_field.go @@ -2,6 +2,8 @@ package mujica import ( "github.com/egoist/mygo/ui" + + "mujicaui/theme" ) // FormFieldOptions configure a FormField. @@ -15,24 +17,70 @@ type FormFieldOptions struct { Horizontal bool } -// FormField labels the control that control builds and adds help and error text. -// The label names the control and a click on it focuses the control. -func FormField(c *ui.Context, label string, opts FormFieldOptions, control func()) *ui.Element { +// FormField labels the element control returns and shows help and error text for it. +func FormField(c *ui.Context, label string, opts FormFieldOptions, control func() *ui.Element) *ui.Element { + if !opts.Horizontal { + return formFieldBuild(c, label, opts, false, control) + } + var f *ui.Element + formFieldGrid(c, func() { f = formFieldBuild(c, label, opts, true, control) }) + return f +} + +// formFieldGrid holds fields whose labels sit in a column beside their controls. +func formFieldGrid(c *ui.Context, fields func()) *ui.Element { + d := Density(c) + return ui.Grid(c).ColumnTracks(ui.FitContent(), ui.Fr(1)).GapX(d.Unit() * 3).GapY(d.Unit() * 4). + AlignItems(ui.Start).Children(fields) +} + +// formFieldBuild builds the label and the control column; beside makes them two grid cells. +func formFieldBuild(c *ui.Context, label string, opts FormFieldOptions, beside bool, control func() *ui.Element) *ui.Element { if label == "" { panic("mujica: FormField needs a label") } - if opts.Horizontal { - var f *ui.Element - ui.Form(c, func() { f = formFieldBuild(c, label, opts, control) }) - return f + k := Tokens(c) + d := Density(c) + var head, content, ctrl *ui.Element + body := func() { + head = ui.Row(c).Gap(d.Unit()).AlignItems(ui.Center) + if beside { + head.MinHeight(d.ControlHeight()).Justify(ui.End) + } + var text *ui.Element + head.Children(func() { + text = ui.Text(c, label).FontWeight(500).SingleLine() + if opts.Required { + ui.Text(c, "*").TextColor(k.Danger).Role(ui.RoleNone) + } + }) + clicked := head.Clicked() + content = ui.Column(c).Gap(d.Unit() * 1.5).MinWidth(0) + content.Children(func() { + ctrl = control() + if ctrl == nil { + panic("mujica: FormField " + label + ": control returned nil") + } + if opts.Description != "" { + ui.Text(c, opts.Description).TextColor(k.TextMuted).FontSize(FontSize(c, theme.CaptionSize)).Role(ui.RoleNone) + } + if opts.Error != "" { + ui.Text(c, opts.Error).TextColor(k.Danger).FontSize(FontSize(c, theme.CaptionSize)).Role(ui.RoleNone) + } + }) + ctrl.Label(label).Description(opts.Description).Error(opts.Error) + if opts.Required { + ctrl.Description(msg(c, "form.required")) + } + if ctrl.IsDisabled() { + text.TextColor(k.TextMuted) + } else if clicked { + ctrl.Focus() + } } - return formFieldBuild(c, label, opts, control) -} - -// formFieldBuild builds the field in the layout the caller set up. -func formFieldBuild(c *ui.Context, label string, opts FormFieldOptions, control func()) *ui.Element { - if opts.Required { - label += " *" + if beside { + body() + return content } - return ui.Field(c, label, control).Description(opts.Description).Error(opts.Error) + return ui.Column(c).Gap(d.Unit() * 1.5).Children(body) } diff --git a/form_field_test.go b/form_field_test.go index c6ca7f6..80e61d3 100644 --- a/form_field_test.go +++ b/form_field_test.go @@ -1,6 +1,7 @@ package mujica import ( + "slices" "testing" "github.com/egoist/mygo/ui" @@ -10,29 +11,59 @@ func TestFormFieldLabelFocusesControl(t *testing.T) { name := "" tt := ui.NewTester(func(c *ui.Context) { Use(c, Settings{}) - FormField(c, "Name", FormFieldOptions{Required: true, Description: "As on your seal."}, func() { - InputGroup(c, &name, InputGroupOptions{}) + FormField(c, "Name", FormFieldOptions{Required: true, Description: "As on your seal."}, func() *ui.Element { + return InputGroup(c, &name, InputGroupOptions{}).Input }) }, 400, 200) - if err := tt.Click("Name *"); err != nil { + if err := tt.Click("Name"); err != nil { t.Fatal(err) } tt.Type("Sakiko") if name != "Sakiko" { t.Fatalf("label click did not focus the control: %q", name) } - if !tt.Focused("Name *") || !tt.HasText("As on your seal.") { + if !tt.Focused("Name") || !tt.HasText("As on your seal.") || !tt.HasText("*") { t.Fatalf("texts %q", tt.Texts()) } } +// The label goes to the returned input, not the first focusable element before it. +func TestFormFieldTargetsReturnedControl(t *testing.T) { + tags, site := []string{"rose"}, "" + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Gap(12).Children(func() { + FormField(c, "Flowers", FormFieldOptions{Error: "Too few."}, func() *ui.Element { + return TagsInput(c, &tags, TagsInputOptions{}).Input + }) + FormField(c, "Site", FormFieldOptions{}, func() *ui.Element { + return InputGroup(c, &site, InputGroupOptions{Buttons: []InputGroupButton{{Label: "Back", Leading: true}}}).Input + }) + }) + }, 500, 300) + _ = tt.Click("Flowers") + tt.Type("ivy") + tt.Key(0, ui.KeyEnter) + if !slices.Equal(tags, []string{"rose", "ivy"}) || !tt.Focused("Flowers") { + t.Fatalf("tags %q", tags) + } + if _, ok := tt.Find("Remove rose"); !ok { + t.Fatal("remove button lost its own name") + } + _ = tt.Click("Site") + tt.Type("court") + if site != "court" || tt.Focused("Back") { + t.Fatalf("site %q", site) + } +} + func TestFormFieldErrorAndLayout(t *testing.T) { v := "" horizontal := false tt := ui.NewTester(func(c *ui.Context) { Use(c, Settings{}) - FormField(c, "Email", FormFieldOptions{Error: "Enter an email address.", Horizontal: horizontal}, func() { - InputGroup(c, &v, InputGroupOptions{Prefix: "mailto:"}) + FormField(c, "Email", FormFieldOptions{Error: "Enter an email address.", Horizontal: horizontal}, func() *ui.Element { + return InputGroup(c, &v, InputGroupOptions{Prefix: "mailto:"}).Input }) }, 500, 200) if !tt.HasText("Enter an email address.") { @@ -60,7 +91,7 @@ func TestFormFieldNeedsLabel(t *testing.T) { }() ui.Render(func(c *ui.Context) { Use(c, Settings{}) - FormField(c, "", FormFieldOptions{}, func() {}) + FormField(c, "", FormFieldOptions{}, func() *ui.Element { return ui.Box(c) }) }, 100, 100, 1) } @@ -68,11 +99,11 @@ func TestFormFieldSnapshot(t *testing.T) { a, b := "Sakiko Togawa", "uika@" snapshot(t, "form_field", 520, 260, func(c *ui.Context) { ui.Column(c).Padding(20).Gap(16).Children(func() { - FormField(c, "Name", FormFieldOptions{Required: true, Description: "As written on the invitation."}, func() { - InputGroup(c, &a, InputGroupOptions{}) + FormField(c, "Name", FormFieldOptions{Required: true, Description: "As written on the invitation."}, func() *ui.Element { + return InputGroup(c, &a, InputGroupOptions{}).Input }) - FormField(c, "Email", FormFieldOptions{Horizontal: true, Error: "Enter a full email address."}, func() { - InputGroup(c, &b, InputGroupOptions{Invalid: true}) + FormField(c, "Email", FormFieldOptions{Horizontal: true, Error: "Enter a full email address."}, func() *ui.Element { + return InputGroup(c, &b, InputGroupOptions{Invalid: true}).Input }) }) }) diff --git a/form_test.go b/form_test.go index 2d00634..afe5ddc 100644 --- a/form_test.go +++ b/form_test.go @@ -86,7 +86,7 @@ func TestFormSubmitFailureFocusesFirstErrorAndKeepsValues(t *testing.T) { if p.submits != 0 || !tt.HasText("Required") || !tt.HasText("Enter an email address.") { t.Fatalf("submits %d texts %q", p.submits, tt.Texts()) } - if !tt.Focused("Name *") || p.email != "bad" { + if !tt.Focused("Name") || p.email != "bad" { t.Fatal("first error not focused or value lost") } if got := tt.Announcements(); len(got) == 0 || got[len(got)-1] != "Some fields need attention" { @@ -181,10 +181,72 @@ func TestFormResetRestoresInitialValues(t *testing.T) { func TestFormHorizontalLayout(t *testing.T) { p := &formProbe{horizontal: true} tt := ui.NewTester(p.run, 600, 500) - name, _ := tt.Find("Name *") + star, _ := tt.Find("*") email, _ := tt.Find("Email") - if name.X+name.W != email.X+email.W { - t.Fatalf("labels not right-aligned: %v %v", name, email) + input, _ := tt.Find("Name") + if star.X+star.W != email.X+email.W || input.X >= email.X { + t.Fatalf("labels not right-aligned: %v %v", star, email) + } +} + +// An edit during a pending check must be checked again before the submit goes out. +func TestFormEditWhilePendingRechecks(t *testing.T) { + p := &formProbe{name: "Uika", tags: []string{"x"}, email: "a@b", useAsync: true} + tt := ui.NewTester(p.run, 600, 500) + _ = tt.Click("Submit") + if len(p.asyncCalls) != 1 { + t.Fatalf("calls %v", p.asyncCalls) + } + _ = tt.Click("Email") + tt.Key(ui.Cmd, ui.KeyA) + tt.Type("taken@b") + tt.Frame() + if p.submits != 0 || len(p.asyncCalls) != 2 || p.asyncValues[1] != "taken@b" { + t.Fatalf("submits %d values %q", p.submits, p.asyncValues) + } + if p.st.Resolve("email", p.asyncCalls[0], "") { + t.Fatal("stale result accepted") + } + p.st.Resolve("email", p.asyncCalls[1], "Taken") + tt.Frame() + tt.Frame() + if p.submits != 0 || !tt.HasText("Taken") { + t.Fatalf("submitted unchecked value: %d", p.submits) + } +} + +// Reset also drops drafts and errors kept inside the controls. +func TestFormResetClearsControlState(t *testing.T) { + var st FormState + tags, seen := []string{}, "" + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + Form(c, &st, FormOptions{}, func(f *FormScope) { + FormItem(f, "tags", &tags, FormItemOptions[[]string]{Label: "Tags"}, func() *ui.Element { + return TagsInput(c, &tags, TagsInputOptions{Validate: func(s string) string { + seen = s + return "Invalid tag" + }}).Input + }) + }) + }, 600, 400) + _ = tt.Click("Tags") + tt.Type("bad tag") + tt.Key(0, ui.KeyEnter) + if !tt.HasText("Invalid tag") { + t.Fatal("no tag error") + } + _ = tt.Click("Reset") + tt.Frame() + if tt.HasText("Invalid tag") { + t.Fatal("tag error survived reset") + } + seen = "" + _ = tt.Click("Tags") + tt.Type("x") + tt.Key(0, ui.KeyEnter) + if seen != "x" { + t.Fatalf("draft survived reset: %q", seen) } } diff --git a/input_group.go b/input_group.go index 2db0177..8f0b136 100644 --- a/input_group.go +++ b/input_group.go @@ -49,8 +49,7 @@ func (p InputGroupParts) Changed() bool { return p.Input.Changed() } // Submitted reports whether Enter was pressed in the input. func (p InputGroupParts) Submitted() bool { return p.Input.Submitted() } -// InputGroup joins a single-line input with text and buttons inside one border. -// Every button keeps its own place in the Tab order. +// InputGroup joins an input, fixed text and buttons, each its own Tab stop, in one border. func InputGroup(c *ui.Context, value *string, opts InputGroupOptions) InputGroupParts { for _, b := range opts.Buttons { if b.IconOnly && b.Icon == nil { diff --git a/messages_form.go b/messages_form.go index 96ca640..8366836 100644 --- a/messages_form.go +++ b/messages_form.go @@ -42,6 +42,7 @@ func init() { "transfer.all": {"Select all in %s", "全选%s"}, "transfer.search": {"Search", "搜索"}, "transfer.search_in": {"Search %s", "搜索%s"}, + "transfer.partial": {"%d of %d selected", "已选 %d / %d 项"}, "transfer.empty": {"No items", "暂无条目"}, "transfer.no_match": {"No matches", "无匹配结果"}, "form.submit": {"Submit", "提交"}, diff --git a/pin_input.go b/pin_input.go index 99f05e0..6dc4f9d 100644 --- a/pin_input.go +++ b/pin_input.go @@ -45,8 +45,7 @@ type pinInputState struct { compose string } -// PinInput edits a fixed-length code of digits, one per cell, keeping leading zeros. -// Typing fills the next cell, Backspace clears the last, and paste fills them all. +// PinInput edits a fixed-length digit code, one cell per digit, keeping leading zeros. func PinInput(c *ui.Context, value *string, opts PinInputOptions) PinInputParts { n := opts.Length if n == 0 { @@ -144,9 +143,9 @@ func PinInput(c *ui.Context, value *string, opts PinInputOptions) PinInputParts cell.Children(func() { switch { case showCompose: - ui.Text(c, compose).FontSize(theme.H3Size).Underline().SingleLine() + ui.Text(c, compose).FontSize(FontSize(c, theme.H3Size)).Underline().SingleLine() case ch != "": - ui.Text(c, ch).FontSize(theme.H3Size).FontFeatures("tnum").SingleLine() + ui.Text(c, ch).FontSize(FontSize(c, theme.H3Size)).FontFeatures("tnum").SingleLine() } }) caret := focused && i == active && len(*value) < n && !showCompose diff --git a/tags_input.go b/tags_input.go index 3669bf0..424e876 100644 --- a/tags_input.go +++ b/tags_input.go @@ -47,7 +47,6 @@ type tagsInputState struct { } // TagsInput edits a list of unique tags shown as chips before a text input. -// Enter or a separator adds the text; Backspace in the empty input removes the last tag. func TagsInput(c *ui.Context, tags *[]string, opts TagsInputOptions) TagsInputParts { if opts.Max < 0 { panic("mujica: TagsInput Max must not be negative") @@ -102,11 +101,10 @@ func TagsInput(c *ui.Context, tags *[]string, opts TagsInputOptions) TagsInputPa Padding(d.Unit(), d.Unit()*2).Radius(theme.ControlRadius).Background(k.Surface).Disabled(opts.Disabled) box.Children(func() { for i, tag := range *tags { - chip := ui.Row(c).Key(tag).AlignItems(ui.Center).Gap(d.Unit()).Padding(0, d.Unit(), 0, d.Unit()*2). - MinHeight(d.ControlHeight() - d.Unit()*3).Radius(theme.ControlRadius).Background(k.Selection).Shrink(0) + chip := ui.Row(c).Key(tag).AlignItems(ui.Center).Padding(0, 0, 0, d.Unit()*2).Radius(theme.ControlRadius).Background(k.Selection).Shrink(0) chip.Children(func() { ui.Text(c, tag).SingleLine() - x := ui.ButtonBase(c).Size(20, 20).Radius(theme.ControlRadius).TextColor(k.TextMuted). + x := ui.ButtonBase(c).Size(theme.MinHitSize, theme.MinHitSize).Radius(theme.ControlRadius).TextColor(k.TextMuted). Label(fmt.Sprintf(msg(c, "tags_input.remove"), tag)) internal.Ring(x, k.Focus, theme.ControlRadius) if x.Hovered() { @@ -135,7 +133,7 @@ func TagsInput(c *ui.Context, tags *[]string, opts TagsInputOptions) TagsInputPa }) }) if st.err != "" { - ui.Text(c, st.err).TextColor(k.Danger).FontSize(theme.CaptionSize).Role(ui.RoleStatus) + ui.Text(c, st.err).TextColor(k.Danger).FontSize(FontSize(c, theme.CaptionSize)).Role(ui.RoleStatus) } }) in := parts.Input diff --git a/tags_input_test.go b/tags_input_test.go index 2d2dae2..da8aeb3 100644 --- a/tags_input_test.go +++ b/tags_input_test.go @@ -115,3 +115,12 @@ func TestTagsInputSnapshot(t *testing.T) { }) }) } + +func TestTagsInputRemoveHitArea(t *testing.T) { + tags, n := []string{"rose"}, 0 + tt := tagsInputTester(&tags, TagsInputOptions{}, &n) + r, ok := tt.Find("Remove rose") + if !ok || r.W < 28 || r.H < 28 { + t.Fatalf("remove button %v", r) + } +} diff --git a/testdata/snapshots/darwin/color_picker-dark.png b/testdata/snapshots/darwin/color_picker-dark.png index 494495e2609c0f96a3535c03b87b84d9c3ef0794..00f3d75c8af5c5f17052552c54d104eafb63dd38 100644 GIT binary patch delta 845 zcmV-T1G4fg1@#~f^nQKK z{GR{id0!86`tiQtH{ZYylaXa3e}C5av-o1q@TIGpm(MrKrB;L|or|qjvfr%i)E8>i zV}B?VUQc>MjhHv~wn9zw=Bv+y8ZocEy%=hmvB$D_3HSUrx1V?k_oZj=4>e+HU!44o zP4ClVp+?Nsm-ENg@VAA3^YZz7HvhO#-wPZ6a&~)?jVl)mwXk;WckOrWf6vLazfms5 zlYj8Dll8quxfE9L!w-LM@VAPQKOmEjfFFMN+s1E<$>G2cKm72+4?q0y!w*0F@WT&3 z{P6!r_{&KWD*W)n-!=HJ4c?es{;bm97dGIBAO0@De{Jx_i|@~TJ^Rt`Yrlp)_~D1Y z)A1k5UwZe$#hLfQ9{ljbf8Sa7FWk}l)GOoXO6SNYpZsj(=LP>?&F0Y93nSB0hyKYY zpZwVJ^Mb#=Q=1!|xcBD3$n;d-tpW1MCqK6Qyx=bs3ft?|xzUOK$8Wv-@hth|lOJ1t zM&IW@<7}^2-+BI}zM;XDPZz?Tli$hjTl$ePksjS2y=(u7?at+50jB) z7k{^fzu0Pp`ak{%_~D1YZT!i8bGIkr3psXslBCfLD^K`&!p{?axp~5`vQyusAAb1ZhaZ0U;fEi7_*miZO#E5=tM9?P9}P8Pe%e?LHBEE>&rl<# zRK6|LG|xTxaHtXU`By)Ln&y)a-U>BhM#d*YP4oS?S-gVb=Fo7cX;#-(Lyeg0{ntZv z@;mvR{7(LkIQf%7XhD-uXe22=760Gt(;*InP!I&r?j@SmR@8w)asQxD;1FEplTWgW z1Wn-0n%VIWlObpsJO10?kMH}F{Vb)FtgqVkw{N?7U2+zAXqw-Dn8sQoBFDpbx!VQ+ XnhJL}ODeI200000NkvXXu0mjfrP$W8 delta 932 zcmeCV#JJ`X;{+AP&l^>FQ{y*=CdwR0zsF-<)BiortpCMT?+qKw)RsjC3SLyY?kVlq ztZ*ooJM*ejl&c4K`BaY7EuCVyhr|>e-NaaTYAp=2VrjGDbnd&{Qpvv}K%+u$`^@|Q zZ`VBEG2?1~@q?=O?33rEN={yz%2jXwC-U+6M@Q#f%r@V?E3qMp{lD*YYnOtwZCG%d**O?dG&SdB7x0{_kk{nsnQvGrEZU5Sq-?uh@ zZ#PTIil0+=eA(}poj^t3rgy7f`!JvT|Fy5DzvuidT)I!*OwXb^_T;nP)vZwxyT9%J zR=@k(^C!3NYfOK1(q6_o@_zml??hJnKOdg6)vuQL$!_$M^T)&X|95^&4YJe$vgGSP z#J`w_`s$t;AXeYO`s@w$RbMxI<@?`g07_dk{9k+UpZNXxzpMT&zTX@1f4bo74~Or! z{pf$Pe$VfRpYBvA@&gUY*Z&j#?nT|J`l%$>|ba0>2uTn^=ZW^k6Jh0oT>aD zB$o5D@?iY^wYok2cdbnf%&adP+c?<$d~$r+eDOc6PKoJ@cNy4S{r%&^Y5DV${q25k ze473x?7n1n`r=>bKI?z&;aOL^OXS;}KYn%U^}FZ)d3omAt9+2LY@dqT<29#79^|*L z|MTH6KhVEmBA(%2(rVFL|3CU40E#_7Hebf%`!1z@({^8#HA~e-wDXx!hjrR>#lGV$&^|v)Jp~ z%#ysG-gcV(Y^Sbz`hGsip5JPgbWClz^XzB8^EX!r7H6cGY{|S;$W3m@;Kzbl>ir*^FTFk`F1X6~r7423oq5@pe`oJW zu6E#I3Y>8C^5_5i!&18+Gi5djxJ+7evobg`ipPI@qdw~iO@WzqKHX5RTfdU0@=(YzV6d*({~`6_Ll_r^x!YC@lVy~5R#M+(-5 zG+SP&^jtN$`|Z{s-e-rlMy~Wzx_f+y)S1Z(ql4zYv9(sXny^g&y9aCiw;!(;O-v7e ze=NR!LT8Mdrs%5meB0eqn{w@M*KPYd@8&mlZ7<%F=WXOmBupFc5wpOKxZg;Fs{+uzoD=by)F=Ps|aTiRap zMEU-Tn)MH^PrF*PY3tJc`j6#*o^aon`7`d|{#|>Fu3g(&8lLQ3A0N6y5G?Kil!y-q z*kH2X;M%p&&FXgwt3@Ch^lZ=n?@!LGOZ@R-=Bj7QrVD>h?VCCu2=Bkwu20j^*HHqR zT<*B<`3GYOp6hIr?K7n7(_7=0>nxqJ=XC9qAgk1q))0Ts?@@R9di9gu@j$QKdmD9k z&X~aI_oMJozi{0=%ZKLXlHA+fn->}h|Bto*TN>NlxwC!aiHBh`m0SMUW<9+e{n9VT zy4G`l&hu5dx35LL-r9X_+O=C=>OU*%e!u(sskr4yW?E9Ps%SJ*ql0+judm8pYh#VR z??B@_W$aWc`+@^pj?jEvot9DHZcD0o!K|x)sp3l zgI68o>EZD%H4>gZDa&Ag{l3k!{%BoIxHf%?cWKa;bv~;OF4?E+nff#x48I>e1y5<9 z)P@~%>in~R^#9yF*;@e|EP*0t|7?wa^kP3h*MY?oGy+(5=by+C6EJaja4$v9q~J@_ zWcySZxA^A!*D7uPWxq2lj0=CK=b5@hN7Mbb(cSnwym; cueA=p8J<=!dtcpUA;JIzp00i_>zopr09b6A5&!@I delta 929 zcmV;S177^}(E-WQ0gxjCX%Mj`|6~_oL#h8pSk?+frwdrJm+$_bHI~NXcv=E zXc2#R8^0Sb_Kco8UlWZ4%Zl>@+5cOkQ&uvbm>G|q=wE$e$Bmr_r8Su2&mTzZWNffo zT7x;%eo0y<7h9{PHJA(6rloZf={zQ_!8{qbC9RXaXZxfzn90js(t>~O_-mq(XIJmW zUw@E+Y(^;+s;vySMrD9yKg)iW{hnF&2g`qo4av{EbQpj2J{T&I0q}z#{GP#YVzux7 ze?f@Pf*H(UW^HD`4}S22AN=44Kls6K0)Ihap|s!!KlpP7e|bY)_tSfusw!jv{NM+F z4&X0us5^bV|MBq6FYi9e82G^te!t_-$e+A2I?+EQW8eor`2B@{L+QqS?Wca;t4Du6 z@{w;;zE|*T%W6E?+|=8X@sE7uBj2=qui#%^TpDTV*t)B}skf&hT#tO@Bj2=qui($i z%UhV88)@mN+7oWOJ&b(hBj2=qm)`38%UYP78$5cZqOsxS*nJse=4a+-=J)%|pQ**U zdE_G>`7X%!9Da(TTr2Q{AN=44Klp#a4}S22AN=6Y0)Cyclu~k+{V1h$%91Ht*P$oKMIA`~2+lv(N9Deg2v8ShzJB43(JprM>h|ch4tg9>yYv zn`Mj;^5>|fPj97nV%zCU`eQp+ZQHiiTCZHRwzSq(I?2zo+jsAme@94;W-1;wQB<}i z5D4U_KR=?>$|dv6D^I>gpMbr$>?eeHFq1%K6j9%w_}$p*J93~?T7$XsXh2#gHP!Xf z8qAyN7t%WEYHOF)VETpzrFAkDn~>IEe%;?$PJWfvVAdCvO6#Oxof`)fe|0@v>k2pI?yr zU43WI{CXG!VIb}qQNRCpHU5bii(+voWP4c#>-{cav-QC~9M!^o;M@BE{>J=gEeL)H zQO?e#Iik?ckGFxU%I))okl&Fq0zL|5W&VWVijlE}TdjRao)C>}77#md?5jAX#LkcC z-&5VboIAVe+JTA)V4CYQ)Pk(c@7$Wx=j@s!)#$TL{s}G!CZgy(vWD7$CUFMb7~MR%07`UBh0i00000NkvXXu0mjf DYcTD( diff --git a/testdata/snapshots/darwin/form-dark.png b/testdata/snapshots/darwin/form-dark.png index 64b96f994bf299a7de7da434026bdfa0130f7509..5b7add72fc3aaed5988b2ddf3319f159b78110f8 100644 GIT binary patch literal 17144 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 literal 17134 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 Q{z)SlNkxfju}^{j7Z**NlK=n! diff --git a/testdata/snapshots/darwin/form-light.png b/testdata/snapshots/darwin/form-light.png index 7690b2ad47f122ded2ef4375ea0a39ec23e140cf..f318ed7bccf475f7e38393ce41d76e389e65cd5f 100644 GIT binary patch literal 17110 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 T-~I|zejy{NC{Zo;@yq`Ka+V8$ diff --git a/testdata/snapshots/darwin/form_field-dark.png b/testdata/snapshots/darwin/form_field-dark.png index d6b2a7e3d7c863a2fb6fc01922a2a230245ad886..6efd9bc43ab32d10388eba78443bf0154c72592c 100644 GIT binary patch literal 12026 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 F{{yJ1yTc6b&YSbgx$oY0 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 literal 11877 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 PkL4)Jsmg+ZrlJ1<#s?Pq literal 10757 zcmeHtbx<8o*XG3~Sdicj!7X@z5ZooWyE|O`;u>5M2wWV3JHa)$UfkW?f;)Tjy}$RX z+WNL?|J-l4wolj0)Xa3x^f^zTbDo)wP*#*eMlkmAF1?

nCx`p4M!5{bLecjs`ymsOJFx|gFVf1f# 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 E59K)|-2eap literal 10519 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/tabs-hover-dark.png b/testdata/snapshots/darwin/tabs-hover-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..7d6f8e95649f4e5bf40eacf1dd14dadd7416d918 GIT binary patch literal 17828 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 Fe*josW8we+ literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/tabs-hover-light.png b/testdata/snapshots/darwin/tabs-hover-light.png new file mode 100644 index 0000000000000000000000000000000000000000..4ab1e624cb71b51cf4664ba92662b641e8fb2f4d GIT binary patch literal 17092 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 G1O6N3O9;0B literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/tabs-pressed-dark.png b/testdata/snapshots/darwin/tabs-pressed-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..90652e87b8a79a36b509c404a58a8c644d048014 GIT binary patch literal 17706 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/tabs-pressed-light.png b/testdata/snapshots/darwin/tabs-pressed-light.png new file mode 100644 index 0000000000000000000000000000000000000000..382b4995f1e5c1d768e72569dda45fcef861b627 GIT binary patch literal 17041 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 Date: Mon, 5 Oct 2026 12:45:45 -0400 Subject: [PATCH 8/8] Data: review r1 fixes --- card.go | 2 +- carousel.go | 5 +- carousel_test.go | 18 ++- collapsible.go | 3 +- collapsible_test.go | 22 +++ data_table.go | 74 +++++---- data_table_columns.go | 143 +++++++++++++++--- data_table_test.go | 88 +++++++---- description_list.go | 2 +- docs/components/070-list.md | 4 +- docs/components/071-data-table.md | 12 +- docs/components/072-tree.md | 4 +- docs/components/073-tree-table.md | 5 +- docs/components/074-accordion.md | 2 +- docs/components/075-collapsible.md | 2 +- examples/gallery/pages_data.go | 4 +- examples/gallery/pages_data_collections.go | 1 - examples/gallery/pages_data_content.go | 8 +- examples/gallery/pages_data_test.go | 49 ++++++ image_viewer.go | 3 +- list.go | 50 +++++- list_test.go | 46 ++++++ messages_data.go | 6 + statistic.go | 6 +- statistic_test.go | 15 ++ testdata/snapshots/darwin/data_table-dark.png | Bin 12573 -> 14614 bytes .../snapshots/darwin/data_table-light.png | Bin 12230 -> 14162 bytes testdata/snapshots/darwin/list-dark.png | Bin 18588 -> 18498 bytes testdata/snapshots/darwin/list-light.png | Bin 18172 -> 17989 bytes testdata/snapshots/darwin/tree-dark.png | Bin 9132 -> 9112 bytes testdata/snapshots/darwin/tree-light.png | Bin 8920 -> 8844 bytes testdata/snapshots/darwin/tree_table-dark.png | Bin 9912 -> 10275 bytes .../snapshots/darwin/tree_table-light.png | Bin 9545 -> 9909 bytes timeline.go | 4 +- tree.go | 42 +++-- tree_table.go | 40 ++--- tree_table_test.go | 54 +++++++ tree_test.go | 36 ++++- 38 files changed, 602 insertions(+), 148 deletions(-) create mode 100644 examples/gallery/pages_data_test.go diff --git a/card.go b/card.go index 6f06830..b246cd2 100644 --- a/card.go +++ b/card.go @@ -41,7 +41,7 @@ func Card(c *ui.Context, opts CardOptions, body func()) *ui.Element { } card.Children(func() { if opts.Title != "" { - ui.Text(c, opts.Title).Font(theme.SerifFont).FontSize(theme.H3Size).FontWeight(600).LineHeight(1.3) + ui.Text(c, opts.Title).Font(theme.SerifFont).FontSize(FontSize(c, theme.H3Size)).FontWeight(600).LineHeight(1.3) if opts.Decorated { ui.Box(c).Height(7).FillWidth().Shrink(0).Draw(func(p *ui.Painter, r ui.Rect) { cy := r.Y + r.H/2 diff --git a/carousel.go b/carousel.go index 81078e3..05f4587 100644 --- a/carousel.go +++ b/carousel.go @@ -58,10 +58,13 @@ func Carousel(c *ui.Context, index *int, n int, opts CarouselOptions, slide func } wrap := opts.Loop || opts.Autoplay goTo := func(i int) { + if n == 0 { + return + } if wrap { i = (i%n + n) % n } - if n == 0 || i < 0 || i >= n || i == *index { + if i < 0 || i >= n || i == *index { return } *index = i diff --git a/carousel_test.go b/carousel_test.go index b30e2e4..aae5119 100644 --- a/carousel_test.go +++ b/carousel_test.go @@ -124,9 +124,25 @@ func TestCarouselSnapshot(t *testing.T) { ui.Column(c).Padding(16).Size(440, 240).Children(func() { Carousel(c, *i, 4, CarouselOptions{Autoplay: true, Label: "Windows"}, func(n int) { ui.Column(c).Grow(1).Center().Children(func() { - ui.Text(c, fmt.Sprintf("Rose window %d", n+1)).FontSize(18) + ui.Text(c, fmt.Sprintf("Rose window %d", n+1)).FontSize(FontSize(c, 18)) }) }).Grow(1) }) }) } + +func TestCarouselEmptyAutoplayKeys(t *testing.T) { + index := 0 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + Carousel(c, &index, 0, CarouselOptions{Autoplay: true}, func(int) {}).Size(300, 200) + }, 320, 240) + for range 4 { + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyRight) + tt.Key(0, ui.KeyLeft) + } + if index != 0 { + t.Fatalf("index %d", index) + } +} diff --git a/collapsible.go b/collapsible.go index 7e90fa4..262e7d2 100644 --- a/collapsible.go +++ b/collapsible.go @@ -85,7 +85,8 @@ func collapsiblePanel(c *ui.Context, open bool, prog float32, fn func()) *ui.Ele if !open && prog == 0 { return nil } - clip := ui.Column(c).Shrink(0) + // Closing content takes no input or focus while it shrinks away. + clip := ui.Column(c).Shrink(0).Disabled(!open) var inner *ui.Element clip.Children(func() { inner = ui.Column(c).Shrink(0) diff --git a/collapsible_test.go b/collapsible_test.go index 90e5b28..f6ecd90 100644 --- a/collapsible_test.go +++ b/collapsible_test.go @@ -84,3 +84,25 @@ func TestCollapsibleSnapshot(t *testing.T) { }) }) } + +func TestCollapsibleClosingContentLeavesTabOrder(t *testing.T) { + open := true + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Padding(10).Children(func() { + Collapsible(c, &open, CollapsibleOptions{Title: "Details"}, func() { + Button(c, "Inner", ButtonOptions{}) + }) + Button(c, "After", ButtonOptions{}) + }) + }, 300, 300) + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeySpace) // closes; the content shrinks for 120 ms + if open || !tt.HasText("Inner") { + t.Fatalf("expected a closing animation: open %v", open) + } + tt.Key(0, ui.KeyTab) + if !tt.Focused("After") { + t.Fatal("Tab entered closing content") + } +} diff --git a/data_table.go b/data_table.go index eafc719..86ca4d6 100644 --- a/data_table.go +++ b/data_table.go @@ -7,7 +7,6 @@ import ( "github.com/egoist/mygo/ui" - "mujicaui/icons" "mujicaui/internal" "mujicaui/theme" ) @@ -62,6 +61,7 @@ type DataTableState[K comparable] struct { started bool sel K has bool + toggled bool cache dataTableCache[K] } @@ -95,7 +95,7 @@ func (v DataTableView) Changed() bool { return v.changed } // Submitted reports Enter or a double click on a row. func (v DataTableView) Submitted() bool { return v.submitted } -// SortChanged reports a header click that changed State.Sort. +// SortChanged reports a header click or menu choice that changed State.Sort. func (v DataTableView) SortChanged() bool { return v.sorted } // Retried reports a click on the retry action of a failed load. @@ -109,19 +109,25 @@ func DataTable[R any, K comparable](c *ui.Context, s *DataTableState[K], rows [] if !s.started { s.started, s.cursor = true, -1 } - dataTableRefresh(s, rows, opts) - if s.has { - if i, ok := s.cache.at[s.sel]; ok { - s.cursor = i - } else { - s.cursor = -1 - } - } k := Tokens(c) d := Density(c) + before := s.Sort var v DataTableView - v.Element = ui.Column(c).MinHeight(0) + v.Element = ui.Column(c).MinHeight(0).Gap(d.Unit() * 2) v.Children(func() { + if len(rows) > 0 { + ui.Row(c).Justify(ui.End).Children(func() { + tableColumnMenu(c, dataTableMenu(opts), &s.Sort, &s.Layout, &s.Hidden) + }) + } + dataTableRefresh(s, rows, opts) + if s.has { + if i, ok := s.cache.at[s.sel]; ok { + s.cursor = i + } else { + s.cursor = -1 + } + } view := s.cache.view if len(view) == 0 { empty := opts.Empty @@ -139,12 +145,9 @@ func DataTable[R any, K comparable](c *ui.Context, s *DataTableState[K], rows [] if opts.Multiple { s.rows.Selection = &s.Selection } - before := s.Sort // Rows reach the data-row height of the density. - saved := c.Theme() - t := *saved - t.Spacing = d.ControlHeight() / 8 - c.SetTheme(&t) + restore := dataSelectTheme(c, d.ControlHeight()/8) + head := s.Sort e := ui.Table(c, &s.rows, cols, len(view), func(row, col int) { r := rows[view[row]] if col == 0 { @@ -158,18 +161,19 @@ func DataTable[R any, K comparable](c *ui.Context, s *DataTableState[K], rows [] ui.Text(c, dc.Text(r)).SingleLine() } }) - c.SetTheme(saved) + restore() e.Grow(1).MinHeight(0).Background(k.Surface).Border(theme.BorderWidth, k.Border).Radius(theme.ControlRadius) internal.Ring(e, k.Focus, theme.ControlRadius) s.Layout = s.rows.Columns - v.sorted = s.Sort != before - v.changed = e.Changed() && !v.sorted + v.changed = e.Changed() && s.Sort == head || s.toggled + s.toggled = false v.submitted = e.Submitted() v.retry = dataFooter(c, opts.Status, opts.Error) if s.cursor >= 0 && s.cursor < len(view) { s.sel, s.has = opts.Key(rows[view[s.cursor]]), true } }) + v.sorted = s.Sort != before if v.sorted { slog.Debug("mujica: data_table sort", "column", s.Sort.Column, "descending", s.Sort.Descending) } @@ -252,6 +256,15 @@ func dataTablePrune[R any, K comparable](s *DataTableState[K], rows []R, opts Da } } +// dataTableMenu lists the columns for the column menu. +func dataTableMenu[R any, K comparable](opts DataTableOptions[R, K]) []tableColumn { + cols := make([]tableColumn, len(opts.Columns)) + for i, col := range opts.Columns { + cols[i] = tableColumn{ID: col.ID, Title: col.Title, Width: col.Width, MinWidth: col.MinWidth, Sortable: col.Sortable} + } + return cols +} + func dataTableColumns[R any, K comparable](c *ui.Context, s *DataTableState[K], opts DataTableOptions[R, K]) ([]int, []ui.TableColumn) { w := Density(c).ControlHeight() cols := []ui.TableColumn{{ID: dataTableMarkID, Width: w, Fixed: true, Align: ui.Center}} @@ -275,27 +288,24 @@ func dataTableMark[R any, K comparable](c *ui.Context, s *DataTableState[K], opt if !opts.Multiple { if row == s.cursor { ui.Box(c).Size(8, 8).Shrink(0).Draw(func(p *ui.Painter, r ui.Rect) { - p.FillPath(internal.Diamond(internal.Snap(p, r.X+r.W/2), internal.Snap(p, r.Y+r.H/2), r.W), k.OnAccent) + p.FillPath(internal.Diamond(internal.Snap(p, r.X+r.W/2), internal.Snap(p, r.Y+r.H/2), r.W), k.AccentText) }) } return } on := s.Selection.Has(key) - box := ui.Box(c).Size(16, 16).Shrink(0).Radius(theme.ControlRadius).Role(ui.RoleCheckBox).Label(msg(c, "data_table.selectRow")) - if on { - box.Border(theme.BorderWidth, k.OnAccent).TextColor(k.OnAccent).Children(func() { - ui.Icon(c, icons.Must("check")).Size(14, 14) - }).Center() - } else { - box.Border(theme.BorderWidth, k.ControlBorder) - } - if box.Clicked() { + cb := ui.CheckboxBase(c, &on).Label(msg(c, "data_table.selectRow")).Size(theme.MinHitSize, theme.MinHitSize). + Justify(ui.Center).AlignItems(ui.Center).Radius(theme.ControlRadius) + internal.Ring(cb, k.Focus, theme.ControlRadius) + cb.Children(func() { dataTableCheckBox(c, on) }) + if cb.Changed() { if on { - s.Selection.Remove(key) - } else { s.Selection.Add(key) + } else { + s.Selection.Remove(key) } - slog.Debug("mujica: data_table toggle", "on", !on) + s.toggled = true + slog.Debug("mujica: data_table toggle", "on", on) } } diff --git a/data_table_columns.go b/data_table_columns.go index 430b8e1..62494d8 100644 --- a/data_table_columns.go +++ b/data_table_columns.go @@ -1,7 +1,10 @@ package mujica import ( + "fmt" "log/slog" + "maps" + "slices" "github.com/egoist/mygo/ui" @@ -10,58 +13,156 @@ import ( "mujicaui/theme" ) -// DataTableColumnPicker is a Columns button whose popover shows and hides columns. -// The last visible column cannot be hidden. -func DataTableColumnPicker[R any, K comparable](c *ui.Context, s *DataTableState[K], cols []DataColumn[R]) *ui.Element { +// tableColumn is what the column menu knows of a column. +type tableColumn struct { + ID, Title string + Width, MinWidth float32 + Sortable bool +} + +// tableWidthStep is how far one Narrower or Wider press resizes a column. +const tableWidthStep float32 = 16 + +// tableColumnMenu is the keyboard path to sort, move, resize and, with hidden, show columns. +func tableColumnMenu(c *ui.Context, cols []tableColumn, sort *ui.SortOrder, layout *ui.TableLayout, hidden *map[string]bool) { k := Tokens(c) u := Density(c).Unit() - b := Button(c, msg(c, "data_table.columns"), ButtonOptions{Variant: Secondary, Icon: icons.Must("eye")}) + b := Button(c, msg(c, "data_table.columns"), ButtonOptions{Variant: Secondary, Icon: icons.Must("settings")}) open := ui.Local(b, "open", func() bool { return false }) if b.Clicked() { *open = !*open } - visible := 0 - for _, col := range cols { - if !s.Hidden[col.ID] { - visible++ + order := tableOrder(cols, *layout) + visible := len(cols) + if hidden != nil { + for _, col := range cols { + if (*hidden)[col.ID] { + visible-- + } } } ui.PopoverBase(c, b, open, func(panel *ui.Element) { panel.Background(k.Surface).Border(theme.BorderWidth, k.ControlBorder).Radius(theme.PopupRadius). - Padding(u * 2).Gap(u).MinWidth(200).MarginY(u) - for _, col := range cols { - ui.Column(c).Key(col.ID).Children(func() { dataTablePickerItem(c, s, col.ID, col.Title, visible) }) + Padding(u * 2).Gap(u).MinWidth(240).MarginY(u) + for at, id := range order { + col := cols[slices.IndexFunc(cols, func(col tableColumn) bool { return col.ID == id })] + ui.Row(c).Key(id).Gap(u).AlignItems(ui.Center).Children(func() { + if hidden != nil { + tableVisibility(c, col, hidden, visible) + } else { + ui.Text(c, col.Title).SingleLine().Grow(1).Padding(0, u*2) + } + tableColumnActions(c, col, at, order, sort, layout) + }) } }) - return b } -// dataTablePickerItem is one column's check box in the picker. -func dataTablePickerItem[K comparable](c *ui.Context, s *DataTableState[K], id, title string, visible int) { +// tableColumnActions are one column's sort, move and width buttons. +func tableColumnActions(c *ui.Context, col tableColumn, at int, order []string, sort *ui.SortOrder, layout *ui.TableLayout) { + act := func(icon, key string, disabled bool) bool { + return Button(c, "", ButtonOptions{Variant: Ghost, Icon: icons.Must(icon), Label: fmt.Sprintf(msg(c, key), col.Title), Disabled: disabled}).Clicked() + } + if col.Sortable { + for _, desc := range []bool{false, true} { + icon, key := "arrow-up", "data_table.sortAsc" + if desc { + icon, key = "arrow-down", "data_table.sortDesc" + } + if act(icon, key, *sort == ui.SortOrder{Column: col.ID, Descending: desc}) { + *sort = ui.SortOrder{Column: col.ID, Descending: desc} + slog.Debug("mujica: table sort", "column", col.ID, "descending", desc) + } + } + } + for _, step := range []int{-1, 1} { + icon, key := "chevron-left", "data_table.moveLeft" + if step > 0 { + icon, key = "chevron-right", "data_table.moveRight" + } + to := at + step + if act(icon, key, to < 0 || to >= len(order)) { + ids := slices.Clone(order) + ids[at], ids[to] = ids[to], ids[at] + layout.Order = ids + slog.Debug("mujica: table move", "column", col.ID, "to", to) + } + } + w := tableWidth(col, *layout) + least := max(col.MinWidth, tableWidthStep) + if act("minus", "data_table.narrower", w <= least) { + tableSetWidth(layout, col.ID, max(least, w-tableWidthStep)) + } + if act("plus", "data_table.wider", false) { + tableSetWidth(layout, col.ID, w+tableWidthStep) + } +} + +// tableVisibility is a column's show/hide check box; the last visible one cannot hide. +func tableVisibility(c *ui.Context, col tableColumn, hidden *map[string]bool, visible int) { k := Tokens(c) d := Density(c) u := d.Unit() - on := !s.Hidden[id] + on := !(*hidden)[col.ID] last := on && visible == 1 - cb := ui.CheckboxBase(c, &on).Disabled(last).MinHeight(d.ControlHeight()). + cb := ui.CheckboxBase(c, &on).Label(col.Title).Disabled(last).MinHeight(d.ControlHeight()).Grow(1). Padding(0, u*2).Gap(u * 2).AlignItems(ui.Center).Radius(theme.ControlRadius) internal.Ring(cb, k.Focus, theme.ControlRadius) if cb.Hovered() && !last { cb.Background(k.SurfaceHover) } if cb.Changed() && !last { - if s.Hidden == nil { - s.Hidden = map[string]bool{} + m := maps.Clone(*hidden) + if m == nil { + m = map[string]bool{} } - s.Hidden[id] = !on - slog.Debug("mujica: data_table column", "id", id, "visible", on) + m[col.ID] = !on + *hidden = m + slog.Debug("mujica: table column", "id", col.ID, "visible", on) } cb.Children(func() { dataTableCheckBox(c, on) - ui.Text(c, title).SingleLine() + ui.Text(c, col.Title).SingleLine() }) } +// tableOrder lists column IDs as the layout orders them, the rest after. +func tableOrder(cols []tableColumn, l ui.TableLayout) []string { + var ids []string + for _, id := range l.Order { + if slices.ContainsFunc(cols, func(col tableColumn) bool { return col.ID == id }) && !slices.Contains(ids, id) { + ids = append(ids, id) + } + } + for _, col := range cols { + if !slices.Contains(ids, col.ID) { + ids = append(ids, col.ID) + } + } + return ids +} + +// tableWidth is a column's set width; a sharing column starts from its least, at least 120. +func tableWidth(col tableColumn, l ui.TableLayout) float32 { + if w, ok := l.Widths[col.ID]; ok { + return w + } + if col.Width > 0 { + return col.Width + } + return max(col.MinWidth, 120) +} + +func tableSetWidth(l *ui.TableLayout, id string, w float32) { + m := maps.Clone(l.Widths) + if m == nil { + m = map[string]float32{} + } + m[id] = w + l.Widths = m + slog.Debug("mujica: table width", "column", id, "width", w) +} + // dataTableCheckBox draws a 16 DIP check box: OnAccent check on Accent when on. func dataTableCheckBox(c *ui.Context, on bool) { k := Tokens(c) diff --git a/data_table_test.go b/data_table_test.go index b327fee..dbbe47d 100644 --- a/data_table_test.go +++ b/data_table_test.go @@ -3,10 +3,13 @@ package mujica import ( "cmp" "fmt" + "image/color" "strconv" "testing" "github.com/egoist/mygo/ui" + + "mujicaui/theme" ) type relic struct { @@ -22,7 +25,6 @@ type tableHarness struct { compares int changes int sorts int - picker bool c *ui.Context seen map[string]int } @@ -45,9 +47,6 @@ func (h *tableHarness) view(c *ui.Context) { Use(c, Settings{Mode: Light}) h.c, h.seen = c, map[string]int{} ui.Column(c).Padding(10).Gap(8).Children(func() { - if h.picker { - DataTableColumnPicker(c, &h.st, h.opts.Columns) - } cols := h.opts for i := range cols.Columns { text := cols.Columns[i].Text @@ -154,8 +153,11 @@ func TestDataTableMultipleMarks(t *testing.T) { r, _ := tt.Find(name) tt.ClickAt(table.X-28, r.Y+r.H/2) // the mark column sits before Name } - if h.st.Selection.Len() != 2 || !h.st.Selection.Has(2) || !h.st.Selection.Has(4) { - t.Fatalf("marks chose %d", h.st.Selection.Len()) + if h.st.Selection.Len() != 2 || !h.st.Selection.Has(2) || !h.st.Selection.Has(4) || h.changes != 2 { + t.Fatalf("marks chose %d, changes %d", h.st.Selection.Len(), h.changes) + } + if _, ok := tt.Find("Select row"); !ok { + t.Fatal("row check box has no name") } _ = tt.Click("Age") if h.st.Selection.Len() != 2 || !h.st.Selection.Has(4) { @@ -168,39 +170,52 @@ func TestDataTableMultipleMarks(t *testing.T) { } } -func TestDataTableColumns(t *testing.T) { - h := newTableHarness(relics()) - h.picker = true - tt := ui.NewTester(h.view, 400, 400) - h.st.Layout.Order = []string{"age", "name"} - tt.Frame() - age, _ := tt.Find("Age") - name, _ := tt.Find("Name") - if age.X >= name.X { - t.Fatalf("order not applied: age %v name %v", age.X, name.X) - } - if err := tt.Click("Columns"); err != nil { - t.Fatal(err) - } - ages := 0 - for _, s := range tt.Texts() { - if s == "Age" { - ages++ +// tabTo presses Tab until the element labeled label has the focus. +func tabTo(t *testing.T, tt *ui.Tester, label string) { + t.Helper() + for range 60 { + if tt.Focused(label) { + return } + tt.Key(0, ui.KeyTab) } - if ages != 2 { // header and picker - t.Fatalf("picker missing: %q", tt.Texts()) + t.Fatalf("Tab never reached %q", label) +} + +func TestDataTableColumnMenuKeyboard(t *testing.T) { + h := newTableHarness(relics()) + tt := ui.NewTester(h.view, 420, 480) + tabTo(t, tt, "Columns") + tt.Key(0, ui.KeyEnter) + tabTo(t, tt, "Sort Age descending") + tt.Key(0, ui.KeyEnter) + if h.st.Sort != (ui.SortOrder{Column: "age", Descending: true}) || h.sorts != 1 { + t.Fatalf("sort %+v sorts %d", h.st.Sort, h.sorts) } - tt.Key(0, ui.KeyTab) + tabTo(t, tt, "Move Age left") + tt.Key(0, ui.KeyEnter) + if fmt.Sprint(h.st.Layout.Order) != "[age name]" { + t.Fatalf("order %v", h.st.Layout.Order) + } + tabTo(t, tt, "Make Age wider") + tt.Key(0, ui.KeyEnter) + if h.st.Layout.Widths["age"] != 96 { + t.Fatalf("widths %v", h.st.Layout.Widths) + } + tabTo(t, tt, "Name") tt.Key(0, ui.KeySpace) - if !h.st.Hidden["name"] || tt.HasText("Censer") { - t.Fatalf("name not hidden: %v %q", h.st.Hidden, tt.Texts()) + if !h.st.Hidden["name"] { + t.Fatalf("name not hidden: %v", h.st.Hidden) } - tt.Key(0, ui.KeyTab) + tabTo(t, tt, "Age") tt.Key(0, ui.KeySpace) if h.st.Hidden["age"] { t.Fatal("hid the last visible column") } + tt.Key(0, ui.KeyEscape) + if tt.HasText("Censer") || !tt.HasText("Age") { + t.Fatalf("table did not follow the menu: %q", tt.Texts()) + } } func TestDataTableCustomCellAndControlled(t *testing.T) { @@ -335,3 +350,16 @@ func TestDataTableSnapshot(t *testing.T) { }) }) } + +func TestDataTableSelectionColors(t *testing.T) { + h := newTableHarness(relics()) + tt := ui.NewTester(h.view, 400, 360) + if err := tt.Click("Bell"); err != nil { + t.Fatal(err) + } + r, _ := tt.Find("Bell") + got := color.RGBAModel.Convert(tt.Image().At(int(r.X+r.W-6), int(r.Y+r.H/2))).(color.RGBA) + if want := toRGBA(theme.Light().Selection); got != want { + t.Fatalf("selected row background %v, want Selection %v", got, want) + } +} diff --git a/description_list.go b/description_list.go index 3be4d4b..9d89dca 100644 --- a/description_list.go +++ b/description_list.go @@ -86,7 +86,7 @@ func DescriptionList(c *ui.Context, items []DescriptionItem, opts DescriptionLis cell.ColumnSpan(it.Span) } cell.Children(func() { - ui.Text(c, it.Label).FontSize(theme.CaptionSize).TextColor(k.TextMuted) + ui.Text(c, it.Label).FontSize(FontSize(c, theme.CaptionSize)).TextColor(k.TextMuted) ui.Row(c).Gap(u).MinHeight(theme.MinHitSize).AlignItems(ui.Center).Children(func() { ui.Text(c, it.Value).Shrink(1).MinWidth(0) if !it.Copyable { diff --git a/docs/components/070-list.md b/docs/components/070-list.md index 48dc71e..3623837 100644 --- a/docs/components/070-list.md +++ b/docs/components/070-list.md @@ -41,7 +41,7 @@ ui.Render(view, 400, 300, 1) ## 状态 -默认、悬停(SurfaceHover)、选中(Accent 填充 + OnAccent 文字 + 勾选标记)、聚焦(列表外 2 DIP 焦点环)、网格选中(AccentText 边框 + 勾选)、加载、追加加载、失败、空。 +默认、悬停(SurfaceHover)、选中(Selection 背景 + Text 文字 + AccentText 勾选标记)、聚焦(列表外 2 DIP 焦点环)、网格选中(Selection 背景 + AccentText 边框与勾选)、加载、追加加载、失败、空。 ## 事件 @@ -57,6 +57,6 @@ ui.Render(view, 400, 300, 1) ## 限制 - 虚拟化由 MyGo `ui.List`/`ui.GridView` 提供:每帧构建的元素数由可见区域和预取范围决定;程序跳转(`ScrollTo`)时目标两侧各构建一屏。测试以 10 万条记录统计“最后一帧调用条目构建函数的次数”验证上限(list_test.go)。 -- MyGo 单选跟随键时只在原位置附近 1000 行内查找(ui/list.go:30 `listSearch`);插入或删除大量上方行后,单选可能被清除。 +- 单选按键保存:每帧先检查原位置的键,不符时扫描全部条目重新定位(MyGo 自身只在附近 1000 行内查找,ui/list.go:30),所以反转、排序或在网格前端插入后选择仍指向同一条目;条目被删除时选择清除。 - Shift 连选的锚点由 MyGo 决定(ui/list.go `extend`),与平台习惯一致。 - 网格模式没有 `ListState.Visible` 等滚动位置读取接口。 diff --git a/docs/components/071-data-table.md b/docs/components/071-data-table.md index dce0755..1a3505e 100644 --- a/docs/components/071-data-table.md +++ b/docs/components/071-data-table.md @@ -34,7 +34,7 @@ ui.Render(view, 400, 300, 1) ## 参数 -`func DataTable[R any, K comparable](c *ui.Context, s *DataTableState[K], rows []R, opts DataTableOptions[R, K]) DataTableView`。另有 `DataTableColumnPicker(c, s, cols)`(“列”按钮与勾选弹层,控制显隐)和纯函数 `DataTableRows(rows, cols, sort, filter) []int`(本地排序筛选辅助,返回行下标)。 +`func DataTable[R any, K comparable](c *ui.Context, s *DataTableState[K], rows []R, opts DataTableOptions[R, K]) DataTableView`。表格上方有“列”按钮,弹层中每列提供显隐勾选框、升序/降序排序、左移/右移与减小/增大列宽(每次 16 DIP),这是排序、列顺序与列宽的键盘入口。另有纯函数 `DataTableRows(rows, cols, sort, filter) []int`(本地排序筛选辅助,返回行下标)。 `DataTableState` 字段:`Sort ui.SortOrder`、`Filter string`(不区分大小写包含匹配全部列的 `Text`)、`Hidden map[string]bool`(按列 ID 隐藏)、`Layout ui.TableLayout`(用户拖动得到的列顺序与列宽,可保存恢复)、`Selection ui.Selection[K]`(多选)。方法:`Selected()`、`Rows()`(筛选后行数)。 @@ -51,23 +51,25 @@ ui.Render(view, 400, 300, 1) ## 状态 -默认、表头悬停、排序箭头(升/降)、行悬停、选中行(Accent 填充 + OnAccent 文字;单选首列菱形,多选首列勾选框)、聚焦(表格外焦点环)、加载、追加加载、失败、空、无匹配。数据行高度不低于当前密度的数据行高(28/36/44 DIP)。 +默认、表头悬停、排序箭头(升/降)、行悬停、选中行(Selection 背景 + Text 文字;单选首列 AccentText 菱形,多选首列勾选框)、聚焦(表格外焦点环)、加载、追加加载、失败、空、无匹配。数据行高度不低于当前密度的数据行高(28/36/44 DIP)。 ## 事件 -`Changed()`:选择变化;`Submitted()`:Enter 或双击;`SortChanged()`:点击表头改变了 `State.Sort`;`Retried()`:点击“重试”。 +`Changed()`:选择变化(含勾选框);`Submitted()`:Enter 或双击;`SortChanged()`:点击表头或列菜单改变了 `State.Sort`;`Retried()`:点击“重试”。 ## 键盘操作 - ↑/↓、Home/End:移动选择;Enter:提交;输入字母按首个可见列定位。 - 多选:Shift/Cmd(Ctrl) 配合点击或方向键;Cmd/Ctrl+A 全选。 - 表头:点击排序、再次点击反向;拖动表头边缘调整列宽,双击适配内容;拖动表头移动列。 -- 列选择器:Tab 进入勾选项,Space 切换;Escape 关闭。 +- 列菜单:Tab 到“列”按钮,Enter 打开;Tab 在各列的勾选框与排序、移动、列宽按钮间移动,Enter/Space 执行;Escape 关闭。 +- 多选勾选框可用 Tab 到达,Space 切换。 ## 限制 - MyGo `ui.Table` 只按调用方给出的顺序显示(docs/ui/table.md “Sorting”),因此本组件在本地完成排序,或在受控模式下交给调用方。 -- 表头内容只能是 `Title` 文字(ui/table.go `table` 构建表头),无法放置全选勾选框;全选使用 Cmd/Ctrl+A。 +- 表头内容只能是 `Title` 文字且只响应指针(ui/table.go `tableHeader`),因此全选使用 Cmd/Ctrl+A,键盘排序与调整列通过列菜单。 +- 共享列宽的列在列菜单中从 max(MinWidth, 120) DIP 开始调整。 - 单选的跟随由组件按键重新定位,跨越任意距离都有效;多选的键盘锚点在大规模重排后由 MyGo 重置(ui/list.go:30)。 - 删除的数据行对应的选择会在数据变化时清除;被筛选隐藏的行保留选择。 - 10 万行 × 10 列:测试统计“最后一帧构建过单元格的行数”不超过 16,并断言重复帧不再调用比较函数(data_table_test.go)。 diff --git a/docs/components/072-tree.md b/docs/components/072-tree.md index 5e37cb8..7b6c049 100644 --- a/docs/components/072-tree.md +++ b/docs/components/072-tree.md @@ -38,7 +38,7 @@ ui.Render(view, 400, 300, 1) ## 状态 -默认、悬停、选中(Accent 填充 + 勾选标记)、聚焦、展开/折叠(箭头旋转)、子项加载中、子项加载失败、空、首次加载与失败。 +默认、悬停、选中(Selection 背景 + AccentText 勾选标记)、聚焦、展开/折叠(箭头旋转)、子项加载中、子项加载失败、空、首次加载与失败。 ## 事件 @@ -53,5 +53,5 @@ ui.Render(view, 400, 300, 1) - 基于 MyGo `ui.Outline` 而不是 `ui.Tree`:`ui.Tree` 会构建全部已展开节点(docs/ui/tree.md “A tree builds every item it shows”),不满足大量节点虚拟化要求。 - `Outline` 每帧遍历已展开的节点以计算行(ui/outline.go `flatten`),元素数受可见区域限制,但遍历成本随展开节点数增长。 -- 单选跟随节点的搜索范围为 1000 行(ui/list.go:30)。 +- 单选按节点保存:行移动超过 MyGo 的 1000 行搜索范围(ui/list.go:30)时,组件扫描可见行重新定位并立即重建一帧;所选节点被折叠隐藏或删除时选择清除。 - 异步加载由调用方在后台完成并通过 `Window.Update` 回到界面线程。 diff --git a/docs/components/073-tree-table.md b/docs/components/073-tree-table.md index 60d8799..dac451b 100644 --- a/docs/components/073-tree-table.md +++ b/docs/components/073-tree-table.md @@ -29,7 +29,7 @@ ui.Render(view, 400, 300, 1) ## 参数 -`func TreeTable[K comparable](c *ui.Context, s *TreeTableState[K], opts TreeTableOptions[K]) DataTableView`。`TreeTableState` 字段:`Sort`、`Layout`、`Selection`;方法:`Selected()`、`SetOpen`、`IsOpen`。 +`func TreeTable[K comparable](c *ui.Context, s *TreeTableState[K], opts TreeTableOptions[K]) DataTableView`。`TreeTableState` 字段:`Sort`、`Layout`、`Selection`;方法:`Selected()`、`SetOpen`、`IsOpen`。表格上方的“列”按钮弹层提供每列的排序、左移/右移与列宽调整,是这些操作的键盘入口。 | 字段 | 类型 | 默认值 | 含义 | | --- | --- | --- | --- | @@ -45,7 +45,7 @@ ui.Render(view, 400, 300, 1) ## 状态 -默认、悬停、选中(Accent 填充 + 勾选标记)、聚焦、展开/折叠、排序箭头、子项加载中/失败、空。 +默认、悬停、选中(Selection 背景 + AccentText 勾选标记)、聚焦、展开/折叠、排序箭头、子项加载中/失败、空。 ## 事件 @@ -54,6 +54,7 @@ ui.Render(view, 400, 300, 1) ## 键盘操作 - 与 Tree 相同的方向键与展开键;点击表头排序同级节点,再次点击反向;拖动表头边缘或表头调整列宽与顺序。 +- 列菜单:Tab 到“列”按钮,Enter 打开,Tab 到排序、移动与列宽按钮,Enter 执行,Escape 关闭。 ## 限制 diff --git a/docs/components/074-accordion.md b/docs/components/074-accordion.md index 5d02cdc..fe0a242 100644 --- a/docs/components/074-accordion.md +++ b/docs/components/074-accordion.md @@ -44,4 +44,4 @@ ui.Render(view, 400, 300, 1) ## 限制 - 基于 MyGo `ui.CollapsibleBase`;MyGo 的 `ui.Accordion` 外观固定且用内部状态移动焦点(ui/collapsible.go `accordionKeys`),因此键盘移动在组件内重新实现:向上移动时焦点在下一帧到达。 -- 关闭动画进行的 120 ms 内内容仍在界面树中。 +- 关闭动画进行的 120 ms 内内容仍在界面树中,但已禁用:不接收点击,也不进入 Tab 序列。 diff --git a/docs/components/075-collapsible.md b/docs/components/075-collapsible.md index 12b3cbe..417263d 100644 --- a/docs/components/075-collapsible.md +++ b/docs/components/075-collapsible.md @@ -38,7 +38,7 @@ ui.Render(view, 400, 300, 1) ## 键盘操作 - Enter/Space:展开或关闭。 -- 关闭后内容不在 Tab 序列中。 +- 关闭(包括关闭动画期间)的内容不在 Tab 序列中。 ## 限制 diff --git a/examples/gallery/pages_data.go b/examples/gallery/pages_data.go index 7e7a5df..310a332 100644 --- a/examples/gallery/pages_data.go +++ b/examples/gallery/pages_data.go @@ -39,7 +39,7 @@ var dataPages = []page{ // dataSection lays out a titled block of a demo. func dataSection(c *ui.Context, title string, fn func()) { ui.Column(c).Gap(12).Children(func() { - ui.Text(c, title).Font(theme.SerifFont).FontSize(theme.H3Size) + ui.Text(c, title).Font(theme.SerifFont).FontSize(mujica.FontSize(c, theme.H3Size)) fn() }) } @@ -50,7 +50,7 @@ func dataStates(c *ui.Context, fn func(state func(name string, body func()))) { ui.Row(c).Gap(24).Wrap().AlignItems(ui.Start).Children(func() { fn(func(name string, body func()) { ui.Column(c).Gap(6).AlignItems(ui.Start).Children(func() { - ui.Text(c, name).FontSize(theme.CaptionSize).TextColor(k.TextMuted) + ui.Text(c, name).FontSize(mujica.FontSize(c, theme.CaptionSize)).TextColor(k.TextMuted) body() }) }) diff --git a/examples/gallery/pages_data_collections.go b/examples/gallery/pages_data_collections.go index bfc442c..0b37378 100644 --- a/examples/gallery/pages_data_collections.go +++ b/examples/gallery/pages_data_collections.go @@ -134,7 +134,6 @@ func dataTableDemo(c *ui.Context, log func(string)) { ui.Checkbox(c, &s.multiple, "Multiple") ui.Select(c, &s.status, dataStatuses) ui.TextInput(c, &s.table.Filter).Width(180).Placeholder("Filter") - mujica.DataTableColumnPicker(c, &s.table, cols) }) v := mujica.DataTable(c, &s.table, rows, mujica.DataTableOptions[dataRelic, int]{ Columns: cols, Key: func(r dataRelic) int { return r.ID }, Multiple: s.multiple, Status: st, diff --git a/examples/gallery/pages_data_content.go b/examples/gallery/pages_data_content.go index 57a4612..92d1b95 100644 --- a/examples/gallery/pages_data_content.go +++ b/examples/gallery/pages_data_content.go @@ -63,7 +63,9 @@ func dataAccordionDemo(c *ui.Context, log func(string)) { {ID: "nave", Title: "Nave", Content: func() { ui.Text(c, "Pews of black oak, polished for the feast.") }}, {ID: "crypt", Title: "Crypt (disabled)", Disabled: true, Content: func() {}}, {ID: "bells", Title: "Bells", Content: func() { - mujica.Button(c, "Ring", mujica.ButtonOptions{}) + if mujica.Button(c, "Ring", mujica.ButtonOptions{}).Clicked() { + log("ring the bells") + } }}, }, mujica.AccordionOptions{Multiple: s.multiple, KeepOne: s.keepOne}).Width(420).Changed() { log(fmt.Sprintf("open %v", s.open)) @@ -84,7 +86,9 @@ func dataCollapsibleDemo(c *ui.Context, log func(string)) { }) if mujica.Collapsible(c, &s.open, mujica.CollapsibleOptions{Title: "Rites of the evening", Disabled: s.disabled}, func() { ui.Text(c, "Candles are lit at the seventh bell; the choir enters from the north door.") - mujica.Button(c, "Light candles", mujica.ButtonOptions{Variant: mujica.Outline}) + if mujica.Button(c, "Light candles", mujica.ButtonOptions{Variant: mujica.Outline}).Clicked() { + log("light candles") + } }).Changed() { log(fmt.Sprintf("open=%v", s.open)) } diff --git a/examples/gallery/pages_data_test.go b/examples/gallery/pages_data_test.go new file mode 100644 index 0000000..8593aeb --- /dev/null +++ b/examples/gallery/pages_data_test.go @@ -0,0 +1,49 @@ +package main + +import ( + "slices" + "testing" + + "github.com/egoist/mygo/ui" + + mujica "mujicaui" +) + +// dataDemo runs the demo of page id and returns its tester and event log. +func dataDemo(t *testing.T, id string) (*ui.Tester, *[]string) { + t.Helper() + i := slices.IndexFunc(dataPages, func(p page) bool { return p.ID == id }) + if i < 0 { + t.Fatalf("no page %s", id) + } + events := &[]string{} + tt := ui.NewTester(func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + ui.Scroll(c).Fill().Padding(24).Children(func() { + dataPages[i].Demo(c, func(s string) { *events = append(*events, s) }) + }) + }, 900, 700) + tt.SetPreferences(ui.Preferences{ReduceMotion: true, TextScale: 1}) + return tt, events +} + +func TestDataDemoButtonsLog(t *testing.T) { + tt, events := dataDemo(t, "074") + for _, s := range []string{"Bells", "Ring"} { + if err := tt.Click(s); err != nil { + t.Fatal(err) + } + } + if !slices.Contains(*events, "ring the bells") { + t.Fatalf("Ring not logged: %q", *events) + } + tt, events = dataDemo(t, "075") + for _, s := range []string{"Open from outside", "Light candles"} { + if err := tt.Click(s); err != nil { + t.Fatal(err) + } + } + if !slices.Contains(*events, "light candles") { + t.Fatalf("Light candles not logged: %q", *events) + } +} diff --git a/image_viewer.go b/image_viewer.go index 30a10e2..2f2fa69 100644 --- a/image_viewer.go +++ b/image_viewer.go @@ -20,8 +20,7 @@ type ViewerImage struct { Alt string } -// ImageViewerView is a built ImageViewer and what happened to it in this frame. -// Element is nil while the viewer is closed. +// ImageViewerView is a built ImageViewer; Element is nil while closed. type ImageViewerView struct { *ui.Element changed bool diff --git a/list.go b/list.go index bedea8d..0275742 100644 --- a/list.go +++ b/list.go @@ -89,6 +89,7 @@ func List[K comparable](c *ui.Context, s *ListState[K], n int, opts ListOptions[ if !s.started { s.started, s.cursor = true, -1 } + listLocate(s, n, opts.Key) k := Tokens(c) var v ListView v.Element = ui.Column(c).MinHeight(0) @@ -118,6 +119,21 @@ func List[K comparable](c *ui.Context, s *ListState[K], n int, opts ListOptions[ return v } +// listLocate finds the chosen key again when items moved or came and went. +func listLocate[K comparable](s *ListState[K], n int, key func(int) K) { + if !s.has || s.cursor >= 0 && s.cursor < n && key(s.cursor) == s.key { + return + } + s.cursor = -1 + for i := range n { + if key(i) == s.key { + s.cursor = i + break + } + } + slog.Debug("mujica: list selection moved", "row", s.cursor) +} + func listRows[K comparable](c *ui.Context, s *ListState[K], n int, opts ListOptions[K], item func(i int)) *ui.Element { d := Density(c) s.rows.Key = func(i int) any { return opts.Key(i) } @@ -128,11 +144,14 @@ func listRows[K comparable](c *ui.Context, s *ListState[K], n int, opts ListOpti } else { s.rows.Selection = nil } + k := Tokens(c) + restore := dataSelectTheme(c, 0) + defer restore() return ui.List(c, &s.rows, n, func(i int) { ui.Row(c).MinHeight(d.ControlHeight()).Padding(0, d.Unit()*3).Gap(d.Unit() * 2).AlignItems(ui.Center).Children(func() { ui.Row(c).Grow(1).MinWidth(0).AlignItems(ui.Center).Gap(d.Unit() * 2).Children(func() { item(i) }) if listChosen(s, opts, i) { - ui.Icon(c, icons.Must("check")).Size(16, 16).Shrink(0) + ui.Icon(c, icons.Must("check")).Size(16, 16).Shrink(0).TextColor(k.AccentText) } }) }).Padding(d.Unit()) @@ -155,16 +174,22 @@ func listGrid[K comparable](c *ui.Context, s *ListState[K], n int, opts ListOpti } else { s.grid.Selection = nil } - // Chosen items take AccentText borders, legible on both surfaces. + // Chosen items take an AccentText ring over a Selection face. + k := Tokens(c) saved := c.Theme() t := *saved - t.Accent = Tokens(c).AccentText + t.Accent = k.AccentText c.SetTheme(&t) e := ui.GridView(c, &s.grid, n, w, h, func(i int) { - ui.Column(c).Grow(1).Padding(d.Unit() * 2).Gap(d.Unit()).Children(func() { + chosen := listChosen(s, opts, i) + face := ui.Column(c).Grow(1).Padding(d.Unit() * 2).Gap(d.Unit()).Radius(theme.ControlRadius) + if chosen { + face.Background(k.Selection) + } + face.Children(func() { item(i) - if listChosen(s, opts, i) { - ui.Icon(c, icons.Must("check")).Size(16, 16).Absolute().Top(d.Unit()).Right(d.Unit()) + if chosen { + ui.Icon(c, icons.Must("check")).Size(16, 16).Absolute().Top(d.Unit()).Right(d.Unit()).TextColor(k.AccentText) } }) }).Padding(d.Unit() * 2) @@ -172,6 +197,19 @@ func listGrid[K comparable](c *ui.Context, s *ListState[K], n int, opts ListOpti return e } +// dataSelectTheme shows MyGo's chosen rows as Selection with Text; spacing > 0 sets the unit. +func dataSelectTheme(c *ui.Context, spacing float32) func() { + k := Tokens(c) + saved := c.Theme() + t := *saved + t.Accent, t.AccentText = k.Selection, k.Text + if spacing > 0 { + t.Spacing = spacing + } + c.SetTheme(&t) + return func() { c.SetTheme(saved) } +} + func listChosen[K comparable](s *ListState[K], opts ListOptions[K], i int) bool { if opts.Multiple { return s.Selection.Has(opts.Key(i)) diff --git a/list_test.go b/list_test.go index d146136..a3eeacb 100644 --- a/list_test.go +++ b/list_test.go @@ -2,9 +2,13 @@ package mujica import ( "fmt" + "image/color" + "slices" "testing" "github.com/egoist/mygo/ui" + + "mujicaui/theme" ) type listHarness struct { @@ -213,3 +217,45 @@ func TestListSnapshot(t *testing.T) { }) }) } + +func TestListKeyFollowsLargeReorder(t *testing.T) { + h := newListHarness(5000) + tt := ui.NewTester(h.view, 400, 400) + if err := tt.Click("Item 3"); err != nil { + t.Fatal(err) + } + slices.Reverse(h.ids) + tt.Frame() + if k, ok := h.st.Selected(); !ok || k != 3 || h.st.cursor != 4996 { + t.Fatalf("after reversing: selected %d %v at row %d", k, ok, h.st.cursor) + } +} + +func TestListGridKeyFollowsInsert(t *testing.T) { + h := newListHarness(12) + h.opts.Grid = true + h.opts.ItemWidth, h.opts.ItemHeight = 80, 60 + h.listSize = [2]float32{380, 300} + tt := ui.NewTester(h.view, 420, 340) + if err := tt.Click("Item 2"); err != nil { + t.Fatal(err) + } + h.ids = append([]int{100}, h.ids...) + tt.Frame() + if k, _ := h.st.Selected(); k != 2 || h.st.cursor != 3 { + t.Fatalf("after insert: selected %d at %d", k, h.st.cursor) + } +} + +func TestListSelectionColors(t *testing.T) { + h := newListHarness(5) + tt := ui.NewTester(h.view, 400, 400) + if err := tt.Click("Item 1"); err != nil { + t.Fatal(err) + } + r, _ := tt.Find("Item 1") + got := color.RGBAModel.Convert(tt.Image().At(int(r.X+r.W-6), int(r.Y+r.H/2))).(color.RGBA) + if want := toRGBA(theme.Light().Selection); got != want { + t.Fatalf("selected row background %v, want Selection %v", got, want) + } +} diff --git a/messages_data.go b/messages_data.go index d5fe967..bdc75f2 100644 --- a/messages_data.go +++ b/messages_data.go @@ -10,6 +10,12 @@ func init() { "data_table.noMatch": {"No matching rows", "没有匹配的行"}, "data_table.selectRow": {"Select row", "选择行"}, "data_table.columns": {"Columns", "列"}, + "data_table.sortAsc": {"Sort %s ascending", "按%s升序排序"}, + "data_table.sortDesc": {"Sort %s descending", "按%s降序排序"}, + "data_table.moveLeft": {"Move %s left", "将%s左移"}, + "data_table.moveRight": {"Move %s right", "将%s右移"}, + "data_table.narrower": {"Make %s narrower", "减小%s列宽"}, + "data_table.wider": {"Make %s wider", "增大%s列宽"}, "timeline.done": {"Done", "已完成"}, "timeline.active": {"Current", "进行中"}, "timeline.warning": {"Warning", "警告"}, diff --git a/statistic.go b/statistic.go index 2530b5c..cee212c 100644 --- a/statistic.go +++ b/statistic.go @@ -43,10 +43,10 @@ func Statistic(c *ui.Context, value float64, opts StatisticOptions) *ui.Element e := ui.Column(c).Gap(u).Role(ui.RoleGroup) e.Children(func() { if opts.Title != "" { - ui.Text(c, opts.Title).FontSize(theme.CaptionSize).TextColor(k.TextMuted) + ui.Text(c, opts.Title).FontSize(FontSize(c, theme.CaptionSize)).TextColor(k.TextMuted) } ui.Row(c).Gap(u).AlignItems(ui.End).Children(func() { - ui.Text(c, num).Font(theme.SerifFont).FontSize(theme.H1Size).FontWeight(600).LineHeight(1.2).SingleLine() + ui.Text(c, num).Font(theme.SerifFont).FontSize(FontSize(c, theme.H1Size)).FontWeight(600).LineHeight(1.2).SingleLine() if opts.Unit != "" { ui.Text(c, opts.Unit).TextColor(k.TextMuted).Padding(0, 0, u, 0) } @@ -70,7 +70,7 @@ func Statistic(c *ui.Context, value float64, opts StatisticOptions) *ui.Element ui.Text(c, text).FontWeight(600).SingleLine() }) if opts.ChangeNote != "" { - ui.Text(c, opts.ChangeNote).FontSize(theme.CaptionSize).TextColor(k.TextMuted) + ui.Text(c, opts.ChangeNote).FontSize(FontSize(c, theme.CaptionSize)).TextColor(k.TextMuted) } }) }) diff --git a/statistic_test.go b/statistic_test.go index d72c92b..5bf9951 100644 --- a/statistic_test.go +++ b/statistic_test.go @@ -79,3 +79,18 @@ func TestStatisticSnapshot(t *testing.T) { }) }) } + +func TestStatisticTextScale(t *testing.T) { + var h float32 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).AlignItems(ui.Start).Children(func() { h = Statistic(c, 7, StatisticOptions{}).Bounds().H }) + }, 300, 300) + tt.Frame() + base := h + tt.SetPreferences(ui.Preferences{TextScale: 2}) + tt.Frame() + if h < base*1.8 { + t.Fatalf("height %v at 200%%, %v at 100%%", h, base) + } +} diff --git a/testdata/snapshots/darwin/data_table-dark.png b/testdata/snapshots/darwin/data_table-dark.png index df9f8dad5d513a22e9cb5dda1da22660c819ac59..cda8438da141680e2daab7123fae87b5d406a083 100644 GIT binary patch literal 14614 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

;0|y@gy5N4-3E$(ep?R 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 I!X)&60Z&~O*Z=?k diff --git a/testdata/snapshots/darwin/data_table-light.png b/testdata/snapshots/darwin/data_table-light.png index 49c7d33dee2aa1ccfc6595c5935813de2cf1df58..ee748c66bfea8f9d348f1dab6c96e19a8c8dbe1d 100644 GIT binary patch literal 14162 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 YX&bMpzwZuwHxPz`jLPe3DYJL~14aw~od5s; literal 18588 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%0DaN4LO;*Kv;7>D?JLA*$+gl%x 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 diff --git a/testdata/snapshots/darwin/tree-dark.png b/testdata/snapshots/darwin/tree-dark.png index 896dd199f70e5aa22fccee6bab261fb4bfeba5cf..e779595f35fb4464003fd7c4eafcdf6d24fea44f 100644 GIT binary patch delta 6846 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 delta 7043 zcmb_hXHXQ%vPKCKL_ocQ zmK>HG7Fg0g&b{}?`*~m0o2r?ruIiee?*8Vh?wK?dgvuxGd*0PNjf7CKhSKAB{0r~d zG2b1qsdQ7UIsMLe7bsEhg{d&35;ccnerMj}b~0;tZuC0^F5bUC14Mt8Ea%^Q!qIsM z(_oQ$^LL~2vvG0{d_#}SI4=f_i*1(qYLp>tL^}NXKFQquQ(d{4=LSd2 zdwQb}`)z$dGxQFG$XuE_v`Nh~jr-+(3@mjDR+j0;%pIXN-#s4E#Vw;H!<=)CBd7rb zNYQWY^8$UFhRcl;9ai!umWxE8z&xV1|82f1DVR(YikSPU#w-bN)Oddp&m$E19wnxr zOp()Mo$zc%OZu{>v#V0WygEX3dNSViMyCz=!`bwQklH$CD(=_1$jN!o4A zqdKKoNnE_3#FY$mG;YpDO_lj}99Q0dc4BmJd2{@=#l#gZ37 z{8*_PDmi9fA=37~BD?3WJ$w+=2PNW0uUS28mxK%Am2c4gma$$@D(zlYt^Q*IsoR{B zj^-T7u!Lq@Se71NC;iHuKT*J{b`wuuI*N)};1!->rzN4uT*lBi6;Rk9djf6aW#K=Y zkZG%_Jro!K#;zp3Ij_c4gc8Q#Bn49tg(6T+DTVpy93gj^U@1@iB3bEziMciG?R29% z#SR(T#xT@)?y5dg(a0IOpfuHp;~ z^EJKw0_rl++|Um}gV(Lea~63@ z8l@Cuhpt`l_wfx4qtAwA=8x?(SfLWo^RR3Ri^NCCE;RTYQq$VPP30l3=FZBu0-NQo zRnlWu-$_DseOb)vZB0~{2QXcMC~O2}J|$A0%+PzG>*Ok!7w&WEZYH_z_``AUw*#0r znb8$htNwKQ%H=I738Uc`HY(UW7m(fG5?kcR6I%NX!3{Ti6`)08Qc8=Mg!Z>Rx4j| zbBLS?Gn7)iv(87!iRB(&lW_9ALsV`^t15l=-hHTmH`x3JbPzhLx5Re^I{q=JLHPv7%(F1$ceC|k2SIow7@9b<8S4!Pi)ll!G zlbS}dSg&)}8h&4#z4fqq%RZy2;q2G;#>vyQj2e9Vev0?8QPvmYz}J`x2#XMMm2RLR zz9;t}mc6HgIBDf|(bRczq|I^p&hQwmaf*1{+edK@z5u3jD8=EP-~L!^J^dyG z6&-Gu5$xMEHa`KVrkKJ%Wa2X4^Si7%&QH-4j=;oOr?DtDEQcf!gK26Die!0Fr8M z{XdC^-}+E=ErzGc%Yo8ufarJ$m&NbO#d;ir|KiWkj~I$Td)CSEdZ9xI@ILq7K;l{| zPauEDL*;frey)Q&)aA&aL?PL*5{yX!yI-}u+6zR^&Y46bZG>o?O_3A2I*8}KmelVk z72k;hf%H%A!?{0YwTS#A`Z`(0pHsN=?e=ijm-p}E{@I<~c$tYXjY$)bkF?;GUHcGz zv7U%%`tJ&1E#kbisr*N5mn%-Q+JWy~PnH8Y;1`S8PkUAOq5Hzb9NylwpVz+DJE!Djl(fWTa0~!0_NhWx3>d*4fz?^w zK^dzSqQ79*M>|PuzCl|Y+x-K7K{!&KR|maSh_Q#Q-_0_s{x}kIFvc=c_oO!T*o6{R znpJ}UZZEH)d!AubH>>gDCdS4~&I%M{V9=iq80+L8FsSJus?6TSr89Rd1a{%QIkdaG zD!TrN~OG$hQ#)c@?gnRsSl zWo1r6`p$|B2}d2Szav!XoA#HsrM>C(}&5+1cE;w$Lg~|jw$@>uG95{Abe)=jd&G)0# zoR#Uh+|kcsEMZrAdca-m`%LBz|1t3&3r(hPlM}sIIk*!V);4Iw#Z*BWPe?ogH0Ys=*~zR2v+a31YGFXXInEFGca%Kc|;`= ze%#tRi3qki%HNvqa#rMg)<$!e8N&AaR^*x>F|m3So91sW^B$8qG@4OLO6t{g;@^qf z@|10_^uTM$nMUIig>Tzj@(|E^~LyQ zTY0Of=*>tBAVhwNN8yF zL2s<&L&fSy)e9yaUNFj_H=`FUp3}$t`IGw-ugwJcDwtF3Xh~;W)6P)Xy>Bh%;g>vt z^8KkP3C2u%I+|oo_}RYnJ6G4ESy;fcN~QX5{eF9|KyTi_L`d*{Rsp9$CaZhhu!EI= zaNbhlUnZd7NSa%!GKBop^Uq|5){(RR22(|E&o9SIYid?f*|@ z43MNB)(g$w-d?8q4{};d+H0&b8)F*$zOhjZfpzV-)9D%hiJG(H7`yB5g3aj2$m$<# z@x$l&x}}d*`xWGd8SbwP)A&F_de2t*39SAu*w!o6bVd3P7v!S1jg3uw-upVe;2t8U zA&WB}pBMEsZw=#4?Gpauq+<@jU&I2cq1N7Ta%&mJJhrclxcG0@w8}dCtzx-LZKAhd z24Ppg7TosCcdLajHBqa4x}Nv(!YGuA%MgZJ4$@8Lr6nchUE6Y&16w*cvt}>t6$vFC zKM%K(s+ppDuk>n9NMCSoOU@LU3lED3{FcU*=>egy+`C3WGHCm|75a)Ip6CP$-W9Cu zZqo%9a|YjB=~MzxSgcWlc*-43js?>4oFb|$MYJVk?tid?0Vx-7oYnfeW?cM~`tO%j zLs&zPKRpQ({3=vK&K4AOy~dE`?-{U9lTup{5}xVpvzEoCeP;AxB*9x|K8p%CRqM7i zj}I`WHb?!bJ7Z%i)LrQAV}nXvb0w>pw>mjm;^in8R2XA^V@|V{9NS_w6Em^jiU_d) zlbQx3l7)l%$jf2ACe2U6#rVSF1O%|N(K|VHY!fiB2ixtRX`hd7hp9%A_%vC4_~EDK zH5wK>7p2~JD0^>7a;3B0o5eLJF|%|R4I~z8=sRSk-v1T7hP^&Hgc>2E9%TiZJ$!g- z5lifsCK~7F@Ft-0^0ZN%(~||*vlw^fr1(9yK3T0$pu9xNYvrAN@qU}uqbKb^*sh9q zCU+vt^jn~&T3%;mlyuJfJrld39kTqGSbEaJzL^pEavtv!cTB6-W>~0yQ)602&Ay?& zs_DD;1uBqZ?5pe080cqGXXvP3YQ@)Z0<4nC&~~lC>rbdc!R@Q0whk3pyzq_H8UliZ z;^HayZuRUnD86T<2vbLH4rjJHuFk0yqIVl#)SGZsIKK=OMnX%CqeLk1hN<`}7JN2) zQvinC!`+{hJGS4NBIEsi6NUV)RwUAWh_vK{J)>zaPXY{J=-v7I;YT)8EsbzTYhb~M zVYg7V=;k$8wpQ)UUdKsHnylWr!)R8mwIc#qzn&a}D6-q0uc8cMSP*N=bV$Q!iIF(C$Pc;17|Q%HavIY0m`@+ZO6g`?Qc{a| zhWUoiTGH9!x0uCnNr~g9)YbvObjV3bYfhHY-^HNC=GGXYpR?wm5J$w>)u4!8>f&>dT?Kzt-K|B#&g@fiQ!gOckpKEik@;1{kqRn-tkwz-nPPtuYdjPiv_Po3*VRAeFLNIGXqAlg?P&w2=rKQyAs3uTi{$EMQsqvR%);kCan8|{ z0xbslOzb|zExLv1y4BgY{R5>`lUhd}we<~9YtgNuB0yxF(s=}GvPfxi)TD_Fzir>4$Y1PP%*)nvYn?UhVX}h@s*`u-d0rYhJBk zB1%fWt0bB{2!9aF?9-H2UvCS6a0NfvvRL^9-dM>x{PY1YxW@-);t7$LKfqaRen3HE zvNNKUnc5EM@Q8E;5W-I;KKZ9CxyiMe0TRnU%MM8yr4@7J__y9qF1v#4w^tG(4a+&i zUN8>!wO{{OHF`qe`7OUJuXJV};kU0`s5{{#_KJyop7piS)RIlpxKq8dLNU|I3+so| ztU9uYkJWP9&8Qtya>Y`8gN0_czZOu?jsgqZ&gAbeFW>*1=%V7g>}^ayO;5|n2?PlY z-wdRyL!PS$s-KXo?lns!R1Q5Mq0Jxv_%~BN%#5w zMFG32F8|{bnR$TFOJa_@%f-UNyYz*tt{t2|UE{lX+sbxu@$RH_j7~s+AUL=s{rUa= z{sY_1wfO4Ql>#t_>Rx(nYAPUVvekGQYpES{wtb}%f7e1eOL!|=E)M3W(3;czXi{F= zUT^T}g{`ewyhFNPfbi%a0n(s|(A!@G^3&<21LtSbL6}j6N0%&SS-jQ8h($1I-s$c< zqmHYhKR;*0*?TO4VeGSjfv4jPKa(^3O>U(`h*l0-Y-SXu$2E$a0|11{$sd{3yNqBh zDvgcP9$bP~$#Bo)vNd8YXwGk&-POMeZ7|nnOL7sH8-eaBQ3ibV zz`D~0F8I*cB38;_;%cVWQJq#Pb-qp7!?yG_cLj|^%gGsOta4JO(dlBCkgTBk56Pfw zcR||9+qu!v(c|5$Yg7dw^n-u!$h3g8m#mPuC0NsYOnYYg<;{areS3VGf(a+@W7795 zFHe`82zL#S?m*mJ&~DbqRgdB=Ja-SRp1-o@Cq=2H#hGJ*+HzuoNJl}_uw`UM0Qvc9~{ zcu{>&WkuHhdldWzJ#uI+<8H9fRj?VCo?iMi`e_-`s8s*uIVF^nt6dzYeLWff>cI3z zuqBS~_itq~8>46GzZuD~a}orMu~HrtkMKHrf8I3(c_R+gq}!( zkx=)VTPP$kQ~oHwV_##7g}ZrGd4T>ivMJ8h!gMOb3&L}3-;j__^{Uo6;h;i z`bh>@VlLdB86TZ%LeI!t4!H3v3sPO#nWsg~5$S<=FOHsLtnAHbnKPDvC zRw6FVfy;Gp7DA=~nf;~sJh%C}f_;}K-nizNZ>dIRW~Zr5Oaq~LC(#jASv=`%%ol-I z>jx()!q95&&bz+6J)wpB^zd*x5tp&B?7xRW){fOq^^-be%r@ByWe(ci_WChE?5DEq z>Gp+#G8;vGU?Cx+x_ZCkaqs2EBYs&1*D=I}(#W{Ee2~LU+wuZX1>4ijqwhRy zwB=&6s!6Q4fV8E;uEu860Pe!wHiub?c4-*JZ%V@=o4&U^0zNt(GViK>re}x~4yR1y zGsX0+1Skcf`iHL|I!Ctxwn7}-qJN+`=};9py_RO2&4zP+)f*5$LZzkZlC1n>Lr4!= zDG7=5Uq9}mTFwK|?hI^_ySGAqy7|5CY@eUd4IeWG*IAGApUsN(udL>iaGV4`KgZPf zH_GgLHYRqjyUl(F7b&i7Z%bOWU)*^ooLatH((Y6rrsY47bD%;z)AH1>iC;DEje&l) znp#%V4aJU>l#eEw3{F|EYzjGMON9!XlaP{X4!n}n0r3ND|OTrmZfeXggCHV~G>j(p6wP}X#F zkojR5tZZa-E-2|dV5e@G3tiqvK4GJ9caYI0c64(~5H?lOp^o1fyry_J`V|@}aVilV zh4OyMTsA9(dRAa+G8dmJsAoS|qFNnhKQl^!+6XPY?k664L%?30-5dQPzWc`y9{_@L^fURqCO@qg9n}nZR zFuL^n(cNtr5A^xM_#HK*lr%xDN#_dThq2UdQ~I>+kRAC@_0FIRA^4_N=NZJX987N1@KG z;e@CRdc`#e0lv1#*@HF2QUXVO)YQD(D{bFjwqt5wtLp~)bMUmm6sF5elA~(oI6e+| zKV~s2Rr>qQX);vBW#BV!thk?MFggptiwW(7gHX@*-|j%?o!>}xMP{rOuV!ne`uJ=K zH<;UHD_iCL17JW=6=UYm+};`ajv*-lhf#%(qE-wj?Z(=@QmNc^XLmO$i@sVv!*%PK zTI#!J+LVngmj;e!+3l`n8B(5VUO_CYWU(0NRE5UtgX?LlyO2Lr9Z*1q^@ zh7f+GgROnrmX}U)l-^A_aQ!;K+r~N@uz2Rdx+_;9EXg_?bAYAn#a{13$rx%mi2WF zJ3io#?22zAG3=8eAd1`09eE(JAotc>D_{EQn*QDdo1Mzz1nAV`{dDGjL+@rW?YK+GaApTpq@WewZ{~0A4PXr*UsQeTiA3HeGa~KQ{O3E z7YyI`uo6vkf2l*2U~f7;FcTq&_|@U?f+3c7WA_#WFx*(hR~S2`oMjCLAt3|ZS9ih( z!_h26SM)|ez>Nz^`ayao=&`kG1P@0FoI;o+ymt#@&cmaE9(EjO6!Ip&`zm6-18^7* z=$LfZ)CxsHdC2%Sy<#I~g&Bw2Ix_>pnXs80zMpqXje)n5W zO#Tk;N#$N}-VL9f401*Gug+|&`^;|e>fl9ZA!*C$@jsR0nh$5R9omPe;(f5P*u`WtN>cV{s-t{*x&#F diff --git a/testdata/snapshots/darwin/tree-light.png b/testdata/snapshots/darwin/tree-light.png index 159f119355ec795d0eaeb6adf100f82d297780af..3709e91613a3c13e2f8f41eb17e284c62df59069 100644 GIT binary patch delta 6608 zcmaKQcQjmG+kPTii0DL*LG&oW5G_$7N{rEhD2d(;qYX~NAb5}vL>mvH&FG90?a>J# zdPWVROSFv9=bPtU-yh%akKcRNb@tk8owN77_kCac+V|eywg1w7CwLuNBUC~GP`zH= zX!te`A`?3icw2A~8y^{;Y$&7FXKXp374sPE3w`S;0o5A-Jyft<8J2}VKaTa!^7OxL zr(dn}gPzSr+TGciE$_9KjHj__&qmJ}?Tb=wEojVbznSB6FJjZiVgsXrni2uFe2vZi z`u~Nw-Rr42yRX3MPT)~ncF>%aHN}ok%@x~@PxIcHwXF8$pHL~gy0L!2AUC&|smio? zbJu8d@5(eyaem~B`mzdw_hQ*|lzGL0|2d*{*N-gpDcZ>mM3 z{GjclYqZt>1;Bs##(Q1g%q%c?e=?HQC$+8_|s4Y4%_LXs~bFr*lQZ?J%zyyH{q)-<>N8?JkJs zGl1-W{4-GVs<1EFE~R$!t9AmQ9FAT-T+5^9GkV?tn6_($HF{VW*`m1NA8I|flFub^ z9y5J{BX;fXYn_LOw?EO)sxP(Tyc>lj^)Pi-l0`za<0iz?s*F8N@p_m*1=FFw%3qYt zT-Bj;<}$_#Z_0*fyNxVELl7A=~a*j~W(McAyc9Ekke5br9F-xYpjIvK2z&SDLb1rSII+ z(J{Ac5=mxg)<5tt=N?!x{?Ovxd4|=XPIO(XwKvSXgMaE-&hXOL{+}k9Wfbp7`>=O} zh=;VwiIfcIElEj9nAXqxA$RC*o+?otf_KBf7SxQg4&`k1FdVe&TRy*^j0_0?vj9jL zdng-#~PJTCE_E4hJM8bu%G+Ous?UR-BYu*Dska;kzL&+$Q7gwja28T z=_K9ZM}Gete$GXkia}$Bl6m~&$DYOBPP|E*&Bxj@!wo9Qe8+U}omC)V#X%mFMPzl~r>W7vbUDnSjgBc|cyC5hSN|;J~v6 zcMFArX=%}~@o|cPwR@{#HFR~qFqR;bgPwjrpg;r%l$gy>o}3REZsfCC<(mar`8_=$ zFG042kO+f}O-vC0jhov%h}g_J*clvzrM{KRNZN}}-J|(`b?5(T5UCE3-f7@^`gpe= z2-d<<5m_{`vv!XWf_O;ZrbD8?d?Ru7ql?VwOVrx>QTh3ig!ZNi-uCh7uC@Mzr^4J|YDrL7$I-80 zLWIbL4)0G+wwdatm|l6HT{2Vvg*;zVrUt*f?6~XfH5< zFTUu22yS=J#E9}6+;n(K4eb&}F}*~8$^b^6DMpOX&VK3XIhlAC7##c=z~haO@AC3S zFG8-Al$ymYD($76{b>@qyEG1ustogfTiV#n&dm*N&{|moK8RpxrD$#P$E|J7*viWL zQ8K#EGp<`+V|z_uuPR?{l%tsW;R7h`DHSDU036QD6rn|JW@^g8$>F_lhWo+)_O7Xz zxHkwnueyFuP!NPXtg=DuRDh3vC5SfJim)7SZf!kO8k3h3VWH_=@`y?|Tboj)zwKSBiK_I`dIx))<4Lc?*8 ziT?xyb=$I`K|w#Ad<9kT{)yn{!l>xz)9H$AfHfT1G=Ccoha=zR=2pbT9pr1)NEy~W zkd-|=JbW9cq*2O%v4|BwhK7cgnMfYjf{4-YmoH1o%Qy?=NJ>t~PA4zdi0{kH%@ z6MlE!q_N3Cp-zuRZ^GgDLA^3tR67p0K}isCj?T<{Zi}Lc`Dmc?tKxGu7_*?d4uFs= zF9DcK=*HTM6_~O++J_(M=~=v@uMthb%4TY5?4bHQS{tN#0cEo2XigdW^)?}q2qS=5 z;?I z_|ww*hv`w1%jWYR>`krwk|`3(M^E}4lg%UeyVn9q!D8%DMC-?Cff%Uqc>Mk~axxAN zFG=HP|KOPOW?Oegu%d?xw*+@~;^?6Jm-8R?Nb-^XVYApYvy8Dh@ zdBqlD{ajw-P_6y%HW)YGD+!)E?}pZz2rT0QEU3||3f=Dl8AEjsM&-Z?E2`I~PdXn0 zYCd}Vu%Kc>t&_MNYH+?r)#~trx9*l(X7ny-9*BB$PtF}GXOR1g5d;aScS{NkK9Omj zSZr4U)wTzQrt~{j z7o(bemsifYz{(GmxRu$0_@xjoe~#zpTT4rm_pgM%EO+~r=h)1XEQ-J~J@?X9A|-PR~Pb#-^r!;66N~QHdE( zNzqs2Ml$%L*m=1~V#%kXx#&Tjox|3@&=_ylLQDxi@1vy7mw>IU?XhDf3yE=)tZ-ldFdC}*wmd(HVLYE>S+!JAK0Ej0Y2R3t zeCcekXZic5MI54KW@~E&w(oN<>;HD*r;Le-k1wx~#5=y!hcZVOEX%#pd2&JnMBZi4 zNQC2YnVEPjT&J%OwRm*k^o@RrZ=cRmW$3GvgaI_ZCS^G2;*h5Yc= zgq4+9ghExzulvd}P|$XNx2BcT?-RnW+HEA(T6=*^MP*u$@7X{{up7V@wamxzeSDI; zh4=`t%d@$kyuc^GLTzi^9(HWgmzKaTmGg=pNgj4J78UzB_(fH8v{9k*ryRvNsi=od z^JBjcs$Y(Jm?m4gqHUaKsw9Jw7RT zXW?&!`;{ZX%oI{L?Q2HFy~%)T3bMz>-`;6W?3RdmY+ULTetegi-JkvJ z&ua=(=qhfx^NZ-RuXD`(+l$S(VO#|K0(D??(>gnQ4W_i<_PHSHolIhJN!8N$cP$3; zufz4oZYB5%kks3UZN%zPF1Y|53*#?ex}zs)_v5#lGSeE7t!*bY*mH+O+P}lZqd<^;O_3d{3d^34aO9Q#FQ|) zM@8K@{*@@&0*Oe1qhx}T-j99Te*HO%Q;ocg&YM6;M)&1E&aQU;tpR}j8-&YlUCt}m zNXfvniYw){-O`6l)LA2g_jCHSK@e%Jd&#ZwW`mA#S|o*xU~jVqz5iCCyv22AzU@Ik zUiuTtf#6JFzvn&sz$L_t=QKkkBSue*HA{cz9fcl*ii0@ZnRn`Tw_fk)A!Zzc!n5Y2Gah)Q%U zf>0Tq<^*>Vs;cv!P;YE+{@oF&nE?^uYzmO|X$eQ1G^kd_0)i4HMv_g(vEyY%-n!5A zWELNUbaEmZyynE%5(L0nYt=9=uIv;hXrT69CU|LL)>%x=(Uf%1G7=O#41STocDgLn zvq7tNv7cJYwdPV+OV1O3L?D=PT*TGXWQMLCni)ATR#SKys#sqfBP>>!-Wx1JmclNB zIeB@ZS=(F?Z*x--qN#vzp>mFq0lLYru%`0L(sQ20&=8@k>%}9cQTq04J7VLu z_>QL+9RCA1;1*M7b5EI<@CvH=3i7zq$E9{ZnlDetA)ibQNKIoGxRE+IklMn|4e(|D zzNMkpr(0BNCyDU!=Fj^%TNv@%C19e?UH zrELUj?(ct;y)bVnm^OysxDbwBKVy)E>V14_vUfS88*6QdS2{dmX8P81udZ52n_78& zfQPcRi^a@Ugtn8TL1Be$bLdJ$Vb3ESwfYAYRIP> z@ug6aV0+gE&3UQm$?={W0*o}|Syoo`Z3JRTpek`Yx1r&6Q57ROf9hbM&z!f+l)GV1 zOE9s}WN@UexaG&9V|jIqX3@5B*~2En{_X#vY@!QVLNfAyE|hE=%==2y4E2}*CDIw7U6W}<0GY{7$j`<|4lBhNu++~;7i@-pa6E1$aaX|TL^!b zjyyhOXL^j5?qdgX34Z30vMqk=K{36bDcw)?MMv$4`xrg7Xd zyK4;NcvBgz^~LGAQ+;Bm$@>I(I^?5A_V-#Otc`JWxlTtKUElRm4TS4YRr@&ztuBPu z#ISWlQtb8U=q?S1{A%M=7$+PEPwg@hGn14IG8JRBJ~4Wrq?DNvlwVO1C224Hkyw*i z*pcBI9DK6B{C)1LBoy(pW=s_fo|v7D=OHQ-nq!Ve?C$V!1qIl2Pq)j8r9HieVT-%y zSY`i@0ZaAruK1)R9<${154NqR8+`>UGqIGh^t%1kQA;oh2?>@N;3{A@SkC&RY7~8p zk+UP7KwnMqnxgs|+dpRys{j_L8|(&yrMz{l6?^Zx z@i4=%^RdI!lm#xf6usRx@HX7L5;YpDGdTk`su&CG_z@Y|RlOmQo2&3wVj_>CZ)tIH z(%ZiN{!}KrquJe^W?*n*b1b;Xq{!GN<0(DUSf@qOlOn2?&!59vFMSr=r}LsW#|m|? z=7d;TWsj#w!y>c1=0PJNARw@T9lfmlyR>|lr^p1jF*H5h*Y85x@8=aXx4N1Vt*fadE;bZhxzpo>l;D1HXQq|H@Q(^AEqM=*Z+` zeH8(ksH3Tc!?~=%w7W1eeh2+(O;b4sI|hjJDa5f36GW@$w<-d3dXc8WySF_xTekPs zd;UbUA26Eet5HV)vb(U%T1Vq?A$(1QAK5Vax!2mIlcYV zyat1z?Fal87uAoxS7VFTl5!WGEe013Pfe{2XBs4}3NraUg;|k0PE8eHjE;%zb(0qZLeaPg_)F+Fc>diKfeYn z)@E-TABo-F96V;&C&L|IMP zQP)|An?+htadLLHcq06MhIr58H@npTMvc}!{H8=V9~ISkhTS6JHzI9$*k=di-?1d@5j9zw3V(UGM8v*bRV2{u z#67`GeQ}(^SP<*cXcc+MwP=978*5c@#iK>`=JHp^RbuYz`*xK%?RHl^hGnJ|){P1R z0$2z{;3i|n<&{?;@*eNA>I@bZ7E9|HV+(P@eCyaajM19%-`QQ4pq#E7J(SM^?g@U9 zlV8}~<7f(Qm}31r$= zd4K+xo7>*(!r!f=@>4wtx1%3{R0pfr`uV-tx;Q;2T*7wP)VHoI*d%M4Og}!;8owch z!&Lemnt|#5`w41a#@s(%XgDV%gZ!`g*t*Yo~^cU3Sauda|yh z3MMi;OfaOeXhi&G{(H>TDDSB-$p5H>pidZBi!UvGbp|$Eko6A=n%JtJYdEd;C&|~I zmm+>&cNY)H@hy3pskMoBKEZc}~L>&;Urc1z3Q&Q~NM#gyjFE?^fKoomlbNmkHH z{bugA2KfzCRaQ1=ZJ8>Sbfug6ji1+OIynj(nPxI4Cv;yAZDB6gPCgB&ON1opr--Eq zjlNLtX~uR0x6b+HRAx*Z`APMT)Yk1vC}SGxOx#-{6#s&TeYg73=-(>jHiPB6;!EA* j7a(=3%;~{y-$r>2ju!_@_as5Dksdv5Bdtme`^f(R@e1YR delta 6557 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 YMeC&CnDdXApZ@@AN+88bd5fU`0xRuEkpKVy literal 9912 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 PwqU6%Yb#YKSbzE-)nSE} diff --git a/testdata/snapshots/darwin/tree_table-light.png b/testdata/snapshots/darwin/tree_table-light.png index 8d71e7bba583e3ff6ae2c24062b4d20865eef969..2ee1fb747f13a4db246a76f24d4d33c79625f166 100644 GIT binary patch literal 9909 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 diff --git a/timeline.go b/timeline.go index 115f077..745e51a 100644 --- a/timeline.go +++ b/timeline.go @@ -44,10 +44,10 @@ func Timeline(c *ui.Context, items []TimelineItem) *ui.Element { ui.Column(c).Grow(1).MinWidth(0).Gap(u).Padding(0, 0, u*5, 0).Children(func() { ui.Row(c).Gap(u * 2).AlignItems(ui.Center).Wrap().Children(func() { if it.Time != "" { - ui.Text(c, it.Time).FontSize(theme.CaptionSize).TextColor(k.TextMuted) + ui.Text(c, it.Time).FontSize(FontSize(c, theme.CaptionSize)).TextColor(k.TextMuted) } if w := timelineWord(c, it.Status); w != "" { - ui.Text(c, w).FontSize(theme.CaptionSize).TextColor(timelineColor(k, it.Status)).FontWeight(600) + ui.Text(c, w).FontSize(FontSize(c, theme.CaptionSize)).TextColor(timelineColor(k, it.Status)).FontWeight(600) } }) if it.Title != "" { diff --git a/tree.go b/tree.go index d659ceb..fb4796f 100644 --- a/tree.go +++ b/tree.go @@ -76,12 +76,34 @@ func (t *treeCore[K]) begin(label func(K) string, sel *ui.Selection[K], multiple } } -// end reads the chosen item after the outline was built. -func (t *treeCore[K]) end() { - t.has = t.cursor >= 0 && t.cursor < t.outline.Rows() - if t.has { - t.sel = t.outline.Item(t.cursor) +// end reads a new choice, or finds the chosen item again after rows moved. +func (t *treeCore[K]) end(c *ui.Context, changed bool) { + rows := t.outline.Rows() + at := t.cursor >= 0 && t.cursor < rows + if changed || !t.has { + t.has = at + if at { + t.sel = t.outline.Item(t.cursor) + } + return } + if at && t.outline.Item(t.cursor) == t.sel { + return + } + t.cursor = -1 + for i := range rows { + if t.outline.Item(i) == t.sel { + t.cursor = i + break + } + } + if t.cursor < 0 { + t.has = false + return + } + // The rows showed the old place: build them again at the new one. + c.Invalidate() + slog.Debug("mujica: tree selection moved", "row", t.cursor) } // chosen reports whether item shows as chosen. @@ -89,7 +111,7 @@ func (t *treeCore[K]) chosen(item K, sel *ui.Selection[K], multiple bool) bool { if multiple { return sel.Has(item) } - return t.cursor >= 0 && t.cursor < t.outline.Rows() && t.outline.Item(t.cursor) == item + return t.has && t.sel == item } // itemStatus asks for unloaded children of an open item and shows loading or failure. @@ -118,7 +140,7 @@ func (t *treeCore[K]) itemStatus(c *ui.Context, item K, status func(K) DataStatu case DataFailed: ui.Row(c).Gap(u).AlignItems(ui.Center).TextColor(k.Danger).Children(func() { ui.Icon(c, icons.Must("circle-alert")).Size(14, 14) - ui.Text(c, msg(c, "list.failed")).FontSize(theme.CaptionSize).SingleLine() + ui.Text(c, msg(c, "list.failed")).FontSize(FontSize(c, theme.CaptionSize)).SingleLine() }) if Button(c, msg(c, "list.retry"), ButtonOptions{Variant: Ghost}).MinHeight(theme.MinHitSize).Clicked() { slog.Debug("mujica: tree retry", "item", item) @@ -161,21 +183,23 @@ func Tree[K comparable](c *ui.Context, s *TreeState[K], opts TreeOptions[K]) Tre } // Outline rows pad by one unit above and below. h := d.ControlHeight() - 2*c.Theme().Space(1) + restore := dataSelectTheme(c, 0) e := ui.Outline(c, &t.outline, opts.Roots, opts.Children, func(item K) { ui.Row(c).Grow(1).MinWidth(0).MinHeight(h).Gap(u * 2).AlignItems(ui.Center).Children(func() { ui.Text(c, opts.Label(item)).SingleLine().Grow(1).MinWidth(0) t.itemStatus(c, item, opts.ItemStatus, opts.Load) if t.chosen(item, &s.Selection, opts.Multiple) { - ui.Icon(c, icons.Must("check")).Size(16, 16).Shrink(0) + ui.Icon(c, icons.Must("check")).Size(16, 16).Shrink(0).TextColor(k.AccentText) } }) }) + restore() e.Grow(1).MinHeight(0).Padding(u).Background(k.Surface).Border(theme.BorderWidth, k.Border).Radius(theme.ControlRadius) internal.Ring(e, k.Focus, theme.ControlRadius) v.changed, v.submitted = e.Changed(), e.Submitted() v.retry = dataFooter(c, opts.Status, opts.Error) }) - t.end() + t.end(c, v.changed) if v.changed { slog.Debug("mujica: tree changed", "row", t.cursor, "count", s.Selection.Len()) } diff --git a/tree_table.go b/tree_table.go index 43313bb..6f09ab3 100644 --- a/tree_table.go +++ b/tree_table.go @@ -29,8 +29,7 @@ type TreeColumn[K comparable] struct { type TreeTableOptions[K comparable] struct { Columns []TreeColumn[K] Roots []K - // Children returns an item's children: nil for a leaf, empty while unloaded; required. - // Return a new slice when they change: sorted copies are cached by slice. + // Children returns kids (nil leaf, empty unloaded); required; return a new slice on change. Children func(item K) []K // Label returns an item's text, read out and matched by typing; required. Label func(item K) string @@ -84,15 +83,15 @@ func TreeTable[K comparable](c *ui.Context, s *TreeTableState[K], opts TreeTable if s.sorted == nil { s.sorted = map[K]treeSorted[K]{} } - var cmp func(a, b K) int cols := make([]ui.TableColumn, len(opts.Columns)) + menu := make([]tableColumn, len(opts.Columns)) for i, col := range opts.Columns { cols[i] = ui.TableColumn{ID: col.ID, Title: col.Title, Width: col.Width, MinWidth: col.MinWidth, Align: col.Align, Sortable: col.Compare != nil} - if col.ID == s.Sort.Column && col.Compare != nil { - cmp = col.Compare - } + menu[i] = tableColumn{ID: col.ID, Title: col.Title, Width: col.Width, MinWidth: col.MinWidth, Sortable: col.Compare != nil} } - order := s.Sort + // The sort is read after the column menu, which may change it. + var cmp func(a, b K) int + var order ui.SortOrder sorted := func(src []K, cache *treeSorted[K]) []K { if cmp == nil || len(src) < 2 { return src @@ -120,20 +119,25 @@ func TreeTable[K comparable](c *ui.Context, s *TreeTableState[K], opts TreeTable s.sorted[item] = cache return out } + before := s.Sort var v DataTableView - v.Element = ui.Column(c).MinHeight(0) + v.Element = ui.Column(c).MinHeight(0).Gap(d.Unit() * 2) v.Children(func() { if len(opts.Roots) == 0 { v.retry = dataPlaceholder(c, opts.Status, opts.Error, opts.Empty, msg(c, "list.empty")) return } + ui.Row(c).Justify(ui.End).Children(func() { tableColumnMenu(c, menu, &s.Sort, &s.Layout, nil) }) + order = s.Sort + for _, col := range opts.Columns { + if col.ID == order.Column { + cmp = col.Compare + } + } roots := sorted(opts.Roots, &s.roots) - before := s.Sort + head := s.Sort t.outline.List.Sort, t.outline.List.Columns = &s.Sort, s.Layout - saved := c.Theme() - th := *saved - th.Spacing = d.ControlHeight() / 8 - c.SetTheme(&th) + restore := dataSelectTheme(c, d.ControlHeight()/8) e := ui.OutlineTable(c, &t.outline, cols, roots, children, func(item K, col int) { if col > 0 { opts.Columns[col].Cell(item) @@ -143,20 +147,20 @@ func TreeTable[K comparable](c *ui.Context, s *TreeTableState[K], opts TreeTable ui.Row(c).Grow(1).MinWidth(0).AlignItems(ui.Center).Children(func() { opts.Columns[0].Cell(item) }) t.itemStatus(c, item, opts.ItemStatus, opts.Load) if t.chosen(item, &s.Selection, opts.Multiple) { - ui.Icon(c, icons.Must("check")).Size(16, 16).Shrink(0) + ui.Icon(c, icons.Must("check")).Size(16, 16).Shrink(0).TextColor(k.AccentText) } }) }) - c.SetTheme(saved) + restore() e.Grow(1).MinHeight(0).Background(k.Surface).Border(theme.BorderWidth, k.Border).Radius(theme.ControlRadius) internal.Ring(e, k.Focus, theme.ControlRadius) s.Layout = t.outline.List.Columns - v.sorted = s.Sort != before - v.changed = e.Changed() && !v.sorted + v.changed = e.Changed() && s.Sort == head v.submitted = e.Submitted() v.retry = dataFooter(c, opts.Status, opts.Error) }) - t.end() + v.sorted = s.Sort != before + t.end(c, v.changed) if v.sorted { slog.Debug("mujica: tree_table sort", "column", s.Sort.Column, "descending", s.Sort.Descending) } diff --git a/tree_table_test.go b/tree_table_test.go index 1f4f02a..1013187 100644 --- a/tree_table_test.go +++ b/tree_table_test.go @@ -182,6 +182,7 @@ func TestTreeTableSnapshot(t *testing.T) { h.st.SetOpen("Vestry", true) h.st.Sort = ui.SortOrder{Column: "name"} h.st.tree.started, h.st.tree.cursor, h.st.tree.asked = true, 2, map[string]bool{} + h.st.tree.sel, h.st.tree.has = "Vestry", true return h }) (*h).c = c @@ -190,3 +191,56 @@ func TestTreeTableSnapshot(t *testing.T) { }) }) } + +func TestTreeTableSelectionFollowsLargeSort(t *testing.T) { + kids := make([]int, 3000) + for i := range kids { + kids[i] = i + 1 + } + var st TreeTableState[int] + view := func(c *ui.Context) { + Use(c, Settings{}) + TreeTable(c, &st, TreeTableOptions[int]{Roots: []int{0}, Label: strconv.Itoa, + Children: func(n int) []int { + if n == 0 { + return kids + } + return nil + }, + Columns: []TreeColumn[int]{{ID: "n", Title: "N", Cell: func(n int) { ui.Text(c, "#"+strconv.Itoa(n)) }, Compare: cmp.Compare[int]}}, + }).Size(320, 360) + } + st.SetOpen(0, true) + tt := ui.NewTester(view, 400, 400) + if err := tt.Click("#3"); err != nil { + t.Fatal(err) + } + st.Sort = ui.SortOrder{Column: "n", Descending: true} + tt.Frame() + if k, ok := st.Selected(); !ok || k != 3 || st.tree.outline.Item(st.tree.cursor) != 3 { + t.Fatalf("after sort: selected %d %v at row %d", k, ok, st.tree.cursor) + } +} + +func TestTreeTableColumnMenuKeyboard(t *testing.T) { + h := newTTHarness() + tt := ui.NewTester(h.view, 420, 480) + tabTo(t, tt, "Columns") + tt.Key(0, ui.KeyEnter) + tabTo(t, tt, "Sort Size ascending") + tt.Key(0, ui.KeyEnter) + if h.st.Sort != (ui.SortOrder{Column: "size"}) || h.sorts != 1 { + t.Fatalf("sort %+v sorts %d", h.st.Sort, h.sorts) + } + tabTo(t, tt, "Move Name right") + tt.Key(0, ui.KeyEnter) + tabTo(t, tt, "Make Name narrower") + tt.Key(0, ui.KeyEnter) + if fmt.Sprint(h.st.Layout.Order) != "[size name]" || h.st.Layout.Widths["name"] != 104 { + t.Fatalf("layout %+v", h.st.Layout) + } + tt.Key(0, ui.KeyEscape) + if got := h.order(tt); got != "[Belfry Organ Vestry]" { + t.Fatalf("rows not sorted by size: %s", got) + } +} diff --git a/tree_test.go b/tree_test.go index d258570..77354b2 100644 --- a/tree_test.go +++ b/tree_test.go @@ -2,9 +2,13 @@ package mujica import ( "fmt" + "image/color" + "slices" "testing" "github.com/egoist/mygo/ui" + + "mujicaui/theme" ) type treeHarness struct { @@ -185,8 +189,7 @@ func TestTreeLargeIsVirtualized(t *testing.T) { }}).Size(320, 360) } tt := ui.NewTester(view, 400, 400) - // Label runs twice per built row (row name and text). A jump builds a - // view on each side of its target: 2×10 rows of 36 DIPs, plus 2×2 overscan and 2 edges. + // Two Label calls per row; a jump builds 2×(10 rows + 2 overscan) + 2 edges. const bound = 2 * 26 if built == 0 || built > bound { t.Fatalf("collapsed: label calls %d, bound %d", built, bound) @@ -213,6 +216,7 @@ func TestTreeSnapshot(t *testing.T) { h.st.SetOpen("Crypt", true) h.status["Crypt"] = DataLoading h.st.tree.started, h.st.tree.cursor, h.st.tree.asked = true, 1, map[string]bool{} + h.st.tree.sel, h.st.tree.has = "Pulpit", true return h }) ui.Column(c).Padding(16).Children(func() { @@ -220,3 +224,31 @@ func TestTreeSnapshot(t *testing.T) { }) }) } + +func TestTreeSelectionFollowsLargeReorder(t *testing.T) { + roots := make([]int, 3000) + for i := range roots { + roots[i] = i + } + var st TreeState[int] + view := func(c *ui.Context) { + Use(c, Settings{Mode: Light}) + Tree(c, &st, TreeOptions[int]{Roots: roots, Children: func(int) []int { return nil }, + Label: func(n int) string { return fmt.Sprintf("Node %d", n) }}).Size(320, 360) + } + tt := ui.NewTester(view, 400, 400) + if err := tt.Click("Node 2"); err != nil { + t.Fatal(err) + } + r, _ := tt.Find("Node 2") + got := color.RGBAModel.Convert(tt.Image().At(int(r.X+r.W-6), int(r.Y+r.H/2))).(color.RGBA) + if want := toRGBA(theme.Light().Selection); got != want { + t.Fatalf("selected row background %v, want Selection %v", got, want) + } + roots = slices.Clone(roots) + slices.Reverse(roots) + tt.Frame() + if k, ok := st.Selected(); !ok || k != 2 || st.tree.cursor != 2997 { + t.Fatalf("after reversing: selected %d %v at row %d", k, ok, st.tree.cursor) + } +}

-yUu% zI77aVnvF(fyzX{~5QGv&_lt;c+#C}l1yg;IwnY->jf&ZJY0eTR)QNG17n(0YdM5;%KwV{CuVZ`D zh6;yRAA2fp&&hh=dftn6N0j!uaN ze9y&50RsH)TWWb6te$+H%PtRlQ@?(?rtVqkaNBl||NNpv@)YMM@MnBfQ zhM7)?-{>&Q2vTtY08Ys3pFEEVPLHE7b0>?CW6As-7vE;=>UoGpYx*3eQ4v((zPL&L zrV5*$nYkWL<04)&7UE)kPr1GSw`t>Q{P0k_Mwi*;@0VB|>dT88%j!kb?;OZ?r_(m| z3cgR>##iY?#Ov$l9|yXEyquOS0G|VYz3lA!JmOYluWwp9niJqL5+qdFa0#es>)6lz zaSy!Ob>YC+LPiGa)M`Oj7i~7f-Ny%3qg!5a zdSOnpC;YcTg>jwxIWv-hBo{uc#{SzJ}5LE z{*G+8rF%u-N^ma`NsD`5Uk@#Cl=!o^T9V%AW|cF^_~=*~zdImFPh_R9FBeXnp5o^^ zszj0=DHo7vPE zGf80A_?gx(kWyjn<*nABMTJ8}dU`r;sW#f(F;|)bTG~kLfCS2FMUhF3&cJ)JL*WY# zOPcDCpBZ67MKFxt(8g=gB#_`k&G87X%YB%bm}-b8mm6=&d!ti@up5kImB$DFEV1C6 z;-Puc*aIDGDA5q#XLM0m9WFB8296s4?X*hxdPf$Cw)*ualD$NLgM*#jQD5RrBt!AG zxZ50biWo>#(b81LA=Y&82(eT%234 zt{x~>y+i7G`J8TLEz=h}&J+g#hY3JsyM2d}qe9P^uf~wj*YVo2Xzu_7)>|$taisMM zpg_1C$}+-y2eOfl?x+6)rJwWJ-FS`3PxDK)Gcq!O_CG3{+chtVW3~*~9P=g@rlu|d z_QxYlO};lbk=o3k!ReP{@%bpfE>tI>$eT<^tOzWJ50iL5Cm#juuicApEj79Ld)#ah z*zxUkEj2O0y(fD-aO;GoSLrEn>=)#zbjDWOv+;Sw0Ai$EIQ>x^%mW*0%Ie_2m>*99 zlQfLGZKd6tOALKMZvUK`x-)+;mMtPf<}JyN;dx0FPfMCGy8#7dQ z_hH+dV0T~(3MUgb?(MLzCttn!1qDX4K99R3E0yMZOd~pIhb(JucxW~my3;#qM`NKl zVLVw3r}X9L6Q-pZlk>B`=F4Bgsb^aMszQ!ug$!4vhJ-OAJ7|_X5|L3nKT(MWwle8pY#-? z%YJWrSnhCabcvFIeXBxH5xmWup#wE--2s;eSjF5LVr3FuKGC^q#Ub9_uYP8yP_KZV z&)DLanojN#LkU6a-?j*^Flh2BY|(SOS)zM;`_eUP;3A8HaM>0n_%q?v;7C+=}~+3^SAcuTVICLC+KZ3ww{ln3Ku zy%gf!5ah|F^4Wn6@Urz?`=x(Oa`79k1|KhTHnT$h)# zGzD$Hu2)0n= zQSjLfxlpvHLl~NdLH)c(9W9t=IJv1!)Ri2<0h*?tyKPW5p@*L1@#f{yi5zz;cn7wb zKAZlBDd$WVvZvR-r-uKLA^z8!br@{n6hjOqO1?FH*pFQUm_tMWUlf6?HnM~!= zFHlYvKg@a4&bGHXL<|OFI-V=2PoEDq$31zqG&7=r7Uch&oC;;;kM6&Ax=6#H&wHzU z!V>up0skfCH=fX^xqoE(SC;xe=eB{`b54GHWC8=df>Jx&W7!=DsF2Jk{(t*#(LiVu z0c&Wr_P{?!1Yx?L%cu7V`Z{5d*uTMIn83gj{7-tsCm@1pWgb=bm7070M;bXPCCLhL Hlkfiqylx?b diff --git a/transfer.go b/transfer.go index 47a3fc1..3b300d9 100644 --- a/transfer.go +++ b/transfer.go @@ -43,8 +43,7 @@ type transferState struct { query [2]string } -// Transfer moves items between a source list and *target, the IDs chosen, in order. -// Each side has search, check boxes with select-all, and move buttons between them. +// Transfer moves items between a source list and *target, the chosen IDs in order. func Transfer(c *ui.Context, target *[]string, items []TransferItem, opts TransferOptions) TransferParts { byID := make(map[string]TransferItem, len(items)) for _, it := range items { @@ -158,6 +157,7 @@ func transferPanel(c *ui.Context, st *transferState, side int, title string, ite all := checked > 0 && checked == enabled box := ui.CheckboxBase(c, &all).Label(fmt.Sprintf(msg(c, "transfer.all"), title)).Disabled(enabled == 0) transferMark(c, box, all, checked > 0 && !all) + box.Description(transferPartial(c, checked, enabled)) if box.Changed() { for _, it := range shown { if !it.Disabled { @@ -166,7 +166,7 @@ func transferPanel(c *ui.Context, st *transferState, side int, title string, ite } } ui.Text(c, title).Font(theme.SerifFont).FontWeight(600).TextColor(k.Text).Grow(1) - ui.Text(c, fmt.Sprintf("%d / %d", checked, len(items))).TextColor(k.TextMuted).FontSize(theme.CaptionSize).FontFeatures("tnum") + ui.Text(c, fmt.Sprintf("%d / %d", checked, len(items))).TextColor(k.TextMuted).FontSize(FontSize(c, theme.CaptionSize)).FontFeatures("tnum") }) ui.Box(c).Padding(d.Unit() * 2).Children(func() { InputGroup(c, &st.query[side], InputGroupOptions{Placeholder: msg(c, "transfer.search"), Label: fmt.Sprintf(msg(c, "transfer.search_in"), title)}) @@ -202,6 +202,14 @@ func transferPanel(c *ui.Context, st *transferState, side int, title string, ite }) } +// transferPartial describes a select-all box that is neither clear nor full. +func transferPartial(c *ui.Context, checked, enabled int) string { + if checked == 0 || checked == enabled { + return "" + } + return fmt.Sprintf(msg(c, "transfer.partial"), checked, enabled) +} + // transferMark draws a check box's square inside box, which takes the focus ring. func transferMark(c *ui.Context, box *ui.Element, on, mixed bool) { k := Tokens(c) diff --git a/transfer_test.go b/transfer_test.go index fb366b0..427d4d2 100644 --- a/transfer_test.go +++ b/transfer_test.go @@ -104,3 +104,15 @@ func TestTransferSnapshot(t *testing.T) { }) }) } + +// MyGo's tester cannot read descriptions, so this checks the text the select-all box gets. +func TestTransferPartialDescription(t *testing.T) { + var got [3]string + ui.Render(func(c *ui.Context) { + Use(c, Settings{}) + got = [3]string{transferPartial(c, 2, 3), transferPartial(c, 3, 3), transferPartial(c, 0, 3)} + }, 100, 100, 1) + if got != [3]string{"2 of 3 selected", "", ""} { + t.Fatalf("descriptions %q", got) + } +} From 67be3e93849f062040bd1f6215b5ca0be4bbb8e0 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:40:11 -0400 Subject: [PATCH 3/8] Date & Time: review r1 fixes --- calendar.go | 12 +- date_picker.go | 27 +- date_range_picker.go | 18 +- date_time_picker.go | 55 ++-- datetime.go | 29 ++- datetime_grid.go | 32 ++- datetime_review_test.go | 236 ++++++++++++++++++ docs/components/051-calendar.md | 1 + docs/components/052-date-picker.md | 6 +- docs/components/053-date-range-picker.md | 2 + docs/components/054-time-picker.md | 6 +- docs/components/055-time-range-picker.md | 2 + docs/components/056-date-time-picker.md | 3 + docs/components/057-month-picker.md | 2 + docs/components/058-year-picker.md | 2 + examples/gallery/pages_datetime.go | 20 +- messages_datetime.go | 2 + month_picker.go | 6 +- .../snapshots/darwin/time_picker-dark.png | Bin 5336 -> 5251 bytes .../snapshots/darwin/time_picker-light.png | Bin 5060 -> 5066 bytes .../darwin/time_range_picker-dark.png | Bin 7143 -> 7150 bytes .../darwin/time_range_picker-light.png | Bin 6724 -> 6733 bytes time_picker.go | 232 ++++++++++------- time_picker_test.go | 2 +- time_range_picker.go | 44 ++-- year_picker.go | 7 +- 26 files changed, 570 insertions(+), 176 deletions(-) create mode 100644 datetime_review_test.go diff --git a/calendar.go b/calendar.go index b3ebeb2..7c96a59 100644 --- a/calendar.go +++ b/calendar.go @@ -12,8 +12,7 @@ import ( "mujicaui/theme" ) -// WeekStart is the first column of a month. The zero value follows the locale: -// Monday for zh-CN, Sunday for en-US. +// WeekStart is a month's first column; zero follows the locale. type WeekStart int const ( @@ -25,7 +24,7 @@ const ( // CalendarOptions configure a Calendar. type CalendarOptions struct { - // Min and Max bound the days that can be chosen; zero leaves a side open. + // Min and Max bound choosable days; zero is open. Min, Max Date // DisableDate marks single days that cannot be chosen. DisableDate func(Date) bool @@ -38,7 +37,6 @@ type CalendarOptions struct { } // Calendar shows one month and chooses a day into *value. -// Arrows move by day and week, PageUp/PageDown by month, Shift with them by year. func Calendar(c *ui.Context, value *Date, opts CalendarOptions) DateTimeResult { datetimeCheckDate("Calendar value", *value) datetimeCheckBounds("Calendar", opts.Min, opts.Max) @@ -115,7 +113,7 @@ func calendarSeek(d Date, dir int, enabled func(Date) bool) Date { return d } -// calendarMonth draws the month of *cursor and returns the day picked and the day hovered. +// calendarMonth draws *cursor's month; returns picked and hovered days. func calendarMonth(c *ui.Context, cursor *Date, cfg calendarConfig) (picked, hovered Date) { k := Tokens(c) d := Density(c) @@ -140,7 +138,7 @@ func calendarMonth(c *ui.Context, cursor *Date, cfg calendarConfig) (picked, hov if datetimeIconButton(c, "chevron-left", msg(c, "calendar.prev_month")).Clicked() { move(cur.AddMonths(-1), -1, false) } - ui.Text(c, title).Font(theme.SerifFont).FontSize(theme.BodySize + 2).Bold(). + ui.Text(c, title).Font(theme.SerifFont).FontSize(FontSize(c, theme.BodySize+2)).Bold(). TextColor(k.Text).Grow(1).TextAlign(ui.Center).SingleLine() if datetimeIconButton(c, "chevron-right", msg(c, "calendar.next_month")).Clicked() { move(cur.AddMonths(1), 1, false) @@ -154,7 +152,7 @@ func calendarMonth(c *ui.Context, cursor *Date, cfg calendarConfig) (picked, hov for i := range 7 { wd := (int(first) + i) % 7 ui.Text(c, msg(c, "calendar.weekday_"+strconv.Itoa(wd))).Width(cell).TextAlign(ui.Center). - FontSize(theme.CaptionSize).TextColor(k.TextMuted).Role(ui.RoleColumnHeader). + FontSize(FontSize(c, theme.CaptionSize)).TextColor(k.TextMuted).Role(ui.RoleColumnHeader). Label(msg(c, "calendar.weekday_long_"+strconv.Itoa(wd))) } }) diff --git a/date_picker.go b/date_picker.go index c17fe93..d0630a5 100644 --- a/date_picker.go +++ b/date_picker.go @@ -24,12 +24,13 @@ type DatePickerOptions struct { // Placeholder shows in the empty field; empty uses the built-in copy. Placeholder string Disabled bool + // ReadOnly keeps the text focusable and copyable but blocks edits and the popup. + ReadOnly bool // Label names the field for assistive technology. Label string } -// DatePicker is a typed date field with a calendar popup editing *value. -// Typed text commits on Enter or when the field loses focus; invalid text stays and is reported. +// DatePicker types or picks *value; invalid text is kept and reported. func DatePicker(c *ui.Context, value *Date, opts DatePickerOptions) DateTimeResult { datetimeCheckDate("DatePicker value", *value) datetimeCheckBounds("DatePicker", opts.Min, opts.Max) @@ -53,6 +54,13 @@ func DatePicker(c *ui.Context, value *Date, opts DatePickerOptions) DateTimeResu open := ui.Local(col, "date-picker-open", func() bool { return false }) cursor := ui.Local(col, "date-picker-cursor", func() Date { return Date{} }) wasFocused := ui.Local(col, "date-picker-focused", func() bool { return false }) + shownLayout := ui.Local(col, "date-picker-layout", func() string { return layout }) + if *shownLayout != layout { + if *text == Date.Format(*value, *shownLayout) || value.IsZero() && *text == "" { + *text = format(*value) + } + *shownLayout = layout + } if *seen != *value { *seen, *text, *problem = *value, format(*value), "" } @@ -96,23 +104,26 @@ func DatePicker(c *ui.Context, value *Date, opts DatePickerOptions) DateTimeResu } var field *ui.Element col.Children(func() { - field = datetimeField(c, ui.Row(c), *problem != "") + field = datetimeField(c, ui.Row(c), *problem != "", opts.ReadOnly) field.Children(func() { - in := ui.TextInputBase(c, text).Grow(1).Shrink(1).Placeholder(placeholder).FontFeatures("tnum") + in := textInputEditor(c, field, text, opts.ReadOnly, false).Grow(1).Shrink(1).Placeholder(placeholder).FontFeatures("tnum") label := opts.Label if label == "" { label = placeholder } in.Label(label).Error(*problem) focused := in.Focused() - if in.Submitted() || *wasFocused && !focused && *text != format(*value) { + if !opts.ReadOnly && (in.Submitted() || *wasFocused && !focused && *text != format(*value)) { submit() } *wasFocused = focused + if opts.ReadOnly { + return + } if opts.Clearable && !value.IsZero() && datetimeIconButton(c, "x", msg(c, "calendar.clear")).Clicked() { commit(Date{}, "clear") } - if datetimeIconButton(c, "calendar", msg(c, "date_picker.open")).Clicked() { + if datetimeIconButton(c, "calendar", msg(c, "date_picker.open")).Role(ui.RolePopUpButton).Clicked() { if *open { *open = false } else { @@ -120,10 +131,10 @@ func DatePicker(c *ui.Context, value *Date, opts DatePickerOptions) DateTimeResu } } }) - if !*open && (field.Shortcut(0, ui.KeyDown) || field.Shortcut(ui.Alt, ui.KeyDown)) { + if !*open && !opts.ReadOnly && (field.Shortcut(0, ui.KeyDown) || field.Shortcut(ui.Alt, ui.KeyDown)) { openAt() } - datetimePopup(c, field, open, func() { + datetimePopup(c, field, open, opts.ReadOnly, func() { picked, _ := calendarMonth(c, cursor, calendarConfig{ chosen: func(x Date) bool { return x == *value }, enabled: enabled, diff --git a/date_range_picker.go b/date_range_picker.go index 0ce0323..096e95b 100644 --- a/date_range_picker.go +++ b/date_range_picker.go @@ -37,12 +37,13 @@ type DateRangePickerOptions struct { // Today is marked in the calendar; zero uses the system clock. Today Date Disabled bool + // ReadOnly keeps the field focusable and copyable but blocks the popup. + ReadOnly bool // Label names the field for assistive technology. Label string } -// DateRangePicker edits *value in a popup: pick a start, preview the span, pick an end, then confirm. -// Clear empties the value; Escape, Cancel or a click outside discards the draft. +// DateRangePicker picks start and end; Confirm writes *value. func DateRangePicker(c *ui.Context, value *DateRange, opts DateRangePickerOptions) DateTimeResult { datetimeCheckDate("DateRangePicker Start", value.Start) datetimeCheckDate("DateRangePicker End", value.End) @@ -84,10 +85,10 @@ func DateRangePicker(c *ui.Context, value *DateRange, opts DateRangePickerOption } var field *ui.Element col.Children(func() { - field = datetimeField(c, ui.Row(c), false) + field = datetimeField(c, ui.Row(c), *problem != "", opts.ReadOnly) field.Children(func() { - t := datetimeTrigger(c, text, msg(c, "date_range_picker.placeholder"), "calendar").Label(label).Description(text) - if t.Clicked() || !*open && t.Shortcut(0, ui.KeyDown) { + t := datetimeTrigger(c, text, msg(c, "date_range_picker.placeholder"), "calendar").Label(label).Description(text).Error(*problem) + if !opts.ReadOnly && (t.Clicked() || !*open && t.Shortcut(0, ui.KeyDown)) { *open = !*open if *open { *draft, *problem, *hover = *value, "", Date{} @@ -99,9 +100,9 @@ func DateRangePicker(c *ui.Context, value *DateRange, opts DateRangePickerOption } } }) - datetimePopup(c, field, open, func() { + datetimePopup(c, field, open, opts.ReadOnly, func() { ui.Text(c, dateRangeSummary(c, *draft, layout)).TextColor(k.TextMuted). - FontSize(theme.CaptionSize).FontFeatures("tnum").Role(ui.RoleStatus) + FontSize(FontSize(c, theme.CaptionSize)).FontFeatures("tnum").Role(ui.RoleStatus) end := draft.End if end.IsZero() && !draft.Start.IsZero() { end = *hover @@ -144,6 +145,9 @@ func DateRangePicker(c *ui.Context, value *DateRange, opts DateRangePickerOption cancelled = true } *wasOpen = *open + if !*open { + *problem = "" + } return DateTimeResult{Element: col, changed: changed, cancelled: cancelled} } diff --git a/date_time_picker.go b/date_time_picker.go index b5c60ce..9e7c482 100644 --- a/date_time_picker.go +++ b/date_time_picker.go @@ -12,8 +12,10 @@ import ( // DateTimePickerOptions configure a DateTimePicker. type DateTimePickerOptions struct { - // Location is the time zone the user edits in. Required. + // Location is the time zone the user edits in; required. Location *time.Location + // Layout is the Go layout of the date part; empty uses 2006-01-02. + Layout string // Min and Max bound the instant; zero leaves a side open. Min, Max time.Time Seconds bool @@ -23,12 +25,13 @@ type DateTimePickerOptions struct { // Today is marked in the calendar; zero uses the system clock. Today Date Disabled bool + // ReadOnly keeps the field focusable and copyable but blocks the popup. + ReadOnly bool // Label names the field for assistive technology. Label string } -// DateTimePicker edits *value as a date and a wall-clock time in opts.Location, confirmed together. -// Times a DST change skips or repeats are reported, never shifted. +// DateTimePicker edits *value as wall time in opts.Location. func DateTimePicker(c *ui.Context, value *time.Time, opts DateTimePickerOptions) DateTimeResult { loc := opts.Location if loc == nil { @@ -56,7 +59,11 @@ func DateTimePicker(c *ui.Context, value *time.Time, opts DateTimePickerOptions) clock := ui.Local(col, "date-time-clock", func() TimeOfDay { return TimeOfDay{} }) cursor := ui.Local(col, "date-time-cursor", func() Date { return Date{} }) problem := ui.Local(col, "date-time-error", func() string { return "" }) - format := func(t time.Time) string { return dateTimeText(c, t.In(loc), cfg) } + typedBad := ui.Local(col, "date-time-typed-bad", func() bool { return false }) + if opts.Layout == "" { + opts.Layout = "2006-01-02" + } + format := func(t time.Time) string { return dateTimeText(c, t.In(loc), opts.Layout, cfg) } changed, cancelled, done := false, false, false label := opts.Label if label == "" { @@ -67,10 +74,10 @@ func DateTimePicker(c *ui.Context, value *time.Time, opts DateTimePickerOptions) text = format(*value) } col.Children(func() { - field := datetimeField(c, ui.Row(c), false) + field := datetimeField(c, ui.Row(c), *problem != "", opts.ReadOnly) field.Children(func() { - t := datetimeTrigger(c, text, msg(c, "date_time_picker.placeholder"), "calendar").Label(label).Description(text) - if t.Clicked() || !*open && t.Shortcut(0, ui.KeyDown) { + t := datetimeTrigger(c, text, msg(c, "date_time_picker.placeholder"), "calendar").Label(label).Description(text).Error(*problem) + if !opts.ReadOnly && (t.Clicked() || !*open && t.Shortcut(0, ui.KeyDown)) { *open = !*open if *open { *day, *clock, *problem = today, TimeOfDay{}, "" @@ -83,7 +90,7 @@ func DateTimePicker(c *ui.Context, value *time.Time, opts DateTimePickerOptions) } } }) - datetimePopup(c, field, open, func() { + datetimePopup(c, field, open, opts.ReadOnly, func() { picked, _ := calendarMonth(c, cursor, calendarConfig{ chosen: func(x Date) bool { return x == *day }, enabled: calendarEnabled(lo, hi, nil), @@ -94,11 +101,17 @@ func DateTimePicker(c *ui.Context, value *time.Time, opts DateTimePickerOptions) if !picked.IsZero() { *day, *problem = picked, "" } + bad := "" ui.Row(c).Gap(d.Unit() * 2).AlignItems(ui.Center).Children(func() { - if _, edited := timeEditor(c, clock, cfg); edited { - *problem = "" + cfg.problem = *problem + _, edited, b := timeEditor(c, clock, cfg) + switch { + case b != "": + *problem, *typedBad, bad = b, true, b + case edited || *typedBad: + *problem, *typedBad = "", false } - ui.Text(c, loc.String()).FontSize(theme.CaptionSize).TextColor(k.TextMuted) + ui.Text(c, loc.String()).FontSize(FontSize(c, theme.CaptionSize)).TextColor(k.TextMuted) }) datetimeError(c, *problem) datetimeFooter(c, func() { @@ -107,6 +120,9 @@ func DateTimePicker(c *ui.Context, value *time.Time, opts DateTimePickerOptions) } if Button(c, msg(c, "calendar.confirm"), ButtonOptions{}).Clicked() { at, p := dateTimeConfirm(c, *day, *clock, loc, opts, cfg) + if bad != "" { + p = bad + } *problem = p if p == "" { if !at.Equal(*value) { @@ -124,6 +140,9 @@ func DateTimePicker(c *ui.Context, value *time.Time, opts DateTimePickerOptions) cancelled = true } *wasOpen = *open + if !*open { + *problem = "" + } return DateTimeResult{Element: col, changed: changed, cancelled: cancelled} } @@ -132,7 +151,7 @@ func dateTimeConfirm(c *ui.Context, d Date, t TimeOfDay, loc *time.Location, opt if p := timePickerProblem(c, t, cfg); p != "" { return time.Time{}, p } - wall := fmt.Sprintf("%v %s", d, timeText(c, t, cfg)) + wall := d.Format(opts.Layout) + " " + timeText(c, t, cfg) at, n := dateTimeResolve(d, t, loc) switch { case n == 0: @@ -142,14 +161,14 @@ func dateTimeConfirm(c *ui.Context, d Date, t TimeOfDay, loc *time.Location, opt slog.Debug("mujica: date_time_picker ambiguous", "wall", wall, "zone", loc.String()) return at, fmt.Sprintf(msg(c, "date_time_picker.ambiguous"), wall, loc.String()) case !opts.Min.IsZero() && at.Before(opts.Min): - return at, fmt.Sprintf(msg(c, "calendar.before_min"), dateTimeText(c, opts.Min.In(loc), cfg)) + return at, fmt.Sprintf(msg(c, "calendar.before_min"), dateTimeText(c, opts.Min.In(loc), opts.Layout, cfg)) case !opts.Max.IsZero() && at.After(opts.Max): - return at, fmt.Sprintf(msg(c, "calendar.after_max"), dateTimeText(c, opts.Max.In(loc), cfg)) + return at, fmt.Sprintf(msg(c, "calendar.after_max"), dateTimeText(c, opts.Max.In(loc), opts.Layout, cfg)) } return at, "" } -// dateTimeResolve finds the instants showing wall time d t in loc: none in a DST gap, two in an overlap. +// dateTimeResolve counts instants for a wall time: 0 gap, 2 overlap. func dateTimeResolve(d Date, t TimeOfDay, loc *time.Location) (time.Time, int) { wall := time.Date(d.Year, d.Month, d.Day, t.Hour, t.Minute, t.Second, 0, time.UTC) guess := time.Date(d.Year, d.Month, d.Day, t.Hour, t.Minute, t.Second, 0, loc) @@ -175,7 +194,7 @@ func dateTimeResolve(d Date, t TimeOfDay, loc *time.Location) (time.Time, int) { return hits[0], len(hits) } -// dateTimeText formats a wall time with the picker's clock style. -func dateTimeText(c *ui.Context, w time.Time, cfg timeConfig) string { - return DateOf(w).String() + " " + timeText(c, TimeOfDay{w.Hour(), w.Minute(), w.Second()}, cfg) + " " + w.Format("MST") +// dateTimeText formats a wall time with the picker's date layout and clock style. +func dateTimeText(c *ui.Context, w time.Time, layout string, cfg timeConfig) string { + return w.Format(layout) + " " + timeText(c, TimeOfDay{w.Hour(), w.Minute(), w.Second()}, cfg) + " " + w.Format("MST") } diff --git a/datetime.go b/datetime.go index 9da7642..e258df2 100644 --- a/datetime.go +++ b/datetime.go @@ -2,6 +2,7 @@ package mujica import ( "fmt" + "log/slog" "time" "github.com/egoist/mygo/ui" @@ -11,8 +12,7 @@ import ( "mujicaui/theme" ) -// Date is a calendar day with no time of day and no location. -// The zero value means no date. +// Date is a calendar day without clock or location; zero means none. type Date struct { Year int Month time.Month @@ -136,28 +136,33 @@ func datetimeIconButton(c *ui.Context, icon, label string) *ui.Element { } // datetimeField styles row as a single-line field: solid fill and fine border. -func datetimeField(c *ui.Context, row *ui.Element, invalid bool) *ui.Element { +func datetimeField(c *ui.Context, row *ui.Element, invalid, readOnly bool) *ui.Element { k := Tokens(c) d := Density(c) - border := k.ControlBorder + bg, border := k.Surface, k.ControlBorder switch { case invalid: border = k.Danger + case readOnly: + bg, border = k.Background, k.Border case row.FocusWithin(): border = k.Focus case row.Hovered(): border = k.Text } return row.MinHeight(d.ControlHeight()).Padding(0, d.Unit()).PaddingX(d.Unit()*3).Gap(d.Unit()). - AlignItems(ui.Center).Radius(theme.ControlRadius).Background(k.Surface).Border(theme.BorderWidth, border) + AlignItems(ui.Center).Radius(theme.ControlRadius).Background(bg).Border(theme.BorderWidth, border) } -// datetimeTrigger is the button inside a field that shows text and opens a popup. +// datetimeTrigger is the popup button inside a field; Cmd+C copies its text. func datetimeTrigger(c *ui.Context, text, placeholder, icon string) *ui.Element { k := Tokens(c) b := ui.ButtonBase(c).Grow(1).Shrink(1).Justify(ui.Start).Gap(Density(c).Unit() * 2). - MinHeight(theme.MinHitSize).Radius(theme.ControlRadius) + MinHeight(theme.MinHitSize).Radius(theme.ControlRadius).Role(ui.RolePopUpButton) internal.Ring(b, k.Focus, theme.ControlRadius) + if b.Shortcut(ui.Cmd, ui.KeyC) && text != "" { + c.WriteClipboard(text) + } b.Children(func() { ui.Icon(c, icons.Must(icon)).Size(16, 16).TextColor(k.TextMuted) if text == "" { @@ -169,10 +174,14 @@ func datetimeTrigger(c *ui.Context, text, placeholder, icon string) *ui.Element return b } -// datetimePopup shows fn in a popup panel below anchor while *open is set. -func datetimePopup(c *ui.Context, anchor *ui.Element, open *bool, fn func()) *ui.Element { +// datetimePopup shows fn below anchor while *open; a disabled or read-only anchor closes it. +func datetimePopup(c *ui.Context, anchor *ui.Element, open *bool, readOnly bool, fn func()) *ui.Element { k := Tokens(c) d := Density(c) + if *open && (readOnly || anchor.IsDisabled()) { + slog.Debug("mujica: datetime popup closed by state", "readOnly", readOnly) + *open = false + } return ui.PopoverBase(c, anchor, open, func(panel *ui.Element) { born := ui.Local(panel, "datetime-born", func() bool { return true }) if *born { @@ -192,7 +201,7 @@ func datetimeError(c *ui.Context, text string) { if text == "" { return } - ui.Text(c, text).FontSize(theme.CaptionSize).TextColor(Tokens(c).Danger).Role(ui.RoleStatus) + ui.Text(c, text).FontSize(FontSize(c, theme.CaptionSize)).TextColor(Tokens(c).Danger).Role(ui.RoleStatus) } // datetimeFooter lays out popup actions at the end of a row. diff --git a/datetime_grid.go b/datetime_grid.go index 7cb7c48..7c35d05 100644 --- a/datetime_grid.go +++ b/datetime_grid.go @@ -39,7 +39,7 @@ func datetimeGrid(c *ui.Context, cursor *int, cfg datetimeGridConfig) (picked in if datetimeIconButton(c, "chevron-left", cfg.prev).Clicked() { *cursor, *keyed = *cursor-cfg.page, false } - ui.Text(c, cfg.title(start)).Font(theme.SerifFont).FontSize(theme.BodySize + 2).Bold(). + ui.Text(c, cfg.title(start)).Font(theme.SerifFont).FontSize(FontSize(c, theme.BodySize+2)).Bold(). TextColor(k.Text).Grow(1).TextAlign(ui.Center).SingleLine() if datetimeIconButton(c, "chevron-right", cfg.next).Clicked() { *cursor, *keyed = *cursor+cfg.page, false @@ -61,10 +61,9 @@ func datetimeGrid(c *ui.Context, cursor *int, cfg datetimeGridConfig) (picked in case cells.Shortcut(0, ui.KeyPageDown): *cursor += cfg.page case cells.Shortcut(0, ui.KeyHome): - *cursor, _ = cfg.pageOf(*cursor) + *cursor, _ = datetimeGridBounds(*cursor, cfg) case cells.Shortcut(0, ui.KeyEnd): - s, n := cfg.pageOf(*cursor) - *cursor = s + n - 1 + _, *cursor = datetimeGridBounds(*cursor, cfg) default: moved = false } @@ -145,33 +144,46 @@ func datetimeGridCell(c *ui.Context, o, start, cursor int, cfg datetimeGridConfi return cell.Clicked() && enabled } +// datetimeGridBounds returns the page's own first and last ordinals. +func datetimeGridBounds(o int, cfg datetimeGridConfig) (first, last int) { + start, n := cfg.pageOf(o) + first, last = start, start+n-1 + for first < last && cfg.muted(first, start) { + first++ + } + for last > first && cfg.muted(last, start) { + last-- + } + return first, last +} + // datetimeGridField is the field and popup shared by MonthPicker and YearPicker. type datetimeGridField struct { text, placeholder, label string clearable, hasValue bool - disabled bool + disabled, readOnly bool // home is the ordinal the popup opens on. home int } -// datetimeGridPicker draws f and its popup grid; it returns the column, a picked ordinal and whether Clear was pressed. +// datetimeGridPicker draws f and its popup; reports a pick or clear. func datetimeGridPicker(c *ui.Context, f datetimeGridField, cfg datetimeGridConfig) (col *ui.Element, picked int, ok, cleared bool) { d := Density(c) col = ui.Column(c).Width(d.ControlHeight() * 6).Gap(d.Unit()).AlignItems(ui.Stretch).Disabled(f.disabled) open := ui.Local(col, "datetime-grid-open", func() bool { return false }) cursor := ui.Local(col, "datetime-grid-cursor", func() int { return 0 }) col.Children(func() { - field := datetimeField(c, ui.Row(c), false) + field := datetimeField(c, ui.Row(c), false, f.readOnly) field.Children(func() { t := datetimeTrigger(c, f.text, f.placeholder, "calendar").Label(f.label).Description(f.text) - if t.Clicked() || !*open && t.Shortcut(0, ui.KeyDown) { + if !f.readOnly && (t.Clicked() || !*open && t.Shortcut(0, ui.KeyDown)) { *open, *cursor = !*open, f.home } - if f.clearable && f.hasValue && datetimeIconButton(c, "x", msg(c, "calendar.clear")).Clicked() { + if f.clearable && f.hasValue && !f.readOnly && datetimeIconButton(c, "x", msg(c, "calendar.clear")).Clicked() { cleared = true } }) - datetimePopup(c, field, open, func() { + datetimePopup(c, field, open, f.readOnly, func() { cfg.autoFocus = true if picked, ok = datetimeGrid(c, cursor, cfg); ok { *open = false diff --git a/datetime_review_test.go b/datetime_review_test.go new file mode 100644 index 0000000..a995fbf --- /dev/null +++ b/datetime_review_test.go @@ -0,0 +1,236 @@ +package mujica + +import ( + "image/color" + "testing" + "time" + + "github.com/egoist/mygo/ui" + + "mujicaui/theme" +) + +// datePickerLive builds a DatePicker whose options a test changes between frames. +func datePickerLive(value *Date, opts *DatePickerOptions, changes *int) *ui.Tester { + return ui.NewTester(func(c *ui.Context) { + Use(c, Settings{Mode: Light}) + ui.Column(c).Padding(16).Gap(8).Children(func() { + o := *opts + o.Today, o.Label = calendarToday, "Due" + if DatePicker(c, value, o).Changed() { + *changes++ + } + }) + }, 420, 460) +} + +func TestDatePickerDisablingClosesPopup(t *testing.T) { + v, n := Date{2026, time.October, 5}, 0 + opts := DatePickerOptions{} + tt := datePickerLive(&v, &opts, &n) + _ = tt.Click("Open calendar") + day := datetimeTestLabel(oct(5)) + if !tt.Focused(day) { + t.Fatal("setup: the popup should focus the chosen day") + } + opts.Disabled = true + tt.Frame() + tt.Key(0, ui.KeyRight) + tt.Key(0, ui.KeyEnter) + _ = tt.Click(datetimeTestLabel(oct(20))) + if v != oct(5) || n != 0 { + t.Fatalf("disabled picker committed %v (%d events)", v, n) + } + if tt.HasText("October 2026") || tt.Focused(datetimeTestLabel(oct(6))) || tt.Focused("Due") { + t.Fatal("the popup should close and nothing in the disabled picker keep focus") + } +} + +func TestDatePickerDisabledBlocksInput(t *testing.T) { + v, n := Date{2026, time.October, 5}, 0 + tt := datePickerTester(&v, DatePickerOptions{Label: "Due", Disabled: true}, &n) + _ = tt.Click("Due") + tt.Type("2027-01-01") + tt.Key(0, ui.KeyEnter) + tt.Key(0, ui.KeyDown) + _ = tt.Click("Open calendar") + if v != oct(5) || n != 0 || tt.Focused("Due") || tt.HasText("October 2026") { + t.Fatalf("disabled picker took input: %v (%d)", v, n) + } +} + +func TestTimePickerKeepsInvalidHour(t *testing.T) { + v, n := TimeOfDay{9, 30, 0}, 0 + tt := timePickerTester(&v, TimePickerOptions{}, &n) + _ = tt.Click("Alarm: Hours") + tt.Key(0, ui.Key2) + tt.Key(0, ui.Key9) + if v != (TimeOfDay{2, 30, 0}) || n != 1 { + t.Fatalf("first digit should apply: %v", v) + } + if !tt.HasText("29") || !tt.HasText("Hours must be from 0 to 23.") || !tt.Focused("Alarm: Hours") { + t.Fatalf("29 should stay shown with an error: %v", tt.Texts()) + } + tt.Key(0, ui.Key1) + tt.Key(0, ui.Key5) + if v != (TimeOfDay{15, 30, 0}) || n != 3 || tt.HasText("Hours must be") { + t.Fatalf("fixing the hour: %v", v) + } +} + +func TestTimeSegmentDescription(t *testing.T) { + var got []string + ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + got = []string{timeSegmentDescription(c, timeHourPart, " 9", 1, 12), timeSegmentDescription(c, timePeriodPart, "PM", 0, 59)} + }, 100, 100) + if got[0] != "9, from 1 to 12" || got[1] != "PM" { + t.Fatalf("descriptions %q", got) + } +} + +func TestTimePickerSegmentFocusRing(t *testing.T) { + v := TimeOfDay{9, 30, 0} + tt := timePickerTester(&v, TimePickerOptions{}, new(int)) + tt.SetPreferences(ui.Preferences{ReduceMotion: true, TextScale: 1}) + tt.Key(0, ui.KeyTab) + r, ok := tt.Find("Alarm: Hours") + if !ok || !tt.Focused("Alarm: Hours") { + t.Fatal("setup: hours not focused") + } + want := theme.Light().Focus + img := tt.Image() + found := false + for dy := float32(-4); dy <= -2 && !found; dy++ { + c := img.RGBAAt(int(r.X+r.W/2), int(r.Y+dy)) + found = datetimeNear(c, want) + } + if !found { + t.Fatal("no focus ring above the focused segment") + } +} + +func datetimeNear(c color.RGBA, w ui.Color) bool { + d := func(a, b uint8) int { + if a > b { + return int(a - b) + } + return int(b - a) + } + return d(c.R, w.R)+d(c.G, w.G)+d(c.B, w.B) < 60 +} + +func TestDatePickerLayoutChangeReformats(t *testing.T) { + v, n := Date{2026, time.October, 5}, 0 + opts := DatePickerOptions{} + tt := datePickerLive(&v, &opts, &n) + opts.Layout = "02/01/2006" + tt.Frame() + _ = tt.Click("Due") + tt.Key(0, ui.KeyEnter) + if v != oct(5) || n != 0 || tt.HasText("Enter a date like") { + t.Fatalf("committed text kept the old layout: %v", tt.Texts()) + } + _ = tt.Click("Due") + tt.Command("selectAll") + tt.Type("12/10") + opts.Layout = "2006-01-02" + tt.Frame() + tt.Key(0, ui.KeyEnter) + if !tt.HasText("Enter a date like 2026-10-05.") || v != oct(5) { + t.Fatal("a draft being edited should be kept across a layout change") + } +} + +func TestYearPickerHomeEndStayOnPage(t *testing.T) { + v := 2026 + tt := yearPickerTester(&v, YearPickerOptions{}, new(int)) + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyDown) + tt.Key(0, ui.KeyHome) + if !tt.HasText("2020 – 2029") || !tt.Focused("2020") { + t.Fatalf("Home left the page: %v", tt.Texts()[:4]) + } + tt.Key(0, ui.KeyEnd) + if !tt.HasText("2020 – 2029") || !tt.Focused("2029") { + t.Fatal("End left the page") + } +} + +func TestDatePickerReadOnly(t *testing.T) { + v, n := Date{2026, time.October, 5}, 0 + tt := datePickerTester(&v, DatePickerOptions{Label: "Due", ReadOnly: true, Clearable: true}, &n) + _ = tt.Click("Due") + if !tt.Focused("Due") { + t.Fatal("read-only field should take focus") + } + tt.Command("selectAll") + tt.Command("copy") + if tt.Clipboard() != "2026-10-05" { + t.Fatalf("copied %q", tt.Clipboard()) + } + tt.Type("2027-01-01") + tt.Key(0, ui.KeyEnter) + tt.Key(0, ui.KeyDown) + if v != oct(5) || n != 0 || tt.HasText("October 2026") || tt.HasText("Open calendar") || tt.HasText("Clear") { + t.Fatalf("read-only picker changed: %v %v", v, tt.Texts()) + } + tt.Key(0, ui.KeyTab) + tt.Key(ui.Shift, ui.KeyTab) + tt.Command("selectAll") + tt.Command("copy") + if tt.Clipboard() != "2026-10-05" { + t.Fatalf("typed text leaked into the field: %q", tt.Clipboard()) + } +} + +func TestTimePickerReadOnly(t *testing.T) { + v, n := TimeOfDay{9, 30, 0}, 0 + tt := timePickerTester(&v, TimePickerOptions{ReadOnly: true}, &n) + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyUp) + tt.Key(0, ui.Key1) + tt.Key(ui.Alt, ui.KeyDown) + if !tt.Focused("Alarm: Hours") || v != (TimeOfDay{9, 30, 0}) || n != 0 || tt.HasText("Choose time") { + t.Fatalf("read-only time changed: %v", v) + } + tt.Key(ui.Cmd, ui.KeyC) + if tt.Clipboard() != "09:30" { + t.Fatalf("copied %q", tt.Clipboard()) + } +} + +func TestMonthPickerReadOnly(t *testing.T) { + v, n := YearMonth{2026, time.May}, 0 + tt := monthPickerTester(&v, MonthPickerOptions{ReadOnly: true, Clearable: true}, &n) + _ = tt.Click("Billing month") + tt.Key(0, ui.KeyDown) + if tt.HasText("January") || tt.HasText("Clear") || !tt.Focused("Billing month") { + t.Fatalf("read-only month opened: %v", tt.Texts()) + } + tt.Key(ui.Cmd, ui.KeyC) + if tt.Clipboard() != "May 2026" || v != (YearMonth{2026, time.May}) || n != 0 { + t.Fatalf("copied %q, value %v", tt.Clipboard(), v) + } +} + +func TestDateTimePickerLayout(t *testing.T) { + v := time.Time{} + n, x := 0, 0 + maxT := time.Date(2026, time.October, 10, 12, 0, 0, 0, time.UTC) + tt := dateTimeTester(t, &v, DateTimePickerOptions{Location: time.UTC, Max: maxT, Layout: "02/01/2006"}, &n, &x) + _ = tt.Click("Meeting") + _ = tt.Click(datetimeTestLabel(oct(10))) + _ = tt.Click("Time: Hours") + tt.Key(0, ui.Key1) + tt.Key(0, ui.Key3) + _ = tt.Click("Confirm") + if n != 0 || !tt.HasText("Choose 10/10/2026 12:00 UTC or earlier.") { + t.Fatalf("error ignores the layout: %v", tt.Texts()) + } + _ = tt.Click(datetimeTestLabel(oct(9))) + _ = tt.Click("Confirm") + if n != 1 || !tt.HasText("09/10/2026 13:00 UTC") { + t.Fatalf("display ignores the layout: %v", tt.Texts()) + } +} diff --git a/docs/components/051-calendar.md b/docs/components/051-calendar.md index 72d7a72..c891a73 100644 --- a/docs/components/051-calendar.md +++ b/docs/components/051-calendar.md @@ -53,3 +53,4 @@ ui.Render(view, 400, 300, 1) - MyGo 的 `ui.Calendar` 固定周一起始、只有英文且不支持禁用日期(ui/date.go:85-160),因此本组件基于 `RadioBase` 自绘网格,不复用 `ui.Calendar`。 - 日期与时间值不带时区:`Date`、`YearMonth`、`TimeOfDay` 只保存日历字段,组件内部计算不做 UTC 转换。 - `Today` 为零值时读取 `c.Now()`(系统本地时区);需要固定“今天”(测试、跨时区应用)时显式传入。 +- 无障碍:MyGo v0.2.10 没有公开设置弹出按钮展开状态(`expanded`)、数值范围(`hasRange`/`accRange`)与值(`accValue`)的接口,这些字段只在 MyGo 内部组件中赋值(ui/element.go:286-295,例如 ui/base.go:297、ui/indicators.go:61)。因此触发器只能声明为 `RolePopUpButton` 而无法报告展开状态;时间段以 `Description` 读出当前值与范围,错误通过 `Error()` 关联。 diff --git a/docs/components/052-date-picker.md b/docs/components/052-date-picker.md index 4a7b7a4..0a3352c 100644 --- a/docs/components/052-date-picker.md +++ b/docs/components/052-date-picker.md @@ -33,12 +33,13 @@ ui.Render(view, 400, 300, 1) | `Today` | `Date` | 零值(系统时钟) | 弹层日历中的今日标记;空值时弹层打开到此月份。 | | `Clearable` | `bool` | false | 显示清空按钮;清空输入后提交表示“无日期”。 | | `Placeholder` | `string` | 内置“选择日期” | 空输入框的占位文字。 | +| `ReadOnly` | `bool` | false | 只读:可聚焦、可复制(Cmd/Ctrl+C),不能修改,不打开弹层。 | | `Disabled` | `bool` | false | 禁用输入与弹层。 | | `Label` | `string` | 占位文字 | 辅助技术名称。 | ## 状态 -默认、悬停(边框加深)、聚焦(焦点色边框)、错误(危险色边框 + 下方说明,输入保留)、禁用。弹层内日历状态同 Calendar。 +默认、悬停(边框加深)、聚焦(焦点色边框)、只读(背景与边框减弱,可选择复制)、错误(危险色边框 + 下方说明,输入保留)、禁用。弹层内日历状态同 Calendar。 ## 事件 @@ -54,6 +55,7 @@ ui.Render(view, 400, 300, 1) - 无效或越界的输入(如 2026-02-30)显示具体错误并保留原文,不会被修正为相邻日期。 - MyGo 的 `ui.DateInput` 固定格式且不可键入(ui/date.go:13),因此本组件组合 `TextInputBase` 与自绘日历弹层(`PopoverBase`)。 -- 暂不提供只读模式:MyGo v0.2.10 未公开 TextInputBase 的只读开关。 +- 只读模式沿用 TextInput 的做法:编辑副本并在每帧恢复,文本仍可选择与复制。 - 日期与时间值不带时区:`Date`、`YearMonth`、`TimeOfDay` 只保存日历字段,组件内部计算不做 UTC 转换。 - `Today` 为零值时读取 `c.Now()`(系统本地时区);需要固定“今天”(测试、跨时区应用)时显式传入。 +- 无障碍:MyGo v0.2.10 没有公开设置弹出按钮展开状态(`expanded`)、数值范围(`hasRange`/`accRange`)与值(`accValue`)的接口,这些字段只在 MyGo 内部组件中赋值(ui/element.go:286-295,例如 ui/base.go:297、ui/indicators.go:61)。因此触发器只能声明为 `RolePopUpButton` 而无法报告展开状态;时间段以 `Description` 读出当前值与范围,错误通过 `Error()` 关联。 diff --git a/docs/components/053-date-range-picker.md b/docs/components/053-date-range-picker.md index f400753..9a50075 100644 --- a/docs/components/053-date-range-picker.md +++ b/docs/components/053-date-range-picker.md @@ -30,6 +30,7 @@ ui.Render(view, 400, 300, 1) | `DisableDate` | `func(Date) bool` | nil | 不可选日期;范围内包含此类日期时拒绝并提示。 | | `WeekStart` | `WeekStart` | `WeekStartLocale` | 周起始日。 | | `Today` | `Date` | 零值(系统时钟) | 今日标记与空值时的起始月份。 | +| `ReadOnly` | `bool` | false | 只读:可聚焦、可复制(Cmd/Ctrl+C),不能修改,不打开弹层。 | | `Disabled` | `bool` | false | 禁用。 | | `Label` | `string` | 内置“日期范围” | 辅助技术名称。 | @@ -55,3 +56,4 @@ ui.Render(view, 400, 300, 1) - `DateRange` 为闭区间,`Days()` 计入两端。 - 日期与时间值不带时区:`Date`、`YearMonth`、`TimeOfDay` 只保存日历字段,组件内部计算不做 UTC 转换。 - `Today` 为零值时读取 `c.Now()`(系统本地时区);需要固定“今天”(测试、跨时区应用)时显式传入。 +- 无障碍:MyGo v0.2.10 没有公开设置弹出按钮展开状态(`expanded`)、数值范围(`hasRange`/`accRange`)与值(`accValue`)的接口,这些字段只在 MyGo 内部组件中赋值(ui/element.go:286-295,例如 ui/base.go:297、ui/indicators.go:61)。因此触发器只能声明为 `RolePopUpButton` 而无法报告展开状态;时间段以 `Description` 读出当前值与范围,错误通过 `Error()` 关联。 diff --git a/docs/components/054-time-picker.md b/docs/components/054-time-picker.md index 3740297..0014447 100644 --- a/docs/components/054-time-picker.md +++ b/docs/components/054-time-picker.md @@ -30,12 +30,13 @@ ui.Render(view, 400, 300, 1) | `SecondStep` | `int` | 0(即 1) | 秒步长,必须整除 60。 | | `Min` | `TimeOfDay` | 00:00:00 | 最早时间。 | | `Max` | `TimeOfDay` | 零值(即 23:59:59) | 最晚时间。 | +| `ReadOnly` | `bool` | false | 只读:可聚焦、可复制(Cmd/Ctrl+C),不能修改,不打开弹层。 | | `Disabled` | `bool` | false | 禁用。 | | `Label` | `string` | 空 | 组名;各段名称为“Label: 时/分/秒”。 | ## 状态 -默认、悬停、聚焦段(酒红填充)、错误(危险色边框 + 说明,草稿保留)、禁用。弹层列表中超出范围的项禁用。 +默认、悬停、聚焦段(酒红填充 + 键盘焦点环)、只读、错误(危险色边框 + 说明,草稿保留)、禁用。弹层列表中超出范围的项禁用。 ## 事件 @@ -52,8 +53,9 @@ ui.Render(view, 400, 300, 1) ## 限制 -- 超出范围或不符合步长的时间会提示,不会被自动夹取或取整。 +- 超出范围或不符合步长的时间会提示,不会被自动夹取或取整;键入超出段范围的数字(如小时 29)会保留显示并报错。 - 段顺序固定为“时:分:秒 上午/下午”,zh-CN 下上午/下午也位于末尾。 - MyGo 的 `ui.TimeInput` 只有时分且无 12 小时制、步长和范围(ui/timeinput.go:18),因此本组件自绘分段。 - 日期与时间值不带时区:`Date`、`YearMonth`、`TimeOfDay` 只保存日历字段,组件内部计算不做 UTC 转换。 - `Today` 为零值时读取 `c.Now()`(系统本地时区);需要固定“今天”(测试、跨时区应用)时显式传入。 +- 无障碍:MyGo v0.2.10 没有公开设置弹出按钮展开状态(`expanded`)、数值范围(`hasRange`/`accRange`)与值(`accValue`)的接口,这些字段只在 MyGo 内部组件中赋值(ui/element.go:286-295,例如 ui/base.go:297、ui/indicators.go:61)。因此触发器只能声明为 `RolePopUpButton` 而无法报告展开状态;时间段以 `Description` 读出当前值与范围,错误通过 `Error()` 关联。 diff --git a/docs/components/055-time-range-picker.md b/docs/components/055-time-range-picker.md index 377fe2e..4aac9bf 100644 --- a/docs/components/055-time-range-picker.md +++ b/docs/components/055-time-range-picker.md @@ -31,6 +31,7 @@ ui.Render(view, 400, 300, 1) | `Min` | `TimeOfDay` | 00:00:00 | 两端最早时间。 | | `Max` | `TimeOfDay` | 零值(即 23:59:59) | 两端最晚时间。 | | `AllowOvernight` | `bool` | false | 允许结束早于开始,表示次日结束,并显示“次日”。 | +| `ReadOnly` | `bool` | false | 只读:可聚焦、可复制(Cmd/Ctrl+C),不能修改,不打开弹层。 | | `Disabled` | `bool` | false | 禁用。 | | `Label` | `string` | 空 | 整组名称。 | @@ -53,3 +54,4 @@ ui.Render(view, 400, 300, 1) - `TimeRange.Overnight()` 报告是否跨午夜。 - 日期与时间值不带时区:`Date`、`YearMonth`、`TimeOfDay` 只保存日历字段,组件内部计算不做 UTC 转换。 - `Today` 为零值时读取 `c.Now()`(系统本地时区);需要固定“今天”(测试、跨时区应用)时显式传入。 +- 无障碍:MyGo v0.2.10 没有公开设置弹出按钮展开状态(`expanded`)、数值范围(`hasRange`/`accRange`)与值(`accValue`)的接口,这些字段只在 MyGo 内部组件中赋值(ui/element.go:286-295,例如 ui/base.go:297、ui/indicators.go:61)。因此触发器只能声明为 `RolePopUpButton` 而无法报告展开状态;时间段以 `Description` 读出当前值与范围,错误通过 `Error()` 关联。 diff --git a/docs/components/056-date-time-picker.md b/docs/components/056-date-time-picker.md index b6dcb14..d2a7efa 100644 --- a/docs/components/056-date-time-picker.md +++ b/docs/components/056-date-time-picker.md @@ -29,6 +29,7 @@ ui.Render(view, 400, 300, 1) | 字段 | 类型 | 默认值 | 含义 | | --- | --- | --- | --- | | `Location` | `*time.Location` | 必填 | 用户编辑所用时区;为 nil 时 panic。 | +| `Layout` | `string` | `2006-01-02` | 日期部分的 Go 时间布局,用于显示与错误说明。 | | `Min` | `time.Time` | 零值 | 最早时刻。 | | `Max` | `time.Time` | 零值 | 最晚时刻。 | | `Seconds` | `bool` | false | 显示秒。 | @@ -36,6 +37,7 @@ ui.Render(view, 400, 300, 1) | `MinuteStep` | `int` | 0(即 1) | 分钟步长。 | | `WeekStart` | `WeekStart` | `WeekStartLocale` | 周起始日。 | | `Today` | `Date` | 零值(系统时钟) | 今日标记与空值时的默认日期。 | +| `ReadOnly` | `bool` | false | 只读:可聚焦、可复制(Cmd/Ctrl+C),不能修改,不打开弹层。 | | `Disabled` | `bool` | false | 禁用。 | | `Label` | `string` | 内置占位文字 | 辅助技术名称。 | @@ -60,3 +62,4 @@ ui.Render(view, 400, 300, 1) - 空值(零 `time.Time`)打开时默认今天 00:00。 - 日期与时间值不带时区:`Date`、`YearMonth`、`TimeOfDay` 只保存日历字段,组件内部计算不做 UTC 转换。 - `Today` 为零值时读取 `c.Now()`(系统本地时区);需要固定“今天”(测试、跨时区应用)时显式传入。 +- 无障碍:MyGo v0.2.10 没有公开设置弹出按钮展开状态(`expanded`)、数值范围(`hasRange`/`accRange`)与值(`accValue`)的接口,这些字段只在 MyGo 内部组件中赋值(ui/element.go:286-295,例如 ui/base.go:297、ui/indicators.go:61)。因此触发器只能声明为 `RolePopUpButton` 而无法报告展开状态;时间段以 `Description` 读出当前值与范围,错误通过 `Error()` 关联。 diff --git a/docs/components/057-month-picker.md b/docs/components/057-month-picker.md index c0eb9e5..1a701c1 100644 --- a/docs/components/057-month-picker.md +++ b/docs/components/057-month-picker.md @@ -29,6 +29,7 @@ ui.Render(view, 400, 300, 1) | `DisableMonth` | `func(YearMonth) bool` | nil | 不可选月份。 | | `Clearable` | `bool` | false | 有值时显示清空按钮。 | | `Today` | `Date` | 零值(系统时钟) | 标记当前月份。 | +| `ReadOnly` | `bool` | false | 只读:可聚焦、可复制(Cmd/Ctrl+C),不能修改,不打开弹层。 | | `Disabled` | `bool` | false | 禁用。 | | `Label` | `string` | 内置“选择月份” | 辅助技术名称。 | @@ -53,3 +54,4 @@ ui.Render(view, 400, 300, 1) - 键盘移到不可选月份时焦点保持在原处,可继续移动。 - 日期与时间值不带时区:`Date`、`YearMonth`、`TimeOfDay` 只保存日历字段,组件内部计算不做 UTC 转换。 - `Today` 为零值时读取 `c.Now()`(系统本地时区);需要固定“今天”(测试、跨时区应用)时显式传入。 +- 无障碍:MyGo v0.2.10 没有公开设置弹出按钮展开状态(`expanded`)、数值范围(`hasRange`/`accRange`)与值(`accValue`)的接口,这些字段只在 MyGo 内部组件中赋值(ui/element.go:286-295,例如 ui/base.go:297、ui/indicators.go:61)。因此触发器只能声明为 `RolePopUpButton` 而无法报告展开状态;时间段以 `Description` 读出当前值与范围,错误通过 `Error()` 关联。 diff --git a/docs/components/058-year-picker.md b/docs/components/058-year-picker.md index 2ff6c6f..2b10e5a 100644 --- a/docs/components/058-year-picker.md +++ b/docs/components/058-year-picker.md @@ -29,6 +29,7 @@ ui.Render(view, 400, 300, 1) | `DisableYear` | `func(int) bool` | nil | 不可选年份。 | | `Clearable` | `bool` | false | 有值时显示清空按钮。 | | `Today` | `Date` | 零值(系统时钟) | 标记当前年份。 | +| `ReadOnly` | `bool` | false | 只读:可聚焦、可复制(Cmd/Ctrl+C),不能修改,不打开弹层。 | | `Disabled` | `bool` | false | 禁用。 | | `Label` | `string` | 内置“选择年份” | 辅助技术名称。 | @@ -53,3 +54,4 @@ ui.Render(view, 400, 300, 1) - 只支持公元 1 年及以后;值为负数时 panic。 - 日期与时间值不带时区:`Date`、`YearMonth`、`TimeOfDay` 只保存日历字段,组件内部计算不做 UTC 转换。 - `Today` 为零值时读取 `c.Now()`(系统本地时区);需要固定“今天”(测试、跨时区应用)时显式传入。 +- 无障碍:MyGo v0.2.10 没有公开设置弹出按钮展开状态(`expanded`)、数值范围(`hasRange`/`accRange`)与值(`accValue`)的接口,这些字段只在 MyGo 内部组件中赋值(ui/element.go:286-295,例如 ui/base.go:297、ui/indicators.go:61)。因此触发器只能声明为 `RolePopUpButton` 而无法报告展开状态;时间段以 `Description` 读出当前值与范围,错误通过 `Error()` 关联。 diff --git a/examples/gallery/pages_datetime.go b/examples/gallery/pages_datetime.go index 07f6b8c..f547335 100644 --- a/examples/gallery/pages_datetime.go +++ b/examples/gallery/pages_datetime.go @@ -35,7 +35,7 @@ var datetimePages = []page{ func dtSection(c *ui.Context, title string, fn func()) { k := mujica.Tokens(c) ui.Column(c).Gap(8).Children(func() { - ui.Text(c, title).Font(theme.SerifFont).FontSize(theme.H3Size).TextColor(k.Text) + ui.Text(c, title).Font(theme.SerifFont).FontSize(mujica.FontSize(c, theme.H3Size)).TextColor(k.Text) fn() }) } @@ -46,7 +46,7 @@ func dtStates(c *ui.Context, fn func(state func(name string, body func()))) { ui.Row(c).Gap(24).Wrap().AlignItems(ui.Start).Children(func() { fn(func(name string, body func()) { ui.Column(c).Gap(6).AlignItems(ui.Start).Children(func() { - ui.Text(c, name).FontSize(theme.CaptionSize).TextColor(k.TextMuted) + ui.Text(c, name).FontSize(mujica.FontSize(c, theme.CaptionSize)).TextColor(k.TextMuted) body() }) }) @@ -128,6 +128,9 @@ func dtDatePickerDemo(c *ui.Context, log func(string)) { log("DatePicker (bounded) changed: " + s.b.String()) } }) + state("Read-only", func() { + mujica.DatePicker(c, &s.d, mujica.DatePickerOptions{Label: "Signed on", Layout: layout, ReadOnly: true}) + }) state("Disabled", func() { mujica.DatePicker(c, &s.d, mujica.DatePickerOptions{Label: "Locked", Layout: layout, Disabled: true}) }) @@ -202,6 +205,11 @@ func dtTimePickerDemo(c *ui.Context, log func(string)) { log("TimePicker (bounded) changed: " + s.b.String()) } }) + state("Read-only", func() { + o := base + o.Label, o.ReadOnly = "Logged at", true + mujica.TimePicker(c, &s.a, o) + }) state("Disabled", func() { o := base o.Label, o.Disabled = "Locked", true @@ -261,7 +269,7 @@ func dtDateTimeDemo(c *ui.Context, log func(string)) { } k := mujica.Tokens(c) ui.Text(c, "Try 2026-03-08 02:30 in America/New_York: the picker reports the DST gap."). - FontSize(theme.CaptionSize).TextColor(k.TextMuted) + FontSize(mujica.FontSize(c, theme.CaptionSize)).TextColor(k.TextMuted) }) } @@ -288,6 +296,9 @@ func dtMonthDemo(c *ui.Context, log func(string)) { log("MonthPicker changed: " + s.v.String()) } }) + state("Read-only", func() { + mujica.MonthPicker(c, &s.v, mujica.MonthPickerOptions{Label: "Closed month", ReadOnly: true}) + }) state("Disabled", func() { mujica.MonthPicker(c, &s.v, mujica.MonthPickerOptions{Label: "Locked", Disabled: true}) }) @@ -311,6 +322,9 @@ func dtYearDemo(c *ui.Context, log func(string)) { log(fmt.Sprintf("YearPicker changed: %d", s.v)) } }) + state("Read-only", func() { + mujica.YearPicker(c, &s.v, mujica.YearPickerOptions{Label: "Founded", ReadOnly: true}) + }) state("Disabled", func() { mujica.YearPicker(c, &s.v, mujica.YearPickerOptions{Label: "Locked", Disabled: true}) }) diff --git a/messages_datetime.go b/messages_datetime.go index 1d44b95..2b4dd2d 100644 --- a/messages_datetime.go +++ b/messages_datetime.go @@ -63,6 +63,8 @@ func init() { "time_picker.open": {"Choose time", "选择时间"}, "time_picker.minute_step": {"Minutes must be a multiple of %d.", "分钟须为 %d 的倍数。"}, "time_picker.second_step": {"Seconds must be a multiple of %d.", "秒须为 %d 的倍数。"}, + "time_picker.segment": {"%[1]s, from %[2]d to %[3]d", "%[1]s,范围 %[2]d–%[3]d"}, + "time_picker.part_range": {"%[1]s must be from %[2]d to %[3]d.", "%[1]s须在 %[2]d 至 %[3]d 之间。"}, "time_picker.out_of_range": {"Choose a time from %s to %s.", "请选择 %s 至 %s 之间的时间。"}, "time_range_picker.start": {"Start time", "开始时间"}, diff --git a/month_picker.go b/month_picker.go index b88359a..766686d 100644 --- a/month_picker.go +++ b/month_picker.go @@ -44,11 +44,13 @@ type MonthPickerOptions struct { // Today marks the current month; zero uses the system clock. Today Date Disabled bool + // ReadOnly keeps the field focusable and copyable but blocks the popup and clearing. + ReadOnly bool // Label names the field for assistive technology. Label string } -// MonthPicker chooses a month into *value from a year page; PageUp and PageDown change the year. +// MonthPicker chooses a month into *value from a year page. func MonthPicker(c *ui.Context, value *YearMonth, opts MonthPickerOptions) DateTimeResult { for _, m := range []YearMonth{*value, opts.Min, opts.Max} { if !m.IsZero() && (m.Month < time.January || m.Month > time.December) { @@ -75,7 +77,7 @@ func MonthPicker(c *ui.Context, value *YearMonth, opts MonthPickerOptions) DateT } col, picked, ok, cleared := datetimeGridPicker(c, datetimeGridField{ text: text, placeholder: msg(c, "month_picker.placeholder"), label: label, - clearable: opts.Clearable, hasValue: !value.IsZero(), disabled: opts.Disabled, home: home.ordinal(), + clearable: opts.Clearable, hasValue: !value.IsZero(), disabled: opts.Disabled, readOnly: opts.ReadOnly, home: home.ordinal(), }, datetimeGridConfig{ pageOf: func(o int) (int, int) { return yearMonthOf(o).Year * 12, 12 }, cols: 3, diff --git a/testdata/snapshots/darwin/time_picker-dark.png b/testdata/snapshots/darwin/time_picker-dark.png index 12a4377873f02a260da347ac94256addf6b266cb..2486b12ad70c07bc42b35b018b1407d10b8f2458 100644 GIT binary patch literal 5251 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 literal 5336 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 F{{z*kaeV*) literal 5060 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 diff --git a/testdata/snapshots/darwin/time_range_picker-dark.png b/testdata/snapshots/darwin/time_range_picker-dark.png index d3f8038f0e4c69c5aedbdd29ac629054c7fc1a68..ea34102148732346cf0de9b6503be6e4d986314b 100644 GIT binary patch literal 7150 zcmdUURa6|^x-AeO9b5xJf&@v>KUg4GAP`&vjWzBN++9K%mkw#%-Q62$2o8-ya3^>p zjXQ_E?>TSxWuKQjZasXXs>XWwR*gB=oU^`gRb?4`94Z_%G&FoUSt&I%H1xcudrtty zQ{~Ag4njktu9uUN0D7h&)4YJ{mN$JXsj9Ntz)nUv0Af@YOGlsRr}Pg-(Ef$`KB{SG zwYreTuHKDiL7BXKI!66`XSTUcw*E6aS9y8;JewL8rUZIo5xu0Mnm8Lqq^{3ow3(%C?M%mj7bW(nKxg5Ao7jhD_t2OY6>gdZ}d($z(QS}DE$R-j;O1rkT z7vxgZteF;@42@4EOpM6aV_V%AJ0>==Ct~2^>ZfA>dWP!i zf!sxprf<46p4#w@^ zhKtivl+pXEyNJ-9d>m=&^Y z)#DH3%ytWYsF@X%)2ivHSf_27j)mz=rS7nW51o=wwIgazA+b^^G8*)cL%~)h8;|Q| zL=RT52SpodYhu%8&?_jKdf5bW(%F~%iIf$)QX5{Bb$s|MKRomB<0?{dq1pV$gXSyN zAbP=Z;<*p@?gk9p*bwd^xD%9=R)Pp~L?_8aD7H|U26cLBZ5O|u#2})?EuZha)RL;z2Fotc zJXyOvYLzuOt}gvIrR+6DLJ^!|o>!hiDpmJTKYV-@!&H8J2C~-z=nQp2yR|jW{!XY3 z+Dzmd=s@LYOjqA7*{~BP>&GDZ?6cMug`tS;B49~5-H{&<lzsh{I-Bv*09+Q)efizuxNobLPmzR%Q~7jWibd*YQj6;Xm-Q zekKP82(-}O-pVuLazCz;&_`01etCjbtli|X9Xguc4%E;{bw6Q^mmfB3W&j5T_42&3 zH)JWaFyE#ice+H1+FDvtlhTGjp3(Un6E{~|?Dl>X5}IFF*j#BYr(LzOwr+dO>K>hu z=>pYkP1m@relAvXJNvcRd=IAJ|3OO2E2Nlhg@8MeZhI#b7Pb`CfS4u}$>_l+C%Bfq zD(7detN=-^(kQ6ATaf#goYLOsSb1tA^5&z@YwPJ8-E+eC_fRq%ax(BcmC0I*ds7XY z8K$}h`F1gX64tYK#&agRZ0Cpfq598Py{CS6^$|-F5L_rL$FL`IGscDuaSU4pHkhVn z22ktjO~sn6ZFKa#_5}+I*DlUgYby??`MGf_XYGA^A1%;1k^lmBO9T9>tPhTj3AnhF zsXs6=g1^MvnHCr(R&0~&AqFsvv@~>yv9T}TsOZ(^h3GQK?e14|w@)d|C zRFP$)4r~93llOU%;RJ+u$M=WbbG^OG4*Nus+gt^PO?N((dHYdkE6NX!AH5FKUWuo* zIj*gfm#6BN$H|+kq-IoWcvA;R_k3D7h*R~oE-Ix~CaapH5*!OVal`RZMP zJS&MOP2iw($HwuqMEyj>t^L=O z0+PNGJxN+~p19Vjzqhpj>}=Kw#-t5Kb+}<~TXZNqx@tXte#R83x1JR%GExE>kP!Dzsz-!xe;m zP@O@IP17X**o?zVNjI#6a(k4Q>^ZE^ocPZlB83TDo%P!jU zi4#GW(`D`jLM(pGjY>zN^+2{34M)q7eJ5ww-C^7M05R!(AN&Rp%>J!D1;IHo(8h0L zQKqdoGcnQZe4X=jRNll7*^8t5@{RRnQ<*&%_PJZ8?*U_PzZC7z4JpaX8;TWRWMSh- zAeAHP{{6X+*S|f6sHD=NtT?_~2@;u|hb{pM|9=3U``LKz%H~C)B*4CCXD%RIux>4MQ zot>Sfs~nb}Ur|B$hW^Q<%ph`YJgbt<@uRt8n0LSZLFjyXFzD<&$fWDiy;ln;MlN#sKwee3OB2-0{h0@tplfk^7Z!lMLlYKE~?+K9)z--OZ z9=G$V^(i&Yv>?dmg+BC@=-|M>K*}?;|HL%=TpJexi&uBcew@2%2GPf{fUfa033B2K z&j0Q2o;+^t4%bpG(H3D4y~s{Qw9>HPxZ(HsA13(&eqiaIEf7%8v64x^WYN(__Zi(s z4C4~j65!J+tV?-3QM5AOcjZs6IN)R_?6Jm!MO7)yhAx1WUMCC(o#Dj`GAyPt#u{$v zEG_n#l1nzO9()D%`Uph5eNTQ9uo858UU~s4)jw;eswmkjxt{+gpX7fP zI`lh~Hz?4rnuL8?Tv$3H(Y_o?qwT^VsKuX{nlWMVpi5$-LiSm&7MF?@1c@m1M5b;i zrIZn6uZ1Gc>E+n81jc`_k{lkpiWB=T|GmpJi4c+)&;iu`DjNIkj)%7!ja{Z&zWf$Y zHA#+KO|TSn@N#W_{5?oqN8Jble!H0Nlp$ExUZL2xlbjEytVQglHufxq%SwpA&(ekj zKY+qWu4*OiwtHmc z<-qxEbjy*$3dDmdD(J3NUyy(sLInP~&8LNhB$D*~zSCXI-PqHEeeK0sSg?_PrZ`yu zOS?Ox50{bxxVgC<%z5y=-%V)6>S;aS5`K?(fr-b!6e}x!eHQ63`WSXO83eq_H!1D? z1<6pSx!^JwpB}H?*$MTms2u8rh}WziNXv+Glvi}S{6j4qRa^Phn_T5@@;B`sqIMAIG!JYl#N0&03mNh{Z437CBafqXFJ0ralfs*rMRfHv^ z@ecw8tyIWJqLdE~?mj-ZBZLG`&?2Ka-4HlfZt_xrQZ+(pp0~VuZGZKP?SHoFfE{|E z+e%_63FUmX(0;$J2I9%s$)DA6(7Rt9JMwvi@%=+Knw>9^t>unX5jq~AII^$KNxuE) z=s)MR%KWK)uFB5o6W~EVFg?Mj(R?2+dK)t+&S`62by&)O~Uv&()Qr~_8ohikQ_7S>;g>0i}ehn@Q{ofqQ1He&vrH(^*_`K{r-y}y-f)Db{-flzbk@W%Rn z;Co@t=(#pLYMbfXN6*HJinWtXDUq4-erX3xtZTjNYmmmD4sM;6#Ejs7I3DE~GE~_F zQgzhSp71p&KQ}nXQE>NDB0m0)XJpyCe>xVDB>l%HBDO%)lv$pK!{>8IwerMzTV`B~_(5M+GhxG<)>mG-xI=rgx5W;fD?nl0}^Xuje zHIT;+$X2et>Zq}ri`)-P1k1ue*3nz@k+g*!L@FM)01p{-G5W!TUf1d<=(4H z9U(YDV7jKUr3nuzK$(dsyt_%M;UzL8N`7t$a}h{xqF-c+|y&>bb^ zN#?j+oS&a&TS4Q2X+fnJt?71()C=aDz31K!n2BsAtO~`Y8dkA?r=UX8A&=DiH_1;G z<`jDo+%{T$7f0Dt>c{!^ewQ1Y3-7G2CRG1Suq{|K@yNYj3OA-qma^S7-kd(TJz9<* zZnIsvF!*~j|nnD{I2Q}x0sgpfPijZLszTaSp6>R5yFQ1y=us*gcc4iOLCo) zQ&DAMEBz^-A0gd3P}AC4Q(B6vVpTAI6Ee7$^2Ah8LXub73-kVM?x!<0OO1QHB8zOL zHsAKCkKN06-R0S0Wsy*_1nbi&PO|=Ki=I683i$AlVsum#rsUkX#@DX{W)tLjp8@*q z88k4*irn1$z$$fKaE|kTqoI1s%d}%e5Ue_6L(GNLS|9NbX?&|;ZYtW9cN>x-!3%wq za%sEsMGEP{Kc36>LvRQPU7+}M`Q$I_-0Ebo!HNxLcXLJ`6iwYRG29&=1wLqvh(prl zZ^~zQ(eXlh3Ry2a+}+w*>_b0(s7itF$B$B^Bqw8Ic_UhkPM4FIV`afPC)3jnB_$~{ zord|U{War;x;7s^u=?+IbOjGG#mhUe6k^|a&#}>Q*3=t6zwusDRQ}U*sw2*--+ng9 z?e~C^51!X)5h1fl6?bSbvBUifo$-a+PS-T$#Yr-#G}LPjfj$b&A(Ywnh-K1+l*s=N z37m)q*T_R*N{@)TS23E%OM^`A(QGH|5R&3EFNH|arEeJ?fgHiAiQ0EQ2JS;PF0Wr) zk5cX3lv&y$j9TBM}2q7p(1z~63_ENa6NYO2CWyfNJ_otxZ!B$VTc>EK9`pwVhF9CM{$#n70C@>(H& zsY`v)JIk*UDbJ-3i`eE%$P86??(OoY;)6(N>*(w6?+qruBKgEb1rt=!Z*#6z1v;J0 zzN^-Df4I603hVfE^z`5JQ^3(|J$q_uDkM`-bk%5a%k903WiWGLfdUhW$V_|O^^*rU zuJGP{vjk>|m48ikNtNVYU%gpX#=YDU&1x3Q%~mha7)FqK@3FE<^V)+a-3zr`juA`W zF@9ZsEVOo*(K9+Y@a0QH@?yfp#q~0};R;-no+K;7=KF$n`C{+LaU6b4jdqkbEQ^qt9EARcBJ8QZg$o{romi5EXH*x1G26U(|}vkk?1Kxe2zB zkxH;fdS2E_%jBP4V1E-pr)YlSg$|r2-DlG~xK?!}qf2k>cIjkxy z{gP!ut)welt?53)$ga;d?F;7Kw5~&L`~Z@`%4>5=`=TOfmrB}dPrdD5W?a<*Otr^u zw}4;nd`e?7+rZq>c>v7Lz!?nDt`s|sm9eXpP`X%IGagQ?AfD)H0X3|@sksy^cSl-R z6F>RL*oTL$u`wkz+&D9Krkk8XG!?ydePl+h)&Hn1c9pd2K1rW#X>S9BYInAz{Y~@qU5Tb7(z4iZY?uHU`cC)Juf&PD;A{~xC7jCNg!T$euX^CyCxqU=O Z^W%E=bINl1X^e-4CMT^dRUv5<^k2r!1=j!o literal 7143 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 UoQDKqkBM+p6rl2Ta+VSQ1(R|uvj6}9 literal 6724 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 diff --git a/time_picker.go b/time_picker.go index 12a4391..57f4eac 100644 --- a/time_picker.go +++ b/time_picker.go @@ -4,6 +4,7 @@ import ( "fmt" "log/slog" "strconv" + "strings" "github.com/egoist/mygo/ui" @@ -49,12 +50,13 @@ type TimePickerOptions struct { // Min and Max bound the time; a zero Max means 23:59:59. Min, Max TimeOfDay Disabled bool + // ReadOnly keeps the segments focusable and copyable but blocks edits and the popup. + ReadOnly bool // Label names the field for assistive technology. Label string } -// TimePicker edits *value by typing into hour, minute and second segments or by choosing in a popup. -// Times outside the range or off the step are reported and not written. +// TimePicker edits *value in segments or a popup. func TimePicker(c *ui.Context, value *TimeOfDay, opts TimePickerOptions) DateTimeResult { cfg := timePickerConfig("TimePicker", opts) if !value.Valid() { @@ -65,17 +67,23 @@ func TimePicker(c *ui.Context, value *TimeOfDay, opts TimePickerOptions) DateTim seen := ui.Local(col, "time-picker-seen", func() TimeOfDay { return *value }) problem := ui.Local(col, "time-picker-error", func() string { return "" }) if *seen != *value { - *draft, *seen, *problem = *value, *value, "" + *draft, *seen = *value, *value } changed := false col.Children(func() { - cfg.invalid = *problem != "" - if _, edited := timeEditor(c, draft, cfg); edited { - *problem = timePickerProblem(c, *draft, cfg) - if *problem == "" && *draft != *value { - slog.Debug("mujica: time_picker change", "from", *value, "to", *draft) - *value, *seen, changed = *draft, *draft, true - } + cfg.problem = *problem + _, edited, bad := timeEditor(c, draft, cfg) + p := bad + if p == "" { + p = timePickerProblem(c, *draft, cfg) + } + if p != *problem { + *problem = p + c.Invalidate() + } + if edited && p == "" && *draft != *value { + slog.Debug("mujica: time_picker change", "from", *value, "to", *draft) + *value, *seen, changed = *draft, *draft, true } datetimeError(c, *problem) }) @@ -88,13 +96,15 @@ type timeConfig struct { minuteStep, secondStep int min, max TimeOfDay label string - invalid bool + // problem is the error shown last frame, attached to the segments. + problem string + readOnly bool } // timePickerConfig checks opts and fills in defaults. func timePickerConfig(name string, opts TimePickerOptions) timeConfig { cfg := timeConfig{seconds: opts.Seconds, hour12: opts.Hour12, minuteStep: max(opts.MinuteStep, 1), - secondStep: max(opts.SecondStep, 1), min: opts.Min, max: opts.Max, label: opts.Label} + secondStep: max(opts.SecondStep, 1), min: opts.Min, max: opts.Max, label: opts.Label, readOnly: opts.ReadOnly} for _, s := range []int{opts.MinuteStep, opts.SecondStep} { if s < 0 || s > 0 && 60%s != 0 { panic(fmt.Sprintf("mujica: %s step %d does not divide 60", name, s)) @@ -174,15 +184,18 @@ func timeParts(cfg timeConfig) []timePart { return parts } -// timeEditor draws a segmented time field with a popup and reports whether the user edited *draft. -func timeEditor(c *ui.Context, draft *TimeOfDay, cfg timeConfig) (field *ui.Element, edited bool) { +// timeEditor draws segments and popup; reports edits and invalid entry. +func timeEditor(c *ui.Context, draft *TimeOfDay, cfg timeConfig) (field *ui.Element, edited bool, bad string) { k := Tokens(c) d := Density(c) - field = datetimeField(c, ui.Row(c), cfg.invalid).Gap(d.Unit() * 2) + field = datetimeField(c, ui.Row(c), cfg.problem != "", cfg.readOnly).Gap(d.Unit() * 2) open := ui.Local(field, "time-open", func() bool { return false }) fresh := ui.Local(field, "time-fresh", func() bool { return false }) field.Children(func() { - segs := ui.Row(c).AlignItems(ui.Center).FocusGroup(ui.Horizontal).Role(ui.RoleGroup).Label(cfg.label) + segs := ui.Row(c).AlignItems(ui.Center).Gap(d.Unit() * 1.5).FocusGroup(ui.Horizontal).Role(ui.RoleGroup).Label(cfg.label) + if segs.Shortcut(ui.Cmd, ui.KeyC) { + c.WriteClipboard(timeText(c, *draft, cfg)) + } segs.Children(func() { focusNext := false for i, part := range timeParts(cfg) { @@ -192,84 +205,107 @@ func timeEditor(c *ui.Context, draft *TimeOfDay, cfg timeConfig) (field *ui.Elem if part == timePeriodPart { ui.Box(c).Width(d.Unit()) } - seg, done := timeSegment(c, draft, part, cfg, &edited) + seg, done, segBad := timeSegment(c, draft, part, cfg, &edited) if focusNext { seg.Focus() - focusNext = false } focusNext = done + if bad == "" { + bad = segBad + } } }) - b := datetimeIconButton(c, "clock", msg(c, "time_picker.open")) + if cfg.readOnly { + return + } + b := datetimeIconButton(c, "clock", msg(c, "time_picker.open")).Role(ui.RolePopUpButton) if b.Clicked() { *open, *fresh = !*open, true } }) - if !*open && field.Shortcut(ui.Alt, ui.KeyDown) { + if !*open && !cfg.readOnly && field.Shortcut(ui.Alt, ui.KeyDown) { *open, *fresh = true, true } - datetimePopup(c, field, open, func() { + datetimePopup(c, field, open, cfg.readOnly, func() { if timeColumns(c, draft, cfg, *fresh) { edited = true } *fresh = false }) - return field, edited + return field, edited, bad } -// timeSegment draws one focusable segment; done reports a fully typed value. -func timeSegment(c *ui.Context, draft *TimeOfDay, part timePart, cfg timeConfig, edited *bool) (seg *ui.Element, done bool) { +// timeLimits returns the lowest and highest value a segment accepts. +func timeLimits(part timePart, cfg timeConfig) (lo, hi int) { + switch { + case part != timeHourPart: + return 0, 59 + case cfg.hour12: + return 1, 12 + } + return 0, 23 +} + +// timeSegment draws one segment; done reports a complete valid entry, bad an invalid one. +func timeSegment(c *ui.Context, draft *TimeOfDay, part timePart, cfg timeConfig, edited *bool) (seg *ui.Element, done bool, bad string) { k := Tokens(c) d := Density(c) name := msg(c, timePartNames[part]) if cfg.label != "" { name = cfg.label + ": " + name } - seg = ui.Box(c).Focusable().FocusRing(false).Role(ui.RoleStepper).Label(name). - Padding(d.Unit()/2, d.Unit()).Radius(theme.ControlRadius).MinWidth(theme.BodySize * 1.6).Center() + seg = ui.Box(c).Focusable().Role(ui.RoleStepper).Label(name). + Padding(0, d.Unit()).Radius(theme.ControlRadius).MinWidth(theme.BodySize * 1.6).Shrink(0).Center() + internal.Ring(seg, k.Focus, theme.ControlRadius) typed := ui.Local(seg, "time-typed", func() string { return "" }) + badText := ui.Local(seg, "time-bad", func() string { return "" }) + badFor := ui.Local(seg, "time-bad-for", func() TimeOfDay { return TimeOfDay{} }) if !seg.Focused() { *typed = "" } + if *badFor != *draft { + *badText = "" + } set := func(t TimeOfDay) { + *badText = "" if t != *draft { *draft = t *edited = true } } t := *draft - step := func(dir int) { - switch part { - case timeHourPart: - t.Hour = (t.Hour + dir + 24) % 24 - case timeMinutePart: - t.Minute = timeStep(t.Minute, cfg.minuteStep, dir) - case timeSecondPart: - t.Second = timeStep(t.Second, cfg.secondStep, dir) - case timePeriodPart: - t.Hour = (t.Hour + 12) % 24 + lo, hi := timeLimits(part, cfg) + if !cfg.readOnly { + switch { + case seg.Shortcut(0, ui.KeyUp): + set(timeStepPart(t, part, cfg, 1)) + case seg.Shortcut(0, ui.KeyDown): + set(timeStepPart(t, part, cfg, -1)) } - set(t) - } - switch { - case seg.Shortcut(0, ui.KeyUp): - step(1) - case seg.Shortcut(0, ui.KeyDown): - step(-1) - } - if part == timePeriodPart { - if seg.Shortcut(0, ui.KeyA) && t.Hour >= 12 || seg.Shortcut(0, ui.KeyP) && t.Hour < 12 { - t.Hour = (t.Hour + 12) % 24 - set(t) - } - } else { - for n := range 10 { - if seg.Shortcut(0, ui.Key0+ui.Key(n)) { - done = timeType(typed, n, part, cfg, &t) + t = *draft + if part == timePeriodPart { + if seg.Shortcut(0, ui.KeyA) && t.Hour >= 12 || seg.Shortcut(0, ui.KeyP) && t.Hour < 12 { + t.Hour = (t.Hour + 12) % 24 set(t) } + } else { + for n := range 10 { + if !seg.Shortcut(0, ui.Key0+ui.Key(n)) { + continue + } + v, ok, complete := timeType(typed, n, lo, hi) + switch { + case ok: + set(timeWithPart(t, part, v, cfg)) + done = complete + case complete: + *badText, *badFor = fmt.Sprintf("%02d", v), *draft + slog.Debug("mujica: time_picker invalid segment", "part", int(part), "typed", v) + } + } } } + t = *draft text := "" switch part { case timeHourPart: @@ -284,16 +320,64 @@ func timeSegment(c *ui.Context, draft *TimeOfDay, part timePart, cfg timeConfig, case timePeriodPart: text = timePeriod(c, t.Hour) } + if *badText != "" { + text = *badText + bad = fmt.Sprintf(msg(c, "time_picker.part_range"), msg(c, timePartNames[part]), lo, hi) + } + seg.Description(timeSegmentDescription(c, part, text, lo, hi)).Error(cfg.problem) fg := k.Text switch { - case seg.Focused(): + case *badText != "": + fg = k.Danger + case seg.Focused() && !cfg.readOnly: seg.Background(k.Accent) fg = k.OnAccent + case seg.Focused(): + seg.Background(k.Selection) case seg.Hovered(): seg.Background(k.SurfaceHover) } seg.Children(func() { ui.Text(c, text).TextColor(fg).FontFeatures("tnum").SingleLine() }) - return seg, done + return seg, done, bad +} + +// timeSegmentDescription gives assistive technology a segment's value and range. +func timeSegmentDescription(c *ui.Context, part timePart, text string, lo, hi int) string { + if part == timePeriodPart { + return text + } + return fmt.Sprintf(msg(c, "time_picker.segment"), strings.TrimSpace(text), lo, hi) +} + +// timeStepPart steps one segment of t by dir, wrapping round its cycle. +func timeStepPart(t TimeOfDay, part timePart, cfg timeConfig, dir int) TimeOfDay { + switch part { + case timeHourPart: + t.Hour = (t.Hour + dir + 24) % 24 + case timeMinutePart: + t.Minute = timeStep(t.Minute, cfg.minuteStep, dir) + case timeSecondPart: + t.Second = timeStep(t.Second, cfg.secondStep, dir) + case timePeriodPart: + t.Hour = (t.Hour + 12) % 24 + } + return t +} + +// timeWithPart sets one segment of t to v, keeping the period on a 12-hour clock. +func timeWithPart(t TimeOfDay, part timePart, v int, cfg timeConfig) TimeOfDay { + switch part { + case timeHourPart: + if cfg.hour12 { + v = v%12 + t.Hour/12*12 + } + t.Hour = v + case timeMinutePart: + t.Minute = v + case timeSecondPart: + t.Second = v + } + return t } // timeStep moves v to the next multiple of step in dir, wrapping within an hour. @@ -307,42 +391,22 @@ func timeStep(v, step, dir int) int { return (v - step + 60) % 60 } -// timeType adds digit n to a segment's typed digits and reports when the segment is complete. -func timeType(typed *string, n int, part timePart, cfg timeConfig, t *TimeOfDay) bool { - lo, hi := 0, 59 - if part == timeHourPart { - hi = 23 - if cfg.hour12 { - lo, hi = 1, 12 - } +// timeType appends digit n; reports value, validity and completion. +func timeType(typed *string, n, lo, hi int) (v int, ok, complete bool) { + s := *typed + strconv.Itoa(n) + if len(s) > 2 { + s = strconv.Itoa(n) } - s := *typed + fmt.Sprint(n) v, err := strconv.Atoi(s) if err != nil { panic(err) } - if len(s) > 2 || v > hi { - s, v = fmt.Sprint(n), n + complete = len(s) == 2 || v*10 > hi + if complete { + s = "" } *typed = s - if v >= lo { - switch part { - case timeHourPart: - if cfg.hour12 { - v = v%12 + t.Hour/12*12 - } - t.Hour = v - case timeMinutePart: - t.Minute = v - case timeSecondPart: - t.Second = v - } - } - if len(s) == 2 || n*10 > hi && len(s) == 1 { - *typed = "" - return true - } - return false + return v, v >= lo && v <= hi, complete } // timeColumns lists choosable values per segment and reports whether a choice edited *draft. diff --git a/time_picker_test.go b/time_picker_test.go index a5eb6a8..c6976d7 100644 --- a/time_picker_test.go +++ b/time_picker_test.go @@ -143,7 +143,7 @@ func TestTimePickerRejectsBadOptions(t *testing.T) { func TestTimePickerSnapshot(t *testing.T) { a, b := TimeOfDay{9, 30, 0}, TimeOfDay{21, 5, 40} - snapshot(t, "time_picker", 480, 80, func(c *ui.Context) { + snapshot(t, "time_picker", 520, 80, func(c *ui.Context) { ui.Row(c).Padding(16).Gap(16).Children(func() { TimePicker(c, &a, TimePickerOptions{}) TimePicker(c, &b, TimePickerOptions{Hour12: true, Seconds: true}) diff --git a/time_range_picker.go b/time_range_picker.go index 4776748..3a03486 100644 --- a/time_range_picker.go +++ b/time_range_picker.go @@ -9,7 +9,7 @@ import ( "mujicaui/theme" ) -// TimeRange is a start and an end time of day. End before Start means it ends the next day. +// TimeRange is a span of day; End before Start means next day. type TimeRange struct { Start, End TimeOfDay } @@ -28,15 +28,16 @@ type TimeRangePickerOptions struct { // AllowOvernight accepts an end before the start, meaning the next day. AllowOvernight bool Disabled bool + // ReadOnly keeps both ends focusable and copyable but blocks edits. + ReadOnly bool // Label names the pair for assistive technology. Label string } -// TimeRangePicker edits a start and an end time. It writes *value only when both ends are valid -// and the end follows the start, or crosses midnight with AllowOvernight. +// TimeRangePicker writes *value only when the range is valid. func TimeRangePicker(c *ui.Context, value *TimeRange, opts TimeRangePickerOptions) DateTimeResult { cfg := timePickerConfig("TimeRangePicker", TimePickerOptions{Seconds: opts.Seconds, Hour12: opts.Hour12, - MinuteStep: opts.MinuteStep, SecondStep: opts.SecondStep, Min: opts.Min, Max: opts.Max}) + MinuteStep: opts.MinuteStep, SecondStep: opts.SecondStep, Min: opts.Min, Max: opts.Max, ReadOnly: opts.ReadOnly}) if !value.Start.Valid() || !value.End.Valid() { panic(fmt.Sprintf("mujica: TimeRangePicker value %v is not a pair of times", *value)) } @@ -53,32 +54,37 @@ func TimeRangePicker(c *ui.Context, value *TimeRange, opts TimeRangePickerOption seen := ui.Local(col, "time-range-seen", func() TimeRange { return *value }) problem := ui.Local(col, "time-range-error", func() string { return "" }) if *seen != *value { - *draft, *seen, *problem = *value, *value, "" + *draft, *seen = *value, *value } changed := false col.Children(func() { - edited := false + edited, bad := false, "" ui.Row(c).Gap(d.Unit() * 2).AlignItems(ui.Center).Children(func() { start, end := cfg, cfg start.label, end.label = msg(c, "time_range_picker.start"), msg(c, "time_range_picker.end") - start.invalid, end.invalid = *problem != "", *problem != "" - if _, e := timeEditor(c, &draft.Start, start); e { - edited = true - } + start.problem, end.problem = *problem, *problem + _, e1, b1 := timeEditor(c, &draft.Start, start) ui.Text(c, "–").TextColor(k.TextMuted).Role(ui.RoleNone) - if _, e := timeEditor(c, &draft.End, end); e { - edited = true + _, e2, b2 := timeEditor(c, &draft.End, end) + edited, bad = e1 || e2, b1 + if bad == "" { + bad = b2 } if draft.Overnight() && opts.AllowOvernight { - ui.Text(c, msg(c, "time_range_picker.next_day")).FontSize(theme.CaptionSize).TextColor(k.AccentText) + ui.Text(c, msg(c, "time_range_picker.next_day")).FontSize(FontSize(c, theme.CaptionSize)).TextColor(k.AccentText) } }) - if edited { - *problem = timeRangeProblem(c, *draft, cfg, opts.AllowOvernight) - if *problem == "" && *draft != *value { - slog.Debug("mujica: time_range_picker change", "from", *value, "to", *draft) - *value, *seen, changed = *draft, *draft, true - } + p := bad + if p == "" { + p = timeRangeProblem(c, *draft, cfg, opts.AllowOvernight) + } + if p != *problem { + *problem = p + c.Invalidate() + } + if edited && p == "" && *draft != *value { + slog.Debug("mujica: time_range_picker change", "from", *value, "to", *draft) + *value, *seen, changed = *draft, *draft, true } datetimeError(c, *problem) }) diff --git a/year_picker.go b/year_picker.go index b607152..f6b990d 100644 --- a/year_picker.go +++ b/year_picker.go @@ -17,12 +17,13 @@ type YearPickerOptions struct { // Today marks the current year; zero uses the system clock. Today Date Disabled bool + // ReadOnly keeps the field focusable and copyable but blocks the popup and clearing. + ReadOnly bool // Label names the field for assistive technology. Label string } -// YearPicker chooses a year into *value, zero meaning none, from a decade page. -// Arrows move by year and row, PageUp and PageDown by decade. +// YearPicker chooses a year into *value from a decade page; zero is none. func YearPicker(c *ui.Context, value *int, opts YearPickerOptions) DateTimeResult { if *value < 0 || opts.Min < 0 || opts.Max < 0 || opts.Min != 0 && opts.Max != 0 && opts.Min > opts.Max { panic(fmt.Sprintf("mujica: YearPicker value %d or range %d..%d is not valid", *value, opts.Min, opts.Max)) @@ -43,7 +44,7 @@ func YearPicker(c *ui.Context, value *int, opts YearPickerOptions) DateTimeResul } col, picked, ok, cleared := datetimeGridPicker(c, datetimeGridField{ text: text, placeholder: msg(c, "year_picker.placeholder"), label: label, - clearable: opts.Clearable, hasValue: *value != 0, disabled: opts.Disabled, home: home, + clearable: opts.Clearable, hasValue: *value != 0, disabled: opts.Disabled, readOnly: opts.ReadOnly, home: home, }, datetimeGridConfig{ pageOf: func(o int) (int, int) { return decade(o) - 1, 12 }, cols: 3, From 227c8d1ce383fdcd97297813818019e30248e286 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:40:53 -0400 Subject: [PATCH 4/8] Merge fix: DatePicker uses textInputEditor's Base parameter --- date_picker.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/date_picker.go b/date_picker.go index d0630a5..26644bf 100644 --- a/date_picker.go +++ b/date_picker.go @@ -106,7 +106,7 @@ func DatePicker(c *ui.Context, value *Date, opts DatePickerOptions) DateTimeResu col.Children(func() { field = datetimeField(c, ui.Row(c), *problem != "", opts.ReadOnly) field.Children(func() { - in := textInputEditor(c, field, text, opts.ReadOnly, false).Grow(1).Shrink(1).Placeholder(placeholder).FontFeatures("tnum") + in := textInputEditor(c, field, text, opts.ReadOnly, ui.TextInputBase).Grow(1).Shrink(1).Placeholder(placeholder).FontFeatures("tnum") label := opts.Label if label == "" { label = placeholder From 9186dd67a3d42228971b968d9ae9e17e680c9582 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:42:29 -0400 Subject: [PATCH 5/8] Display: review r2 fixes --- docs/components/014-image.md | 7 +- examples/gallery/pages_display.go | 112 +------------------- examples/gallery/pages_display_media.go | 120 ++++++++++++++++++++++ image.go | 47 ++++++++- image_state_test.go | 35 +++++++ image_test.go | 50 ++++++++- testdata/snapshots/darwin/image-dark.png | Bin 7050 -> 6980 bytes testdata/snapshots/darwin/image-light.png | Bin 6942 -> 7028 bytes text.go | 1 + text_test.go | 33 ++++++ 10 files changed, 283 insertions(+), 122 deletions(-) create mode 100644 examples/gallery/pages_display_media.go create mode 100644 image_state_test.go diff --git a/docs/components/014-image.md b/docs/components/014-image.md index b7db4fb..f730439 100644 --- a/docs/components/014-image.md +++ b/docs/components/014-image.md @@ -29,7 +29,7 @@ view := func(c *ui.Context) { | 字段 | 类型 | 默认值 | 含义 | | --- | --- | --- | --- | -| `Width`, `Height` | `float32` | `0` | 盒子尺寸(DIP)。为 0 时使用 `src` 的尺寸(只给一边时按比例补齐),在占位、加载、错误状态下也保持这个尺寸;`src` 为 nil 时为 160×120。负数 panic。 | +| `Width`, `Height` | `float32` | `0` | 盒子尺寸(DIP)。为 0 时使用 `src` 的尺寸(只给一边时按比例补齐);`src` 为 nil 时为 160×120。占位、加载、错误状态与已加载图片使用相同的宽高比和伸缩规则,父容器变窄时一起按比例缩小,所以各状态的盒子完全相同。负数 panic。 | | `Crop` | `bool` | `false` | `true` 覆盖并裁切(`ui.Cover`);`false` 完整放入(`ui.Contain`)。 | | `Alt` | `string` | `""` | 替代说明,供辅助技术读取;在其他状态下作为描述。 | | `Loading` | `bool` | `false` | 调用方正在加载。 | @@ -43,7 +43,7 @@ view := func(c *ui.Context) { - 占位:浅色框内显示图片图标,名称“暂无图片”。 - 加载中:框内显示 Spinner,名称“正在加载图片”。 -- 错误:显示错误图标、“图片加载失败”和“重试”按钮,`Err.Error()` 作为无障碍错误说明。 +- 错误:盒子中央是 28×28 DIP 的仅图标“重试”按钮(`refresh-cw`),`Err.Error()` 作为按钮的悬停提示和描述,也是盒子的无障碍错误说明。盒子足够宽时,按钮旁边还会显示“图片加载失败”文字。 ## 事件 @@ -55,6 +55,9 @@ view := func(c *ui.Context) { ## 限制 +- 盒子高度至少 28 DIP 时,“重试”按钮才能完整显示。更矮的盒子会裁掉按钮的上下边缘,但按钮中心仍然可以点击,键盘也可以操作。 +- “图片加载失败”文字只在盒子宽度足够时显示。宽度按上一帧的布局判断,盒子尺寸变化时组件会多布局一帧来修正。 + - 组件不读取文件,也不访问网络。解码(`ui.DecodeBitmap`、`ui.ParseSVG`)和异步加载由调用方完成,结果通过 `Window.Update` 回到界面线程,再设置 `Loading` 与 `Err`。 - SVG 的绘制范围以 MyGo 支持的部分为准:不支持文本、嵌入图片、pattern、marker 和 filter。 - 接口里装着 nil 指针(如 `(*ui.Bitmap)(nil)`)时不算 `nil`,不会显示占位。 diff --git a/examples/gallery/pages_display.go b/examples/gallery/pages_display.go index 596ce4b..2f11f00 100644 --- a/examples/gallery/pages_display.go +++ b/examples/gallery/pages_display.go @@ -1,7 +1,6 @@ package main import ( - "errors" "fmt" "strings" @@ -172,116 +171,6 @@ const iconCode = `ui.Row(c).Gap(8).Children(func() { mujica.Icon(c, "circle-check", mujica.IconOptions{Size: 20, Tone: mujica.IconSuccess, Label: "Done"}) })` -type imageState struct { - crop, loading, fail, empty bool - err error -} - -var displayPicture = func() *ui.SVG { - return ui.MustParseSVG([]byte(` - -`)) -}() - -func imageDemo(c *ui.Context, log func(string)) { - s := ui.Local(c.Root(), "014", func() imageState { return imageState{crop: true} }) - mujica.Heading(c, "Image", mujica.HeadingOptions{Subtitle: "位图与 SVG;包含或裁切;占位、加载、错误;替代说明", Divider: true}) - displaySection(c, "Parameters", func() { - displayControls(c, func() { - displayLog(log, ui.Checkbox(c, &s.crop, "Crop"), "crop", &s.crop) - displayLog(log, ui.Checkbox(c, &s.empty, "No source"), "empty", &s.empty) - displayLog(log, ui.Checkbox(c, &s.loading, "Loading"), "loading", &s.loading) - if ui.Checkbox(c, &s.fail, "Error").Changed() { - log(fmt.Sprintf("fail = %v", s.fail)) - s.err = nil - if s.fail { - s.err = errors.New("connection reset") - } - } - }) - }) - displaySection(c, "Preview", func() { - var src ui.ImageSource = displayPicture - if s.empty { - src = nil - } - v := mujica.Image(c, src, mujica.ImageOptions{Width: 200, Height: 200, Crop: s.crop, Alt: "Gothic emblem", Loading: s.loading, Err: s.err}) - if v.Retry { - s.fail, s.err = false, nil - log("retry") - } - }) - displaySection(c, "States", func() { - ui.Row(c).Gap(12).Wrap().Children(func() { - mujica.Image(c, displayPicture, mujica.ImageOptions{Width: 120, Height: 120}) - mujica.Image(c, displayPicture, mujica.ImageOptions{Width: 120, Height: 120, Crop: true}) - mujica.Image(c, nil, mujica.ImageOptions{Width: 120, Height: 120}) - mujica.Image(c, nil, mujica.ImageOptions{Width: 120, Height: 120, Loading: true}) - if mujica.Image(c, nil, mujica.ImageOptions{Width: 160, Height: 140, Err: errors.New("404")}).Retry { - log("retry (static example)") - } - }) - }) - displayCode(c, imageCode, log) -} - -const imageCode = `img := mujica.Image(c, photo, mujica.ImageOptions{ - Width: 160, Height: 120, Crop: true, Alt: "Hall of mirrors", - Loading: loading, Err: loadErr, -}) -if img.Retry { - loading, loadErr = true, nil // start loading again here -}` - -type avatarState struct { - name string - size float64 - img bool -} - -var displayBitmap = func() *ui.Bitmap { - return ui.NewBitmap(ui.Render(func(c *ui.Context) { - mujica.Use(c, mujica.Settings{Mode: mujica.Dark}) - ui.Box(c).Fill().Background(ui.Hex("#7D2034")) - }, 64, 64, 1)) -}() - -func avatarDemo(c *ui.Context, log func(string)) { - s := ui.Local(c.Root(), "015", func() avatarState { return avatarState{name: "Sakiko Togawa", size: 48} }) - mujica.Heading(c, "Avatar", mujica.HeadingOptions{Subtitle: "图片、姓名首字母与默认图标回退", Divider: true}) - displaySection(c, "Parameters", func() { - displayControls(c, func() { - if ui.TextInput(c, &s.name).Width(200).Changed() { - log("name " + s.name) - } - ui.Text(c, fmt.Sprintf("Size %d", int(s.size))) - displayLog(log, ui.StepSlider(c, &s.size, 24, 80, 4).Width(160), "size", &s.size) - displayLog(log, ui.Checkbox(c, &s.img, "Image"), "img", &s.img) - }) - }) - displaySection(c, "Preview", func() { - var img *ui.Bitmap - if s.img { - img = displayBitmap - } - mujica.Avatar(c, s.name, mujica.AvatarOptions{Size: float32(s.size), Image: img}) - }) - displaySection(c, "Fallbacks", func() { - ui.Row(c).Gap(12).AlignItems(ui.Center).Children(func() { - mujica.Avatar(c, "Photo", mujica.AvatarOptions{Image: displayBitmap, Size: 40}) - mujica.Avatar(c, "Uika Misumi", mujica.AvatarOptions{Size: 40}) - mujica.Avatar(c, "若叶睦", mujica.AvatarOptions{Size: 40}) - mujica.Avatar(c, "", mujica.AvatarOptions{Size: 40}) - }) - }) - displayCode(c, avatarCode, log) -} - -const avatarCode = `ui.Row(c).Gap(8).Children(func() { - mujica.Avatar(c, "Sakiko Togawa", mujica.AvatarOptions{Size: 40}) - mujica.Avatar(c, "", mujica.AvatarOptions{}) -})` - var displayPeople = []mujica.AvatarItem{ {Name: "Sakiko Togawa"}, {Name: "Uika Misumi"}, {Name: "Mutsumi Wakaba"}, {Name: "Umiri Yahata"}, {Name: "Nyamu Yutenji"}, {Name: "Tomori Takamatsu"}, {Name: "Anon Chihaya"}, {Name: "Rana Kaname"}, @@ -444,6 +333,7 @@ func linkDemo(c *ui.Context, log func(string)) { } if mujica.Button(c, "Clear error", mujica.ButtonOptions{Variant: mujica.Ghost}).Clicked() { s.external = "" + log("open failure cleared") } }) }) diff --git a/examples/gallery/pages_display_media.go b/examples/gallery/pages_display_media.go new file mode 100644 index 0000000..945b929 --- /dev/null +++ b/examples/gallery/pages_display_media.go @@ -0,0 +1,120 @@ +package main + +import ( + "errors" + "fmt" + + "github.com/egoist/mygo/ui" + + mujica "mujicaui" +) + +type imageState struct { + crop, loading, fail, empty bool + err error +} + +var displayPicture = func() *ui.SVG { + return ui.MustParseSVG([]byte(` + +`)) +}() + +func imageDemo(c *ui.Context, log func(string)) { + s := ui.Local(c.Root(), "014", func() imageState { return imageState{crop: true} }) + mujica.Heading(c, "Image", mujica.HeadingOptions{Subtitle: "位图与 SVG;包含或裁切;占位、加载、错误;替代说明", Divider: true}) + displaySection(c, "Parameters", func() { + displayControls(c, func() { + displayLog(log, ui.Checkbox(c, &s.crop, "Crop"), "crop", &s.crop) + displayLog(log, ui.Checkbox(c, &s.empty, "No source"), "empty", &s.empty) + displayLog(log, ui.Checkbox(c, &s.loading, "Loading"), "loading", &s.loading) + if ui.Checkbox(c, &s.fail, "Error").Changed() { + log(fmt.Sprintf("fail = %v", s.fail)) + s.err = nil + if s.fail { + s.err = errors.New("connection reset") + } + } + }) + }) + displaySection(c, "Preview", func() { + var src ui.ImageSource = displayPicture + if s.empty { + src = nil + } + v := mujica.Image(c, src, mujica.ImageOptions{Width: 200, Height: 200, Crop: s.crop, Alt: "Gothic emblem", Loading: s.loading, Err: s.err}) + if v.Retry { + s.fail, s.err = false, nil + log("retry") + } + }) + displaySection(c, "States", func() { + ui.Row(c).Gap(12).Wrap().Children(func() { + mujica.Image(c, displayPicture, mujica.ImageOptions{Width: 120, Height: 120}) + mujica.Image(c, displayPicture, mujica.ImageOptions{Width: 120, Height: 120, Crop: true}) + mujica.Image(c, nil, mujica.ImageOptions{Width: 120, Height: 120}) + mujica.Image(c, nil, mujica.ImageOptions{Width: 120, Height: 120, Loading: true}) + if mujica.Image(c, nil, mujica.ImageOptions{Width: 160, Height: 140, Err: errors.New("404")}).Retry { + log("retry (static example)") + } + }) + }) + displayCode(c, imageCode, log) +} + +const imageCode = `img := mujica.Image(c, photo, mujica.ImageOptions{ + Width: 160, Height: 120, Crop: true, Alt: "Hall of mirrors", + Loading: loading, Err: loadErr, +}) +if img.Retry { + loading, loadErr = true, nil // start loading again here +}` + +type avatarState struct { + name string + size float64 + img bool +} + +var displayBitmap = func() *ui.Bitmap { + return ui.NewBitmap(ui.Render(func(c *ui.Context) { + mujica.Use(c, mujica.Settings{Mode: mujica.Dark}) + ui.Box(c).Fill().Background(ui.Hex("#7D2034")) + }, 64, 64, 1)) +}() + +func avatarDemo(c *ui.Context, log func(string)) { + s := ui.Local(c.Root(), "015", func() avatarState { return avatarState{name: "Sakiko Togawa", size: 48} }) + mujica.Heading(c, "Avatar", mujica.HeadingOptions{Subtitle: "图片、姓名首字母与默认图标回退", Divider: true}) + displaySection(c, "Parameters", func() { + displayControls(c, func() { + if ui.TextInput(c, &s.name).Width(200).Changed() { + log("name " + s.name) + } + ui.Text(c, fmt.Sprintf("Size %d", int(s.size))) + displayLog(log, ui.StepSlider(c, &s.size, 24, 80, 4).Width(160), "size", &s.size) + displayLog(log, ui.Checkbox(c, &s.img, "Image"), "img", &s.img) + }) + }) + displaySection(c, "Preview", func() { + var img *ui.Bitmap + if s.img { + img = displayBitmap + } + mujica.Avatar(c, s.name, mujica.AvatarOptions{Size: float32(s.size), Image: img}) + }) + displaySection(c, "Fallbacks", func() { + ui.Row(c).Gap(12).AlignItems(ui.Center).Children(func() { + mujica.Avatar(c, "Photo", mujica.AvatarOptions{Image: displayBitmap, Size: 40}) + mujica.Avatar(c, "Uika Misumi", mujica.AvatarOptions{Size: 40}) + mujica.Avatar(c, "若叶睦", mujica.AvatarOptions{Size: 40}) + mujica.Avatar(c, "", mujica.AvatarOptions{Size: 40}) + }) + }) + displayCode(c, avatarCode, log) +} + +const avatarCode = `ui.Row(c).Gap(8).Children(func() { + mujica.Avatar(c, "Sakiko Togawa", mujica.AvatarOptions{Size: 40}) + mujica.Avatar(c, "", mujica.AvatarOptions{}) +})` diff --git a/image.go b/image.go index 50481e3..7dfc000 100644 --- a/image.go +++ b/image.go @@ -5,6 +5,7 @@ import ( "github.com/egoist/mygo/ui" + "mujicaui/internal" "mujicaui/theme" ) @@ -54,22 +55,36 @@ func Image(c *ui.Context, src ui.ImageSource, opts ImageOptions) ImageView { u := Density(c).Unit() w, h := imageBox(src, opts.Width, opts.Height) var v ImageView - frame := ui.Column(c).Size(w, h).Shrink(0).Center().Gap(u*2).Padding(u*2).Clip(). + // Same size rules as the loaded image. + frame := ui.Row(c).AspectRatio(w/h).Center().Gap(u*2).Padding(0, u).Clip(). Radius(theme.ControlRadius).Background(k.SurfaceHover).Border(theme.BorderWidth, k.Border) + if opts.Width > 0 || opts.Height == 0 { + frame.Width(w) + } + if opts.Height > 0 { + frame.Height(h) + } v.Element = frame + room := frame.Bounds() + // Build again when the box changed, settling the error text. + if last := ui.Local(frame, imageRoomKey{}, func() ui.Rect { return ui.Rect{W: -1} }); *last != room { + *last = room + c.AnimationFrame() + } frame.Children(func() { switch { case opts.Err != nil: frame.Role(ui.RoleGroup).Label(msg(c, "image.error")).Description(opts.Alt).Error(opts.Err.Error()) - Icon(c, "circle-alert", IconOptions{Size: 20, Tone: IconDanger}) - ui.Text(c, msg(c, "image.error")).FontSize(FontSize(c, theme.CaptionSize)).TextColor(k.Danger).TextAlign(ui.Center) - if Button(c, msg(c, "image.retry"), ButtonOptions{Variant: Secondary}).Clicked() { + if imageRetry(c, k, opts.Err.Error()).Clicked() { v.Retry = true slog.Debug("mujica: image retry", "alt", opts.Alt) } + if room.W >= theme.MinHitSize+u*4+imageErrorTextWidth { + ui.Text(c, msg(c, "image.error")).FontSize(FontSize(c, theme.CaptionSize)).TextColor(k.Danger).SingleLine() + } case opts.Loading: frame.Role(ui.RoleImage).Label(msg(c, "image.loading")).Description(opts.Alt) - Spinner(c, SpinnerOptions{Size: 20, Label: msg(c, "image.loading")}) + Spinner(c, SpinnerOptions{Size: min(20, room.H), Label: msg(c, "image.loading")}) default: frame.Role(ui.RoleImage).Label(msg(c, "image.placeholder")).Description(opts.Alt) Icon(c, "image", IconOptions{Size: 24, Tone: IconMuted}) @@ -78,6 +93,28 @@ func Image(c *ui.Context, src ui.ImageSource, opts ImageOptions) ImageView { return v } +type imageRoomKey struct{} + +// imageErrorTextWidth is the room the error text needs. +const imageErrorTextWidth = 120 + +// imageRetry is the 28 DIP icon-only retry button. +func imageRetry(c *ui.Context, k theme.Tokens, problem string) *ui.Element { + b := ui.ButtonBase(c).Size(theme.MinHitSize, theme.MinHitSize).Radius(theme.ControlRadius). + Label(msg(c, "image.retry")).Description(problem).Tooltip(problem) + bg := k.Surface + if b.Pressed() { + bg = k.Selection + } else if b.Hovered() { + bg = k.SurfaceHover + } + b.Background(bg).Border(theme.BorderWidth, k.ControlBorder).TextColor(k.Danger) + internal.Ring(b, k.Focus, theme.ControlRadius) + internal.Fade(b, Motion(c, theme.StateDuration)) + b.Children(func() { Icon(c, "refresh-cw", IconOptions{Size: 16}) }) + return b +} + // imageBox fills unset sides from src's aspect, else 160×120. func imageBox(src ui.ImageSource, w, h float32) (float32, float32) { var sw, sh float32 diff --git a/image_state_test.go b/image_state_test.go new file mode 100644 index 0000000..75a800c --- /dev/null +++ b/image_state_test.go @@ -0,0 +1,35 @@ +package mujica + +import ( + "errors" + "testing" + + "github.com/egoist/mygo/ui" +) + +func TestImageErrorTextNeedsRoom(t *testing.T) { + for _, tc := range []struct { + w float32 + text bool + }{{200, true}, {80, false}} { + ready := false + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + if ready { + Image(c, nil, ImageOptions{Width: tc.w, Height: 60, Err: errors.New("404")}) + } + }, 300, 200) + ready = true + tt.Frame() + n := 0 + for _, s := range tt.Texts() { + if s == "Image failed to load" { + n++ + } + } + // One is the box's name; a second is the visible text. + if got := n == 2; got != tc.text { + t.Errorf("width %v: error text shown %v, want %v (%v)", tc.w, got, tc.text, tt.Texts()) + } + } +} diff --git a/image_test.go b/image_test.go index 7316b7b..657c173 100644 --- a/image_test.go +++ b/image_test.go @@ -77,11 +77,14 @@ func TestImageRetry(t *testing.T) { retries++ } }, 300, 300) + tt.Key(0, ui.KeyTab) + if !tt.Focused("Retry") { + t.Fatal("retry not focused by Tab") + } + tt.Key(0, ui.KeyEnter) if err := tt.Click("Retry"); err != nil { t.Fatal(err) } - tt.Key(0, ui.KeyTab) - tt.Key(0, ui.KeyEnter) if retries != 2 { t.Fatalf("retries %d, want 2", retries) } @@ -102,12 +105,13 @@ func TestImageNegativeSizePanics(t *testing.T) { func TestImageSnapshot(t *testing.T) { bmp := imageTestBitmap() - snapshot(t, "image", 600, 180, func(c *ui.Context) { + snapshot(t, "image", 760, 170, func(c *ui.Context) { ui.Row(c).Padding(20).Gap(12).AlignItems(ui.Start).Children(func() { Image(c, bmp, ImageOptions{Width: 120, Height: 120, Crop: true, Alt: "Cropped"}) Image(c, nil, ImageOptions{Width: 120, Height: 120}) Image(c, nil, ImageOptions{Width: 120, Height: 120, Loading: true}) - Image(c, nil, ImageOptions{Width: 160, Height: 140, Err: errors.New("404")}) + Image(c, nil, ImageOptions{Width: 200, Height: 120, Err: errors.New("404")}) + Image(c, bmp, ImageOptions{Err: errors.New("404")}) }) }) } @@ -135,3 +139,41 @@ func TestImageKeepsSizeWhileLoading(t *testing.T) { } } } + +func TestImageStatesShareBoxWhenShrunk(t *testing.T) { + bmp := imageTestBitmap() + var got []ui.Rect + for _, opts := range []ImageOptions{{}, {Loading: true}, {Err: errors.New("x")}} { + var r ui.Rect + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Row(c).Width(40).AlignItems(ui.Start).Children(func() { + r = Image(c, bmp, opts).Element.Bounds() + }) + }, 300, 300) + tt.Frame() + got = append(got, r) + } + if got[0].W != 40 || got[0].H != 20 || got[1] != got[0] || got[2] != got[0] { + t.Fatalf("loaded, loading, error boxes %v", got) + } +} + +func TestImageRetryInSmallBox(t *testing.T) { + retries := 0 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Row(c).Width(40).AlignItems(ui.Start).Children(func() { + if Image(c, imageTestBitmap(), ImageOptions{Err: errors.New("timeout")}).Retry { + retries++ + } + }) + }, 300, 300) + tt.Frame() + if err := tt.Click("Retry"); err != nil { + t.Fatal(err) + } + if retries != 1 { + t.Fatalf("retries %d, want 1", retries) + } +} diff --git a/testdata/snapshots/darwin/image-dark.png b/testdata/snapshots/darwin/image-dark.png index 286963c4894e311f1315462bd2fd54a7e22c95a3..dd44a888a87feaeed2a1de457124609bc7570f89 100644 GIT binary patch literal 6980 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 I&)kuena3oU|XnD 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 Fe**}EN`n9Z diff --git a/testdata/snapshots/darwin/image-light.png b/testdata/snapshots/darwin/image-light.png index 9b207d68a367f4f5b462842b9d58c180b428b8b1..10ab9f5c4e4f4acf4748c3ade23b3d4667cc05d9 100644 GIT binary patch literal 7028 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 Sf2q@N{!o-tlP#Bi75HCaXdK=E literal 6942 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 diff --git a/text.go b/text.go index e275700..e2aa6ca 100644 --- a/text.go +++ b/text.go @@ -120,6 +120,7 @@ func editableTextField(c *ui.Context, k theme.Tokens, value *string, opts Editab in = ui.TextInputBase(c, &st.draft).Grow(1).MinWidth(theme.MinHitSize*3).Padding(pad, pad*2). Radius(theme.ControlRadius).Background(k.Surface).Border(theme.BorderWidth, k.Accent).TextColor(k.Text). Label(opts.Label).Error(opts.Error) + internal.Ring(in, k.Focus, theme.ControlRadius) }) done := func() { st.editing = false diff --git a/text_test.go b/text_test.go index 8866fb9..d6ead0c 100644 --- a/text_test.go +++ b/text_test.go @@ -4,6 +4,8 @@ import ( "testing" "github.com/egoist/mygo/ui" + + "mujicaui/theme" ) func TestTextSelectAndCopy(t *testing.T) { @@ -183,3 +185,34 @@ func TestTextSnapshot(t *testing.T) { }) }) } + +func TestEditableTextInputFocusRing(t *testing.T) { + name := "report.pdf" + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{Mode: Light}) + ui.Column(c).Padding(20).Gap(20).AlignItems(ui.Start).Children(func() { + EditableText(c, &name, EditableTextOptions{Label: "File name"}) + Button(c, "Other", ButtonOptions{}) + }) + }, 300, 160) + tt.SetPreferences(ui.Preferences{ReduceMotion: true, TextScale: 1}) + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyEnter) + r, ok := tt.Find("File name") + if !ok || !tt.Focused("File name") { + t.Fatal("editing input not found or not focused") + } + // The ring's middle: focus gap plus half its width outside the box. + x, y := int(r.X-theme.FocusGap-theme.FocusWidth/2), int(r.Y+r.H/2) + focused := tt.Image().RGBAAt(x, y) + tt.Key(0, ui.KeyEscape) + tt.Key(0, ui.KeyTab) + if tt.Focused("File name") { + t.Fatal("focus did not leave") + } + plain := tt.Image().RGBAAt(x, y) + want := theme.Light().Focus + if d := int(focused.R) - int(want.R); d < -24 || d > 24 || focused == plain { + t.Fatalf("ring pixel %v focused, %v unfocused, want near %v", focused, plain, want) + } +} From 20aeb143ef916646be241766be644fa2b2d7b718 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:42:50 -0400 Subject: [PATCH 6/8] Feedback: review r1 fixes --- alert.go | 8 +- docs/components/093-progress.md | 8 +- docs/components/094-spinner.md | 2 +- docs/components/095-skeleton.md | 2 +- empty_state.go | 2 +- feedback_review_test.go | 84 +++++++++++++++++++ loading_overlay.go | 4 +- notification_center.go | 12 ++- progress.go | 40 ++++----- progress_test.go | 46 ++++++++++ result.go | 5 +- skeleton.go | 16 ++-- spinner.go | 9 +- status_indicator.go | 5 +- testdata/snapshots/darwin/progress-dark.png | Bin 23280 -> 23331 bytes testdata/snapshots/darwin/progress-light.png | Bin 22360 -> 22400 bytes toast.go | 38 ++++++--- toast_test.go | 52 ++++++++---- 18 files changed, 250 insertions(+), 83 deletions(-) create mode 100644 feedback_review_test.go diff --git a/alert.go b/alert.go index 2b5f116..8d78108 100644 --- a/alert.go +++ b/alert.go @@ -43,8 +43,10 @@ func severityLook(k theme.Tokens, s Severity) (ui.Color, *ui.SVG) { return k.Warning, icons.Must("triangle-alert") case SeverityError: return k.Danger, icons.Must("circle-x") + case SeverityInfo: + return k.Info, icons.Must("info") } - return k.Info, icons.Must("info") + panic(fmt.Sprintf("mujica: unknown Severity %d", int(s))) } // AlertOptions configure an Alert. @@ -66,9 +68,7 @@ type AlertResult struct { Closed bool } -// Alert shows an inline message marked by color, icon and accessible name. -// A non-nil open adds a dismiss button that sets *open to false; nothing -// shows while *open is false. +// Alert shows an inline message; a non-nil open adds a dismiss button that clears it. func Alert(c *ui.Context, open *bool, message string, opts AlertOptions) AlertResult { if message == "" { panic("mujica: Alert needs a message") diff --git a/docs/components/093-progress.md b/docs/components/093-progress.md index 8609972..36caa84 100644 --- a/docs/components/093-progress.md +++ b/docs/components/093-progress.md @@ -27,18 +27,18 @@ mujica.Meter(c, 93, mujica.MeterOptions{ | 字段 | 类型 | 默认值 | 含义 | | --- | --- | --- | --- | | `value` | `float64` | 必填 | 0 到 1;超出或 NaN 时 panic(不确定模式忽略)。 | -| `Shape` | `ProgressShape` | `ProgressLinear` | `ProgressLinear` 或 `ProgressRing`。 | +| `Shape` | `ProgressShape` | `ProgressLinear` | `ProgressLinear` 或 `ProgressRing`;其他值 panic。 | | `Indeterminate` | `bool` | `false` | 未知长度的进度。 | | `Label` | `string` | `""` | 显示在旁边并作为无障碍名称;为空时名称为“Loading”。 | | `ShowValue` | `bool` | `false` | 显示百分比。 | -| `Size` | `float32` | 环形 48、线形填满 | 环形直径或线形宽度;负数 panic。 | +| `Size` | `float32` | 环形 48、线形填满 | 环形直径或线形宽度;负数、NaN 或无穷 panic。 | `MeterOptions`: | 字段 | 类型 | 默认值 | 含义 | | --- | --- | --- | --- | | `value` | `float64` | 必填 | 须在范围内,否则 panic。 | -| `Min`, `Max` | `float64` | 0, 1(两者都为 0 时) | 范围;`Max <= Min` panic。 | +| `Min`, `Max` | `float64` | 0, 1(两者都为 0 时) | 范围;非有限值或 `Max <= Min` panic。 | | `Levels` | `*ui.MeterLevels` | `nil` | 阈值:达到 `Warning` 为偏高、达到 `Critical` 为严重;`Critical < Warning` 时低值为坏(如电量)。须在范围内。 | | `Label` | `string` | `""` | 名称。 | | `ShowValue` | `bool` | `false` | 显示“值 / 最大值”。 | @@ -47,7 +47,7 @@ mujica.Meter(c, 93, mujica.MeterOptions{ ## 状态 - 确定进度变化时以 120 ms 过渡,减少动画时直接跳到新值。 -- 不确定进度只在绘制时移动(只重绘、不重建视图);减少动画时显示静态填充和“In progress”文字。 +- 不确定进度只在绘制时移动(只重绘、不重建视图);减少动画时显示满格静态填充(对比度不低于 3:1)和“In progress”文字;切换到减少动画时进行中的过渡直接跳到目标值。 - 计量条按级别使用 Success / Warning / Danger 颜色,同时显示“Normal / High / Critical / Low”文字与阈值刻度,并把级别写入无障碍名称。 ## 事件 diff --git a/docs/components/094-spinner.md b/docs/components/094-spinner.md index 06d612f..f4698c3 100644 --- a/docs/components/094-spinner.md +++ b/docs/components/094-spinner.md @@ -16,7 +16,7 @@ mujica.Spinner(c, mujica.SpinnerOptions{Size: 20, Label: "Syncing", ShowLabel: t | 字段 | 类型 | 默认值 | 含义 | | --- | --- | --- | --- | -| `Size` | `float32` | 16 | 标记边长(DIP)。 | +| `Size` | `float32` | 16 | 标记边长(DIP);负数、NaN 或无穷 panic。 | | `Label` | `string` | 内置“Loading / 加载中” | 无障碍名称;`ShowLabel` 时也显示在旁边。 | | `ShowLabel` | `bool` | `false` | 在标记旁显示说明。 | | `Color` | `ui.Color` | `AccentText` | 标记颜色。 | diff --git a/docs/components/095-skeleton.md b/docs/components/095-skeleton.md index 4e7e7e1..188319f 100644 --- a/docs/components/095-skeleton.md +++ b/docs/components/095-skeleton.md @@ -26,7 +26,7 @@ ui.Row(c).Gap(12).Children(func() { | `Height` | `float32` | 当前密度控件高度 | 矩形高度;文字形状由行数决定(每行 21 DIP)。 | | `Lines` | `int` | 1 | 文字行数,多行时最后一行为 60% 宽。 | -负值 panic。 +负值、NaN、无穷或未知形状 panic。文字行高随系统文本缩放。 ## 状态 diff --git a/empty_state.go b/empty_state.go index 67ca961..2951801 100644 --- a/empty_state.go +++ b/empty_state.go @@ -76,7 +76,7 @@ func EmptyState(c *ui.Context, opts EmptyStateOptions) EmptyStateResult { if !opts.NoIcon { ui.Icon(c, icon).Size(32, 32).TextColor(k.TextMuted).Margin(0, 0, u*2, 0) } - ui.Text(c, title).Font(theme.SerifFont).FontSize(theme.H3Size).TextColor(k.Text).TextAlign(ui.Center) + ui.Text(c, title).Font(theme.SerifFont).FontSize(FontSize(c, theme.H3Size)).TextColor(k.Text).TextAlign(ui.Center) ui.Text(c, desc).TextColor(k.TextMuted).TextAlign(ui.Center).MaxWidth(360).LineHeight(theme.LineHeight) if opts.Action != "" { ui.Box(c).Margin(u*2, 0, 0, 0).Children(func() { diff --git a/feedback_review_test.go b/feedback_review_test.go new file mode 100644 index 0000000..d332dad --- /dev/null +++ b/feedback_review_test.go @@ -0,0 +1,84 @@ +package mujica + +import ( + "math" + "testing" + + "github.com/egoist/mygo/ui" + + "mujicaui/theme" +) + +func TestFeedbackTextFollowsTextScale(t *testing.T) { + items := []Notification{{ID: "n", Title: "Backup complete", Read: true}, {ID: "u", Title: "Unread one"}} + var empty, result float32 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Children(func() { + Progress(c, 0.5, ProgressOptions{ShowValue: true}) + empty = EmptyState(c, EmptyStateOptions{Title: "Empty title", Description: "Short", NoIcon: true}).Element.Bounds().H + result = Result(c, ResultOptions{Title: "Result title"}).Element.Bounds().H + StatusIndicator(c, StatusSuccess, StatusIndicatorOptions{}) + NotificationCenter(c, &items, NotificationCenterOptions{}) + }) + }, 900, 2400) + tt.Frame() + empty1, result1 := empty, result + tt.SetPreferences(ui.Preferences{TextScale: 2}) + tt.Frame() // Bounds report the previous layout + for text, min := range map[string]float32{ + "50%": theme.CaptionSize * 2, + "Healthy": theme.BodySize * 2, + "1 unread": theme.CaptionSize * 2, + } { + if r, ok := tt.Find(text); !ok || r.H < min { + t.Errorf("%q at 200%%: %v %v, want height >= %v", text, r, ok, min) + } + } + // Titles are found only through their labeled groups: the groups must grow by the titles too. + if grow := empty - empty1; grow < theme.BodySize*theme.LineHeight+theme.H3Size { + t.Errorf("EmptyState grew %v at 200%%; its title did not scale", grow) + } + if grow := result - result1; grow < theme.H2Size { + t.Errorf("Result grew %v at 200%%; its title did not scale", grow) + } +} + +func TestFeedbackRejectsInvalidInput(t *testing.T) { + nan, inf := math.NaN(), math.Inf(1) + for name, f := range map[string]func(c *ui.Context){ + "progress shape": func(c *ui.Context) { Progress(c, 0.5, ProgressOptions{Shape: 7}) }, + "progress NaN size": func(c *ui.Context) { Progress(c, 0.5, ProgressOptions{Size: float32(nan)}) }, + "meter infinite range": func(c *ui.Context) { Meter(c, 1, MeterOptions{Max: inf}) }, + "meter NaN min": func(c *ui.Context) { Meter(c, 1, MeterOptions{Min: nan, Max: 2}) }, + "meter NaN threshold": func(c *ui.Context) { + Meter(c, 1, MeterOptions{Max: 2, Levels: &ui.MeterLevels{Warning: nan, Critical: 2}}) + }, + "skeleton shape": func(c *ui.Context) { Skeleton(c, SkeletonOptions{Shape: 5}) }, + "skeleton NaN width": func(c *ui.Context) { Skeleton(c, SkeletonOptions{Width: float32(nan)}) }, + "spinner negative size": func(c *ui.Context) { Spinner(c, SpinnerOptions{Size: -4}) }, + "status unknown labeled": func(c *ui.Context) { StatusIndicator(c, 42, StatusIndicatorOptions{Label: "Custom"}) }, + "alert severity": func(c *ui.Context) { Alert(c, nil, "x", AlertOptions{Severity: 9}) }, + "toast severity": func(c *ui.Context) { ShowToast(c, ToastMessage{Message: "x", Severity: -1}) }, + } { + func() { + defer func() { + if recover() == nil { + t.Errorf("%s: no panic", name) + } + }() + ui.NewTester(func(c *ui.Context) { Use(c, Settings{}); f(c) }, 300, 200) + }() + } +} + +func TestNotificationTitleOnlyHitHeight(t *testing.T) { + items := []Notification{{ID: "n", Title: "Backup complete", Read: true}} + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + NotificationCenter(c, &items, NotificationCenterOptions{}) + }, 600, 400) + if r, ok := tt.Find("Backup complete"); !ok || r.H < theme.MinHitSize { + t.Fatalf("title-only notification hit box %v %v", r, ok) + } +} diff --git a/loading_overlay.go b/loading_overlay.go index 6f8ba0d..5e826b4 100644 --- a/loading_overlay.go +++ b/loading_overlay.go @@ -25,9 +25,7 @@ type LoadingOverlayResult struct { Canceled bool } -// LoadingOverlay builds content and, while loading, covers it with a -// spinner and label. Covered content takes no pointer, keys or focus; -// the rest of the window stays usable. Focus inside moves to the overlay. +// LoadingOverlay covers content while loading, blocking input to that region only. func LoadingOverlay(c *ui.Context, loading bool, opts LoadingOverlayOptions, content func()) LoadingOverlayResult { if content == nil { panic("mujica: LoadingOverlay needs content") diff --git a/notification_center.go b/notification_center.go index 19a4f93..f712d4d 100644 --- a/notification_center.go +++ b/notification_center.go @@ -44,9 +44,7 @@ type NotificationCenterResult struct { ClearedAll bool } -// NotificationCenter lists *items and edits them in place: read, unread, -// remove, clear. The list is one Tab stop; arrows move among its buttons -// and Delete removes the focused notification. +// NotificationCenter lists *items and edits them in place: read, unread, remove, clear. func NotificationCenter(c *ui.Context, items *[]Notification, opts NotificationCenterOptions) NotificationCenterResult { if items == nil { panic("mujica: NotificationCenter needs items") @@ -70,9 +68,9 @@ func NotificationCenter(c *ui.Context, items *[]Notification, opts NotificationC Role(ui.RoleGroup).Label(title).Clip() panel.Children(func() { ui.Row(c).AlignItems(ui.Center).Gap(u*2).Padding(u*3, u*3, u*3, u*4).Children(func() { - ui.Text(c, title).Font(theme.SerifFont).FontSize(theme.H3Size).TextColor(k.Text) + ui.Text(c, title).Font(theme.SerifFont).FontSize(FontSize(c, theme.H3Size)).TextColor(k.Text) if unread > 0 { - ui.Text(c, fmt.Sprintf(msg(c, "notification_center.unread"), unread)).FontSize(theme.CaptionSize).TextColor(k.AccentText) + ui.Text(c, fmt.Sprintf(msg(c, "notification_center.unread"), unread)).FontSize(FontSize(c, theme.CaptionSize)).TextColor(k.AccentText) } ui.Spacer(c) if Button(c, msg(c, "notification_center.mark_all_read"), ButtonOptions{Variant: Ghost, Disabled: unread == 0}).Clicked() { @@ -135,7 +133,7 @@ func notificationRow(c *ui.Context, k theme.Tokens, u float32, n *Notification, p.FillPath(internal.Diamond(r.X+r.W/2, r.Y+r.H/2, 8), k.AccentText) } }) - open := ui.ButtonBase(c).Grow(1).Shrink(1).Column().AlignItems(ui.Start).Justify(ui.Start).Gap(u). + open := ui.ButtonBase(c).MinHeight(theme.MinHitSize).Grow(1).Shrink(1).Column().AlignItems(ui.Start).Justify(ui.Start).Gap(u). Radius(theme.ControlRadius).Label(name) internal.Ring(open, k.Focus, theme.ControlRadius) open.Children(func() { @@ -145,7 +143,7 @@ func notificationRow(c *ui.Context, k theme.Tokens, u float32, n *Notification, t.Bold() } if n.Time != "" { - ui.Text(c, n.Time).FontSize(theme.CaptionSize).TextColor(k.TextMuted).SingleLine() + ui.Text(c, n.Time).FontSize(FontSize(c, theme.CaptionSize)).TextColor(k.TextMuted).SingleLine() } }) if n.Body != "" { diff --git a/progress.go b/progress.go index 85d09dc..08f60cd 100644 --- a/progress.go +++ b/progress.go @@ -31,14 +31,16 @@ type ProgressOptions struct { Size float32 } -// Progress shows value, from 0 to 1, of work done. It panics outside that range. -// Indeterminate indicators move only while painted and hold still under reduced motion. +// Progress shows work done, value 0 to 1; indeterminate ones hold still under reduced motion. func Progress(c *ui.Context, value float64, opts ProgressOptions) *ui.Element { + if opts.Shape != ProgressLinear && opts.Shape != ProgressRing { + panic(fmt.Sprintf("mujica: unknown ProgressShape %d", int(opts.Shape))) + } if !opts.Indeterminate && (math.IsNaN(value) || value < 0 || value > 1) { panic(fmt.Sprintf("mujica: Progress value %v outside 0..1", value)) } - if opts.Size < 0 { - panic("mujica: negative Progress Size") + if !(opts.Size >= 0) || math.IsInf(float64(opts.Size), 1) { + panic(fmt.Sprintf("mujica: Progress Size %v invalid", opts.Size)) } k := Tokens(c) u := Density(c).Unit() @@ -71,12 +73,12 @@ func Progress(c *ui.Context, value float64, opts ProgressOptions) *ui.Element { if opts.Label != "" || caption != "" { ui.Row(c).Gap(u * 2).Children(func() { ui.Text(c, opts.Label).TextColor(k.Text).Grow(1).Shrink(1) - ui.Text(c, caption).TextColor(k.TextMuted).FontSize(theme.CaptionSize).FontFeatures("tnum").SingleLine() + ui.Text(c, caption).TextColor(k.TextMuted).FontSize(FontSize(c, theme.CaptionSize)).FontFeatures("tnum").SingleLine() }) } bar := ui.Progress(c, acc).Label(name).FillWidth().Height(u * 1.5).Radius(theme.ControlRadius).Background(k.Border) shown := float32(value) - if !opts.Indeterminate { + if !opts.Indeterminate && !still { shown = bar.Animate("progress.value", shown, theme.StateDuration) } bar.Draw(func(p *ui.Painter, r ui.Rect) { @@ -84,7 +86,7 @@ func Progress(c *ui.Context, value float64, opts ProgressOptions) *ui.Element { case !opts.Indeterminate: p.Fill(ui.Rect{X: r.X, Y: r.Y, W: r.W * shown, H: r.H}, k.AccentText, theme.ControlRadius) case still: - p.Fill(r, k.AccentText.Alpha(0.4), theme.ControlRadius) + p.Fill(r, k.AccentText, theme.ControlRadius) default: p.AnimationFrame() phase := float32(p.Now().UnixMilli()%1400) / 1400 @@ -108,7 +110,7 @@ func progressRing(c *ui.Context, k theme.Tokens, u float32, acc float64, name, c row.Children(func() { ring := ui.Progress(c, acc).Label(name).Size(d, d).Radius(0).Background(ui.Transparent) shown := float32(acc) - if !opts.Indeterminate { + if !opts.Indeterminate && !still { shown = ring.Animate("progress.value", shown, theme.StateDuration) } stroke := max(3, d/10) @@ -123,7 +125,7 @@ func progressRing(c *ui.Context, k theme.Tokens, u float32, acc float64, name, c p.StrokePath(progressArc(p, cx, cy, rad, 0, shown), stroke, k.AccentText) } case still: - p.StrokePath(&track, stroke, k.AccentText.Alpha(0.4)) + p.StrokePath(&track, stroke, k.AccentText) default: p.AnimationFrame() start := float32(p.Now().UnixMilli()%1200) / 1200 @@ -132,7 +134,7 @@ func progressRing(c *ui.Context, k theme.Tokens, u float32, acc float64, name, c }) if caption != "" && d >= 44 && !opts.Indeterminate { ring.Children(func() { - ui.Text(c, caption).FontSize(theme.CaptionSize).FontFeatures("tnum").TextColor(k.Text) + ui.Text(c, caption).FontSize(FontSize(c, theme.CaptionSize)).FontFeatures("tnum").TextColor(k.Text) }) ring.Center() } @@ -142,7 +144,7 @@ func progressRing(c *ui.Context, k theme.Tokens, u float32, acc float64, name, c ui.Text(c, opts.Label).TextColor(k.Text) } if caption != "" && (d < 44 || opts.Indeterminate) { - ui.Text(c, caption).TextColor(k.TextMuted).FontSize(theme.CaptionSize) + ui.Text(c, caption).TextColor(k.TextMuted).FontSize(FontSize(c, theme.CaptionSize)) } }) } @@ -171,8 +173,7 @@ func progressArc(pt *ui.Painter, cx, cy, r float32, a, b float32) *ui.Path { type MeterOptions struct { // Min and Max bound the value; both zero mean 0 to 1. Min, Max float64 - // Levels mark the value High from Warning and Critical from Critical; - // Critical below Warning flags low values instead. Nil marks none. + // Levels are the High and Critical thresholds; Critical below Warning flags low values. Levels *ui.MeterLevels Label string ShowValue bool @@ -195,21 +196,20 @@ func meterLevel(v float64, l *ui.MeterLevels) int { return 0 } -// Meter shows a level within a range, as disk use. Thresholds show as -// ticks and the level as a word as well as a color. It panics on a value outside the range. +// Meter shows a level within a range with threshold ticks and a level word, not color alone. func Meter(c *ui.Context, value float64, opts MeterOptions) *ui.Element { lo, hi := opts.Min, opts.Max if lo == 0 && hi == 0 { hi = 1 } - if !(hi > lo) { + if !finite(lo) || !finite(hi) || !(hi > lo) { panic(fmt.Sprintf("mujica: Meter range %v..%v is empty", lo, hi)) } if math.IsNaN(value) || value < lo || value > hi { panic(fmt.Sprintf("mujica: Meter value %v outside %v..%v", value, lo, hi)) } - if l := opts.Levels; l != nil && (l.Warning < lo || l.Warning > hi || l.Critical < lo || l.Critical > hi) { - panic("mujica: Meter levels outside the range") + if l := opts.Levels; l != nil && !(l.Warning >= lo && l.Warning <= hi && l.Critical >= lo && l.Critical <= hi) { + panic(fmt.Sprintf("mujica: Meter levels %+v outside %v..%v", *l, lo, hi)) } k := Tokens(c) u := Density(c).Unit() @@ -246,7 +246,7 @@ func Meter(c *ui.Context, value float64, opts MeterOptions) *ui.Element { if opts.Label != "" || caption != "" { ui.Row(c).Gap(u * 2).Children(func() { ui.Text(c, opts.Label).TextColor(k.Text).Grow(1).Shrink(1) - ui.Text(c, caption).TextColor(k.TextMuted).FontSize(theme.CaptionSize).FontFeatures("tnum").SingleLine() + ui.Text(c, caption).TextColor(k.TextMuted).FontSize(FontSize(c, theme.CaptionSize)).FontFeatures("tnum").SingleLine() }) } name := opts.Label @@ -270,3 +270,5 @@ func Meter(c *ui.Context, value float64, opts MeterOptions) *ui.Element { }) return col } + +func finite(v float64) bool { return !math.IsNaN(v) && !math.IsInf(v, 0) } diff --git a/progress_test.go b/progress_test.go index 78c5bdf..4016a1e 100644 --- a/progress_test.go +++ b/progress_test.go @@ -5,8 +5,54 @@ import ( "testing" "github.com/egoist/mygo/ui" + + "mujicaui/theme" ) +func TestProgressReducedMotionJumpsMidTransition(t *testing.T) { + v := 0.0 + var bar ui.Rect + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{Mode: Light}) + ui.Column(c).Width(300).Children(func() { + bar = Progress(c, v, ProgressOptions{}).Bounds() + }) + }, 400, 100) + v = 1 + tt.Frame() + tt.SetPreferences(ui.Preferences{ReduceMotion: true, TextScale: 1}) + if got, want := progressPixel(tt, bar.X+bar.W*0.95, bar.Y+bar.H/2), theme.Light().AccentText; got != want { + t.Fatalf("fill at 95%% is %v, want %v at once", got, want) + } +} + +func progressPixel(tt *ui.Tester, x, y float32) ui.Color { + r, g, b, _ := tt.Image().At(int(x), int(y)).RGBA() + return ui.RGB(uint8(r>>8), uint8(g>>8), uint8(b>>8)) +} + +func TestProgressStaticFillContrast(t *testing.T) { + for _, m := range []Mode{Light, Dark} { + var bar ui.Rect + var k theme.Tokens + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{Mode: m}) + k = Tokens(c) + ui.Column(c).Width(300).Children(func() { + bar = Progress(c, 0, ProgressOptions{Indeterminate: true}).Bounds() + }) + }, 400, 100) + tt.SetPreferences(ui.Preferences{ReduceMotion: true, TextScale: 1}) + tt.Frame() // Bounds report the previous layout + fill := progressPixel(tt, bar.X+bar.W/2, bar.Y+bar.H-3) // the bar is the last row + for _, against := range []ui.Color{k.Border, k.Background} { + if cr := theme.Contrast(fill, against); cr < 3 { + t.Errorf("%v: static fill %v vs %v is %.2f:1", m, fill, against, cr) + } + } + } +} + func TestProgressValueText(t *testing.T) { v := 0.424 tt := ui.NewTester(func(c *ui.Context) { diff --git a/result.go b/result.go index 70814d0..537cc19 100644 --- a/result.go +++ b/result.go @@ -38,8 +38,7 @@ type ResultResult struct { Action int } -// Result reports the outcome of a finished task and offers next steps. -// It only reports the chosen step; the caller navigates. +// Result shows a task outcome and reports the chosen next step; the caller navigates. func Result(c *ui.Context, opts ResultOptions) ResultResult { k := Tokens(c) u := Density(c).Unit() @@ -61,7 +60,7 @@ func Result(c *ui.Context, opts ResultOptions) ResultResult { res.Element = ui.Column(c).FillWidth().AlignItems(ui.Center).Gap(u*3).Padding(u*10, u*6).Role(ui.RoleGroup).Label(title) res.Element.Children(func() { ui.Icon(c, icon).Size(48, 48).TextColor(tone) - ui.Text(c, title).Font(theme.SerifFont).FontSize(theme.H2Size).TextColor(k.Text).TextAlign(ui.Center) + ui.Text(c, title).Font(theme.SerifFont).FontSize(FontSize(c, theme.H2Size)).TextColor(k.Text).TextAlign(ui.Center) if opts.Description != "" { ui.Text(c, opts.Description).TextColor(k.TextMuted).TextAlign(ui.Center).MaxWidth(420).LineHeight(theme.LineHeight) } diff --git a/skeleton.go b/skeleton.go index eefa1b5..3c4eb04 100644 --- a/skeleton.go +++ b/skeleton.go @@ -1,6 +1,7 @@ package mujica import ( + "fmt" "math" "github.com/egoist/mygo/ui" @@ -28,11 +29,13 @@ type SkeletonOptions struct { Lines int } -// Skeleton stands in for content that is loading. It pulses while painted -// and shows a static fill under reduced motion. +// Skeleton stands in for loading content; it pulses while painted, static under reduced motion. func Skeleton(c *ui.Context, opts SkeletonOptions) *ui.Element { - if opts.Width < 0 || opts.Height < 0 || opts.Lines < 0 { - panic("mujica: negative Skeleton size") + if opts.Shape != SkeletonText && opts.Shape != SkeletonCircle && opts.Shape != SkeletonRect { + panic(fmt.Sprintf("mujica: unknown SkeletonShape %d", int(opts.Shape))) + } + if !(opts.Width >= 0) || !(opts.Height >= 0) || opts.Lines < 0 || math.IsInf(float64(opts.Width+opts.Height), 1) { + panic(fmt.Sprintf("mujica: Skeleton size %vx%v, %d lines invalid", opts.Width, opts.Height, opts.Lines)) } k := Tokens(c) still := c.Preferences().ReduceMotion @@ -70,9 +73,10 @@ func Skeleton(c *ui.Context, opts SkeletonOptions) *ui.Element { e.Height(h).Draw(func(p *ui.Painter, r ui.Rect) { paint(p, r, theme.CardRadius) }) default: lines := max(opts.Lines, 1) - line := theme.BodySize * theme.LineHeight + size := FontSize(c, theme.BodySize) + line := size * theme.LineHeight e.Height(line * float32(lines)).Draw(func(p *ui.Painter, r ui.Rect) { - bar := theme.BodySize * 0.8 + bar := size * 0.8 for i := range lines { w := r.W if lines > 1 && i == lines-1 { diff --git a/spinner.go b/spinner.go index 2f1e9dd..280f968 100644 --- a/spinner.go +++ b/spinner.go @@ -1,6 +1,7 @@ package mujica import ( + "fmt" "math" "github.com/egoist/mygo/ui" @@ -18,12 +19,14 @@ type SpinnerOptions struct { Color ui.Color } -// Spinner draws four diamonds turning around a center while it shows. -// It repaints only while painted: hidden, it stops. Reduced motion holds it still. +// Spinner turns four diamonds only while painted; hidden or under reduced motion it stops. func Spinner(c *ui.Context, opts SpinnerOptions) *ui.Element { + if !(opts.Size >= 0) || math.IsInf(float64(opts.Size), 1) { + panic(fmt.Sprintf("mujica: Spinner Size %v invalid", opts.Size)) + } k := Tokens(c) size := opts.Size - if size <= 0 { + if size == 0 { size = 16 } label := opts.Label diff --git a/status_indicator.go b/status_indicator.go index 045c642..1ebcf5a 100644 --- a/status_indicator.go +++ b/status_indicator.go @@ -44,11 +44,12 @@ type StatusIndicatorOptions struct { // StatusIndicator shows a status by its own shape and a word, never by color alone. func StatusIndicator(c *ui.Context, status Status, opts StatusIndicatorOptions) *ui.Element { + key := "status_indicator." + status.String() // panics on an unknown Status k := Tokens(c) u := Density(c).Unit() label := opts.Label if label == "" { - label = msg(c, "status_indicator."+status.String()) + label = msg(c, key) } var tone ui.Color var icon *ui.SVG @@ -71,7 +72,7 @@ func StatusIndicator(c *ui.Context, status Status, opts StatusIndicatorOptions) } else { ui.Icon(c, icon).Size(16, 16).TextColor(tone) } - ui.Text(c, label).TextColor(k.Text).FontSize(theme.BodySize).SingleLine() + ui.Text(c, label).TextColor(k.Text).FontSize(FontSize(c, theme.BodySize)).SingleLine() }) return row } diff --git a/testdata/snapshots/darwin/progress-dark.png b/testdata/snapshots/darwin/progress-dark.png index 28c32d33af262b85f99a30cc900ee16c2a868524..cead596a4144482ac4b93a4ade3ea55bd91edfcf 100644 GIT binary patch delta 16049 zcmXwg18|+s_xFu$Cym*d4VpA;)Y!IdCr`}Awi>IkZM#upTaESJ@9#hF%+9?#k9PO$ z`5f<6BSc{nL>v{wNiFpXZB9CDes5%`>7bcnY{>OY?-|rpV{0pIIS5-Rp^73X=WOWZj1hUo*lO zxR3&cls?GKY2%$&KMtgE!I$)G^PEdof#+#GHXUZBD0vy(T7G(~Uf?U^IA-4=-fKcu zU4&s8gF3?w*8Gl9Di!sBR+Wz9Xh`q?XQ-h~R)qBv7ahkjcZ@ysT0D-&p3&wr^~cUu z-`>WSj}|LZQq*;t9f7742D$0yPOnbG_ZPOrevzT*x6AAd?`Lt*)nNq4phX7_l(0ny zQD3esGI*cc*5aO9CZb8_imFM}!s>iOV<$-Ry@{tNT6r9Sx0{2}Pzrt0%fVa9>@1T- zt_Sw6m06cR-i0@b6E#74UW$wum#dk?Sj3BNw{mNNf3aXfv;fkYqlbgheYr;0yS0Zi zt_+#sTO>*|nM@*#_hpNTRri@ONAMMOMyR&|HE07dq@rX(o$|s?|kPHZRXqE4jC~XTq6o5oD}Ic2<%| zwqKL^&_-wN*!3gIaI4^6ftWX`Xtq?_EMGHalGmjH$b8@tMn;Dk0I@YhY)?x>H!Lx! z^#5HN^vk=QM+_8#UrF@M``r?JaV8(yf}b%k<1$>8>GWsfGapbjYtg2qrs&Z&5U}wH z)KiNQA$DOm7A7#Z4jx|loIG*VucoT;Lx$AoNR|x*0$GT1x_r2VLm2tvlfnM~zeFK) z9$UE7Q zSdWfr!1IvE*V|l9OudW5cbdXo=#RNGommD@ba7BFk6dL)PldF--29NKbu9q*R1J%`J! zNv}NKrxkqPryZi*6@<3>X37Y;-B-Q)vO}LMm1)N+>{U0qe|UrZH-5#EEcDk^nx%zx zH>=Ua&ynorJIEpeYnn8L(J?03V{4x5OMQ+F5U?DDzHdN5U$H!qV8E9)nuobo(&^mK zovw*r{zpoDcq8;$3VnH&?Bd3^l{&t3wz>w*I|CAL2h(iLvA> za(-K^rPQsdHU$2+54{0{dAEO_Epwi3+h2#S{w?b({d?NB(Fza_jFrxA_oJ*j3#6pF ziTbw&xT0A={crQ&u!0h0zWBN1NiGcT-ESV^=g1$0dIXJ1GO+%RK+3(flccNi3cHL% zWOqiJLHyqW3*p$c!qy)>M8v)MvE zVf!z#QnF;hGq7Mz7D9ewg4J(ag4YMM8vBhJ^(xw?R@!o8Nb;|rTzcm|Jlx+mx}Kj# znqh`5VPNs4%~M|&m>NzbhvdT^vZr=o@^@qI!!^EmSv@9<&RZ5z+W)F#)0zPOk6`&9 z16$|$1Z9h}CkVI|chaVVf}K#R`{jR|To&<3nf|g`{3T12jNgNK#uj zHQM^%C`g$vC$6EbsdL+9goZNCi|t-+zi270W_j0x^`?b@UI`>4^M-H1Lp>qc62eY4 zT`W+kYEq3-Jtg6B*v+d3__U$%ywO&?r+=IGN#4BhkAzT(h0?s|`EK@;9_Dc0OmJMj zObHz3^gE+4Fw?{Ss|op))>526h<``^`D;~@PA~o$@$YVhuY5UTp#z8e%jsH>L|C{P ztF6g6A$y1hLTrej{;R0YuaKo0);BT$K4h2YE zN82*>_#6G&eLXmTBi+ntuG#Q-@mjV=VeIqI+iH-9*(=w?iuOmrU?V42md#GB#pv-* z84&tmlt<0hWh;dYKusbDor^lz4dL-1z7>^KO-_tQ&&@(0%kXc!alnT5T5t-hyLUw1 zXk4tdjF#g>`F(AH`xzQ}tXy@ueoau4kBIysk6&)7WfcQQNyA^Q{}^~oS$%V_{C6lS zD<6qc)m4;Bmi3tt8v2T62+Pzoq6cJYRZc{35`aNPLt|wG@GDA7J85jz|NOadPIRbN zr2&mh$Cfv6rB4C-J%L}s%!()(GdTk!-qD-%_SJti><6y3nRHxU%0iW<> zWs2C%tRyrvvMd53UJ?}gL1ch`@4Aj4F2keCkCB~>D$Xw?t=Oe3Xm{nh&U>^Ll*M@5 zwMp%+Ub0aEbh@7Z{ODvb-ZS;CcFQ^c`Qn#aNs}H(`Rzr3MZ0dx{W7<0GVb^9-yyBn z!3a>MNBNBjGg?v~Q(98^`163Fv$P(Kf+s>|Zc~_NeF$^(BIhr$K|-ykZ~0VIbab?` zpG1=q(Q#Kg4dRo+>6~NQi=X{JCjae-{N9D{n_L560cbxurne6XBW9ZwR27;)r39s? z-)g*#bRU{Fdq(wAJ^mxtDAnzD&;A&ANl7WGDQan%Y~}?+)|UT%mo+v%?b6ne!LxI) znXuw3&R%bYPy0=S>5K=Mw?EL@!v~Iy(HBqZtj;XMyNN|WP=|gXv(ep;TT740?T#WV z0hX7*nU3SmOrfqI6cmLZbK~aeA(D7USe$=e^|J?m%#-eMwCaT^418cx#IH3HJ#=W^ z9Kjqtb{j7qH;`Lc2Gv3*8fu!DO24IjN@Wt*JMv1FXD&9 zcPP>Fr0eh~QGeza|IDe-CR)qowi8~#B22`@r@lEpd~tTBgw1}xx{k6`t`dX|%M}1n zd)A{yqc6;o_2Eg7Ey>b1PvQl3>GMZqtn`mWy zG90_4(KSY(gU6Q~EJq#PS4M^WbDPc!m|a$f4drYRIQpb&}=z)*dd=|elaE8%G z*0c=FPhmcF=51_f$*;os`Rw4GxiodD=0B^DpGPKWT2~Yw;MbG+KunyCdjBID`Hmdk zX`^Lmaxmi0ckkE>7Ny-k=Qe(bP* zn}-h=ERVr^TQjB6M4xDmEJhO~w@y5QI>(9q$AafWc7^tlbeMBt>9GWv>*46#gTsb} z&`qqY;DzI&lRbrn9cR`IDx}N+d}MJ&$De)pt>GgYY;3a(-vEo!if;f$T&B83v%!>| zygPiLSNCCf`0`EyJ8aPPiK~K>G#_r1s-hwV`Y*Va*|opitu~sQD=T+r-~Ee2pKnZ& zR8^C{c_-5;_+V}Ep!8!0{^AUyX8Vd#`r7yGEFlUQzwEO#WxcAKz~f&7$b`nKl1esM z|BCh^i~pFd1xw*BV5y*IrI8^qM_GQzuWp6}Q6S@@04ZnXM{FIQzJIit4tT z&fw)GXY<^Tyc`>6IA3c0!riRX{j{~O?;fX1E~zWKGPJrgwJx#IohwYkFvg(U%x4u# z>b{j~JS6@M2du2i+16A66(4u3sn(K`GHy;Ay#}mJsl4s2JhBT*0frh9+Vu}M@rsVL zF>jD=hXe;i=@2;a?fI8PPyBc4Ykwcf_?I`l=vjr3q9@UwHz6sR!+*w<%pM(>iIbDZ z(+t5ryyX@boB5e@tLw{a>&n6e=Ka3HhYfN(8whD=sQmZS20t_ifF!AdEhUHdx>>Tu z+Kt$4qb%@+nC^d!AB6qR?Q#Azwi zs8X`Sy0RJ|04!_Uj5e{Dm?>L}^HG2DIPOm(t@V5N!q2IzWfq&miw7YkhwSn3#U;1# zd_oP~CdszEG$}qoL_iclSJBngR#XH-Avq`KZtu7vA>k%xSbEwySHut(Zzs;}O8A`Y zy159ZOp=ay2su4GGSZ+{|E0PofOLiTYkOT*-wklNpR2ICHZL933y+c7x(Si|wU4rZ zi)-;5cOqY*wAN7y1tog)GeM#)N0%ejn)2Qj+0NIR6fv@|qhZwqIVa+CgKBkQ(>EiL#Yu@9^J z5KULeUeY!s{ry+5=%;D9EqFJ$rQvCo0CHU(IU_%8=ynK_nS}W81Aj}9CACgPA}@EPWP$ap|Hbcbh6S=oj2`;k_dX;-TJ*oY*#8vNMA z*yK3N>qh^IbIJHga@3ohev8X>TGl5^u)eBG*vapw?TpPKretY1fB5219H5}0;`B0= z>(#cZXjo%h2npuj!L@>4Z}!0RX^Uju4Kb;5B5Ws#8kMiKwXJQx0V_HA#NZrxe!Kw3 z`!)tVTT(LR_pg6ybZdQ9`cBp5<0YY)M=`z^u_Ax?^eD@#XF3ycdwlrehV{RDepu-& zWY(9UDwl2cWs87~4%ly)L6B0YrQs@df@R(Vo`s@5E(RV~QNd|shta^qSrS-*&n1d_ ze^kFv#GCMw01x+rEv4MCuf8F{(B2fIf@cn%4+m^Zo44ue^8S(Ge3#`Adaf(H%I-Td z>k*;!R!|dUcd5Wmp+6$A);_!n^N~m&_6TK5MMcz|=3iU!vtjw?4j*C*J3E)H64HSI zF=HdF_BM2HbMum0HDEe;ASs&Y4DG#6TSUa?Ax9K!<5cPqK7M%=b?^Y|R`PsBhLpAA zlbB0hXkNA22 zrqm`Q0|He2HDY5>{aEe&qhq_kdd=f=rw{SbZ>v!|`G+N-yQ-85D}ueT(N!Yp|(fQCy)MnG!{81dPL zMMeF-L{S>DW^ULHPG;Iuwj9yCXd8=*jpL_zd3pYM{-9wUH&4%fEeUr+aw>#I_r#_g zlx0*~w`-GcOLKKO0v{zGs1Z`1cU`N<;S&-P{&o5Q6fE6Ghx)O?=nbQz!U_sx+%=%H z$Hsy}PKt8Je~|&@;+81s{UeC#v7`Z!@Ik#toysF04puJ@UmuW=khUFtH~FE3r*l5$ zUj$N9)%hx&&k+`9EL@1+Mxi#3`r&|2CHZacAMt&Cm;$=zV5dcC{;`e+`#;gtg~5hQ zXaM*dE+5`Z-s0KM9RI_sfh0al9UH^MFd`dCN>&#aA4EVxP%M?$?x`M!^% z$_{M_X3~En@8&F!BK-wqF}H3Xstb#d$@(pX{|HM(L*#pI^U?d!XE!#$t=9}PPoWH( ze!z8pW_D&qLrJO2WVR#Z*4%a0qEAEw2nnGE;5wkzx^a2#C&rsUcYKcGbm@?l$|$nu zIqQdo4iPCrZd#g2Y^R_wPG!=3JZJ=zouh(VG`zjTF7LbzD5b&v(oa95qYu5@`1Hj1 zbYqLWiv0Y820v9fIX^GhIiF}UN~Rwa!C@Uq@hQ?jrdK-;6~N|~on8K%MhFuybvk5O zda#ev*3Kst9z`tRhMM&gi}U?(@IWmIA~`nf6&Rd9UGnF?y!+?!8(&7xZyRh0R$lh$ zBVgUbOxGnSfu-q3TJ<>YxUMb7n>H+OXdnQ&frpzS(^N}^VJbaFPeEbibSrM;iSs|d zR>bHr%VvFt$F+_cHmG$Aa4s~LOA(5TkB|T6dM_<1x?7!Htj zyS*I*#l%c8Ok19`Mex z+4c@2-T2p@Hm6!6(I`GzOEv#!ng;FAp(nEiCY@>L z+-e&e&xfkuva_=R+=C&>*z9!WhQ?twB$sA#>&h#};kH&D=^sBlNd+p(*_(=+E_!pP z**Tn_-B}c<(8*D;YD{k{pM>^z$v=#ajdCw`pIkojZq5ZUU?KsCE-U(osl0j`8UzIR zJLWRet_5RO?W`p(u0|i^2n|+yT#{IMIpLGb@zMCKPwGp+61R%_lGlX`b)t1-q_o$` zrTon7YMW>0@VzhC8UkaReNIVBi*Rf#a&a*$-^>@sHSY$0Q8txftUMmJ zm{`cf}TS7bA-^F)>-S4x{Fs1f_eKfL{A&XsnmNt-Ek^Wa7ldQ4nus;SB)6~jioOmHA@Uq(%q5N%5Ny+sNrStC2>h$D%sSPs% z`V+3U=HUIAMyDBr0y$xH*UF%>ipsCXMwI1eG5^;G#_XsN_8Cro@)Lqsagf|AYyKa*I&11oMt9E!s#FB_}Vg|VN zsVS>E)pu;9D{eqG_1^c_N^wy7lzpzJL=Vt)>bx-+SS607b=`rp66iM{AX=x8)E2j>lG$tMx(*_g@N|+ zANA%JM3|`FvyB5jVQmK5nym*8Jg*zyRL0+2+-$4fNA3r5 z_lSa6iHL-F5~B)BDaPFG38BKgyuU3{UDmq$fsd~c3vmbj*^c6eHNkAH%W}oklvKDP zY9PSC#m*|7P_y1X2ouV?L9UP^u`?^vKmWGGeBUxn{t}G{joCzm2t5bx)(-n>Xy&Jj zXu2k7o*0819kuke6l-sR68+dLzLN4v6Z5Y`fqBP?RaHzA%sTCNu?1t+S{v}Y}=G_-c!8TU?3uIFWA=|E|z!KfydFYHtq3O#%de51r`_)Sei)vE-F(r zvGMW2Oz`@+$<0&!(RJJDtgj=V!$Q^ex7O`Ai2?;Yd zI$j>hkw4#*bIGkc-XX$xwn{tQ5q}I5tnj`uZJj9OZJ~7CaW08o|ru(;t6WBPoe*a!^cvk3o zE@LmDk|Q!n^uPfQ=JqpadaU6be$WXSItIpUZl1ELuJ7UWaQT?Dvw0oN_bZ;PpAAXL zA;;@s@)X9qDa={smXRIYl0T%<@sHqq;XQ$O`MjdC+PAvFS_G+PQhvgU(%-h@Lw4X4 z*_7M;@Jx6+TCNN`cYJ(G->!pzxw5)q*X{=o6NmM@mbYz{qaW~1N^06ct6tjrQ$k$l zprfp;?)tTJYPq!)ca`?!V&H#rn6-`{_LrnUt5Q7Gbb<#Yfz`2i30u45jhX@eH=uJg zyZ^}Z7E|FVuw#s!gN1wi8f(gaXJgoG?G8y%vmeP94>wh&IlaMUo1YO^Tk(6fy-l#8 zhLT7}YseGH`a%_WEeCkGf*#L*`<9Q6D?o(NO&$T~q=zh%*=(+D(W=s3V4)u??pKV` zST8`svX)h3mw*}IVX~g$>!%(71f)J%4)UpDYPVi){Zz3!WGx^BOJXo3MA~vOO>7t^ z16tACNxwz^5c6^pCKD=5F6VJaJA>DWu~TOmeLi|6mS6qpZ)bw#8BkR zR#e|~cuugFr=5Mr{m)XtcN`EhpZQTfmb|x|A$V$SL3?O+)$vr{75W9WKLwsNAzu1; z%bN--Ft4=I1xz>AXZoMk z*}4ng^gQ$iTn5G8vjBQuMJWqL7rDT2&}nsbKaVV8i^!d0uj`4BVCJvRiRN{~_=%og zW$&T?U7(SU6yF0%0OxMdEUWXi!w%(gF~2xvB{)b&IcV7VDH=PK{ReeQQnIBLE1uS$ zMGhoCx{>jsUmQQoQ&Y$XxA*t=;OFMbw&WbCcJDq(QlVdYyaLaQ<4ZMqQ$G7AIel#} zR}uX;gS4omrIi$dUe|my-)g&IvJn2~$s@Co$%%69aQ+U>{vI66boaAR3CjcDt!Y8j z=l+jdlhJ&;y*}(oX~3Mucl^*zKji$`aVr6W`Mi%}oLUCY$<3Z2_mSzow+GSN$3>Bpd zvvUImtS)@M1NbPfRq7E+A=o~hLM*@6DU zZAlZ*%+2{lN=jN%N_r$d93|R!f~_xJB@QdOf7B4~i>J)&zASH{CT#JWCV4HZV443z z?Fx91GP=)N+GzwtN9Ox`kQ`XYnkxr1;wi;LW5zh=sZ1y7^snf+;F#EbPxZN7=BHHO zX3*JMSj^N^M_>Up(qVLbsBIItD;+0!@3qf}Fq(#ualjCQ z7Hlys7~>m~K+P!?*HadHA z|efdL8a%FmQn!HvV!ja92_k*>C@`)aUS1STh(7Wc-z>sT>fGvB{Y0g zU*dHy85?+fjNQ4tW!R{5eX;3u!Tbpe0d^2uL9p2y-qbF9^CRSojg4Usp0gGW;b|>- zvH6u@?r=mR!z1IiTGlLdbP76Je!wamLXnBtA&G!ebUiR zqxM>p4S$C{H*$Z(=dw%DzRxNrnGd~Dhts;P%hiol=S?5GL&avONGHsB7m)VrFnhW_ zKP&n1Zc`((kfme;er&hi$Hd6D9{2mU4;!$GYqfcN>iRecyxA#lBV;A4LI<#L&d*Nv zj%H~nD1P?uWMpIp1hm5=AjAv}T|@HtJjT}>48TsWsf*5quJ25m^$pAu>9jO?)NeF* z7Df%D$x?q0p@h4)d2tj>UX?Rv1xM$;H8bD_^=>7%$r%h_sx3Ly2`+xI8joRlj$!DO>N&nYP) zW9TfABLDcJ#~$_)-zaDTNf~hdZ#>v8EYX@CRz_wD8fs>82H74%UUkJ8f`2!_ zN%_#912yS23!T=`Kw1TwQB4b3hm3C}CAVMTq^+#&0Av{k=8-Bo<2CRc{ugUdG7^Hp zQBe>!4MqxmC=vT#KV<1f(Cvc1I>LD!>M;>T64JzQI8bO=S7ZGyyuqJ>j6zKaCML3p zzPah4A;+$yu?eSE&8}8@v5j2_Cn-|;d#M%i6L}%D`dO8oUT(MG_7+44x zKX{Tv}FcWl@Udjn;2itM}@iQ61A%l?+q+KzrK&jEcS# zYB0)P4)*TvCySwgQx<>Y*R^z}L~{3Wk{`msiKkwE+XWTX?$^gn@a3>v`x<+|1`<^0 z7douSFIwImS>f{`W||206>b`tA6>ro!3^!e5Lc z1O{$0ZAUC$VeCTfVzs@yq!|y?(E7J|L&Mg{W`Pz{x5ejf;5awjnV-D8oc_h_drr5{ zorO_C2S_>llUfbD#>2hY4z)3m^%>QzzF79jz#3Z7gG3%V5~IO}t@bk!i5;_+4r*-} zIGtpiQq;BK(ngprLlZA~16iqsF|+Wu?Ya}K&oB-S9mZYBI6$fhlV~M z0Jd4Y{pr$0W`}3}Zx`^_xUBdSu(-|B}0g;e%vnuW1!kZF{1`c?8h5MNVu1EQ);?4U7PjlFQ_|)N0ZEgzyhNCI zkrS^?{q;~Sf*@{k3LE}Usir@w4_3P|xmgy*#JC-=3o8w|EV_=_9OE_}Y@px}M!dU- z`%gcs>@9Tg+Kehwgod^lHJ6-=lq?N;b{=<2032KD2$L%@qZ^?64HlG^PB@*z#dIGw zz|!;`LP*s3HuF@ZvT9;q*>LUNK87}Dc4=O=+l9V6&td)99m0Ry6#O^}$fx5k7uUi^ ztC_Ny8Y;-A{?r-m!PCo&@9mA<_111fkDyJMf&kioT-`7GkUewM#Krw#!aa9sqxS>g zqRjLN!bd(Z9dR+2z%t&Q)b1if?C+af(COym{E$;rJRU&{Q9J0kiIgr=k;WEBix4xi zw1Ow)2YEu@prB?Bn$?30N|}AG{QHff)5Z;JH&B53mP((s>UFVm!#3zX%Iksj0Fd{8#2nzBD!! zo14T-Qpt0x6Wdmed2{88pJAgRv*NqdYMh-JlvGrG&wBS1WJ5-k-o=vB)Xez0EN{em z6ykFXsEihwgeLlr;V~z3w6>+G&=bTiz`_V?O~8ClwgAR@j^o zD;yoDYplhD4@SfRZDn;RbN2qRf~N{W1Uc~W%6<ePclw~j?h899mv~G z%d0vU70%|Dv8%Pl;}W2&>-NlIUS7J3P-{{3BMV1&u}fmD<4=T)vM9a+>zhzPXQEct zMAHjmT?hweG`_w-0dqiJYa^KDWSkry zV=$3d;wXU>8nuXm1JnI;8Q$AlM?*_i`AJ4!fzl2+3x92hyAMzkY^W%<`rp^e^X zLmMe9Ul^}7c@}5iB}EEC+uB0gyiyfBy5F{m|BPiV(PAzx{J{ztrsnwSJ~<|24%d$Q zZFBy7aRRW>Y%eG&Y0mq-JZ&v(tX$t%)Y@7$8aw)V;HMyZfPx1PIUE03Zlu}cdbt&5 z1UBYx&hymq`Vx85dd?qX4B}IsHl^5_=0(jl@~Yn#r@bK*{R|C2{>Il*eqA{6&G(yLtHX6h57lsRFAI8SjME?=sUpUuG4$peq8d82Qi5OV%bmTrKI@3 zALR_CY;~c+IO=-gK;{YaYS2uMV2ybSbWvJ?Wd(HvxSqU2z0l_7w~1`d>T~D?iKg|S z?}nfxm6FBQX`L~MfZNFkbr9pWXDmxy(^a0m)aGj}eq`q24AZIAfvYvrM(AQbHezdK z0YFdwS@Q`=TOzi*-Vp2vb!={K=4N@lU(3T5X6rxA*WcQ$J2a^Ktljx}59eGO2cqqaEO#OTG3|B=;MOj%$B_bFmv}53Xz9d1-T%<-v zMMeGgRD@4~jZ*yl;dxbq1qIa!4j&)ccT3Y zIBelp2$PH_k|)LsN&@{3_&Fznv(B137rz}~vnQ$IM+-j<1?3bQ4NN1H@V-tNKJUpNg5*hA6Nkty~HPOUO zkkS(;a3?^^?Zqb-Fw2?9d=*Z!Kk(&vYV-{%wv0|;R82}%9m(|@$m}w@A~~jQV25Jx z$I(m0Nz=bHsz<0z-vzn<1%bAx4Qe$YNxBOgZLQ%t71_{ni#@PFdbE&8pXQH&vqOH`5-No1Aff;#7oP0W>zN}Q2} z142It*c>KgzHXhX3)3X>@wr?q%vKk6W``~;EOBp1#3d&WrbO%CdUm`9iu|<}HyIe{ z@y{uyRqu2Z)RAghD9i#}!*f7C00Vu)BYjop-&vYndg4{FaN3NoDzp znL-gSR|EX{(SVvc*;I?mZNbSYyQ|0X4E(z>Ay?5=e)((0U}|lAzBi*;UD*?@9uUQ? z7ysDeN)gYyAxcf{o{)fcF0&klP66N7tbeK9e7OS`eSN%3o!DBX(}>CqJ~p7$KQ>3< zrq+-siWfW+ouEzBG{~Sz9~_q`n#!xFe0FYghn@WJvdDBT$Z5gpfv&8>Y`$H21l&1Z zM;@5Vq_=a@^9Ro@;TX66zY+nsNa{VN)@vD1?(` zn^V-Je37}kPY$hFrB@2}(Fyn<0GrdNjDo`-*BW& zg$)(wX}(?YK6-egT-`mH463(W1LolnS+$SSqN~?X!u*Fx9d&BIOSt7Kz(tTEIv_c zTsV4UB>cWpD=AQ0-u~-!;dev`cO;8GQ%_J%|H4c}mv4tV4b35*UTT{(g(%HYLtD0Y z;`Oe~EGKdMzgzKKlpE5k;k$yszJlV(=22_(pmL?`0+O3c9+;&yCd7)lfTV0(y z^`CziH=%N;otW4+d+n-uYp-F5!tRiqY%aZs{3-h3*-aT7lLPQ@Ii4N01P`DV7qd5C zSaT1qdn_A0V2B2=xHXfFN!Zm(hrjJeoUJ zPQ<{9*bP){!Im$H&DA}OnRX0xJC z-^Aw|239_^a{?_tB)p5toj&4o+3TFI#+yn8%|k@e(_G>v&BpnEeL@`u*Rn7+adP1d z*=pKaTN5|?x{sc>D^t>j$RPGnrfIPX((uvq@9q?dO1uYogK;o9bNX4Sg6q`a*#a%y z)!>hW?SN56F~H}kRk3(?yib5bVr0nNHna0e=bDU-3*hVuK%F-EY~JkI*;{J|()RqY z+uXkOOu?n_)+RD5f1M&Oj+&WVa|Z+HI-J&H?63AcF`v6pt%j%ijU!a{H}Cgbpeo-| z3tZRxw`kvKu$UNus;m(^A{g3nZ(!6ZWXH*`Hzx@yx`I#yd|K(dMChGEBF($U(b7Ug zkD=%*@aBUdGEdphiIO4v74u>pK<6-JZyqh0&h;5IP=Nt-%>Q`u|B7A8(xsl_&lw#} zH2-41KDgdxZqgICv!ng!!0COkKroBporvo9KD{`tl?VX>r{%BQQToj*wSf^qJEb;0ccGG`rFvhoPy2?%#3aH#!^v{Wy z7?O*?3tXr#EoelFi5oM0FNi&uVx;TnvO0(TYdj{-XvU09uhKGGxrey_C%gSRr&s*$ z4#g?tMhh#^aoOfFM_>mlQJF=5hW6QpiOFOzK zu&d>wx|k?9aaWLOYI+lXwe|4&Hpgs2BH(sn_0AQPb#8Mo88J4^qSLiQeGrE)M0*L_Pd$L>KLLW{c>dAABKEpVAT={W(W^4?+j@X z_`92v0Q9y%`8W9d=jYJt#DYKef2*s@QM0j=8qCLkZLx)>n%Aq+H_Ffu3s~U;-#&ri zecZysTm0!8E>^q8MuMrSQ>$Ewa=8kH^KH1)?&L&TdXcvK#erVy$uQZ^_si5d&h@1= zByNR|uFk_j8S6JHyMG4XO^b4X0-GxsVOsC6Kak>=$DCf_0=l!LvfCf$<<WYSl%#)cSJnv$wdk)giz1nj8W5iHaF#sqZC_0^fA?Z!h z<{pjGVdhlxGIQ(R=zR9_c6D__#^>V^NKE%Huc+wuX(Xd_5KEOK4(qtQJlV-gNspG` zhfAQ6&;3e@&101J@%4{UgbycUWBgYPN zWLag|>Dj|Mj=yc-l760$enY&CmM0HsdcWze<(1irZ!c+7qm;CAO&#nOA?q*qSdhX; zEwzEH-@YrZw59@*8`C-_3fPN#MV}8Y_{|=gZ;vsshJhwJx2b}n*i544%PhRN?VG_` zPLWh6mfUYZs(8Yl{oy=q3^6ggoyffo+ z*1C@^dEV9u?oN1-xI|B@{$k?H=8MQTiHW`6*TF)0^T$&~W2&NFaGNaphU zgD^xewtIi1P6#^vJB&^7nLUF6Ge?H8HB)tkeQ6oM)kV+}R2H{z^3zVeslN8fY_M){ zT>YDC4?%%}fnLu0mrE>E788}R-+EED zo;m=5|Bilk_$}zm9E@2MYy$(2?g}YFFkGqmgV# z*u!7$>j#^5YJ4tQIAvt@hd?#}LE-m+U=u%SF$4Kx_)c#@Yq2$(aGic%t^SCBZ?Kji z%Utc>uG=@fbuT+kKX|S_tWb?E8eLoSygK_e`PQ^Z&%3nhMVrr$-tAw|j^*IPcKVgv z1t6;A^;uSsh5W(|%~m_rZq6i5N+5&ZSR%^(=0@UMV1vJ^=zJq%p}SItaDIn?_UQ8yJf0Tsu&>jvVMqw}zkUZcLw>9e$S+zc4eeZD?*CR#(Zwme-%Y9Sa$?mY27&(%O?P!p delta 16033 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 JDQp<{{{U_8ZIu83 diff --git a/testdata/snapshots/darwin/progress-light.png b/testdata/snapshots/darwin/progress-light.png index ffa4b252ec8f0a39b4df66421b8658dff852d934..459659c65b9c729ef480596290b08b92c44a033d 100644 GIT binary patch delta 15785 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 Cl3e!y delta 15728 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 t2}%KA!f8FO2ABo7iGAv9xJI~mU{{^FjTU`JE diff --git a/toast.go b/toast.go index e15a6d4..872997a 100644 --- a/toast.go +++ b/toast.go @@ -44,7 +44,10 @@ type toastItem struct { } // toastQueue holds a window's toasts, visible ones first in order shown. -type toastQueue struct{ items []toastItem } +type toastQueue struct { + items []toastItem + wake time.Time // when Toaster last asked for a frame; zero for none +} type toastKey struct{} @@ -64,6 +67,7 @@ func (q *toastQueue) push(m ToastMessage, now time.Time) { if m.Message == "" { panic("mujica: toast needs a Message") } + _ = m.Severity.String() // panics on an unknown Severity if m.ID == "" { m.ID = m.Message } @@ -106,8 +110,8 @@ func (it *toastItem) elapsed(now time.Time) time.Duration { return it.spent + now.Sub(it.runFrom) } -// expire drops toasts whose time ran out and returns the wait until the next does. -func (q *toastQueue) expire(now time.Time) (next time.Duration) { +// expire drops toasts whose time ran out and shows queued ones. +func (q *toastQueue) expire(now time.Time) { live := q.items[:0] for _, it := range q.items { if it.visible && it.life > 0 && it.elapsed(now) >= it.life { @@ -118,6 +122,15 @@ func (q *toastQueue) expire(now time.Time) (next time.Duration) { } q.items = live q.promote(now) +} + +// settle pauses the toasts held, resumes the rest, and returns the wait until one expires. +func (q *toastQueue) settle(now time.Time, held map[string]bool) (next time.Duration) { + for _, it := range q.items { + if it.visible { + q.pause(it.msg.ID, held[it.msg.ID], now) + } + } for _, it := range q.items { if it.visible && it.life > 0 && !it.runFrom.IsZero() { left := it.life - it.elapsed(now) @@ -172,15 +185,12 @@ func DismissToast(c *ui.Context, id string) { c.Invalidate() } -// Toaster draws the window's toasts at its bottom right. Call it once per -// frame, last in the view. Toasts never take the focus; Tab reaches their -// buttons. Hover or focus inside a toast pauses its time. +// Toaster draws the window's toasts, never taking the focus; call it last in the view each frame. func Toaster(c *ui.Context) ToasterResult { q := toasts(c) now := c.Now() - if next := q.expire(now); next > 0 { - c.After(next) - } + q.expire(now) + held := map[string]bool{} var res ToasterResult if len(q.items) == 0 { return res @@ -201,8 +211,8 @@ func Toaster(c *ui.Context) ToasterResult { q.items[i].announced = true c.Announce(it.msg.Message) } - action, closed, held := toastCard(c, k, u, min(360, w-u*8), it.msg) - q.pause(it.msg.ID, held, now) + action, closed, hold := toastCard(c, k, u, min(360, w-u*8), it.msg) + held[it.msg.ID] = hold switch { case action: res.Action = it.msg.ID @@ -220,6 +230,12 @@ func Toaster(c *ui.Context) ToasterResult { c.Invalidate() } } + // Scheduled after resuming, so a toast released this frame still expires. + q.wake = time.Time{} + if next := q.settle(now, held); next > 0 { + q.wake = now.Add(next) + c.After(next) + } return res } diff --git a/toast_test.go b/toast_test.go index d4425ba..c0da1f0 100644 --- a/toast_test.go +++ b/toast_test.go @@ -28,7 +28,8 @@ func TestToastQueueLimitsVisible(t *testing.T) { t.Fatalf("visible %v waiting %v", v, w) } // d starts its 5 s only when it shows. - if next := q.expire(t0.Add(ToastDuration)); next != ToastDuration { + q.expire(t0.Add(ToastDuration)) + if next := q.settle(t0.Add(ToastDuration), nil); next != ToastDuration { t.Fatalf("next wake %v", next) } if v := toastIDs(&q, true); !slices.Equal(v, []string{"d", "e"}) { @@ -66,15 +67,16 @@ func TestToastQueueErrorsStayAndPauseHolds(t *testing.T) { t0 := time.Unix(0, 0) q.push(ToastMessage{ID: "e", Severity: SeverityError, Message: "Failed"}, t0) q.push(ToastMessage{ID: "w", Severity: SeverityWarning, Message: "Slow", Action: "Details"}, t0) - q.pause("w", true, t0.Add(4*time.Second)) - if next := q.expire(t0.Add(time.Hour)); next != 0 { + q.settle(t0.Add(4*time.Second), map[string]bool{"w": true}) + q.expire(t0.Add(time.Hour)) + if next := q.settle(t0.Add(time.Hour), map[string]bool{"w": true}); next != 0 { t.Fatalf("paused toast still counts down: %v", next) } if !slices.Equal(toastIDs(&q, true), []string{"e", "w"}) { t.Fatalf("visible %v", toastIDs(&q, true)) } - q.pause("w", false, t0.Add(time.Hour)) - if next := q.expire(t0.Add(time.Hour)); next != time.Second { + // Released: the wake-up is computed after resuming, in the same call. + if next := q.settle(t0.Add(time.Hour), nil); next != time.Second { t.Fatalf("resumed toast left %v, want 1s", next) } q.expire(t0.Add(time.Hour + time.Second)) @@ -84,7 +86,7 @@ func TestToastQueueErrorsStayAndPauseHolds(t *testing.T) { } func TestToastQueuePanics(t *testing.T) { - for _, m := range []ToastMessage{{}, {Message: "x", Duration: -1}} { + for _, m := range []ToastMessage{{}, {Message: "x", Duration: -1}, {Message: "x", Severity: 9}} { func() { defer func() { if recover() == nil { @@ -156,27 +158,41 @@ func TestToastKeepsFocusAndEscapeCloses(t *testing.T) { } func TestToastExpiresAndHoverPauses(t *testing.T) { - var res ToasterResult - tt := toastTester(ToastMessage{Message: "Copied", Duration: 40 * time.Millisecond}, &res) + var q *toastQueue + const life = 40 * time.Millisecond + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + if Button(c, "Notify", ButtonOptions{}).Clicked() { + ShowToast(c, ToastMessage{Message: "Copied", Duration: life}) + } + q = toasts(c) + Toaster(c) + }, 600, 400) _ = tt.Click("Notify") - time.Sleep(60 * time.Millisecond) - tt.Frame() - if tt.HasText("Copied") { - t.Fatal("toast outlived its duration") + if q.wake.IsZero() { + t.Fatal("no wake-up scheduled for a running toast") } - _ = tt.Click("Notify") r, _ := tt.Find("Copied") tt.Move(r.X+r.W/2, r.Y+r.H/2) - time.Sleep(60 * time.Millisecond) - tt.Frame() + if !q.wake.IsZero() { + t.Fatal("hovered toast still schedules its expiry") + } + time.Sleep(2 * life) + released := time.Now() + tt.Move(5, 395) + done := time.Now() + // The frame that ends the hover must schedule the expiry itself. + if q.wake.IsZero() || q.wake.Before(released) || q.wake.After(done.Add(life)) { + t.Fatalf("release scheduled wake %v, released %v", q.wake, released) + } if !tt.HasText("Copied") { t.Fatal("hovered toast expired") } - tt.Move(5, 395) - time.Sleep(60 * time.Millisecond) + // Stands in for the frame MyGo's timer runs at q.wake. + time.Sleep(time.Until(q.wake) + 5*time.Millisecond) tt.Frame() if tt.HasText("Copied") { - t.Fatal("toast stayed after the pointer left") + t.Fatal("toast stayed after its wake-up") } } From 03a3aeaa1f56be4e2a88c8ce80b12769c417d9d0 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:43:01 -0400 Subject: [PATCH 7/8] Navigation: review r1 fixes --- breadcrumb.go | 14 +++- command_palette.go | 15 +++- command_palette_test.go | 11 +++ docs/components/059-tabs.md | 2 +- docs/components/064-sidebar.md | 4 +- docs/components/066-menubar.md | 4 +- docs/components/068-command-palette.md | 1 + internal/navigation.go | 19 +++++ menubar.go | 28 ++++++- menubar_panel.go | 28 +++++-- menubar_test.go | 33 ++++++++ navigation_menu.go | 15 ++-- navigation_review_test.go | 50 ++++++++++++ pagination.go | 15 ++-- segmented_control.go | 2 +- sidebar.go | 66 +++++++++++++-- sidebar_test.go | 38 +++++++++ steps.go | 5 +- tabs.go | 2 +- tabs_test.go | 77 ++++++++++++++++++ testdata/snapshots/darwin/pagination-dark.png | Bin 10720 -> 10545 bytes .../snapshots/darwin/pagination-light.png | Bin 10327 -> 10142 bytes testdata/snapshots/darwin/sidebar-dark.png | Bin 16031 -> 16406 bytes testdata/snapshots/darwin/sidebar-light.png | Bin 15608 -> 16054 bytes testdata/snapshots/darwin/tabs-focus-dark.png | Bin 0 -> 17636 bytes .../snapshots/darwin/tabs-focus-light.png | Bin 0 -> 16934 bytes testdata/snapshots/darwin/tabs-hover-dark.png | Bin 0 -> 17828 bytes .../snapshots/darwin/tabs-hover-light.png | Bin 0 -> 17092 bytes .../snapshots/darwin/tabs-pressed-dark.png | Bin 0 -> 17706 bytes .../snapshots/darwin/tabs-pressed-light.png | Bin 0 -> 17041 bytes toolbar.go | 1 + 31 files changed, 386 insertions(+), 44 deletions(-) create mode 100644 internal/navigation.go create mode 100644 navigation_review_test.go create mode 100644 testdata/snapshots/darwin/tabs-focus-dark.png create mode 100644 testdata/snapshots/darwin/tabs-focus-light.png create mode 100644 testdata/snapshots/darwin/tabs-hover-dark.png create mode 100644 testdata/snapshots/darwin/tabs-hover-light.png create mode 100644 testdata/snapshots/darwin/tabs-pressed-dark.png create mode 100644 testdata/snapshots/darwin/tabs-pressed-light.png diff --git a/breadcrumb.go b/breadcrumb.go index 1bfd93b..3ea31e2 100644 --- a/breadcrumb.go +++ b/breadcrumb.go @@ -90,10 +90,12 @@ func Breadcrumb(c *ui.Context, items []BreadcrumbItem, opts BreadcrumbOptions) B link := ui.ButtonBase(c).Role(ui.RoleLink).Gap(u).Padding(u, u*1.5).Radius(theme.ControlRadius). Shrink(1).MinWidth(0).Cursor(ui.CursorPointer).Tooltip(it.Label).Label(it.Label) internal.Ring(link, k.Focus, theme.ControlRadius) - link.TextColor(k.TextMuted) + fg := k.TextMuted if link.Hovered() { - link.Background(k.SurfaceHover).TextColor(k.Text) + link.Background(k.SurfaceHover) + fg = k.Text } + internal.Ease(link, Motion(c, theme.StateDuration), fg) link.Children(func() { breadcrumbContent(c, it, width) }) if link.Clicked() { choose(i) @@ -119,12 +121,15 @@ func breadcrumbMore(c *ui.Context, hidden []BreadcrumbItem, choose func(int)) { k := Tokens(c) u := Density(c).Unit() b := ui.ButtonBase(c).Padding(u, u*1.5).Radius(theme.ControlRadius).MinWidth(theme.MinHitSize). - Label(msg(c, "breadcrumb.more")).Tooltip(msg(c, "breadcrumb.more")).TextColor(k.TextMuted).Cursor(ui.CursorPointer) + Label(msg(c, "breadcrumb.more")).Tooltip(msg(c, "breadcrumb.more")).Cursor(ui.CursorPointer) internal.Ring(b, k.Focus, theme.ControlRadius) open := ui.Local(b, "open", func() bool { return false }) + fg := k.TextMuted if b.Hovered() || *open { - b.Background(k.SurfaceHover).TextColor(k.Text) + b.Background(k.SurfaceHover) + fg = k.Text } + internal.Ease(b, Motion(c, theme.StateDuration), fg) if b.Clicked() { *open = !*open } @@ -142,6 +147,7 @@ func breadcrumbMore(c *ui.Context, hidden []BreadcrumbItem, choose func(int)) { if item.Hovered() { item.Background(k.SurfaceHover) } + internal.Ease(item, Motion(c, theme.StateDuration), k.Text) item.Children(func() { if it.Icon != nil { ui.Icon(c, it.Icon).Size(14, 14).Shrink(0) diff --git a/command_palette.go b/command_palette.go index e49f66f..f440299 100644 --- a/command_palette.go +++ b/command_palette.go @@ -8,6 +8,7 @@ import ( "github.com/egoist/mygo/ui" "mujicaui/icons" + "mujicaui/internal" "mujicaui/theme" ) @@ -102,6 +103,15 @@ func CommandPalette(c *ui.Context, open *bool, commands []Command, opts CommandP st.hl, st.reveal = (st.hl-1+n)%n, true } st.hl = max(0, min(st.hl, n-1)) + // Focus stays in the search box, so the highlighted command is read out. + if n > 0 { + in.Description(found[st.hl].Label) + if st.reveal { + c.Announce(found[st.hl].Label) + } + } else { + in.Description(msg(c, "command_palette.empty")) + } run := -1 if in.Submitted() && n > 0 { run = st.hl @@ -118,7 +128,7 @@ func CommandPalette(c *ui.Context, open *bool, commands []Command, opts CommandP if cmd.Group != group { group = cmd.Group if group != "" { - ui.Text(c, group).Font(theme.SerifFont).FontSize(theme.CaptionSize). + ui.Text(c, group).Font(theme.SerifFont).FontSize(FontSize(c, theme.CaptionSize)). TextColor(k.Ornament.Mix(k.Text, 0.35)).Padding(u*2, u*2, u, u*2).SingleLine() } } @@ -129,7 +139,7 @@ func CommandPalette(c *ui.Context, open *bool, commands []Command, opts CommandP }) ui.Row(c).Gap(u*4).Padding(u*2, u*4).Background(k.Background).Children(func() { for _, hint := range []string{"command_palette.hint_move", "command_palette.hint_run", "command_palette.hint_close"} { - ui.Text(c, msg(c, hint)).FontSize(theme.CaptionSize).TextColor(k.TextMuted).SingleLine() + ui.Text(c, msg(c, hint)).FontSize(FontSize(c, theme.CaptionSize)).TextColor(k.TextMuted).SingleLine() } }) if run >= 0 { @@ -162,6 +172,7 @@ func commandPaletteRow(c *ui.Context, cmd Command, i int, st *commandPaletteStat st.reveal = false } } + internal.Ease(row, Motion(c, theme.StateDuration), k.Text) px, py, over := row.PointerPosition() b := row.Bounds() if at := [2]float32{b.X + px, b.Y + py}; over && at != st.ptr { diff --git a/command_palette_test.go b/command_palette_test.go index 724250f..5384491 100644 --- a/command_palette_test.go +++ b/command_palette_test.go @@ -89,6 +89,17 @@ func TestCommandPaletteShortcutSearchRun(t *testing.T) { } } +func TestCommandPaletteAnnouncesHighlight(t *testing.T) { + a := &paletteApp{open: true} + tt := ui.NewTester(a.view, 800, 600) + tt.Key(0, ui.KeyDown) + tt.Key(0, ui.KeyDown) + got := tt.Announcements() + if len(got) < 2 || got[len(got)-2] != "Open recent" || got[len(got)-1] != "Save all" { + t.Fatalf("announcements %q", got) + } +} + func TestCommandPaletteEmptyClickEscape(t *testing.T) { a := &paletteApp{open: true} tt := ui.NewTester(a.view, 800, 600) diff --git a/docs/components/059-tabs.md b/docs/components/059-tabs.md index f99cb30..436f668 100644 --- a/docs/components/059-tabs.md +++ b/docs/components/059-tabs.md @@ -41,7 +41,7 @@ mujica.Tabs(c, &tab, []mujica.Tab{ ## 状态 - 选中:Selection 背景、2 DIP AccentText 边线(横向在底边,纵向在右边)、600 字重,三者同时标记。 -- 悬停:SurfaceHover 背景;按下:Selection 背景。 +- 悬停:SurfaceHover 背景;按下:Selection 背景。背景与文字颜色在 120 ms 内过渡,减少动画时直接切换。 - 焦点:2 DIP Focus 焦点环,外留 2 DIP。 - 禁用:MyGo 统一降低不透明度,不响应指针与键盘。 - 溢出:标签条横向(纵向时竖向)滚动;键盘或点击切换后,选中标签滚入视野。 diff --git a/docs/components/064-sidebar.md b/docs/components/064-sidebar.md index f32e7b8..ff174ed 100644 --- a/docs/components/064-sidebar.md +++ b/docs/components/064-sidebar.md @@ -62,10 +62,10 @@ mujica.Sidebar(c, &selected, []mujica.SidebarSection{ - Tab:进入侧边栏(一个停靠点)。 - ↑/↓:上一项/下一项;Home / End:首项/末项;输入名称开头字母跳到匹配项。 -- 分组与嵌套组标题用指针点击展开折叠。 +- 分组与嵌套组标题各是一个 Tab 停靠点(辅助技术看到 disclosure,含展开状态);Enter 或 Space 展开折叠,箭头在 120 ms 内转动。 ## 限制 - 复用 MyGo `ui.SidebarItem`,它用主题 Accent 绘制图标(`ui/sidebar.go:182`);深色主题 Accent 对比度不足,本组件在构建侧边栏时临时把 MyGo 主题的 Accent 换成 AccentText。 - MyGo `SidebarItem` 总是追加名称文字(`ui/sidebar.go:212`);紧凑模式传入空名称,名称改由 `Label` 与提示提供,因此紧凑模式下首字母跳转不可用。 -- 嵌套组用 MyGo `SidebarSection` 实现,组标题本身不能被选中,且只能用指针展开折叠(MyGo 不给标题注册按键)。 +- 组标题基于 MyGo `CollapsibleBase` 的触发器,而不是 `SidebarSection`(后者只能用指针展开,箭头固定 150 ms,`ui/sidebar.go:115`)。组标题本身不能被选中。展开状态按完整父路径保存,同名组互不影响。 diff --git a/docs/components/066-menubar.md b/docs/components/066-menubar.md index 6f45bba..985d943 100644 --- a/docs/components/066-menubar.md +++ b/docs/components/066-menubar.md @@ -52,7 +52,7 @@ if id, ok := res.Chosen(); ok && id == "wrap" { - 打开的菜单标题:Selection 背景;高亮项:Selection 背景。 - 勾选项:AccentText 勾号;单选项:AccentText 菱形标记;名称附“已勾选”。 - 禁用项:降低不透明度,指针与键盘均跳过。 -- 弹层:6 DIP 圆角、Border 边框;靠近窗口边缘时左移,子菜单放不下时翻到父菜单左侧,过高时上移。 +- 弹层:6 DIP 圆角、Border 边框;靠近窗口边缘时左移,子菜单放不下时翻到父菜单左侧,过高时限高并在菜单内滚动,键盘高亮项自动滚入视野。 ## 事件 @@ -71,4 +71,4 @@ if id, ok := res.Chosen(); ok && id == "wrap" { - 快捷键只做提示,不注册;用 `c.Shortcut` 处理。 - MyGo 没有 menu / menuitem 角色(`ui/access.go:25-79`),项以按钮呈现;勾选状态无法通过公开接口写入(`ui/base.go:56` 的 checked 为内部字段),因此写入名称。 - 指针点击非可聚焦元素会清除焦点(`ui/input.go:238`);选择后组件把焦点还给对应标题。 -- 菜单打开期间,焦点保持在标题上,高亮项由组件管理(与 MyGo `SelectBase` 相同的方式)。 +- 菜单打开期间,焦点保持在标题上,高亮项由组件管理。驱动菜单的按键注册在标题上,而 MyGo 的 active descendant 不公开,因此高亮变化时用 `c.Announce` 朗读当前项,并把它写入标题的 `Description`。 diff --git a/docs/components/068-command-palette.md b/docs/components/068-command-palette.md index a249aeb..85b5911 100644 --- a/docs/components/068-command-palette.md +++ b/docs/components/068-command-palette.md @@ -63,3 +63,4 @@ if id, ok := res.Chosen(); ok { - MyGo `TextInputBase` 没有占位文字(`ui/editor.go:734`);为避免与输入法组合文字重叠,说明放在底部提示栏,搜索框以无障碍名称“搜索命令”标识。 - 搜索是子串匹配,不做模糊匹配或排序打分。 +- 焦点留在搜索框以便继续输入;方向键移动高亮时用 `c.Announce` 朗读当前命令,并写入搜索框的 `Description`(MyGo 的 active descendant 不公开)。 diff --git a/internal/navigation.go b/internal/navigation.go new file mode 100644 index 0000000..d5f4841 --- /dev/null +++ b/internal/navigation.go @@ -0,0 +1,19 @@ +package internal + +import ( + "math" + "time" + + "github.com/egoist/mygo/ui" +) + +// Ease moves e's background, border and text color fg to their targets over d. +func Ease(e *ui.Element, d time.Duration, fg ui.Color) *ui.Element { + if d > 0 { + e.Transition(ui.ElementTransition{Colors: true, Duration: d}) + } + ch := func(key string, v uint8) uint8 { + return uint8(math.Round(float64(e.Animate(key, float32(v), d)))) + } + return e.TextColor(ui.Color{R: ch("mujica.fg.r", fg.R), G: ch("mujica.fg.g", fg.G), B: ch("mujica.fg.b", fg.B), A: ch("mujica.fg.a", fg.A)}) +} diff --git a/menubar.go b/menubar.go index 00f63f2..d27b21e 100644 --- a/menubar.go +++ b/menubar.go @@ -68,6 +68,8 @@ type menubarState struct { hl []int focusTo int ptr [2]float32 + // reveal scrolls the highlighted item into view once. + reveal bool } // Menubar is an in-window menu bar drawn by MujicaUI, with submenus and full keyboard control. @@ -106,6 +108,10 @@ func Menubar(c *ui.Context, menus []MenubarMenu, opts MenubarOptions) MenubarRes if m.st.open >= 0 { m.overlay(titles) } + // Focus stays on the title, so the highlighted item is read out. + if name := m.current(); m.moved && name != "" { + c.Announce(name) + } res.chosen = m.chosen return res } @@ -136,6 +142,20 @@ type menubarRun struct { menus []MenubarMenu st *menubarState chosen string + moved bool +} + +// current names the highlighted item of the open menu, "" for none. +func (m *menubarRun) current() string { + st := m.st + if st.open < 0 || len(st.hl) == 0 { + return "" + } + l := len(st.hl) - 1 + if h := st.hl[l]; h >= 0 { + return menubarName(m.c, m.items(l)[h]) + } + return "" } func (m *menubarRun) title(i int, label string) *ui.Element { @@ -152,6 +172,7 @@ func (m *menubarRun) title(i int, label string) *ui.Element { case t.Hovered(): t.Background(k.SurfaceHover) } + internal.Ease(t, Motion(c, theme.StateDuration), k.Text) if st.focusTo == i { t.Focus() st.focusTo = -1 @@ -165,8 +186,9 @@ func (m *menubarRun) title(i int, label string) *ui.Element { case t.Shortcut(0, ui.KeyDown), t.Shortcut(0, ui.KeyUp): m.openMenu(i, true) } - } else { + } else if open { m.keys(t) + t.Description(m.current()) } if t.Clicked() { if open { @@ -185,6 +207,7 @@ func (m *menubarRun) keys(t *ui.Element) { l := len(st.hl) - 1 items := m.items(l) h := st.hl[l] + m.moved, st.reveal = true, true switch { case t.Shortcut(0, ui.KeyDown): st.hl[l] = menubarStep(items, h, 1) @@ -216,6 +239,8 @@ func (m *menubarRun) keys(t *ui.Element) { } else { m.close() } + default: + m.moved, st.reveal = false, false } } @@ -239,6 +264,7 @@ func (m *menubarRun) openMenu(i int, highlight bool) { first = menubarStep(m.menus[i].Items, -1, 1) } m.st.open, m.st.hl = i, []int{first} + m.moved = highlight m.focus(i) slog.Debug("mujica: menubar open", "menu", m.menus[i].Label) } diff --git a/menubar_panel.go b/menubar_panel.go index 11e7185..1ea06b1 100644 --- a/menubar_panel.go +++ b/menubar_panel.go @@ -53,18 +53,18 @@ func (m *menubarRun) overlay(titles []ui.Rect) { }) } -// panel builds level l at (x, y), flipping left of parent when it does not fit. -// It returns the panel and the row of its highlighted item. +// panel builds level l at (x, y) and returns it with its highlighted row. func (m *menubarRun) panel(l int, x, y float32, parent ui.Rect) (*ui.Element, *ui.Element) { c, st := m.c, m.st k := Tokens(c) u := Density(c).Unit() items := m.items(l) - panel := ui.Column(c).Absolute().Padding(u).MinWidth(200).AlignItems(ui.Stretch).Role(ui.RolePopup). + ww, wh := c.Size() + // Long menus scroll within the window instead of running off it. + panel := ui.Scroll(c).Absolute().Padding(u).MinWidth(200).MaxHeight(wh-8).AlignItems(ui.Stretch).Role(ui.RolePopup). Radius(theme.PopupRadius).Background(k.Surface).Border(theme.BorderWidth, k.Border). Shadow(0, 6, 16, 0, ui.RGBA(0, 0, 0, 0.18)) pb := panel.Bounds() - ww, wh := c.Size() if x+pb.W > ww-4 { x = ww - 4 - pb.W if l > 0 { @@ -85,6 +85,10 @@ func (m *menubarRun) panel(l int, x, y float32, parent ui.Rect) (*ui.Element, *u row := m.item(it, st.hl[l] == j) if st.hl[l] == j { anchor = row + if st.reveal && l == len(st.hl)-1 { + row.ScrollIntoView() + st.reveal = false + } } if row.Clicked() { st.hl = append(st.hl[:l], j) @@ -114,15 +118,13 @@ func (m *menubarRun) item(it MenubarItem, hl bool) *ui.Element { k := Tokens(c) d := Density(c) u := d.Unit() - name := it.Label - if (it.Kind == MenubarCheck || it.Kind == MenubarRadio) && it.Checked { - name += ", " + msg(c, "menubar.checked") - } + name := menubarName(c, it) row := ui.Row(c).AlignItems(ui.Center).Gap(u*2).MinHeight(d.ControlHeight()-4).Padding(0, u*2). Radius(theme.ControlRadius).Label(name).TextColor(k.Text).Disabled(it.Disabled).Role(ui.RoleButton) if hl { row.Background(k.Selection) } + internal.Ease(row, Motion(c, theme.StateDuration), k.Text) row.Children(func() { mark := ui.Box(c).Size(16, 16).Shrink(0).Center().Role(ui.RoleNone) if it.Checked && it.Kind == MenubarCheck { @@ -136,7 +138,7 @@ func (m *menubarRun) item(it MenubarItem, hl bool) *ui.Element { ui.Text(c, it.Label).SingleLine() ui.Box(c).Grow(1).MinWidth(u * 6) if it.Shortcut.Key != 0 { - ui.Text(c, menubarShortcutText(it.Shortcut)).FontSize(theme.CaptionSize).TextColor(k.TextMuted).SingleLine() + ui.Text(c, menubarShortcutText(it.Shortcut)).FontSize(FontSize(c, theme.CaptionSize)).TextColor(k.TextMuted).SingleLine() } if it.Items != nil { ui.Icon(c, icons.Must("chevron-right")).Size(14, 14).TextColor(k.TextMuted) @@ -145,6 +147,14 @@ func (m *menubarRun) item(it MenubarItem, hl bool) *ui.Element { return row } +// menubarName is an item's label, with its checked state for assistive technology. +func menubarName(c *ui.Context, it MenubarItem) string { + if (it.Kind == MenubarCheck || it.Kind == MenubarRadio) && it.Checked { + return it.Label + ", " + msg(c, "menubar.checked") + } + return it.Label +} + var menubarKeyNames = map[ui.Key]string{ ui.KeyEnter: "Enter", ui.KeyEscape: "Esc", ui.KeyBackspace: "Backspace", ui.KeyTab: "Tab", ui.KeySpace: "Space", ui.KeyDelete: "Del", ui.KeyHome: "Home", ui.KeyEnd: "End", ui.KeyPageUp: "PgUp", ui.KeyPageDown: "PgDn", diff --git a/menubar_test.go b/menubar_test.go index 1309072..2f97d12 100644 --- a/menubar_test.go +++ b/menubar_test.go @@ -1,6 +1,7 @@ package mujica import ( + "fmt" "runtime" "testing" @@ -149,6 +150,38 @@ func TestMenubarKeyboard(t *testing.T) { } } +func TestMenubarLongMenuScrolls(t *testing.T) { + var items []MenubarItem + for i := range 30 { + items = append(items, MenubarItem{ID: fmt.Sprint(i), Label: fmt.Sprintf("Entry %02d", i)}) + } + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + Menubar(c, []MenubarMenu{{Label: "Long", Items: items}}, MenubarOptions{}) + }, 400, 300) + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyDown) + tt.Key(0, ui.KeyEnd) + tt.Frame() + r, ok := tt.Find("Entry 29") + if !ok || r.H == 0 || r.Y+r.H > 300 { + t.Fatalf("last item outside the window: %+v", r) + } +} + +func TestMenubarAnnouncesHighlight(t *testing.T) { + a := &menubarApp{wrap: true} + tt := ui.NewTester(a.view, 700, 500) + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyRight) + tt.Key(0, ui.KeyDown) // View opens on Word wrap + tt.Key(0, ui.KeyDown) // Fit + got := tt.Announcements() + if len(got) < 2 || got[len(got)-2] != "Word wrap, checked" || got[len(got)-1] != "Fit" { + t.Fatalf("announcements %q", got) + } +} + func TestMenubarShortcutText(t *testing.T) { got := menubarShortcutText(MenubarShortcut{ui.Ctrl | ui.Shift, ui.KeyF5}) want := "Ctrl+Shift+F5" diff --git a/navigation_menu.go b/navigation_menu.go index da0d3cc..94783ad 100644 --- a/navigation_menu.go +++ b/navigation_menu.go @@ -101,19 +101,23 @@ func navigationMenuTop(c *ui.Context, l NavigationLink, path string, push func(s u := d.Unit() on := navigationMenuActive(l, path) b := ui.ButtonBase(c).MinHeight(d.ControlHeight()).Padding(0, u*3).Gap(u * 1.5).Radius(theme.ControlRadius). - Label(l.Label).TextColor(k.TextMuted).Cursor(ui.CursorPointer) + Label(l.Label).Cursor(ui.CursorPointer) open := ui.Local(b, "open", func() bool { return false }) if l.Items == nil { b.Role(ui.RoleLink) } else { b.Role(ui.RoleMenuButton) } + fg := k.TextMuted if on { - b.TextColor(k.Text).FontWeight(600) + b.FontWeight(600) + fg = k.Text } if b.Hovered() || *open { - b.Background(k.SurfaceHover).TextColor(k.Text) + b.Background(k.SurfaceHover) + fg = k.Text } + internal.Ease(b, Motion(c, theme.StateDuration), fg) b.FocusRing(false).DrawOver(func(p *ui.Painter, r ui.Rect) { if on { p.Fill(ui.Rect{X: r.X + u*3, Y: r.Y + r.H - 2, W: r.W - u*6, H: 2}, k.AccentText, 1) @@ -154,7 +158,7 @@ func navigationMenuTop(c *ui.Context, l NavigationLink, path string, push func(s panic("mujica: NavigationLink needs a Label") } if it.Items != nil { - ui.Text(c, it.Label).Font(theme.SerifFont).FontSize(theme.CaptionSize).TextColor(k.Ornament.Mix(k.Text, 0.35)). + ui.Text(c, it.Label).Font(theme.SerifFont).FontSize(FontSize(c, theme.CaptionSize)).TextColor(k.Ornament.Mix(k.Text, 0.35)). Padding(u*2, u*2, u, u*2).SingleLine() list(it.Items) continue @@ -191,6 +195,7 @@ func navigationMenuItem(c *ui.Context, l NavigationLink, on, first bool) *ui.Ele case e.Hovered(): e.Background(k.SurfaceHover) } + internal.Ease(e, Motion(c, theme.StateDuration), k.Text) e.Children(func() { if l.Icon != nil { ui.Icon(c, l.Icon).Size(16, 16).Margin(2, 0, 0, 0) @@ -198,7 +203,7 @@ func navigationMenuItem(c *ui.Context, l NavigationLink, on, first bool) *ui.Ele ui.Column(c).Gap(2).MinWidth(0).Children(func() { ui.Text(c, l.Label).SingleLine() if l.Description != "" { - ui.Text(c, l.Description).FontSize(theme.CaptionSize).TextColor(k.TextMuted).FontWeight(400) + ui.Text(c, l.Description).FontSize(FontSize(c, theme.CaptionSize)).TextColor(k.TextMuted).FontWeight(400) } }) }) diff --git a/navigation_review_test.go b/navigation_review_test.go new file mode 100644 index 0000000..ff29221 --- /dev/null +++ b/navigation_review_test.go @@ -0,0 +1,50 @@ +package mujica + +import ( + "testing" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" +) + +// TestNavigationCaptionsFollowTextScale checks small text grows with the desktop text scale. +func TestNavigationCaptionsFollowTextScale(t *testing.T) { + for _, tc := range []struct { + text string + view func(c *ui.Context) + }{ + {"Name and seal", func(c *ui.Context) { + cur := 0 + Steps(c, &cur, []Step{{Title: "Account", Description: "Name and seal"}}, StepsOptions{}) + }}, + {"12", func(c *ui.Context) { + sel := "a" + Sidebar(c, &sel, []SidebarSection{{Title: "Mail", Items: []SidebarItem{{ID: "a", Label: "Inbox", Icon: icons.Must("inbox"), Count: 12}}}}, SidebarOptions{}) + }}, + {"Verse of the court", func(c *ui.Context) { + navigationMenuItem(c, NavigationLink{Label: "Poems", Path: "/p", Description: "Verse of the court"}, false, false) + }}, + {"Esc close", func(c *ui.Context) { + open := true + CommandPalette(c, &open, []Command{{ID: "a", Label: "A"}}, CommandPaletteOptions{}) + }}, + } { + height := func(scale float32) float32 { + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Fill().AlignItems(ui.Start).Children(func() { tc.view(c) }) + }, 900, 700) + tt.SetPreferences(ui.Preferences{TextScale: scale}) + tt.Frame() + r, ok := tt.Find(tc.text) + if !ok { + t.Fatalf("no %q", tc.text) + } + return r.H + } + if h1, h2 := height(1), height(2); h2 < h1*1.8 { + t.Errorf("%q: height %v at 2x text, %v at 1x", tc.text, h2, h1) + } + } +} diff --git a/pagination.go b/pagination.go index 05a6fa3..f025bd3 100644 --- a/pagination.go +++ b/pagination.go @@ -141,16 +141,19 @@ func paginationButton(c *ui.Context, text string, icon *ui.SVG, name string, on, b := ui.ButtonBase(c).MinHeight(h).MinWidth(h).Padding(0, Density(c).Unit()*2).Radius(theme.ControlRadius). Label(name).Disabled(disabled) internal.Ring(b, k.Focus, theme.ControlRadius) + fg := k.Text switch { case on: - b.Background(k.Accent).TextColor(k.OnAccent).FontWeight(600) + b.Background(k.Accent).Border(theme.BorderWidth, k.Accent).FontWeight(600) + fg = k.OnAccent case b.Pressed(): - b.Background(k.Selection).TextColor(k.Text) + b.Background(k.Selection).Border(theme.BorderWidth, k.ControlBorder) case b.Hovered(): - b.Background(k.SurfaceHover).TextColor(k.Text).Border(theme.BorderWidth, k.ControlBorder) + b.Background(k.SurfaceHover).Border(theme.BorderWidth, k.ControlBorder) default: - b.TextColor(k.Text).Border(theme.BorderWidth, k.Border) + b.Border(theme.BorderWidth, k.Border) } + internal.Ease(b, Motion(c, theme.StateDuration), fg) if icon != nil { b.Tooltip(name) } @@ -176,6 +179,7 @@ func paginationSizes(c *ui.Context, page, pageSize *int, sizes []int, res *Pagin if sel.Trigger.Hovered() { sel.Trigger.Background(k.SurfaceHover) } + internal.Ease(sel.Trigger, Motion(c, theme.StateDuration), k.Text) sel.Trigger.Children(func() { ui.Text(c, fmt.Sprintf(msg(c, "pagination.per_page"), *pageSize)).SingleLine() ui.Icon(c, icons.Must("chevron-down")).Size(14, 14).TextColor(k.TextMuted) @@ -188,6 +192,7 @@ func paginationSizes(c *ui.Context, page, pageSize *int, sizes []int, res *Pagin if it.Highlighted() { it.Background(k.Selection) } + internal.Ease(it, Motion(c, theme.StateDuration), k.Text) it.Children(func() { ui.Text(c, fmt.Sprintf(msg(c, "pagination.per_page"), s)).SingleLine().Grow(1) if s == *pageSize { @@ -239,7 +244,7 @@ func paginationJump(c *ui.Context, pages int, set func(int)) { } else if in.Focused() { border = k.Focus } - box.Border(theme.BorderWidth, border) + internal.Ease(box.Border(theme.BorderWidth, border), Motion(c, theme.StateDuration), k.Text) if *bad { ui.Text(c, fmt.Sprintf(msg(c, "pagination.range"), pages)).TextColor(k.Danger).SingleLine() } diff --git a/segmented_control.go b/segmented_control.go index f20cfe9..f3b0b50 100644 --- a/segmented_control.go +++ b/segmented_control.go @@ -75,7 +75,7 @@ func SegmentedControl(c *ui.Context, selected *int, segments []Segment, opts Seg seg.Background(k.SurfaceHover) fg = k.Text } - seg.TextColor(fg) + internal.Ease(seg, Motion(c, theme.StateDuration), fg) internal.Ring(seg, k.Focus, theme.ControlRadius) if s.HideLabel { seg.Tooltip(s.Label) diff --git a/sidebar.go b/sidebar.go index 339400e..fa0398d 100644 --- a/sidebar.go +++ b/sidebar.go @@ -6,6 +6,8 @@ import ( "github.com/egoist/mygo/ui" + "mujicaui/icons" + "mujicaui/internal" "mujicaui/theme" ) @@ -76,8 +78,9 @@ func Sidebar(c *ui.Context, selected *string, sections []SidebarSection, opts Si if s.Title == "" { panic("mujica: SidebarSection needs a Title") } - ui.SidebarSection(c, s.Title, sidebarOpen(*closed, "s:"+s.Title), func() { - sidebarItems(c, *selected, s.Items, *closed, 0) + path := s.Title + sidebarGroup(c, s.Title, sidebarOpen(*closed, path), true, 0, func() { + sidebarItems(c, *selected, s.Items, *closed, path, 0) }) } }).FillHeight().FillWidth() @@ -104,17 +107,17 @@ func sidebarOpen(closed map[string]*bool, key string) *bool { return o } -func sidebarItems(c *ui.Context, selected string, items []SidebarItem, closed map[string]*bool, depth int) { +func sidebarItems(c *ui.Context, selected string, items []SidebarItem, closed map[string]*bool, parent string, depth int) { u := Density(c).Unit() for _, it := range items { if it.Label == "" { panic("mujica: SidebarItem needs a Label") } if it.Items != nil { - ui.Column(c).Padding(0, 0, 0, float32(depth)*u*4).Children(func() { - ui.SidebarSection(c, it.Label, sidebarOpen(closed, fmt.Sprintf("g%d:%s", depth, it.Label)), func() { - sidebarItems(c, selected, it.Items, closed, depth+1) - }) + // The key holds the whole path, so same-named groups stay apart. + path := parent + "\x00" + it.Label + sidebarGroup(c, it.Label, sidebarOpen(closed, path), false, depth, func() { + sidebarItems(c, selected, it.Items, closed, path, depth+1) }) continue } @@ -124,6 +127,50 @@ func sidebarItems(c *ui.Context, selected string, items []SidebarItem, closed ma } } +// sidebarGroup is a section title or nested group that Enter, Space or a click opens and closes. +func sidebarGroup(c *ui.Context, title string, open *bool, section bool, depth int, fn func()) { + k := Tokens(c) + d := Density(c) + u := d.Unit() + ui.Column(c).Gap(u*0.5).Shrink(0).Padding(0, 0, 0, float32(depth)*u*4).Children(func() { + was := *open + tr := ui.CollapsibleBase(c, open).Trigger + if *open != was { + slog.Debug("mujica: sidebar group toggle", "group", title, "open", *open) + } + tr.AlignItems(ui.Center).Gap(u*2).Padding(u, u*2).Radius(theme.ControlRadius).Label(title).Cursor(ui.CursorPointer) + if section { + tr.Margin(u*2, 0, 0, 0).FontWeight(600).FontSize(FontSize(c, theme.CaptionSize)) + } else { + tr.MinHeight(d.ControlHeight()) + } + internal.Ring(tr, k.Focus, theme.ControlRadius) + if tr.Hovered() { + tr.Background(k.SurfaceHover) + } + fg := k.Text + if section { + fg = k.TextMuted + } + internal.Ease(tr, Motion(c, theme.StateDuration), fg) + turn := tr.Animate("mujica.turn", sidebarTurn(*open), Motion(c, theme.StateDuration)) + tr.Children(func() { + ui.Icon(c, icons.Must("chevron-right")).Size(12, 12).Shrink(0).Rotate(turn).TextColor(k.TextMuted) + ui.Text(c, title).SingleLine().Grow(1) + }) + if *open { + fn() + } + }) +} + +func sidebarTurn(open bool) float32 { + if open { + return 90 + } + return 0 +} + // sidebarFlat lists every leaf for the compact rail. func sidebarFlat(c *ui.Context, selected string, items []SidebarItem) { for _, it := range items { @@ -158,12 +205,13 @@ func sidebarItem(c *ui.Context, selected string, it SidebarItem, compact bool) { e.Tooltip(name).Label(name) } else if it.Count > 0 { e.Label(name).Children(func() { - ui.Text(c, sidebarCount(it.Count)).FontSize(theme.CaptionSize).FontFeatures("tnum"). + ui.Text(c, sidebarCount(it.Count)).FontSize(FontSize(c, theme.CaptionSize)).FontFeatures("tnum"). TextColor(k.TextMuted).Padding(0, d.Unit()*1.5).Radius(theme.ControlRadius).Background(k.Background) }) } + internal.Ease(e, Motion(c, theme.StateDuration), k.Text) if on { - e.Background(k.Selection).TextColor(k.Text).FontWeight(600) + e.Background(k.Selection).FontWeight(600) e.Draw(func(p *ui.Painter, r ui.Rect) { p.Fill(ui.Rect{X: r.X, Y: r.Y + 4, W: 3, H: r.H - 8}, k.AccentText, 1.5) }) diff --git a/sidebar_test.go b/sidebar_test.go index 9eb9f63..0ae2c17 100644 --- a/sidebar_test.go +++ b/sidebar_test.go @@ -124,6 +124,44 @@ func TestSidebarInvalid(t *testing.T) { } } +func TestSidebarGroupKeyboard(t *testing.T) { + sel := "inbox" + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + Sidebar(c, &sel, sidebarSample(), SidebarOptions{}) + }, 400, 500) + // Tab stops: the item list, the Library title, the Projects group. + for range 3 { + tt.Key(0, ui.KeyTab) + } + tt.Key(0, ui.KeyEnter) + if tt.HasText("Opera") { + t.Fatal("Enter did not collapse the group") + } + tt.Key(0, ui.KeySpace) + if !tt.HasText("Opera") { + t.Fatal("Space did not expand the group") + } +} + +func TestSidebarSameNamedGroups(t *testing.T) { + sel := "a1" + sections := []SidebarSection{ + {Title: "Court", Items: []SidebarItem{{Label: "Drafts", Items: []SidebarItem{{ID: "a1", Label: "Edict"}}}}}, + {Title: "Chapel", Items: []SidebarItem{{Label: "Drafts", Items: []SidebarItem{{ID: "b1", Label: "Hymn"}}}}}, + } + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + Sidebar(c, &sel, sections, SidebarOptions{}) + }, 400, 500) + if err := tt.Click("Drafts"); err != nil { + t.Fatal(err) + } + if tt.HasText("Edict") || !tt.HasText("Hymn") { + t.Fatalf("same-named groups share state: %q", tt.Texts()) + } +} + func TestSidebarSnapshot(t *testing.T) { snapshot(t, "sidebar", 420, 360, func(c *ui.Context) { a, b := "opera", "starred" diff --git a/steps.go b/steps.go index 8971b9a..cae4dde 100644 --- a/steps.go +++ b/steps.go @@ -101,6 +101,7 @@ func stepsItem(c *ui.Context, i, n int, s Step, st stepsState, vertical, tail, d if e.Hovered() { e.Background(k.SurfaceHover) } + internal.Ease(e, Motion(c, theme.StateDuration), k.Text) } else { e = ui.Row(c).Shrink(0).Role(ui.RoleListItem) } @@ -130,7 +131,7 @@ func stepsItem(c *ui.Context, i, n int, s Step, st stepsState, vertical, tail, d title.TextColor(k.TextMuted) } if s.Description != "" { - ui.Text(c, s.Description).FontSize(theme.CaptionSize).TextColor(k.TextMuted).MaxWidth(240) + ui.Text(c, s.Description).FontSize(FontSize(c, theme.CaptionSize)).TextColor(k.TextMuted).MaxWidth(240) } }) }) @@ -161,7 +162,7 @@ func stepsMarker(c *ui.Context, i int, st stepsState) { if icon != "" { ui.Icon(c, icons.Must(icon)).Size(14, 14) } else { - ui.Text(c, strconv.Itoa(i+1)).FontSize(theme.CaptionSize).SingleLine() + ui.Text(c, strconv.Itoa(i+1)).FontSize(FontSize(c, theme.CaptionSize)).SingleLine() } }) } diff --git a/tabs.go b/tabs.go index c3b022e..36afb61 100644 --- a/tabs.go +++ b/tabs.go @@ -152,7 +152,7 @@ func tabsStyle(c *ui.Context, tab *ui.Element, t Tab, on, vertical bool) { tab.Background(k.SurfaceHover) fg = k.Text } - tab.TextColor(fg) + internal.Ease(tab, Motion(c, theme.StateDuration), fg) tab.FocusRing(false).DrawOver(func(p *ui.Painter, r ui.Rect) { if on { if vertical { diff --git a/tabs_test.go b/tabs_test.go index f5ba7f2..d395ae2 100644 --- a/tabs_test.go +++ b/tabs_test.go @@ -1,8 +1,14 @@ package mujica import ( + "bytes" + "image/color" + "os" + "path/filepath" + "runtime" "strings" "testing" + "time" "github.com/egoist/mygo/ui" @@ -153,6 +159,77 @@ func TestTabsSnapshot(t *testing.T) { } } +// tabsStateSnapshot compares tabsView after act in both themes with -.png. +func tabsStateSnapshot(t *testing.T, name string, act func(tt *ui.Tester)) { + t.Helper() + for _, m := range []Mode{Light, Dark} { + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{Mode: m}) + tabsView(c) + }, 520, 300) + tt.SetPreferences(ui.Preferences{ReduceMotion: true, TextScale: 1}) + act(tt) + tt.Frame() + got := encode(t, tt.Image()) + path := filepath.Join("testdata", "snapshots", runtime.GOOS, name+"-"+strings.ToLower(m.String())+".png") + if *update { + if err := os.WriteFile(path, got, 0o644); err != nil { + t.Fatal(err) + } + continue + } + want, err := os.ReadFile(path) + if err != nil { + t.Fatalf("%v (run go test -update)", err) + } + if !bytes.Equal(got, want) { + if err := os.WriteFile(path+".got.png", got, 0o644); err != nil { + t.Fatal(err) + } + t.Errorf("%s differs; see %s.got.png", path, path) + } + } +} + +func TestTabsStateSnapshots(t *testing.T) { + center := func(tt *ui.Tester, s string) (float32, float32) { + r, ok := tt.Find(s) + if !ok { + t.Fatalf("no %q", s) + } + return r.X + r.W/2, r.Y + r.H/2 + } + tabsStateSnapshot(t, "tabs-hover", func(tt *ui.Tester) { tt.Move(center(tt, "Members")) }) + tabsStateSnapshot(t, "tabs-pressed", func(tt *ui.Tester) { tt.Press(center(tt, "Settings")) }) + tabsStateSnapshot(t, "tabs-focus", func(tt *ui.Tester) { + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyRight) + }) +} + +// TestTabsStateColorsEase checks hover fades in over StateDuration, not at once. +func TestTabsStateColorsEase(t *testing.T) { + sel := 0 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{Mode: Light}) + Tabs(c, &sel, []Tab{{Label: "One"}, {Label: "Two"}}, TabsOptions{}) + }, 300, 120) + r, _ := tt.Find("Two") + x, y := int(r.X-8), int(r.Y+r.H/2) + hover := tabsRGBA(theme.Light().SurfaceHover) + tt.Move(r.X+r.W/2, r.Y+r.H/2) + if got := tt.Image().RGBAAt(x, y); got == hover { + t.Fatal("hover color applied at once") + } + time.Sleep(theme.StateDuration + 40*time.Millisecond) + tt.Frame() + if got := tt.Image().RGBAAt(x, y); got != hover { + t.Fatalf("hover color %v after the transition, want %v", got, hover) + } +} + +func tabsRGBA(c ui.Color) color.RGBA { return color.RGBA{c.R, c.G, c.B, c.A} } + // tabsMode recovers the mode snapshot applied, to add a density. func tabsMode(c *ui.Context) Mode { if Tokens(c).Dark { diff --git a/testdata/snapshots/darwin/pagination-dark.png b/testdata/snapshots/darwin/pagination-dark.png index 25c2935d749d27b37b950a057c84329b3fdd1087..85cd1508927f624e58901150f4b6e6f69412214f 100644 GIT binary patch literal 10545 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 literal 10720 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 b##4aRLh2jMzG}^Xh+j!gUAA1>^22`st#o^% diff --git a/testdata/snapshots/darwin/pagination-light.png b/testdata/snapshots/darwin/pagination-light.png index e8f1911577c883c5864175d6489405ac03b8e1cd..12bdbf261138fd7125b8d713c2a0b215f76c5fac 100644 GIT binary patch literal 10142 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 Fe*x6WHvs?u literal 10327 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 ZK&zW|tpiUI%t diff --git a/testdata/snapshots/darwin/sidebar-dark.png b/testdata/snapshots/darwin/sidebar-dark.png index df7abfc0e22afa0995c0120ec0ccf8574e2358a6..378dc079e21cd7becd6d8d9ae44e4ebc40bbca6e 100644 GIT binary patch literal 16406 zcmd731yEdF*De@=gb-YVy95moXrPhc?(Xhxjl+w(2e$-*yVEoh-09#n?%F``;J3f` z{r;(`sXO=nH8oT7)jnOP_Bp55UR&0)WUn2itSE(!N{ssA#S3&9X>rvTFJAsY{H#%4 zA)cfoeW-fzLU=_+TtwX~2fi4nJiSNu_BRwj^)7J%;}(5~EeuQa&!lD$^(W(aN3C6r zc+NMnXS?GQ2A(bBk9B&_&MQv~$BRdxmK9ySmFmOt(rGv0Uuy2JbI>@bsj*(7Q&Hl4 zk@+e8iWWwN)R40yNPagxIDE?LGRlrkVGR@~c83z*Hyys7*S zf)+VXf)X;whJ_^Z!1ohl;U&=cE&MOC+Sj1}w93Ry-Fs6)lwdCwC-a?vnRO5nLH}=me4kp9wPY-+*8)Fz&Al`=F%v{Vom`q_o%rxf>54Qjl z88!@l-JyWqZ<9GyYOVPi^fG*fDa!l;Flx>&D;69wZ&4!?nPA3@vMC2sRWBf$&R6rS z3-+BTgEX4mu}aWY{?$_VbkC#7g7LV%cWT(V*x`FBqFEUFXMw$Dv~Fx-LVHZFoLTX? z(0hLuMNb@SOXy zlYVPovw)*vWXwuu)2{p$I3O-9vVfW<;5_8CzhC^u?v0SJtKXFI!@&Gp&8SYr$+6Le z>OfgT-1xI&1(edjS-QC?6gVsTVmPrFBx0bY<-8lnNEQ^Ee`)^E z)3r#BjDp0i?r~&!nRF?P(lBA%a%ol>YB|I;QD3WvbTW8qPg8&y*tJA6g`Ff>;YN0Z zfrin6MM#2=eNt}cAr>DPSwKT$+o^GKxEQ%#J>2Km(N$8|;HxH~lSOS2uzIFe#$R2} zin5uyANPiOQKzo#HZYJ_PCTsaASOE~7izqBe)70>V#)=jrT5u@^YD+jxC|P*PgtK- z$fa74Ie;%d zg`vYsPS}!DuI6xzTU?8Qux zU;X^YUGRyC`Kac+vewPNL4cF`p=tBgJYbYBo{ewKY%$m6x2GAUSZ2K}H4z!fT0@QF z85_`U=?Qc`rl+wpi%;UTN}QXO*Sut(a6(luL4E~?=O{BO8=RPPBZ<7?$dPAqtEq~0 zCS|~RH*Wc!xiw;|)i}v|z}^!11}R2dR^r@qwY<&j)5*h5M77wLzJ!z{MyF$2s|E`R zQYMr1muEhcFz=!U-!YSxrS!y!CX;suk)@OXh^bkb1*rLC--t4IO)es+?h-}!KzN-q zyu7gCbl~TozT+YVq<_G9ZD7JUhx0?pax_XXlBE~x zj{pTNDsCu}i$J`F06B27eTARTif2Oa>Dkd8v=9FU``&ONX+=nng6*ZoPrVt5L@F$g z)r0zv!nm2Kd%x)waQ*EINb1=tMY?t|rd9cO^K-TmMN+q84Q+ z)S>;gv|rLP{TM<^Qf-?ElGYzr$Q5@xGtmS|1Hq>g+vu0@Z&q&wA@kD>7j7;d94)P` zTP^#{HoR}q+`rX_j9@T90`*~h@_C{~s$}#^-e=X6z(lek40DFAdJ@qR;iq>kc|WTd zoR5Z=JdUEIS#YAnabzeeQ51@lZQS{D-!LUHq<*n@o4T^33cE@@Xrssx@7WsLaM|^L z;&nq1s&+D;*DCfUJAKo>GxVordI6Tk!@S&~E%w#9;BDu(BWc-({$M-amoJXw(I ze1F46$nXW^$_Nx=Jx;vwi#}NcdJ4YX^Z8xZoPwdTR$;rozTCjULq525W@k&jDem;@ zq2ubx9VGQY$naP9i_NvrAj*6>JPGCp<4# z{|b)Q)R;?Or(|CIFzdb|XgM4;hF2nEFUIPS^LmwkcOvs@c<~uO<{dIJa*mjzB8H@y zq|-eUwfn_hr0AJ{AU!#eJtNnL3CrDd*LwCHb6|ERGuL`dwg0umd_WbPK*v$z@eV9Mhv33K|wyiwf#Ybfz~v%%j6Zncl3dRnsdabqaBW zEQYwaZnrUH`A9W71f6@o2B34b+G8>4DQ7Z&1z4&gsgs~Nx|S~CT8KqE+r`i13iWD`QhPZYrpfWqf|`0 zv+tCUASNK25r53`^~G@B`{HXw5l2JIa5HRCO|!U8xw!NwOscQg1Z+#U7Nyl?JI+5k z4$seh{Q@Gw!?P;2Sn;B(f86N*R*;==2i0>C1AG=fS%fOv+A3ux<|Q!`#Kgr7QiXy} z?&j>HqZ(2iOjYl;UQ@kM_kv#5a^~Ya9aA}uuHQ12S60Q1j$YM!Yh`w~s(=Vfe6eu* zLI%PoeS8jk)i=*wyWJmc+O*OQ*eA9v(ambj)#kbQGOb)2@`wX$kb)Uv>QTd#PQDYy z^yByuiPI)u1NYstsB@q8R-}_DQGyjy6vu!-h?hWTdAY0=gFNn?Q`YbE1??=~uDx4- zbM@gB&KwfjKErWp6w_`r%wSr#=osg=w?MV)U?OtDh8n|(FzEWz6WR$0EQ!{emkz_} zN>HBOY~-sOP>`XEOW6%6 zbcPw`?T!2=_b&i+!4oZn01EALxiB$!{Lrg{B%`S@zuw*bvuK%A%)mfcYrbn_0y^8& zTK`IZ{<+xK1LmTuhb5}#|GGXekeh&N+uHuzYcG%p0tz6&_b}Aco4yg|I!)7<6Y!EQ z{P^Hf<8y!`Oso(z>X1vZK0Qk}G&a)k$qIVmE6gV30A20fGmCdzxlF1t!pg_IaqFzR z=cB_pcQJ{_a&@gOnm(8#utZ!dMQ!^b+~2*N6O~mpECfcdoCJd;H5kjvd-N!Q-iZbW zA&2|R^7&=gZ1jOGKhh&93*5NmDAb?FlMO?)`5(W6KL3u%6A;1L%o8a2esHrkDvWBV zm~5`%a$uF+`Bj>hI?3xQE6&J%4Qu_B26rt!_nzswmEz*!#^JcV<37Hzx%v41+Ipe+ zmxbKp4aJ|AT^zsGXiKc z?0xQylTAwiA3CE!7*|h^FB@Y-V3?Z{_9mbvb&%axnQL@T(PLjZ6sx7s?6mOUIMX$YF}#UliA!e~t_LYajnJe}@y{X`i0!Ff7(x5Pf_m z_+cO|FZ}A@>-P4;kz<-BX7-z7!XOb4C8R|Zcy=N3c^wU68{1g1pfm1w?*)_{`LR0if#$>co()JjQrcmD<$yF--g3Yn?<^TdkpO` zyr94eQw(kBFFmF8xs*=u)piy2oviL<>gRUkR5EptGEBq*Ak7SvISpOTM=}40d>$3B zE_6RP`2zRfEw6By58``7(QezZLTFKg4?%xCmv*=$G(IsJJ^y005yvYNOg9-`l0XN6YdFV^u*5_|^TqVdI4 zu&HLK@bsUK=ab*gdSNjEy{qAPHlJw>9#`I{z3VS{kL*o|dLC*zc@h>R*>)G*n9f-i z(s32$HrN$~qDM%2sUWTmhnXQz$35ZOI7x{AGZ*gZA7Yb+xRsS}lwrY_YXm{@dFSQnWUN$!1va+*c=v=r1`c+m_ zA|*-!(F6+t*RDP3D%p!SpSP~iu|y3a%_#k*2d`{VQSZ~M`J0(&y9#32z3Mp)N|ZC4 zxw`hB1an@%(2Zen>htcOdCIngQ15rt9o*DB+zLzYYhtk4G&T8|1?+#c?V@#$$$UseDLmEz*;!~~m~nwf&a6-`8^<)^Qt@Df9T=dFQp z$jR5Qth(#>PjI5e#Vn62^gT0NMX6k~x(pQt%vDB~yiX>T8>QF*PZh7ykxMHoP{Tyu zyIo@r2JpL_r~l=>nwQ5`D0#Tn>2|YSmeFq4MHR}3H!|`q?8GsinAkQfti|Rt@&k#; zmv$fJk9eVpSkHP0%~ev8aJvLNz|iW2NcZMC?All!+>EE^%n{@uR-HO*r5YT_$?VV> z5`!9&*U!bk zdO?I%)c50(F6Qy@kYsAwEh`J`SdGzb_Zorzd0mOdPF7@XjuJXL7Tyx6K|y&4{M7$(T_kgcI20nR+Dou7g{=Ur>k$$g>+6&uI-&KhZHdomdxFTY;p#r z=;{S_inyrBOU0XY8%v_|Jm^{M*P$`>9N#xMQQIj>p5cK_e9k&w*6aV;wRBW<9Y{zL z25<}BohA+4z7)d8zri3AqRQpP)L5-^Gm^C>NEl2==yGK`e_klY9c3=Z5(PM|V(6c7 z$Rw{gMWF<1x0*Zn`@a_5pGK$9oSzB6`Y;89c?j{Gl}twn2;^Xr3Y>5aR#aDSg#5%J zPoVJTq`w=(ejs`I(@skBZg}KNVlL?r29-NCmq&1CcLaIEGZO?;(9($c`SDbNA?D~d zY+CTKgl|#4iO0>;4ej?$b4$zhg%KT=Koi_U=a%BMoy*nWw<{SLD}L(tsRStrpBt1r z?&n>zX{ylj6XC?n_+j%{VvCU9Uc5njhOXv*kb-_>iqP>L4fzLlX*Gk-c(tIN_ z-30R8PTfxZ9iPF(*$;Z1{16h3Sy;~Y+IglXX40^ESKmMf$@RuE^6J^yFpbm)?TiGo zH^BP2HQzm7CrB$V507kU4my#YWA-6wd=_y<=l8nGO3|w|%stcOP zeODG1_&8DKgT6_utgI{qqp;!5O8>Olg8Grw)vVqPMm$t9G6y+1HA{wnV!%fjz%7&B zmgs@$qrJRiD{k%0`UszzOrln~@?@ zm)=|;Ok7=EpMP><#546ilS?>Cd}m8uvTL)YzO8u9DUR^srQo*cSWSiBGEGm5L6n@c zdj{|5_|9)BqX*63zV>hpb|@Y8#!~f~bQZuW9Dyus%ImNC*Ia^LEeP^0WD>`&+u15K z)C%SMT#UBHh;JWrav86hdhkGw;v^EH#iuSu+Mc~V2h+Ga$!GF{dkTJj`&3kayz+Cf zlb2QdsKIbOJ2#gC{}EhwCf$|3lmWrIIAQ^4g{i`(3hW&mG#tiqdYK?RH&SF9XI>3f zkT!V_bw<3BF23i3$rN!s@F}ifNB49IpHikk*|%CoK01H+2O3KTB$2$IwFB|Qqcao? zF>tcD2=r%up%X&~^l2&RA-c}VwyL%Yh=(ue;E2k{r%g$a`$v6!TeafYrH8mdE={_p ze6Nk&g`S=+F`dGgaZN$-z|`cVjkUF(HAqQJOiWF!u(LDh;L95jeJpu;V$w+C9iGss z%Ur`JE>fc7mJL-&U477->3IeHF%~QBMHC^vL<7|sr2zKYBO)Nuf$;5M9SwCi{8o;v zxU>N#F9k?qPFp=_nFRK;%Ye0h$lC7a4@m6vk|cE zGczV6#Y;?K7I;Kog{@Mo!GwNY#Gb7CS0JMno$D&nV}liHbM4HY&%bvd?^uk{|2#1Y zC&Q*I`5{FnFtTII$G^y`$1iOAJfY*JIkban`S3g%R9a{h_}D9`!Z&?J$hmiW;3tH+ z@DkGX8gllACenI!0xPrN*oZS?e6>Z_S-ke6OvXH;gJp98eI~r5@yF%b`%Dbu`O`W# zP;J8}GSBVNny<2S*mW>C_v%R|pEm$UEkl7kvyK1k_>zTMR$6{`YR1{9(>k~aHm!sS z`+az5H}9mFzpJmKv9$%692juDD#zEvl|P-2N=bH<5+`?bOlxc7?d+TkT&d7Ii5h8Y zx^+VO1LT$8c3v3%c;I^zpl+bH1iG}c=p2~u9a(IzQ%TOqASQQ_mXo_^P@)0rSCy%e zPUPLPFnX0ptDk|^?dIlo?YW!AD%%Zw3uNUa#t6j|yGXeSVj|TML2c18w1+jCJhkEj zO!6N4DNRcq*hEv4Q5~SN{X}T`E&L7uiW;`j+_iiX%A=qFiijib<%*W=Eh=Qc>a;7n z+xWx7?@mSu4cq(#9~G||X?ihfMD_GOUYq7T{Wcjj%n^3qPXzEd%{#2gBhXJFt_jF8 zG(0SHy{VBY&$D++M1!7haNIKd>&tU*2XJOao1@Mp{7r84{WG&P)TY~G=v zrpOjKpcjOO#y1$Nso~bOiqMf^KjM(=@wk;|X1=>1`cb~Lq$4GDOkL0&;<0#5EIcgavQ6ki7j8TT$#^6>IK&?hUDxt$Yl}H3@TSm^PPR+Z;YK^LRc4>Qu zFh`I?Oq{#vCPmFrOJnvE%@1Yw$g=O>*|df-9g|0w4i66l{j6pmnKd+K@l$8T)ipJf zQfOFM@m+XxR%=O`?E-amcgHf-7=Xfn(Q%879$4^I&=}=E8-#+9D_cdae^$>@tjG`j z82P}W5i-s6^aHoI4)ax{WXI~cP}ovqf|_G>Vx+2*g`ZEO!_@CGDxY0~t@CqKSJ%*Z z3|v;$0W0%eoTT(YoYx^68`u%LdU{cjgFEH)=nf7ns*WpszHH&pJqgKBe);;@St50Y zYO5!qf7-tyf~uROsVy^iiJ`-hN7$9O|GTGL|e&)68 zTX3G5Cl?!wrseg{l-=;^T>t#(Byo!YD!^r5S~9r#WBYTeyF`Bx?s27`7C0YB2(j`+ ziP3(GL7pUQAxVSI%v{lbg+4|xxMk|4kCqU#;Zi3g%vP+<2oW4tZ&X?aVOW@NBRQ?G zrZe+&JdM;BUEt!Vy{#HwTaaTDm|MEawUtllF*Svw;&mk_VLp{(ro zD(;D#*|0S=t&a6Fq?s%--ruFIxDC|t({t=YVPcgpEsl)x`oJ#-C!Wu;%}8NoU&OJt zhu_=5OY7u2p2MMABlxJ9m1a*TRpYOe68fRgi*oz?avEw@Rs|1_t2<$`^fPaL3pqKr zhRdMU>!_{?l8jqF@}_1U*{lo^^KX_t`!4T@%H%7QHZB@74~-%-H-@ac(9=1mHtV@E zIvqDnE%|z=YL=aeM6>$Zx%_Ey@==A|WDB+b^)L7+? ze!}-rd(uW+YM?j>z*3*`j!rZYYlgUCoK98SMX z?lf|YTeFN``x^cN_;bSBgnIeHq*rF%-CI(sYp5{XY5DA`x1)|#8PBAs@qfR>JsG(Oo+Zfp@QF3FT z8qz`jgpQn%<3;Qn1G%?T8k38TK5rGBG3<6ds#_jM;rdM1c&tdK9CXdjUX>`i#*6GwySz(y_Z|&ZKxJNA zOV8@_H(t{Ijd@j4gaHJ?2q#OZo4s9-krF4UxM~RW&rZ&8uP9-d@3)junM^Tt^nI+z zX&_{C?tFQ?P?N`*5|bsMrDw%kvsw5gU!5n7RW~{ zwVtm)zX$(;Ryje7yq7^Q5tq0*XV$BbSA^!{^EMt5-oE5HTo=QH1llYF3JsD(#c1(p zmO4CvzCml+!uN98%oWFTvdgrA69ICY^nBAGNfwuPU95iI*Yzb7K6A@vCpQ(8Wglev zrI{pE&wkP2E1{_2s8|icPTsHNBrI~1`Q+wBe*G>Bftr72^?j;}&3rG1>VUgsV{?P8 zvbd~HeFtBGrkl6l!65m#lb1TvU^`_GZx74G=}a4FYnv=82+z^5Wv748Xhb$pWT`5p zRTi&%3mhK_$AVGSislF?hg0I4M+g$o$1=cJz;$wE*77j-s;8b0M0v8f_Dg)N5nLcW4lUt=``5Bl*?FHG?s+4d1Sw7Sw+=aJzGm%XVQ_V6jQ=TyTFbtSj6d%H#De9&O?Yi+ z@8Yx#@X`CwKwMqT&}^@;-;|2l?o^4IiH#*nA?rgvY5rwI-@u(@MgJkmx>=nz*iH;< z`>Sa%e)n?S>&xk-3g714x8btYj@7GAs}8IVZ#sf5CM%H>Cj5OAyW@MVC<2eE zE`EXR*ky=JJ`9NMexE;JH!`6IVPE_a=+G4Y$+w`;{iE9z{@Dt-GmO&arw* zPM}vA5jcNxXkzsV zHsym(zxDIK##!FS3EXVDmL{7pWZacG?Yboo8WkYb#c6j z(z?+ORykPG--k1qFdOky@4>YvX}XJ_N9#xaN#i78&_!A5H>OQhKR9B)0^UIK(d%T(Ggn6?59D?1ooq zW~)ulp3J10(~tMs!~oI{dIC-x@nn=~(tWtUodY+E*YZEO3|uFl=qGerlYRB<L<*bZbU@DB~hkw{U&Oc8N~e^Ut2n$s72%g_0uc z$)%aAv{FlL!CLr9x-a&XyNn`Qgq>=dwB51wGv!ZB;oeD^9X<@Dspi9 zxhnO@$A!!fI6`~^sB0r}_nQCwhZl|$ELz0^si@D1oN>rPbk7^#0&!&`fUsk<2EsI2 z#gdJMH`4LS8#Iw=^;V=%pPM0@T(Q*-(Tz7L2ZSL34jVW50nbiLVsZWtLK!X2u`zuT zw3{6Ax zkKgvjM zA-$Md5uf_o$O44c(iGe@JHUK?UfY|_9;oGD{+o}!?syAWAu9uTZh!I_2D$jgSdE0X zUQ=TAhHo2(TK0v=3A6r4+?Up^`rv9*JL%ZuI1Bv>`DWAd*fyCN)~%$Bb;>3-Fv{w@HvtlZo(A}U(TX)8{!{w#xy&)}v-*{CM|Y*d?X5uAlO zX?P+HU*j`({cEwl?rupjvBJOXtI)L$2{8u6e`zn9sf_*M1yk zxeM~B#>Ph1tzxG(Us`zf8wM8>eRucLFtAPPx7{y`XGh3%BwhMsANG4UluJ0TbNR9x z>~3Cy{*Is`{~bo%XH$-K_#=?l*_oFKn^}NicM9b-HN_>6H`&_R9WOkAcRpWm>F^;o zQzliYn4dGoI?bFnw@ihe_FuE5Pw;1(nK^(hE_9C$rcqJlPM5)m@CDSu2nWS>0c;KW zrIJUC!B8 zAQ3XSdm6+~75!ez!)ZEKFHEa2Gdnpyf0TmhPoN|xH{H`ySykn~ly-I4;Ds7CwK|a{ z7*9FGJH{Nf(m_Fy!|&f2n4;hQ)svBxj@mCxey)Z6%1-nvU=*pvsU<_6$Fc+yBVlyM zxpboXt`6*{YAn=~2bNWKnuLR)=0gZ2PLC=|GY8py9T8wy40bGClR-;qx&d+14 zvxKrUC4DU5l~&Xz`|W|xCQ3?BLXu8RMm#);+gl&>pHeF3JxJ(fc$lGmuc-n%Fhh|* z&%&U?B3ipWIzw#DIx{iap>A*E^H1#WW9HXnvY;Ev*PuDXgvl12+peN-$&}OizI(s- zfkY`f8jXjO6MlGNf*4ZR9(z~H=fI^j53m-hU%OyWZ!qXsNO|qo%(82GLFsJ1Uq)WQ zT^bf9#CH-Cf=Ks1NgY)5D!H`|aBTPdQrbWQ~$NLdqd+Z9A^F4O`_kXv}!1pcmfUo2C|e%G^9H!1=i;6F?yTv(aY=haHF=PM0M8 z7W45mUG%%X6Jdj|F!ET3>zIiO2LXNpRH7dNN5X*rw6ymBP9*z(pNxO=-q`9}O-W73 z=m`}{u)v@*ERK*EKv*JivA1t+hbzj@54on`Q=zLg!HmzL6m}wWsH%LQzVPxh@b3ai zuYoE2`X#NXJGAj@P|4E5-16eKeftLzdBPw$1>e)EA@+9>IC&P?-(|(k5freRr+D35 zW^;hnizRBE72q`KC(^{&RU4YiDLytXZ=x<8ofK^7i7rf=31DhXy`+B(F<`#ZaY%}p_D(I^^>crZRNA)Aqz z@caMbmodx0#D!@5drAt<{!=LruREgV>$fl9^+&o){chs77ox>Ml8Inj6#p;+vm=~4WP3ap-HJz@fD&L3IWm}_u+z+lM;>cq51ea0zCgE~gIP^;ja0#rrj=Dpz&yA-9Vah1G;qd6t7+agpiLu== z+*-?!?sKlGs=Ds#{CtT}&CQRFM@w%FkYcs?BJ;_9#=!wk=AayOh&B{KLz4+1;g&MA zs$>ohN&vz_nefN1i0w5-89AsI*U+=4+v>>J#PIO=QIfRSEC0ASv~1mzdWyf{?JZog z$MHpLLK*|EXmc@~NQM8Z>qw#qAUo<%qSwZ|c<=2i89q^t6FtI&6m_x73tJlADW_1? z*OWmS9%puLY>3Y%!xsh~u0Fnf8~-G>JjwCf4TVaLzDrW&>)q>8Bl;R5IbYw|KuTOu zA6lH$+Rcd|hv`)Xxom?YFfWt)4%#rL6S)!pVQCxCH33 zV${rqCN}*!U9LsQrls+dSs+O;rCC;BgXf-!N~%A_&p@ltmv3JZed#m6HrJT^M2Dv! zPArQ>$iso}HhL+`tfF?L;LXalHX_GG)1>dxjU2~H05JE^Hpi1d??ZlRqHX!XYPWs< z6B#*8zq}95Z2)Gv+eyQ++ipJ8%yj)B1O{W_bFeiwx zdS~BckCHm`@;a)n;E8{YlpoG+kj&b8q)6S}`Sc}UXSWvr_G&LS^AgAl`ex=}(9z8N z!+)SGe?08LzWPd^1Iv9=bE$u?f9QmQ2xjw)aJg$r?QL zd3lk>?9?Fq3l@_1$#327m`EatghK!S=!)vuI=iN9Pfj$mrK-2s2A%%zF@vq4n87a) zI+||KvB>DJh!ietx@`k}UoVOlqJR3vXl7Kv36frWB3GQij;dSh&%bnbJ(=zgUJ6Mf zlLUQ$nV8RCOM!4Bz-<_{HBQ#fEuPc`f>t9RZKtdLUk3+co2f1CUSg8Sdz=tSo zR3MOV@#=84s`U>@(NRQ0gS%xf^P)T1dv~|kgt}!WC?{!Kg8`xXarI#A{u!fKW@3lwQ0$2|*_a92E5B-de7# z5p+B9d*;2)^3!hJ;XKe?bGc^x`w=qqgp zo*^tOgfV_mjQq^3_RxeZ1#uZWAx}6Af(-W(SUuE`+eSyPnDe7b()Vz!*8}@aGE}5T zucE4ysV}PpO3zmtv=1aiDe)H0R_R=lpyh5EXrD9!50y4C-&a&D;z)I zB4qbrpBWo-KfA9G7zDHHf8t`J>NkT+t9_RV+CF@)Tv6BciHKa5ipwB?TUpup?>Xv- z_SiTj4UWv_@9oIw>%Zx`IjQXQ_tnsn!^MR3YJKQ5 zxXGj5Gr6CjQ}VpocQUyhc&=V_8mt~>^83zOZzq%3% zdtVrkppRG zXn;y!16_ojZ25W)g!zOtkTgk96;7H(dRW!H>EmF7ScqlB8x3`V$T+#xTQzfU@1mBW z-i0COIXK;Bj+|fT$%(<*-EB1JBsx|o^V6!EyS%-t>N%gn?8BgCgWuyZCZb{N$s{ps zGf9Z!LaWC16@PvW(5ai#Wr8l;gvU{vYtbJG`|5Z;8#@2UeJ0xqZgV*;K z$8*XoInQPCBJRtLO0N;wuE2zuy7Ia>pvB}V=;GL+N+&HB$nfKg@o*WoFebln2^=ue z=j7~>pD0V5$EC2#81WSv@Lo6`a0% zQ^IX{1%X~!BiKTm8Sbhv-oBepsII_z{Dx$t=yntk+!1{e$fRBty( z19?bZ^V63U9}6_9R-PHMSlU$b_dhHxCWlXX`2S`RdyK#H6G|{SmkZdM@RFB|BYm1p z&#y#(?kXHKjV$dnOv`2<;@HIJ9yRP#{XEw1Jvi~YpRP#!^Ur~izP{FK!#OYVcSv{o z6bUxXwfao0oQwW_Ii8}OYflYeFzhmMI4*m5VWHG1-w<*`4r})J?CR{eK3U!5n|S=4 zl(OvoFYN%ijyCXf1TpwO7R&T&5~Mw4_eAZ-*nHoW99Wd;pVYBoRjMBy8%Y}785Pq1 zg^-sfJAgywy~6wJ6j{5Ab6TcUCdQwh7l5N{3SLWV>rY$9Wi7I&if8$SP3*kCl!{ab z`{=ptT*-tv-cl#Tv>WDg0eN|clzyog(Wd|$>EHThkFQnY#$4P;k)O{0d0e?V>Y7yh zmp6y8&~dqdt)hPCeH@s$KizM-7hI%fAcdU-PCAQaC2>ky*^0OQcy(3JcOj&E53ASV zdR59X?}Qgog`!oa?(LndVaGF;O;YbZtRHT2eok8<3>nDNA6YC6oi|*iK0e(tlnPN=X$~*>E)Bq zQLh%l)c-nNw$yyO%Z4kG$U{*anE$kV=eDyY69jdmd4Y>-rlz*>c#l6jtLnIPictKt z1;wwL59pc6_}za+U+-DIC)(q%^%?rwE2T&-NI-)JTCEL8ZD=S=XKaNBfOnbY$<55o z)wQ&4es4@eL=78xuNuIK`Hz=dPd%oT`+Zf-G0^w$yqAz>*BFNHwHHr?pqy zkqS47Crfy|Y^Z5{lqNxJD1lgwOQuo%ow;^tiyVwibuBDr&7VEn1qR(u9d+1K4BFgx z;9z%0hG0r|2X|d?S2I>wBhUG-chzC{u#EsvYd+bD)lK@TRRr>T0v7f^ul~O{Tz&lJ vKlar2|2yvOf9R3)|LWXISJ=uk<_l4By=YvrIeNq~f)_FpisIFx#=-vsb8ru_ literal 16031 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 diff --git a/testdata/snapshots/darwin/sidebar-light.png b/testdata/snapshots/darwin/sidebar-light.png index 3cd875d47449eecc16b5febe3952252d4d8642aa..d7c77dece58257f9d9464124649ab4b98a5dcb0c 100644 GIT binary patch literal 16054 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