@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/list-view.tsx
CHANGED
|
@@ -1,148 +1,52 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import { GtkListView,
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
} from "./types.js";
|
|
22
|
-
import type { CellContainerStore } from "./utils/cell-container-store.js";
|
|
23
|
-
import type { ItemResolver } from "./utils/item-resolver.js";
|
|
24
|
-
|
|
25
|
-
const factoryInstaller = makeFactoryInstaller<Gtk.ListView>((widget, factory) => widget.setFactory(factory));
|
|
26
|
-
|
|
27
|
-
const headerFactoryInstaller = makeFactoryInstaller<Gtk.ListView>((widget, factory) =>
|
|
28
|
-
widget.setHeaderFactory(factory),
|
|
29
|
-
);
|
|
30
|
-
|
|
31
|
-
export type ListViewDeclarativeProps<T = unknown, S = unknown> = CollectionItemSizeProps &
|
|
32
|
-
ControlledSelectionProps &
|
|
33
|
-
ControlledExpansionProps & {
|
|
34
|
-
items?: ItemNode<T>[] | undefined;
|
|
35
|
-
sections?: SectionNode<S, T>[] | undefined;
|
|
36
|
-
renderItem: (props: RenderItemProps<T>) => ReactNode;
|
|
37
|
-
renderHeader?: ((info: { section: S }) => ReactNode) | null | undefined;
|
|
38
|
-
};
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import { GtkListView, GtkSignalListItemFactory } from "@gtkx/jsx/gtk";
|
|
3
|
+
import { omit } from "@gtkx/utils";
|
|
4
|
+
import type { ListViewProps } from "./types.js";
|
|
5
|
+
import { HeaderPortals, ItemPortals, useHeaderCells, useItemCells } from "./internal/cells.js";
|
|
6
|
+
import { useCollection } from "./internal/use-collection.js";
|
|
7
|
+
|
|
8
|
+
const LIST_VIEW_PROPS = [
|
|
9
|
+
"items",
|
|
10
|
+
"sections",
|
|
11
|
+
"renderItem",
|
|
12
|
+
"renderHeader",
|
|
13
|
+
"selectedIds",
|
|
14
|
+
"onSelectionChanged",
|
|
15
|
+
"selectionMode",
|
|
16
|
+
"expandedIds",
|
|
17
|
+
"onExpandedChange",
|
|
18
|
+
"estimatedItemHeight",
|
|
19
|
+
"estimatedItemWidth",
|
|
20
|
+
] as const satisfies (keyof ListViewProps)[];
|
|
39
21
|
|
|
40
22
|
/**
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* an optional section header renderer, controlled selection and expansion, and
|
|
44
|
-
* estimated item sizing.
|
|
23
|
+
* Renders a Gtk.ListView from declarative items or sections, with per-row rendering,
|
|
24
|
+
* controlled selection, controlled tree expansion, and estimated item sizing.
|
|
45
25
|
*/
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
setRef: (value: Gtk.ListView | null) => void;
|
|
54
|
-
resolver: ItemResolver<T, S>;
|
|
55
|
-
headerResolver: ItemResolver<T, S>;
|
|
56
|
-
itemStore: CellContainerStore;
|
|
57
|
-
headerStore: CellContainerStore;
|
|
58
|
-
useHeader: boolean;
|
|
59
|
-
rowId: (row: Gtk.TreeListRow) => string | undefined;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
const useListViewWiring = <T, S>(props: NormalizedListViewProps<T, S>): ListViewWiring<T, S> => {
|
|
63
|
-
const { widgetRef, setRef, collection } = useCollectionWidget<Gtk.ListView, T, S>(props);
|
|
64
|
-
|
|
65
|
-
const useHeader = collection.useHeader;
|
|
66
|
-
|
|
67
|
-
const itemStore = useCellContainers<Gtk.ListView>({
|
|
68
|
-
object: widgetRef,
|
|
69
|
-
installer: factoryInstaller,
|
|
70
|
-
estimatedHeight: props.estimatedItemHeight,
|
|
71
|
-
estimatedWidth: props.estimatedItemWidth,
|
|
72
|
-
});
|
|
73
|
-
const headerStore = useCellContainers<Gtk.ListView>({
|
|
74
|
-
object: useHeader ? widgetRef : null,
|
|
75
|
-
installer: headerFactoryInstaller,
|
|
76
|
-
estimatedHeight: props.estimatedItemHeight,
|
|
77
|
-
estimatedWidth: props.estimatedItemWidth,
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
return {
|
|
81
|
-
setRef,
|
|
82
|
-
resolver: collection.resolver,
|
|
83
|
-
headerResolver: collection.headerResolver,
|
|
84
|
-
itemStore,
|
|
85
|
-
headerStore,
|
|
86
|
-
useHeader,
|
|
87
|
-
rowId: collection.rowId,
|
|
88
|
-
};
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
type NormalizedListViewProps<T, S> = ListViewDeclarativeProps<T, S> & {
|
|
92
|
-
ref?: Ref<Gtk.ListView | null>;
|
|
93
|
-
estimatedItemHeight?: number;
|
|
94
|
-
estimatedItemWidth?: number;
|
|
95
|
-
[key: string]: unknown;
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Renders a Gtk.ListView: a scrollable, single-column list backed by a collection
|
|
100
|
-
* model, with each row drawn by renderItem and optional section headers.
|
|
101
|
-
*/
|
|
102
|
-
export const ListView = <T = unknown, S = unknown>(props: ListViewProps<T, S>): ReactNode => {
|
|
103
|
-
const {
|
|
104
|
-
ref,
|
|
105
|
-
items,
|
|
106
|
-
sections,
|
|
107
|
-
renderItem,
|
|
108
|
-
renderHeader,
|
|
109
|
-
selectedIds,
|
|
110
|
-
selectionMode,
|
|
111
|
-
onSelectionChanged,
|
|
112
|
-
expandedIds,
|
|
113
|
-
onExpandedChange,
|
|
114
|
-
estimatedItemHeight,
|
|
115
|
-
estimatedItemWidth,
|
|
116
|
-
...intrinsicProps
|
|
117
|
-
} = props as NormalizedListViewProps<T, S>;
|
|
118
|
-
|
|
119
|
-
const wiring = useListViewWiring<T, S>({
|
|
120
|
-
ref,
|
|
121
|
-
items,
|
|
122
|
-
sections,
|
|
123
|
-
renderHeader,
|
|
124
|
-
selectedIds,
|
|
125
|
-
selectionMode,
|
|
126
|
-
onSelectionChanged,
|
|
127
|
-
expandedIds,
|
|
128
|
-
onExpandedChange,
|
|
129
|
-
estimatedItemHeight,
|
|
130
|
-
estimatedItemWidth,
|
|
131
|
-
} as NormalizedListViewProps<T, S>);
|
|
132
|
-
|
|
133
|
-
const treeContext: TreeRenderContext = createTreeRenderContext(expandedIds, wiring.rowId);
|
|
134
|
-
const cellRenderer: CellRenderer<T, S> = itemRenderer<T, S>(renderItem, treeContext);
|
|
26
|
+
function ListView<T = unknown, S = unknown>(props: ListViewProps<T, S>): ReactNode {
|
|
27
|
+
const { renderItem, renderHeader, expandedIds, estimatedItemHeight, estimatedItemWidth } = props;
|
|
28
|
+
const rest = omit(props, LIST_VIEW_PROPS);
|
|
29
|
+
const size = { width: estimatedItemWidth ?? -1, height: estimatedItemHeight ?? -1 };
|
|
30
|
+
const { collection, selection } = useCollection(props);
|
|
31
|
+
const itemCells = useItemCells(size);
|
|
32
|
+
const headerCells = useHeaderCells(size);
|
|
135
33
|
|
|
136
34
|
return (
|
|
137
35
|
<>
|
|
138
|
-
<GtkListView
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
36
|
+
<GtkListView
|
|
37
|
+
model={selection}
|
|
38
|
+
factory={<GtkSignalListItemFactory {...itemCells.handlers} />}
|
|
39
|
+
{...(renderHeader != null && {
|
|
40
|
+
headerFactory: <GtkSignalListItemFactory {...headerCells.handlers} />,
|
|
41
|
+
})}
|
|
42
|
+
{...rest}
|
|
145
43
|
/>
|
|
44
|
+
<ItemPortals store={itemCells} render={renderItem} collection={collection} expandedIds={expandedIds} />
|
|
45
|
+
{renderHeader != null && (
|
|
46
|
+
<HeaderPortals store={headerCells} render={renderHeader} collection={collection} />
|
|
47
|
+
)}
|
|
146
48
|
</>
|
|
147
49
|
);
|
|
148
|
-
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export { ListView };
|
package/src/size-group.tsx
CHANGED
|
@@ -1,96 +1,77 @@
|
|
|
1
1
|
import type * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
+
import type { ElementType, ReactNode, Ref, RefCallback } from "react";
|
|
2
3
|
import { GtkSizeGroup } from "@gtkx/jsx/gtk";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
type Ref,
|
|
9
|
-
type RefCallback,
|
|
10
|
-
useCallback,
|
|
11
|
-
useContext,
|
|
12
|
-
useRef,
|
|
13
|
-
} from "react";
|
|
14
|
-
import type { ChildProps } from "./types.js";
|
|
15
|
-
|
|
16
|
-
type SizeGroupRegistry = {
|
|
17
|
-
addWidget: (widget: Gtk.Widget) => void;
|
|
18
|
-
removeWidget: (widget: Gtk.Widget) => void;
|
|
19
|
-
setGroup: (group: Gtk.SizeGroup | null) => void;
|
|
20
|
-
};
|
|
4
|
+
import { useMergedRef } from "@gtkx/react/internal";
|
|
5
|
+
import { createContext, useCallback, useContext, useState } from "react";
|
|
6
|
+
import type { SizeGroupChildProps, SizeGroupProps } from "./types.js";
|
|
7
|
+
|
|
8
|
+
type Register = RefCallback<Gtk.Widget | null>;
|
|
21
9
|
|
|
22
|
-
|
|
10
|
+
type SizeGroupChildRuntimeProps = {
|
|
11
|
+
component: ElementType;
|
|
12
|
+
ref?: Ref<Gtk.Widget | null> | undefined;
|
|
13
|
+
} & Record<string, unknown>;
|
|
23
14
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
if (!registry) throw new Error("<SizeGroup.Child> must be a child of <SizeGroup>");
|
|
27
|
-
return registry;
|
|
15
|
+
type SizeGroupComponent = ((props: SizeGroupProps) => ReactNode) & {
|
|
16
|
+
Child: <C extends ElementType>(props: SizeGroupChildProps<C>) => ReactNode;
|
|
28
17
|
};
|
|
29
18
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
19
|
+
const SizeGroupContext = createContext<Register | null>(null);
|
|
20
|
+
const SizeGroupChild = SizeGroupChildImpl as <C extends ElementType>(props: SizeGroupChildProps<C>) => ReactNode;
|
|
21
|
+
/**
|
|
22
|
+
* Creates a Gtk.SizeGroup that keeps widgets joined through `SizeGroup.Child`
|
|
23
|
+
* at a common size in the given mode, without contributing a widget of its own.
|
|
24
|
+
*/
|
|
25
|
+
const SizeGroup: SizeGroupComponent = Object.assign(SizeGroupRoot, { Child: SizeGroupChild });
|
|
26
|
+
|
|
27
|
+
const useRegister = (): Register => {
|
|
28
|
+
const register = useContext(SizeGroupContext);
|
|
29
|
+
|
|
30
|
+
if (register === null) {
|
|
31
|
+
throw new Error("<SizeGroup.Child> must be a child of <SizeGroup>");
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return register;
|
|
36
35
|
};
|
|
37
36
|
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
function SizeGroupChildImpl(props: SizeGroupChildRuntimeProps): ReactNode {
|
|
38
|
+
const { component: Component, ref, ...rest } = props;
|
|
39
|
+
const refCallback = useMergedRef<Gtk.Widget | null>(ref, useRegister());
|
|
40
|
+
|
|
41
|
+
return <Component {...rest} ref={refCallback} />;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const addWidget = (widgets: Gtk.Widget[], widget: Gtk.Widget): Gtk.Widget[] =>
|
|
45
|
+
widgets.includes(widget) ? widgets : [...widgets, widget];
|
|
46
|
+
|
|
47
|
+
const removeWidget = (widgets: Gtk.Widget[], widget: Gtk.Widget): Gtk.Widget[] =>
|
|
48
|
+
widgets.filter((entry) => entry !== widget);
|
|
49
|
+
|
|
50
|
+
function SizeGroupRoot(props: SizeGroupProps): ReactNode {
|
|
51
|
+
const { mode, ref, children } = props;
|
|
52
|
+
const [widgets, setWidgets] = useState<Gtk.Widget[]>([]);
|
|
40
53
|
|
|
41
|
-
const
|
|
42
|
-
const registry = useSizeGroupRegistry();
|
|
43
|
-
const joinGroup = useCallback<RefCallback<Gtk.Widget>>(
|
|
54
|
+
const register = useCallback<Register>(
|
|
44
55
|
(widget) => {
|
|
45
|
-
if (widget === null)
|
|
46
|
-
|
|
47
|
-
|
|
56
|
+
if (widget === null) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
setWidgets((previous) => addWidget(previous, widget));
|
|
61
|
+
|
|
62
|
+
return () => {
|
|
63
|
+
setWidgets((previous) => removeWidget(previous, widget));
|
|
64
|
+
};
|
|
48
65
|
},
|
|
49
|
-
[
|
|
66
|
+
[setWidgets],
|
|
50
67
|
);
|
|
51
|
-
const Component: ElementType = component;
|
|
52
|
-
const setWidget = useMergeRefs<Gtk.Widget>(ref, joinGroup);
|
|
53
|
-
return <Component {...rest} ref={setWidget} />;
|
|
54
|
-
};
|
|
55
68
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
},
|
|
64
|
-
removeWidget: (widget) => {
|
|
65
|
-
members.delete(widget);
|
|
66
|
-
group?.removeWidget(widget);
|
|
67
|
-
},
|
|
68
|
-
setGroup: (next) => {
|
|
69
|
-
group = next;
|
|
70
|
-
if (next) for (const member of members) next.addWidget(member);
|
|
71
|
-
},
|
|
72
|
-
};
|
|
73
|
-
};
|
|
69
|
+
return (
|
|
70
|
+
<>
|
|
71
|
+
<GtkSizeGroup ref={ref} mode={mode} widgets={widgets} />
|
|
72
|
+
<SizeGroupContext.Provider value={register}>{children}</SizeGroupContext.Provider>
|
|
73
|
+
</>
|
|
74
|
+
);
|
|
75
|
+
}
|
|
74
76
|
|
|
75
|
-
|
|
76
|
-
* Creates a Gtk.SizeGroup that keeps its member widgets at a common size. Members join the group
|
|
77
|
-
* through {@link SizeGroup.Child}.
|
|
78
|
-
*/
|
|
79
|
-
export const SizeGroup: ((props: SizeGroupProps) => ReactNode) & {
|
|
80
|
-
Child: <C extends ElementType>(props: SizeGroupChildProps<C>) => ReactNode;
|
|
81
|
-
} = Object.assign(
|
|
82
|
-
({ mode, ref, children }: SizeGroupProps): ReactNode => {
|
|
83
|
-
const registryRef = useRef<SizeGroupRegistry | null>(null);
|
|
84
|
-
if (registryRef.current === null) registryRef.current = createRegistry();
|
|
85
|
-
const registry = registryRef.current;
|
|
86
|
-
const setGroup = useCallback<RefCallback<Gtk.SizeGroup>>((group) => registry.setGroup(group), [registry]);
|
|
87
|
-
const mergedRef = useMergeRefs<Gtk.SizeGroup>(ref, setGroup);
|
|
88
|
-
return (
|
|
89
|
-
<>
|
|
90
|
-
<GtkSizeGroup ref={mergedRef} mode={mode} />
|
|
91
|
-
<SizeGroupContext.Provider value={registry}>{children}</SizeGroupContext.Provider>
|
|
92
|
-
</>
|
|
93
|
-
);
|
|
94
|
-
},
|
|
95
|
-
{ Child: SizeGroupChild },
|
|
96
|
-
);
|
|
77
|
+
export { SizeGroup };
|
package/src/types.ts
CHANGED
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
import type * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
-
import type {
|
|
2
|
+
import type {
|
|
3
|
+
GtkColumnViewColumnProps,
|
|
4
|
+
GtkColumnViewProps,
|
|
5
|
+
GtkDropDown,
|
|
6
|
+
GtkGridViewProps,
|
|
7
|
+
GtkListViewProps,
|
|
8
|
+
} from "@gtkx/jsx/gtk";
|
|
9
|
+
import type { ComponentPropsWithRef, ElementType, ReactNode, Ref } from "react";
|
|
3
10
|
|
|
4
|
-
/** Props of a container's Child component: the widget to render
|
|
5
|
-
|
|
11
|
+
/** Props of a container's Child component: the widget to render and its own props. */
|
|
12
|
+
type ChildProps<C extends ElementType> = {
|
|
6
13
|
component: C;
|
|
7
|
-
} &
|
|
14
|
+
} & ComponentPropsWithRef<C>;
|
|
8
15
|
|
|
9
16
|
/** Props of a component whose backing widget defaults to one type but can be swapped through `component`. */
|
|
10
|
-
|
|
17
|
+
type WidgetProps<C extends ElementType, Own = unknown, ExtraOmit extends string = never> = Own & {
|
|
11
18
|
component?: C;
|
|
12
19
|
} & Omit<ComponentPropsWithRef<C>, ExtraOmit | keyof Own>;
|
|
13
20
|
|
|
@@ -15,11 +22,11 @@ export type WidgetProps<C extends ElementType, Own = unknown, ExtraOmit extends
|
|
|
15
22
|
* A single item in a collection model, identified by a stable id and holding an
|
|
16
23
|
* arbitrary value. Nested items form a tree.
|
|
17
24
|
*/
|
|
18
|
-
|
|
25
|
+
type Item<T = unknown> = {
|
|
19
26
|
/** Stable identifier used to track the item across updates and selection. */
|
|
20
27
|
id: string;
|
|
21
28
|
value: T;
|
|
22
|
-
children?:
|
|
29
|
+
children?: Item<T>[] | undefined;
|
|
23
30
|
/** Hides the tree expander arrow even when the item has children. */
|
|
24
31
|
hideExpander?: boolean | undefined;
|
|
25
32
|
/** Adds indentation matching the item's depth in the tree. */
|
|
@@ -29,16 +36,16 @@ export type ItemNode<T = unknown> = {
|
|
|
29
36
|
};
|
|
30
37
|
|
|
31
38
|
/** A group of items rendered under a shared section header. */
|
|
32
|
-
|
|
39
|
+
type Section<S = unknown, T = unknown> = {
|
|
33
40
|
/** Stable identifier used to track the section across updates. */
|
|
34
41
|
id: string;
|
|
35
42
|
value: S;
|
|
36
43
|
/** Items belonging to this section. */
|
|
37
|
-
data:
|
|
44
|
+
data: Item<T>[];
|
|
38
45
|
};
|
|
39
46
|
|
|
40
|
-
/**
|
|
41
|
-
|
|
47
|
+
/** Arguments passed to an {@link ItemRenderer} when rendering one cell. */
|
|
48
|
+
type RenderItemArgs<T> = {
|
|
42
49
|
item: T;
|
|
43
50
|
index: number;
|
|
44
51
|
/** Depth of the item within a tree, starting at zero for top-level items. */
|
|
@@ -47,30 +54,154 @@ export type RenderItemProps<T> = {
|
|
|
47
54
|
isExpanded?: boolean | undefined;
|
|
48
55
|
};
|
|
49
56
|
|
|
50
|
-
|
|
57
|
+
/** Arguments passed to a {@link HeaderRenderer} when rendering one section header. */
|
|
58
|
+
type RenderHeaderArgs<S> = {
|
|
59
|
+
section: S;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
/** Renders the contents of one cell of a collection view. */
|
|
63
|
+
type ItemRenderer<T> = (args: RenderItemArgs<T>) => ReactNode;
|
|
64
|
+
/** Renders the contents of one section header of a collection view. */
|
|
65
|
+
type HeaderRenderer<S> = (args: RenderHeaderArgs<S>) => ReactNode;
|
|
66
|
+
|
|
67
|
+
type ItemSizeProps = {
|
|
51
68
|
estimatedItemHeight?: number | undefined;
|
|
52
69
|
estimatedItemWidth?: number | undefined;
|
|
53
70
|
};
|
|
54
71
|
|
|
55
|
-
|
|
72
|
+
type SelectionProps = {
|
|
56
73
|
selectedIds?: string[] | null | undefined;
|
|
57
74
|
onSelectionChanged?: ((ids: string[]) => void) | null | undefined;
|
|
58
75
|
selectionMode?: Gtk.SelectionMode | null | undefined;
|
|
59
76
|
};
|
|
60
77
|
|
|
61
|
-
|
|
78
|
+
type ExpansionProps = {
|
|
62
79
|
expandedIds?: string[] | null | undefined;
|
|
63
80
|
onExpandedChange?: ((ids: string[]) => void) | null | undefined;
|
|
64
81
|
};
|
|
65
82
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
83
|
+
type SourceProps<T, S> = {
|
|
84
|
+
items?: Item<T>[] | undefined;
|
|
85
|
+
sections?: Section<S, T>[] | undefined;
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
/** One column of a {@link ColumnView}, pairing Gtk.ColumnViewColumn props with a cell renderer. */
|
|
89
|
+
type Column<T = unknown> = Omit<GtkColumnViewColumnProps, "factory" | "sorter" | "id" | "title"> & {
|
|
90
|
+
/** Stable identifier, also used to address the column through sorting props. */
|
|
91
|
+
id: string;
|
|
92
|
+
title: string;
|
|
93
|
+
renderCell: ItemRenderer<T>;
|
|
94
|
+
/** Whether clicking the column header sorts by it. */
|
|
95
|
+
sortable?: boolean | undefined;
|
|
96
|
+
headerMenu?: ReactNode;
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
type ColumnViewOwnProps<T, S> = SelectionProps &
|
|
100
|
+
ExpansionProps &
|
|
101
|
+
SourceProps<T, S> &
|
|
102
|
+
Omit<ItemSizeProps, "estimatedItemWidth"> & {
|
|
103
|
+
columns: Column<T>[];
|
|
104
|
+
renderHeader?: HeaderRenderer<S> | null | undefined;
|
|
105
|
+
/** Id of the column the view is sorted by, making sorting controlled. */
|
|
106
|
+
sortColumn?: string | null | undefined;
|
|
107
|
+
sortOrder?: Gtk.SortType | null | undefined;
|
|
108
|
+
onSortChanged?: ((column: string | null, order: Gtk.SortType) => void) | null | undefined;
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Props for {@link ColumnView}. Combines the underlying Gtk.ColumnView props with
|
|
113
|
+
* declarative collection props: flat items or grouped sections, controlled selection
|
|
114
|
+
* and expansion, sorting (sortColumn, sortOrder, onSortChanged), an optional section
|
|
115
|
+
* header renderer, and the columns to render.
|
|
116
|
+
*/
|
|
117
|
+
type ColumnViewProps<T = unknown, S = unknown> = Omit<
|
|
118
|
+
GtkColumnViewProps,
|
|
119
|
+
"columns" | "model" | "headerFactory" | keyof ColumnViewOwnProps<T, S>
|
|
120
|
+
> &
|
|
121
|
+
ColumnViewOwnProps<T, S>;
|
|
122
|
+
|
|
123
|
+
type DropDownOwnProps<T, S> = SourceProps<T, S> & {
|
|
124
|
+
/** Id of the currently selected item, making the selection controlled. */
|
|
125
|
+
selectedId?: string | null | undefined;
|
|
126
|
+
onSelectionChanged?: ((id: string) => void) | null | undefined;
|
|
127
|
+
renderItem?: ItemRenderer<T> | null | undefined;
|
|
128
|
+
/** Renderer for items in the open popup list, falling back to renderItem when omitted. */
|
|
129
|
+
renderListItem?: ItemRenderer<T> | null | undefined;
|
|
130
|
+
/** Renderer for section headers in the popup list. */
|
|
131
|
+
renderHeader?: HeaderRenderer<S> | null | undefined;
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Props for {@link DropDown}. The backing widget is chosen through the `component` prop, defaulting to
|
|
136
|
+
* GtkDropDown, and its own props combine with the declarative collection props.
|
|
137
|
+
*/
|
|
138
|
+
type DropDownProps<T = unknown, S = unknown, C extends ElementType = typeof GtkDropDown> = WidgetProps<
|
|
139
|
+
C,
|
|
140
|
+
DropDownOwnProps<T, S>,
|
|
141
|
+
"model" | "factory" | "listFactory" | "headerFactory"
|
|
142
|
+
>;
|
|
143
|
+
|
|
144
|
+
type GridViewOwnProps<T> = ItemSizeProps &
|
|
145
|
+
SelectionProps & {
|
|
146
|
+
items?: Item<T>[] | undefined;
|
|
147
|
+
renderItem: ItemRenderer<T>;
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Props for {@link GridView}. Combines the underlying Gtk.GridView props with
|
|
152
|
+
* declarative collection props: items, a per-cell renderItem, controlled selection,
|
|
153
|
+
* and estimated item sizing.
|
|
154
|
+
*/
|
|
155
|
+
type GridViewProps<T = unknown> = Omit<GtkGridViewProps, "model" | "factory" | keyof GridViewOwnProps<T>> &
|
|
156
|
+
GridViewOwnProps<T>;
|
|
157
|
+
|
|
158
|
+
type ListViewOwnProps<T, S> = ItemSizeProps &
|
|
159
|
+
SelectionProps &
|
|
160
|
+
ExpansionProps &
|
|
161
|
+
SourceProps<T, S> & {
|
|
162
|
+
renderItem: ItemRenderer<T>;
|
|
163
|
+
renderHeader?: HeaderRenderer<S> | null | undefined;
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Props for {@link ListView}. Combines the underlying Gtk.ListView props with
|
|
168
|
+
* declarative collection props: flat items or grouped sections, a per-row renderItem,
|
|
169
|
+
* an optional section header renderer, controlled selection and expansion, and
|
|
170
|
+
* estimated item sizing.
|
|
171
|
+
*/
|
|
172
|
+
type ListViewProps<T = unknown, S = unknown> = Omit<
|
|
173
|
+
GtkListViewProps,
|
|
174
|
+
"model" | "factory" | "headerFactory" | keyof ListViewOwnProps<T, S>
|
|
175
|
+
> &
|
|
176
|
+
ListViewOwnProps<T, S>;
|
|
177
|
+
|
|
178
|
+
/** Props for {@link SizeGroup}. */
|
|
179
|
+
type SizeGroupProps = {
|
|
180
|
+
/** How the group equalizes sizes: horizontal, vertical, or both. */
|
|
181
|
+
mode?: Gtk.SizeGroupMode | null | undefined;
|
|
182
|
+
ref?: Ref<Gtk.SizeGroup | null>;
|
|
183
|
+
children?: ReactNode;
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
/** Adds a single widget, rendered by the given component, to the enclosing {@link SizeGroup}. */
|
|
187
|
+
type SizeGroupChildProps<C extends ElementType> = ChildProps<C>;
|
|
188
|
+
|
|
189
|
+
export {
|
|
190
|
+
type SelectionProps,
|
|
191
|
+
type ExpansionProps,
|
|
192
|
+
type ChildProps,
|
|
193
|
+
type WidgetProps,
|
|
194
|
+
type Item,
|
|
195
|
+
type Section,
|
|
196
|
+
type RenderItemArgs,
|
|
197
|
+
type RenderHeaderArgs,
|
|
198
|
+
type ItemRenderer,
|
|
199
|
+
type HeaderRenderer,
|
|
200
|
+
type Column,
|
|
201
|
+
type ColumnViewProps,
|
|
202
|
+
type DropDownProps,
|
|
203
|
+
type GridViewProps,
|
|
204
|
+
type ListViewProps,
|
|
205
|
+
type SizeGroupProps,
|
|
206
|
+
type SizeGroupChildProps,
|
|
76
207
|
};
|
package/dist/cell.d.ts
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
-
import { type ReactNode } from "react";
|
|
3
|
-
import type { RenderItemProps } from "./types.js";
|
|
4
|
-
import type { CellContainerStore } from "./utils/cell-container-store.js";
|
|
5
|
-
import type { ItemResolver } from "./utils/item-resolver.js";
|
|
6
|
-
export type CellRenderer<T, S> = (value: T | S | undefined, treeRow: Gtk.TreeListRow | null, position: number) => ReactNode;
|
|
7
|
-
interface CellRenderHostProps<T, S> {
|
|
8
|
-
store: CellContainerStore;
|
|
9
|
-
resolver: ItemResolver<T, S>;
|
|
10
|
-
render: CellRenderer<T, S>;
|
|
11
|
-
}
|
|
12
|
-
export declare const CellRenderHost: <T, S>({ store, resolver, render }: CellRenderHostProps<T, S>) => ReactNode;
|
|
13
|
-
export type TreeRenderContext = {
|
|
14
|
-
controlled: boolean;
|
|
15
|
-
expandedIds: Set<string>;
|
|
16
|
-
rowId: (row: Gtk.TreeListRow) => string | undefined;
|
|
17
|
-
};
|
|
18
|
-
export declare const createTreeRenderContext: (expandedIds: string[] | null | undefined, rowId: (row: Gtk.TreeListRow) => string | undefined) => TreeRenderContext;
|
|
19
|
-
export declare const itemRenderer: <T, S>(render: (props: RenderItemProps<T>) => ReactNode, context?: TreeRenderContext) => CellRenderer<T, S>;
|
|
20
|
-
interface HeaderRenderHostProps<T, S> {
|
|
21
|
-
useHeader: boolean;
|
|
22
|
-
store: CellContainerStore;
|
|
23
|
-
resolver: ItemResolver<T, S>;
|
|
24
|
-
renderHeader: ((info: {
|
|
25
|
-
section: S;
|
|
26
|
-
}) => ReactNode) | null | undefined;
|
|
27
|
-
}
|
|
28
|
-
export declare const HeaderRenderHost: <T, S>({ useHeader, store, resolver, renderHeader, }: HeaderRenderHostProps<T, S>) => ReactNode;
|
|
29
|
-
export {};
|
|
30
|
-
//# sourceMappingURL=cell.d.ts.map
|
package/dist/cell.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cell.d.ts","sourceRoot":"","sources":["../src/cell.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AAGzC,OAAO,EAAkB,KAAK,SAAS,EAAqC,MAAM,OAAO,CAAC;AAC1F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAa,MAAM,iCAAiC,CAAC;AACrF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG7D,MAAM,MAAM,YAAY,CAAC,CAAC,EAAE,CAAC,IAAI,CAC7B,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,EACxB,OAAO,EAAE,GAAG,CAAC,WAAW,GAAG,IAAI,EAC/B,QAAQ,EAAE,MAAM,KACf,SAAS,CAAC;AASf,UAAU,mBAAmB,CAAC,CAAC,EAAE,CAAC;IAC9B,KAAK,EAAE,kBAAkB,CAAC;IAC1B,QAAQ,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7B,MAAM,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAC9B;AA4CD,eAAO,MAAM,cAAc,GAAI,CAAC,EAAE,CAAC,+BAA+B,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,SAmB7F,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,WAAW,KAAK,MAAM,GAAG,SAAS,CAAC;CACvD,CAAC;AAEF,eAAO,MAAM,uBAAuB,gBACnB,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,SACjC,CAAC,GAAG,EAAE,GAAG,CAAC,WAAW,KAAK,MAAM,GAAG,SAAS,KACpD,iBAID,CAAC;AAeH,eAAO,MAAM,YAAY,GACpB,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,SAAS,YAAY,iBAAiB,KAAG,YAAY,CAAC,CAAC,EAAE,CAAC,CAEtB,CAAC;AAOvF,UAAU,qBAAqB,CAAC,CAAC,EAAE,CAAC;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,QAAQ,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7B,YAAY,EAAE,CAAC,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC,CAAA;KAAE,KAAK,SAAS,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;CAC1E;AAED,eAAO,MAAM,gBAAgB,GAAI,CAAC,EAAE,CAAC,iDAKlC,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,SACsF,CAAC"}
|
package/dist/cell.js
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { GtkTreeExpander } from "@gtkx/jsx/gtk";
|
|
3
|
-
import { createPortal } from "@gtkx/react";
|
|
4
|
-
import { Fragment, memo, useCallback, useSyncExternalStore } from "react";
|
|
5
|
-
const TreeExpanderCell = ({ treeRow, metadata, children }) => (_jsx(GtkTreeExpander, { ref: (expander) => {
|
|
6
|
-
if (expander !== null)
|
|
7
|
-
expander.setListRow(treeRow);
|
|
8
|
-
}, hideExpander: metadata.hideExpander, indentForDepth: metadata.indentForDepth, indentForIcon: metadata.indentForIcon, children: children }));
|
|
9
|
-
const Cell = memo(({ container, store, resolver, render }) => {
|
|
10
|
-
const subscribe = useCallback((onChange) => store.subscribePosition(container, onChange), [store, container]);
|
|
11
|
-
const getSnapshot = useCallback(() => store.getPosition(container), [store, container]);
|
|
12
|
-
const entry = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
|
13
|
-
if (entry.position < 0)
|
|
14
|
-
return null;
|
|
15
|
-
const resolved = resolver.resolve(entry.position, entry.treeRow);
|
|
16
|
-
if (!resolved.present)
|
|
17
|
-
return null;
|
|
18
|
-
const content = render(resolved.value, entry.treeRow, entry.position);
|
|
19
|
-
const portalled = entry.treeRow !== null && !resolved.isHeader ? (_jsx(TreeExpanderCell, { treeRow: entry.treeRow, metadata: resolved.metadata, children: content })) : (content);
|
|
20
|
-
return createPortal(portalled, container, store.keyFor(container));
|
|
21
|
-
});
|
|
22
|
-
export const CellRenderHost = ({ store, resolver, render }) => {
|
|
23
|
-
const containers = useSyncExternalStore(store.subscribeSet, store.getContainersSnapshot, store.getContainersSnapshot);
|
|
24
|
-
return (_jsx(Fragment, { children: containers.map((container) => (_jsx(Cell, { container: container, store: store, resolver: resolver, render: render }, store.keyFor(container)))) }));
|
|
25
|
-
};
|
|
26
|
-
export const createTreeRenderContext = (expandedIds, rowId) => ({
|
|
27
|
-
controlled: expandedIds !== undefined && expandedIds !== null,
|
|
28
|
-
expandedIds: new Set(expandedIds ?? []),
|
|
29
|
-
rowId,
|
|
30
|
-
});
|
|
31
|
-
const treeFields = (treeRow, context) => {
|
|
32
|
-
if (treeRow === null)
|
|
33
|
-
return {};
|
|
34
|
-
const depth = treeRow.getDepth();
|
|
35
|
-
if (context === undefined || !treeRow.isExpandable())
|
|
36
|
-
return { depth };
|
|
37
|
-
const isExpanded = context.controlled
|
|
38
|
-
? context.expandedIds.has(context.rowId(treeRow) ?? "")
|
|
39
|
-
: treeRow.getExpanded();
|
|
40
|
-
return { depth, isExpanded };
|
|
41
|
-
};
|
|
42
|
-
export const itemRenderer = (render, context) => (value, treeRow, position) => render({ item: value, index: position, ...treeFields(treeRow, context) });
|
|
43
|
-
const headerRenderer = (renderHeader) => (value) => renderHeader ? renderHeader({ section: value }) : null;
|
|
44
|
-
export const HeaderRenderHost = ({ useHeader, store, resolver, renderHeader, }) => useHeader ? _jsx(CellRenderHost, { store: store, resolver: resolver, render: headerRenderer(renderHeader) }) : null;
|
|
45
|
-
//# sourceMappingURL=cell.js.map
|