@gtkx/components 1.0.0-rc.1 → 1.0.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adw/index.d.ts +3 -0
- package/dist/adw/index.d.ts.map +1 -0
- package/dist/adw/index.js +2 -0
- package/dist/adw/index.js.map +1 -0
- package/dist/adw/toast.d.ts +10 -0
- package/dist/adw/toast.d.ts.map +1 -0
- package/dist/adw/toast.js +51 -0
- package/dist/adw/toast.js.map +1 -0
- package/dist/adw/types.d.ts +28 -0
- package/dist/adw/types.d.ts.map +1 -0
- package/dist/adw/types.js +2 -0
- package/dist/adw/types.js.map +1 -0
- package/dist/column-view.d.ts +7 -29
- package/dist/column-view.d.ts.map +1 -1
- package/dist/column-view.js +98 -70
- package/dist/column-view.js.map +1 -1
- package/dist/drop-down.d.ts +8 -27
- package/dist/drop-down.d.ts.map +1 -1
- package/dist/drop-down.js +112 -81
- package/dist/drop-down.js.map +1 -1
- package/dist/grid-view.d.ts +6 -16
- package/dist/grid-view.d.ts.map +1 -1
- package/dist/grid-view.js +25 -33
- package/dist/grid-view.js.map +1 -1
- package/dist/index.d.ts +6 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -6
- package/dist/index.js.map +1 -1
- package/dist/internal/cells.d.ts +50 -0
- package/dist/internal/cells.d.ts.map +1 -0
- package/dist/internal/cells.js +185 -0
- package/dist/internal/cells.js.map +1 -0
- package/dist/internal/collection-index.d.ts +21 -0
- package/dist/internal/collection-index.d.ts.map +1 -0
- package/dist/internal/collection-index.js +106 -0
- package/dist/internal/collection-index.js.map +1 -0
- package/dist/internal/collection-model.d.ts +12 -0
- package/dist/internal/collection-model.d.ts.map +1 -0
- package/dist/internal/collection-model.js +164 -0
- package/dist/internal/collection-model.js.map +1 -0
- package/dist/internal/collection.d.ts +18 -0
- package/dist/internal/collection.d.ts.map +1 -0
- package/dist/internal/collection.js +64 -0
- package/dist/internal/collection.js.map +1 -0
- package/dist/internal/expansion.d.ts +9 -0
- package/dist/internal/expansion.d.ts.map +1 -0
- package/dist/internal/expansion.js +75 -0
- package/dist/internal/expansion.js.map +1 -0
- package/dist/internal/selection.d.ts +12 -0
- package/dist/internal/selection.d.ts.map +1 -0
- package/dist/internal/selection.js +99 -0
- package/dist/internal/selection.js.map +1 -0
- package/dist/internal/use-collection.d.ts +18 -0
- package/dist/internal/use-collection.d.ts.map +1 -0
- package/dist/internal/use-collection.js +42 -0
- package/dist/internal/use-collection.js.map +1 -0
- package/dist/internal/use-widget-ref.d.ts +4 -0
- package/dist/internal/use-widget-ref.d.ts.map +1 -0
- package/dist/internal/use-widget-ref.js +8 -0
- package/dist/internal/use-widget-ref.js.map +1 -0
- package/dist/list-view.d.ts +5 -20
- package/dist/list-view.d.ts.map +1 -1
- package/dist/list-view.js +32 -53
- package/dist/list-view.js.map +1 -1
- package/dist/size-group.d.ts +8 -16
- package/dist/size-group.d.ts.map +1 -1
- package/dist/size-group.js +35 -51
- package/dist/size-group.js.map +1 -1
- package/dist/types.d.ts +97 -24
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +17 -6
- package/src/adw/index.ts +2 -0
- package/src/adw/toast.tsx +74 -0
- package/src/adw/types.ts +32 -0
- package/src/column-view.tsx +176 -160
- package/src/drop-down.tsx +180 -167
- package/src/grid-view.tsx +29 -73
- package/src/index.ts +18 -25
- package/src/internal/cells.tsx +345 -0
- package/src/internal/collection-index.ts +168 -0
- package/src/internal/collection-model.ts +246 -0
- package/src/internal/collection.ts +104 -0
- package/src/internal/expansion.ts +123 -0
- package/src/internal/selection.tsx +159 -0
- package/src/internal/use-collection.tsx +70 -0
- package/src/internal/use-widget-ref.ts +11 -0
- package/src/list-view.tsx +43 -139
- package/src/size-group.tsx +63 -82
- package/src/types.ts +155 -24
- package/dist/cell.d.ts +0 -30
- package/dist/cell.d.ts.map +0 -1
- package/dist/cell.js +0 -45
- package/dist/cell.js.map +0 -1
- package/dist/column-view-column.d.ts +0 -27
- package/dist/column-view-column.d.ts.map +0 -1
- package/dist/column-view-column.js +0 -30
- package/dist/column-view-column.js.map +0 -1
- package/dist/constraint-layout-apply.d.ts +0 -55
- package/dist/constraint-layout-apply.d.ts.map +0 -1
- package/dist/constraint-layout-apply.js +0 -107
- package/dist/constraint-layout-apply.js.map +0 -1
- package/dist/constraint-layout.d.ts +0 -20
- package/dist/constraint-layout.d.ts.map +0 -1
- package/dist/constraint-layout.js +0 -88
- package/dist/constraint-layout.js.map +0 -1
- package/dist/fixed.d.ts +0 -26
- package/dist/fixed.d.ts.map +0 -1
- package/dist/fixed.js +0 -40
- package/dist/fixed.js.map +0 -1
- package/dist/grid.d.ts +0 -27
- package/dist/grid.d.ts.map +0 -1
- package/dist/grid.js +0 -48
- package/dist/grid.js.map +0 -1
- package/dist/hooks/use-cell-containers.d.ts +0 -18
- package/dist/hooks/use-cell-containers.d.ts.map +0 -1
- package/dist/hooks/use-cell-containers.js +0 -67
- package/dist/hooks/use-cell-containers.js.map +0 -1
- package/dist/hooks/use-collection-model.d.ts +0 -26
- package/dist/hooks/use-collection-model.d.ts.map +0 -1
- package/dist/hooks/use-collection-model.js +0 -35
- package/dist/hooks/use-collection-model.js.map +0 -1
- package/dist/hooks/use-collection-widget.d.ts +0 -28
- package/dist/hooks/use-collection-widget.d.ts.map +0 -1
- package/dist/hooks/use-collection-widget.js +0 -21
- package/dist/hooks/use-collection-widget.js.map +0 -1
- package/dist/hooks/use-drop-down-selection.d.ts +0 -16
- package/dist/hooks/use-drop-down-selection.d.ts.map +0 -1
- package/dist/hooks/use-drop-down-selection.js +0 -35
- package/dist/hooks/use-drop-down-selection.js.map +0 -1
- package/dist/hooks/use-expansion-model.d.ts +0 -12
- package/dist/hooks/use-expansion-model.d.ts.map +0 -1
- package/dist/hooks/use-expansion-model.js +0 -71
- package/dist/hooks/use-expansion-model.js.map +0 -1
- package/dist/hooks/use-header-menu.d.ts +0 -4
- package/dist/hooks/use-header-menu.d.ts.map +0 -1
- package/dist/hooks/use-header-menu.js +0 -20
- package/dist/hooks/use-header-menu.js.map +0 -1
- package/dist/hooks/use-installed-model.d.ts +0 -4
- package/dist/hooks/use-installed-model.d.ts.map +0 -1
- package/dist/hooks/use-installed-model.js +0 -15
- package/dist/hooks/use-installed-model.js.map +0 -1
- package/dist/hooks/use-list-model.d.ts +0 -19
- package/dist/hooks/use-list-model.d.ts.map +0 -1
- package/dist/hooks/use-list-model.js +0 -97
- package/dist/hooks/use-list-model.js.map +0 -1
- package/dist/hooks/use-placed-child.d.ts +0 -18
- package/dist/hooks/use-placed-child.d.ts.map +0 -1
- package/dist/hooks/use-placed-child.js +0 -47
- package/dist/hooks/use-placed-child.js.map +0 -1
- package/dist/hooks/use-selection-model.d.ts +0 -13
- package/dist/hooks/use-selection-model.d.ts.map +0 -1
- package/dist/hooks/use-selection-model.js +0 -103
- package/dist/hooks/use-selection-model.js.map +0 -1
- package/dist/hooks/use-sort-handler.d.ts +0 -17
- package/dist/hooks/use-sort-handler.d.ts.map +0 -1
- package/dist/hooks/use-sort-handler.js +0 -87
- package/dist/hooks/use-sort-handler.js.map +0 -1
- package/dist/menu-items.d.ts +0 -5
- package/dist/menu-items.d.ts.map +0 -1
- package/dist/menu-items.js +0 -48
- package/dist/menu-items.js.map +0 -1
- package/dist/menu.d.ts +0 -14
- package/dist/menu.d.ts.map +0 -1
- package/dist/menu.js +0 -24
- package/dist/menu.js.map +0 -1
- package/dist/overlay.d.ts +0 -24
- package/dist/overlay.d.ts.map +0 -1
- package/dist/overlay.js +0 -49
- package/dist/overlay.js.map +0 -1
- package/dist/utils/cell-container-store.d.ts +0 -28
- package/dist/utils/cell-container-store.d.ts.map +0 -1
- package/dist/utils/cell-container-store.js +0 -98
- package/dist/utils/cell-container-store.js.map +0 -1
- package/dist/utils/item-models.d.ts +0 -10
- package/dist/utils/item-models.d.ts.map +0 -1
- package/dist/utils/item-models.js +0 -82
- package/dist/utils/item-models.js.map +0 -1
- package/dist/utils/item-resolver.d.ts +0 -25
- package/dist/utils/item-resolver.d.ts.map +0 -1
- package/dist/utils/item-resolver.js +0 -102
- package/dist/utils/item-resolver.js.map +0 -1
- package/dist/utils/list-item-flatten.d.ts +0 -24
- package/dist/utils/list-item-flatten.d.ts.map +0 -1
- package/dist/utils/list-item-flatten.js +0 -68
- package/dist/utils/list-item-flatten.js.map +0 -1
- package/src/cell.tsx +0 -144
- package/src/column-view-column.tsx +0 -82
- package/src/constraint-layout-apply.ts +0 -173
- package/src/constraint-layout.tsx +0 -135
- package/src/fixed.tsx +0 -86
- package/src/grid.tsx +0 -88
- package/src/hooks/use-cell-containers.ts +0 -93
- package/src/hooks/use-collection-model.ts +0 -60
- package/src/hooks/use-collection-widget.ts +0 -47
- package/src/hooks/use-drop-down-selection.ts +0 -52
- package/src/hooks/use-expansion-model.ts +0 -82
- package/src/hooks/use-header-menu.ts +0 -34
- package/src/hooks/use-installed-model.ts +0 -20
- package/src/hooks/use-list-model.ts +0 -161
- package/src/hooks/use-placed-child.ts +0 -79
- package/src/hooks/use-selection-model.ts +0 -114
- package/src/hooks/use-sort-handler.ts +0 -107
- package/src/menu-items.ts +0 -48
- package/src/menu.tsx +0 -32
- package/src/overlay.tsx +0 -88
- package/src/utils/cell-container-store.ts +0 -114
- package/src/utils/item-models.ts +0 -113
- package/src/utils/item-resolver.ts +0 -138
- package/src/utils/list-item-flatten.ts +0 -90
package/src/column-view.tsx
CHANGED
|
@@ -1,190 +1,206 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import
|
|
9
|
-
import type {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
} from "./types.js";
|
|
16
|
-
import type { CellContainerStore } from "./utils/cell-container-store.js";
|
|
17
|
-
import type { ItemResolver } from "./utils/item-resolver.js";
|
|
18
|
-
|
|
19
|
-
export type { ColumnDef, ColumnDefDeclarativeProps } from "./column-view-column.js";
|
|
20
|
-
|
|
21
|
-
const headerFactoryInstaller = makeFactoryInstaller<Gtk.ColumnView>((widget, factory) =>
|
|
22
|
-
widget.setHeaderFactory(factory),
|
|
23
|
-
);
|
|
24
|
-
|
|
25
|
-
export type ColumnViewSortProps = {
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
3
|
+
import { GtkColumnView, GtkColumnViewColumn, GtkCustomSorter, GtkSignalListItemFactory } from "@gtkx/jsx/gtk";
|
|
4
|
+
import { useProperty, useSignal } from "@gtkx/react";
|
|
5
|
+
import { omit } from "@gtkx/utils";
|
|
6
|
+
import { useLayoutEffect, useRef } from "react";
|
|
7
|
+
import type { CellSize } from "./internal/cells.js";
|
|
8
|
+
import type { Collection } from "./internal/collection.js";
|
|
9
|
+
import type { Column, ColumnViewProps } from "./types.js";
|
|
10
|
+
import { HeaderPortals, ItemPortals, useHeaderCells, useItemCells } from "./internal/cells.js";
|
|
11
|
+
import { useCollection } from "./internal/use-collection.js";
|
|
12
|
+
import { useWidgetRef } from "./internal/use-widget-ref.js";
|
|
13
|
+
|
|
14
|
+
type SortProps = {
|
|
26
15
|
sortColumn?: string | null | undefined;
|
|
27
16
|
sortOrder?: Gtk.SortType | null | undefined;
|
|
28
17
|
onSortChanged?: ((column: string | null, order: Gtk.SortType) => void) | null | undefined;
|
|
29
18
|
};
|
|
30
19
|
|
|
31
|
-
|
|
32
|
-
Omit<CollectionItemSizeProps, "estimatedItemWidth"> &
|
|
33
|
-
ControlledSelectionProps &
|
|
34
|
-
ControlledExpansionProps & {
|
|
35
|
-
items?: ItemNode<T>[] | undefined;
|
|
36
|
-
sections?: SectionNode<S, T>[] | undefined;
|
|
37
|
-
renderHeader?: ((info: { section: S }) => ReactNode) | null | undefined;
|
|
38
|
-
columns: ColumnDef<T>[];
|
|
39
|
-
};
|
|
20
|
+
type SortTarget = { view: Gtk.ColumnView; column: Gtk.ColumnViewColumn | null };
|
|
40
21
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
*/
|
|
47
|
-
export type ColumnViewProps<T = unknown, S = unknown> = Omit<
|
|
48
|
-
GtkColumnViewProps,
|
|
49
|
-
"columns" | "model" | "headerFactory" | keyof ColumnViewDeclarativeProps<T, S>
|
|
50
|
-
> &
|
|
51
|
-
ColumnViewDeclarativeProps<T, S>;
|
|
52
|
-
|
|
53
|
-
type NormalizedColumnViewProps<T, S> = ColumnViewDeclarativeProps<T, S> & {
|
|
54
|
-
ref?: Ref<Gtk.ColumnView | null>;
|
|
55
|
-
[key: string]: unknown;
|
|
22
|
+
type ColumnCellsProps = {
|
|
23
|
+
column: Column<never>;
|
|
24
|
+
collection: Collection;
|
|
25
|
+
expandedIds: string[] | null | undefined;
|
|
26
|
+
size: CellSize;
|
|
56
27
|
};
|
|
57
28
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
29
|
+
type ColumnListProps = Omit<ColumnCellsProps, "column"> & {
|
|
30
|
+
columns: Column<never>[];
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const COLUMN_VIEW_PROPS = [
|
|
34
|
+
"items",
|
|
35
|
+
"sections",
|
|
36
|
+
"renderHeader",
|
|
37
|
+
"columns",
|
|
38
|
+
"selectedIds",
|
|
39
|
+
"onSelectionChanged",
|
|
40
|
+
"selectionMode",
|
|
41
|
+
"expandedIds",
|
|
42
|
+
"onExpandedChange",
|
|
43
|
+
"sortColumn",
|
|
44
|
+
"sortOrder",
|
|
45
|
+
"onSortChanged",
|
|
46
|
+
"estimatedItemHeight",
|
|
47
|
+
"children",
|
|
48
|
+
"ref",
|
|
49
|
+
] as const satisfies (keyof ColumnViewProps)[];
|
|
50
|
+
|
|
51
|
+
const columnById = (view: Gtk.ColumnView, id: string): Gtk.ColumnViewColumn | null => {
|
|
52
|
+
const columns = view.getColumns();
|
|
53
|
+
|
|
54
|
+
for (let index = 0; index < columns.getNItems(); index++) {
|
|
55
|
+
const column = columns.getItem(index);
|
|
56
|
+
|
|
57
|
+
if (column instanceof Gtk.ColumnViewColumn && column.getId() === id) {
|
|
58
|
+
return column;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
67
61
|
|
|
68
|
-
|
|
69
|
-
instances: Map<string, Gtk.ColumnViewColumn>;
|
|
70
|
-
setInstance: (id: string, column: Gtk.ColumnViewColumn | null) => void;
|
|
71
|
-
} => {
|
|
72
|
-
const [instances, setInstances] = useState<Map<string, Gtk.ColumnViewColumn>>(() => new Map());
|
|
73
|
-
const setInstance = useCallback((id: string, column: Gtk.ColumnViewColumn | null): void => {
|
|
74
|
-
setInstances((current) => {
|
|
75
|
-
if (column === null) {
|
|
76
|
-
if (!current.has(id)) return current;
|
|
77
|
-
const next = new Map(current);
|
|
78
|
-
next.delete(id);
|
|
79
|
-
return next;
|
|
80
|
-
}
|
|
81
|
-
if (current.get(id) === column) return current;
|
|
82
|
-
const next = new Map(current);
|
|
83
|
-
next.set(id, column);
|
|
84
|
-
return next;
|
|
85
|
-
});
|
|
86
|
-
}, []);
|
|
87
|
-
return { instances, setInstance };
|
|
62
|
+
return null;
|
|
88
63
|
};
|
|
89
64
|
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
if (instance) result.push({ id: column.id, column: instance, sortable: column.sortable ?? false });
|
|
65
|
+
const getSortTarget = (view: Gtk.ColumnView | null, sortColumn: string | null | undefined): SortTarget | null => {
|
|
66
|
+
if (view === null || sortColumn === undefined) {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (sortColumn === null) {
|
|
71
|
+
return { view, column: null };
|
|
98
72
|
}
|
|
99
|
-
|
|
73
|
+
|
|
74
|
+
const column = columnById(view, sortColumn);
|
|
75
|
+
|
|
76
|
+
return column === null ? null : { view, column };
|
|
100
77
|
};
|
|
101
78
|
|
|
102
|
-
const
|
|
103
|
-
|
|
79
|
+
const applySort = (
|
|
80
|
+
sorting: { current: boolean },
|
|
81
|
+
view: Gtk.ColumnView,
|
|
82
|
+
column: Gtk.ColumnViewColumn | null,
|
|
83
|
+
order: Gtk.SortType | null | undefined,
|
|
84
|
+
): void => {
|
|
85
|
+
sorting.current = true;
|
|
86
|
+
|
|
87
|
+
try {
|
|
88
|
+
view.sortByColumn(column, order ?? Gtk.SortType.ASCENDING);
|
|
89
|
+
} finally {
|
|
90
|
+
sorting.current = false;
|
|
91
|
+
}
|
|
92
|
+
};
|
|
104
93
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
94
|
+
const emitSortChanged = (
|
|
95
|
+
sorter: Gtk.ColumnViewSorter | null,
|
|
96
|
+
sorting: { current: boolean },
|
|
97
|
+
sort: SortProps,
|
|
98
|
+
): void => {
|
|
99
|
+
if (sorter === null || sorting.current) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
111
102
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
103
|
+
sort.onSortChanged?.(sorter.getPrimarySortColumn()?.getId() ?? null, sorter.getPrimarySortOrder());
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const syncSort = (
|
|
107
|
+
sorting: { current: boolean },
|
|
108
|
+
view: Gtk.ColumnView | null,
|
|
109
|
+
sortColumn: string | null | undefined,
|
|
110
|
+
sortOrder: Gtk.SortType | null | undefined,
|
|
111
|
+
): void => {
|
|
112
|
+
const target = getSortTarget(view, sortColumn);
|
|
113
|
+
|
|
114
|
+
if (target === null) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
117
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
118
|
+
applySort(sorting, target.view, target.column, sortOrder);
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
const useColumnSorting = (view: Gtk.ColumnView | null, sort: SortProps, columns: Column<never>[]): void => {
|
|
122
|
+
const sorting = useRef(false);
|
|
123
|
+
const sorter = useProperty(view, "sorter");
|
|
124
|
+
const columnSorter = sorter instanceof Gtk.ColumnViewSorter ? sorter : null;
|
|
125
|
+
|
|
126
|
+
useSignal(columnSorter, "changed", (): void => {
|
|
127
|
+
emitSortChanged(columnSorter, sorting, sort);
|
|
124
128
|
});
|
|
125
129
|
|
|
126
|
-
const
|
|
127
|
-
const tree = useMemo<TreeRenderContext>(
|
|
128
|
-
() => createTreeRenderContext(expandedIds, collection.rowId),
|
|
129
|
-
[expandedIds, collection.rowId],
|
|
130
|
-
);
|
|
130
|
+
const { sortColumn, sortOrder } = sort;
|
|
131
131
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
132
|
+
useLayoutEffect(() => {
|
|
133
|
+
syncSort(sorting, view, sortColumn, sortOrder);
|
|
134
|
+
}, [view, sortColumn, sortOrder, columns]);
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
const ColumnCells = ({ column, collection, expandedIds, size }: ColumnCellsProps): ReactNode => {
|
|
138
|
+
const cells = useItemCells(size);
|
|
139
|
+
const rest = omit(column, ["id", "renderCell", "sortable"]);
|
|
140
|
+
|
|
141
|
+
return (
|
|
142
|
+
<>
|
|
143
|
+
<GtkColumnViewColumn
|
|
144
|
+
id={column.id}
|
|
145
|
+
factory={<GtkSignalListItemFactory {...cells.handlers} />}
|
|
146
|
+
sorter={column.sortable === true ? <GtkCustomSorter /> : null}
|
|
147
|
+
{...rest}
|
|
148
|
+
/>
|
|
149
|
+
<ItemPortals
|
|
150
|
+
store={cells}
|
|
151
|
+
render={column.renderCell}
|
|
152
|
+
collection={collection}
|
|
153
|
+
expandedIds={expandedIds}
|
|
154
|
+
/>
|
|
155
|
+
</>
|
|
156
|
+
);
|
|
141
157
|
};
|
|
142
158
|
|
|
159
|
+
const ColumnList = ({ columns, collection, expandedIds, size }: ColumnListProps): ReactNode =>
|
|
160
|
+
columns.map((column) => (
|
|
161
|
+
<ColumnCells
|
|
162
|
+
key={column.id}
|
|
163
|
+
column={column}
|
|
164
|
+
collection={collection}
|
|
165
|
+
expandedIds={expandedIds}
|
|
166
|
+
size={size}
|
|
167
|
+
/>
|
|
168
|
+
));
|
|
169
|
+
|
|
143
170
|
/**
|
|
144
|
-
* Renders a Gtk.ColumnView
|
|
145
|
-
*
|
|
171
|
+
* Renders a Gtk.ColumnView from declarative items or sections and a columns array,
|
|
172
|
+
* with controlled selection, expansion, and sorting, per-column header menus, and
|
|
173
|
+
* section header rendering.
|
|
146
174
|
*/
|
|
147
|
-
|
|
148
|
-
const
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
expandedIds,
|
|
159
|
-
onExpandedChange,
|
|
160
|
-
sortColumn,
|
|
161
|
-
sortOrder,
|
|
162
|
-
onSortChanged,
|
|
163
|
-
renderHeader,
|
|
164
|
-
estimatedItemHeight,
|
|
165
|
-
...intrinsicProps
|
|
166
|
-
} = normalized;
|
|
175
|
+
function ColumnView<T = unknown, S = unknown>(props: ColumnViewProps<T, S>): ReactNode {
|
|
176
|
+
const { renderHeader, columns, expandedIds, sortColumn, sortOrder, onSortChanged, estimatedItemHeight, ref } =
|
|
177
|
+
props;
|
|
178
|
+
|
|
179
|
+
const rest = omit(props, COLUMN_VIEW_PROPS);
|
|
180
|
+
const [view, refCallback] = useWidgetRef<Gtk.ColumnView>(ref);
|
|
181
|
+
const size = { width: -1, height: estimatedItemHeight ?? -1 };
|
|
182
|
+
const { collection, selection } = useCollection(props);
|
|
183
|
+
const headerCells = useHeaderCells(size);
|
|
184
|
+
const columnList = columns as Column<never>[];
|
|
185
|
+
useColumnSorting(view, { sortColumn, sortOrder, onSortChanged }, columnList);
|
|
167
186
|
|
|
168
187
|
return (
|
|
169
188
|
<>
|
|
170
|
-
<GtkColumnView
|
|
171
|
-
{
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
/>
|
|
180
|
-
))}
|
|
189
|
+
<GtkColumnView
|
|
190
|
+
ref={refCallback}
|
|
191
|
+
model={selection}
|
|
192
|
+
{...(renderHeader != null && {
|
|
193
|
+
headerFactory: <GtkSignalListItemFactory {...headerCells.handlers} />,
|
|
194
|
+
})}
|
|
195
|
+
{...rest}
|
|
196
|
+
>
|
|
197
|
+
<ColumnList columns={columnList} collection={collection} expandedIds={expandedIds} size={size} />
|
|
181
198
|
</GtkColumnView>
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
resolver={wiring.headerResolver}
|
|
186
|
-
renderHeader={renderHeader}
|
|
187
|
-
/>
|
|
199
|
+
{renderHeader != null && (
|
|
200
|
+
<HeaderPortals store={headerCells} render={renderHeader} collection={collection} />
|
|
201
|
+
)}
|
|
188
202
|
</>
|
|
189
203
|
);
|
|
190
|
-
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export { ColumnView };
|