From 7401fc9bf2a60eb579d0970fa5653c6938f3c00a 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:45:45 -0400 Subject: [PATCH] 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 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 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 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 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) + } +}