@gtkx/react 0.19.0 → 0.21.0

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.
Files changed (289) hide show
  1. package/README.md +26 -62
  2. package/dist/components/compound.d.ts +40 -0
  3. package/dist/components/compound.d.ts.map +1 -0
  4. package/dist/components/compound.js +46 -0
  5. package/dist/components/compound.js.map +1 -0
  6. package/dist/components/list.d.ts +75 -0
  7. package/dist/components/list.d.ts.map +1 -0
  8. package/dist/components/list.js +81 -0
  9. package/dist/components/list.js.map +1 -0
  10. package/dist/components/slot-widget.d.ts +15 -0
  11. package/dist/components/slot-widget.d.ts.map +1 -0
  12. package/dist/components/slot-widget.js +37 -0
  13. package/dist/components/slot-widget.js.map +1 -0
  14. package/dist/errors.d.ts +6 -0
  15. package/dist/errors.d.ts.map +1 -1
  16. package/dist/errors.js +8 -6
  17. package/dist/errors.js.map +1 -1
  18. package/dist/generated/compounds.d.ts +2672 -0
  19. package/dist/generated/compounds.d.ts.map +1 -0
  20. package/dist/generated/compounds.js +2624 -0
  21. package/dist/generated/compounds.js.map +1 -0
  22. package/dist/generated/internal.d.ts +6 -7
  23. package/dist/generated/internal.d.ts.map +1 -1
  24. package/dist/generated/internal.js +3054 -1838
  25. package/dist/generated/internal.js.map +1 -1
  26. package/dist/generated/jsx.d.ts +2096 -4970
  27. package/dist/generated/jsx.d.ts.map +1 -1
  28. package/dist/generated/jsx.js +979 -3862
  29. package/dist/generated/jsx.js.map +1 -1
  30. package/dist/generated/registry.d.ts +1 -0
  31. package/dist/generated/registry.d.ts.map +1 -1
  32. package/dist/generated/registry.js +0 -1
  33. package/dist/generated/registry.js.map +1 -1
  34. package/dist/host-config.d.ts.map +1 -1
  35. package/dist/host-config.js +2 -0
  36. package/dist/host-config.js.map +1 -1
  37. package/dist/index.d.ts +2 -0
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +2 -0
  40. package/dist/index.js.map +1 -1
  41. package/dist/jsx.d.ts +157 -518
  42. package/dist/jsx.d.ts.map +1 -1
  43. package/dist/jsx.js +6 -393
  44. package/dist/jsx.js.map +1 -1
  45. package/dist/metadata.d.ts +1 -1
  46. package/dist/metadata.d.ts.map +1 -1
  47. package/dist/metadata.js +7 -3
  48. package/dist/metadata.js.map +1 -1
  49. package/dist/node.d.ts +0 -4
  50. package/dist/node.d.ts.map +1 -1
  51. package/dist/node.js +19 -41
  52. package/dist/node.js.map +1 -1
  53. package/dist/nodes/alert-dialog.d.ts +14 -0
  54. package/dist/nodes/alert-dialog.d.ts.map +1 -0
  55. package/dist/nodes/alert-dialog.js +41 -0
  56. package/dist/nodes/alert-dialog.js.map +1 -0
  57. package/dist/nodes/animation.d.ts +5 -4
  58. package/dist/nodes/animation.d.ts.map +1 -1
  59. package/dist/nodes/animation.js +65 -49
  60. package/dist/nodes/animation.js.map +1 -1
  61. package/dist/nodes/application.d.ts.map +1 -1
  62. package/dist/nodes/application.js +4 -0
  63. package/dist/nodes/application.js.map +1 -1
  64. package/dist/nodes/column-view-column.d.ts +19 -19
  65. package/dist/nodes/column-view-column.d.ts.map +1 -1
  66. package/dist/nodes/column-view-column.js +130 -119
  67. package/dist/nodes/column-view-column.js.map +1 -1
  68. package/dist/nodes/container-slot.d.ts +3 -1
  69. package/dist/nodes/container-slot.d.ts.map +1 -1
  70. package/dist/nodes/container-slot.js +28 -16
  71. package/dist/nodes/container-slot.js.map +1 -1
  72. package/dist/nodes/drawing-area.d.ts +3 -1
  73. package/dist/nodes/drawing-area.d.ts.map +1 -1
  74. package/dist/nodes/drawing-area.js +20 -22
  75. package/dist/nodes/drawing-area.js.map +1 -1
  76. package/dist/nodes/event-controller.d.ts.map +1 -1
  77. package/dist/nodes/event-controller.js +6 -16
  78. package/dist/nodes/event-controller.js.map +1 -1
  79. package/dist/nodes/fixed-child.d.ts +1 -0
  80. package/dist/nodes/fixed-child.d.ts.map +1 -1
  81. package/dist/nodes/fixed-child.js +13 -0
  82. package/dist/nodes/fixed-child.js.map +1 -1
  83. package/dist/nodes/grid-child.d.ts +1 -0
  84. package/dist/nodes/grid-child.d.ts.map +1 -1
  85. package/dist/nodes/grid-child.js +13 -0
  86. package/dist/nodes/grid-child.js.map +1 -1
  87. package/dist/nodes/internal/accessible.d.ts.map +1 -1
  88. package/dist/nodes/internal/accessible.js.map +1 -1
  89. package/dist/nodes/internal/bound-item.d.ts +4 -0
  90. package/dist/nodes/internal/bound-item.d.ts.map +1 -0
  91. package/dist/nodes/internal/bound-item.js +2 -0
  92. package/dist/nodes/internal/bound-item.js.map +1 -0
  93. package/dist/nodes/internal/construct.d.ts +1 -8
  94. package/dist/nodes/internal/construct.d.ts.map +1 -1
  95. package/dist/nodes/internal/construct.js +30 -54
  96. package/dist/nodes/internal/construct.js.map +1 -1
  97. package/dist/nodes/internal/widget.d.ts.map +1 -1
  98. package/dist/nodes/internal/widget.js +9 -10
  99. package/dist/nodes/internal/widget.js.map +1 -1
  100. package/dist/nodes/list-item-node.d.ts +12 -0
  101. package/dist/nodes/list-item-node.d.ts.map +1 -0
  102. package/dist/nodes/list-item-node.js +45 -0
  103. package/dist/nodes/list-item-node.js.map +1 -0
  104. package/dist/nodes/list.d.ts +100 -0
  105. package/dist/nodes/list.d.ts.map +1 -0
  106. package/dist/nodes/list.js +950 -0
  107. package/dist/nodes/list.js.map +1 -0
  108. package/dist/nodes/notebook-page.d.ts.map +1 -1
  109. package/dist/nodes/notebook-page.js +6 -2
  110. package/dist/nodes/notebook-page.js.map +1 -1
  111. package/dist/nodes/overlay-child.d.ts +2 -0
  112. package/dist/nodes/overlay-child.d.ts.map +1 -1
  113. package/dist/nodes/overlay-child.js +29 -8
  114. package/dist/nodes/overlay-child.js.map +1 -1
  115. package/dist/nodes/spin-row.d.ts +14 -0
  116. package/dist/nodes/spin-row.d.ts.map +1 -0
  117. package/dist/nodes/spin-row.js +46 -0
  118. package/dist/nodes/spin-row.js.map +1 -0
  119. package/dist/nodes/switch-row.d.ts +11 -0
  120. package/dist/nodes/switch-row.d.ts.map +1 -0
  121. package/dist/nodes/switch-row.js +15 -0
  122. package/dist/nodes/switch-row.js.map +1 -0
  123. package/dist/nodes/text-anchor.d.ts.map +1 -1
  124. package/dist/nodes/text-anchor.js +10 -0
  125. package/dist/nodes/text-anchor.js.map +1 -1
  126. package/dist/nodes/text-tag.d.ts.map +1 -1
  127. package/dist/nodes/text-tag.js +45 -39
  128. package/dist/nodes/text-tag.js.map +1 -1
  129. package/dist/nodes/toggle-group.d.ts +12 -6
  130. package/dist/nodes/toggle-group.d.ts.map +1 -1
  131. package/dist/nodes/toggle-group.js +53 -4
  132. package/dist/nodes/toggle-group.js.map +1 -1
  133. package/dist/nodes/widget.d.ts.map +1 -1
  134. package/dist/nodes/widget.js +16 -22
  135. package/dist/nodes/widget.js.map +1 -1
  136. package/dist/nodes/window.d.ts.map +1 -1
  137. package/dist/nodes/window.js +2 -2
  138. package/dist/nodes/window.js.map +1 -1
  139. package/dist/registry.d.ts +0 -2
  140. package/dist/registry.d.ts.map +1 -1
  141. package/dist/registry.js +11 -18
  142. package/dist/registry.js.map +1 -1
  143. package/dist/types.d.ts +3 -2
  144. package/dist/types.d.ts.map +1 -1
  145. package/dist/use-property.d.ts +29 -0
  146. package/dist/use-property.d.ts.map +1 -0
  147. package/dist/use-property.js +44 -0
  148. package/dist/use-property.js.map +1 -0
  149. package/dist/use-setting.d.ts +36 -0
  150. package/dist/use-setting.d.ts.map +1 -0
  151. package/dist/use-setting.js +68 -0
  152. package/dist/use-setting.js.map +1 -0
  153. package/package.json +5 -4
  154. package/src/components/compound.tsx +57 -0
  155. package/src/components/list.tsx +140 -0
  156. package/src/components/slot-widget.tsx +46 -0
  157. package/src/errors.ts +8 -7
  158. package/src/generated/compounds.ts +2741 -0
  159. package/src/generated/internal.ts +3059 -1840
  160. package/src/generated/jsx.ts +2509 -5350
  161. package/src/generated/registry.ts +2 -1
  162. package/src/host-config.ts +2 -0
  163. package/src/index.ts +2 -0
  164. package/src/jsx.ts +167 -581
  165. package/src/metadata.ts +7 -4
  166. package/src/node.ts +23 -39
  167. package/src/nodes/alert-dialog.ts +55 -0
  168. package/src/nodes/animation.ts +67 -60
  169. package/src/nodes/application.ts +5 -0
  170. package/src/nodes/column-view-column.ts +125 -128
  171. package/src/nodes/container-slot.ts +30 -17
  172. package/src/nodes/drawing-area.ts +23 -32
  173. package/src/nodes/event-controller.ts +6 -18
  174. package/src/nodes/fixed-child.ts +13 -0
  175. package/src/nodes/grid-child.ts +13 -0
  176. package/src/nodes/internal/accessible.ts +0 -1
  177. package/src/nodes/internal/bound-item.ts +4 -0
  178. package/src/nodes/internal/construct.ts +38 -68
  179. package/src/nodes/internal/widget.ts +9 -13
  180. package/src/nodes/list-item-node.ts +53 -0
  181. package/src/nodes/list.ts +1082 -0
  182. package/src/nodes/notebook-page.ts +6 -2
  183. package/src/nodes/overlay-child.ts +30 -9
  184. package/src/nodes/spin-row.ts +72 -0
  185. package/src/nodes/switch-row.ts +26 -0
  186. package/src/nodes/text-anchor.ts +9 -0
  187. package/src/nodes/text-tag.ts +45 -40
  188. package/src/nodes/toggle-group.ts +63 -9
  189. package/src/nodes/widget.ts +14 -26
  190. package/src/nodes/window.ts +2 -2
  191. package/src/registry.ts +18 -24
  192. package/src/types.ts +8 -2
  193. package/src/use-property.ts +58 -0
  194. package/src/use-setting.ts +96 -0
  195. package/dist/fiber-root.d.ts +0 -4
  196. package/dist/fiber-root.d.ts.map +0 -1
  197. package/dist/fiber-root.js +0 -6
  198. package/dist/fiber-root.js.map +0 -1
  199. package/dist/nodes/column-view.d.ts +0 -37
  200. package/dist/nodes/column-view.d.ts.map +0 -1
  201. package/dist/nodes/column-view.js +0 -205
  202. package/dist/nodes/column-view.js.map +0 -1
  203. package/dist/nodes/drop-down.d.ts +0 -37
  204. package/dist/nodes/drop-down.d.ts.map +0 -1
  205. package/dist/nodes/drop-down.js +0 -231
  206. package/dist/nodes/drop-down.js.map +0 -1
  207. package/dist/nodes/grid-view.d.ts +0 -30
  208. package/dist/nodes/grid-view.d.ts.map +0 -1
  209. package/dist/nodes/grid-view.js +0 -90
  210. package/dist/nodes/grid-view.js.map +0 -1
  211. package/dist/nodes/internal/base-item-renderer.d.ts +0 -28
  212. package/dist/nodes/internal/base-item-renderer.d.ts.map +0 -1
  213. package/dist/nodes/internal/base-item-renderer.js +0 -85
  214. package/dist/nodes/internal/base-item-renderer.js.map +0 -1
  215. package/dist/nodes/internal/grid-item-renderer.d.ts +0 -20
  216. package/dist/nodes/internal/grid-item-renderer.d.ts.map +0 -1
  217. package/dist/nodes/internal/grid-item-renderer.js +0 -66
  218. package/dist/nodes/internal/grid-item-renderer.js.map +0 -1
  219. package/dist/nodes/internal/header-item-renderer.d.ts +0 -23
  220. package/dist/nodes/internal/header-item-renderer.d.ts.map +0 -1
  221. package/dist/nodes/internal/header-item-renderer.js +0 -87
  222. package/dist/nodes/internal/header-item-renderer.js.map +0 -1
  223. package/dist/nodes/internal/header-renderer-manager.d.ts +0 -13
  224. package/dist/nodes/internal/header-renderer-manager.d.ts.map +0 -1
  225. package/dist/nodes/internal/header-renderer-manager.js +0 -20
  226. package/dist/nodes/internal/header-renderer-manager.js.map +0 -1
  227. package/dist/nodes/internal/list-item-renderer.d.ts +0 -27
  228. package/dist/nodes/internal/list-item-renderer.d.ts.map +0 -1
  229. package/dist/nodes/internal/list-item-renderer.js +0 -131
  230. package/dist/nodes/internal/list-item-renderer.js.map +0 -1
  231. package/dist/nodes/internal/list-store.d.ts +0 -21
  232. package/dist/nodes/internal/list-store.d.ts.map +0 -1
  233. package/dist/nodes/internal/list-store.js +0 -90
  234. package/dist/nodes/internal/list-store.js.map +0 -1
  235. package/dist/nodes/internal/sectioned-list-store.d.ts +0 -50
  236. package/dist/nodes/internal/sectioned-list-store.d.ts.map +0 -1
  237. package/dist/nodes/internal/sectioned-list-store.js +0 -250
  238. package/dist/nodes/internal/sectioned-list-store.js.map +0 -1
  239. package/dist/nodes/internal/selection-helpers.d.ts +0 -12
  240. package/dist/nodes/internal/selection-helpers.d.ts.map +0 -1
  241. package/dist/nodes/internal/selection-helpers.js +0 -25
  242. package/dist/nodes/internal/selection-helpers.js.map +0 -1
  243. package/dist/nodes/internal/selection-model-controller.d.ts +0 -26
  244. package/dist/nodes/internal/selection-model-controller.d.ts.map +0 -1
  245. package/dist/nodes/internal/selection-model-controller.js +0 -82
  246. package/dist/nodes/internal/selection-model-controller.js.map +0 -1
  247. package/dist/nodes/internal/simple-list-store.d.ts +0 -15
  248. package/dist/nodes/internal/simple-list-store.d.ts.map +0 -1
  249. package/dist/nodes/internal/simple-list-store.js +0 -110
  250. package/dist/nodes/internal/simple-list-store.js.map +0 -1
  251. package/dist/nodes/internal/tree-store.d.ts +0 -37
  252. package/dist/nodes/internal/tree-store.d.ts.map +0 -1
  253. package/dist/nodes/internal/tree-store.js +0 -253
  254. package/dist/nodes/internal/tree-store.js.map +0 -1
  255. package/dist/nodes/list-item.d.ts +0 -24
  256. package/dist/nodes/list-item.d.ts.map +0 -1
  257. package/dist/nodes/list-item.js +0 -83
  258. package/dist/nodes/list-item.js.map +0 -1
  259. package/dist/nodes/list-section.d.ts +0 -27
  260. package/dist/nodes/list-section.d.ts.map +0 -1
  261. package/dist/nodes/list-section.js +0 -43
  262. package/dist/nodes/list-section.js.map +0 -1
  263. package/dist/nodes/list-view.d.ts +0 -32
  264. package/dist/nodes/list-view.d.ts.map +0 -1
  265. package/dist/nodes/list-view.js +0 -123
  266. package/dist/nodes/list-view.js.map +0 -1
  267. package/dist/nodes/models/list.d.ts +0 -39
  268. package/dist/nodes/models/list.d.ts.map +0 -1
  269. package/dist/nodes/models/list.js +0 -207
  270. package/dist/nodes/models/list.js.map +0 -1
  271. package/src/fiber-root.ts +0 -20
  272. package/src/nodes/column-view.ts +0 -262
  273. package/src/nodes/drop-down.ts +0 -284
  274. package/src/nodes/grid-view.ts +0 -119
  275. package/src/nodes/internal/base-item-renderer.ts +0 -107
  276. package/src/nodes/internal/grid-item-renderer.ts +0 -78
  277. package/src/nodes/internal/header-item-renderer.ts +0 -105
  278. package/src/nodes/internal/header-renderer-manager.ts +0 -33
  279. package/src/nodes/internal/list-item-renderer.ts +0 -162
  280. package/src/nodes/internal/list-store.ts +0 -107
  281. package/src/nodes/internal/sectioned-list-store.ts +0 -287
  282. package/src/nodes/internal/selection-helpers.ts +0 -35
  283. package/src/nodes/internal/selection-model-controller.ts +0 -119
  284. package/src/nodes/internal/simple-list-store.ts +0 -116
  285. package/src/nodes/internal/tree-store.ts +0 -289
  286. package/src/nodes/list-item.ts +0 -107
  287. package/src/nodes/list-section.ts +0 -64
  288. package/src/nodes/list-view.ts +0 -164
  289. package/src/nodes/models/list.ts +0 -250
@@ -1,164 +0,0 @@
1
- import type * as Gtk from "@gtkx/ffi/gtk";
2
- import type { GtkListViewProps } from "../jsx.js";
3
- import type { Node } from "../node.js";
4
- import type { Container } from "../types.js";
5
- import { ContainerSlotNode } from "./container-slot.js";
6
- import { EventControllerNode } from "./event-controller.js";
7
- import { GridItemRenderer } from "./internal/grid-item-renderer.js";
8
- import type { HeaderItemRenderer } from "./internal/header-item-renderer.js";
9
- import { updateHeaderRenderer } from "./internal/header-renderer-manager.js";
10
- import { ListItemRenderer } from "./internal/list-item-renderer.js";
11
- import { filterProps, hasChanged } from "./internal/props.js";
12
- import { ListItemNode } from "./list-item.js";
13
- import { ListSectionNode } from "./list-section.js";
14
- import { ListModel, type ListModelProps } from "./models/list.js";
15
- import { SlotNode } from "./slot.js";
16
- import { WidgetNode } from "./widget.js";
17
-
18
- const RENDERER_PROPS = ["renderItem", "renderHeader", "estimatedItemHeight"] as const;
19
- const OWN_PROPS = [...RENDERER_PROPS, "autoexpand", "selectionMode", "selected", "onSelectionChanged"] as const;
20
-
21
- type ListViewProps = Pick<GtkListViewProps, (typeof RENDERER_PROPS)[number]> & ListModelProps;
22
-
23
- type ListViewChild = ListItemNode | ListSectionNode | EventControllerNode | SlotNode | ContainerSlotNode;
24
-
25
- export class ListViewNode extends WidgetNode<Gtk.ListView, ListViewProps, ListViewChild> {
26
- private treeRenderer: ListItemRenderer | null = null;
27
- private flatRenderer: GridItemRenderer | null = null;
28
- private headerRenderer: HeaderItemRenderer | null = null;
29
- private list: ListModel;
30
-
31
- public override isValidChild(child: Node): boolean {
32
- return (
33
- child instanceof ListItemNode ||
34
- child instanceof ListSectionNode ||
35
- child instanceof EventControllerNode ||
36
- child instanceof SlotNode ||
37
- child instanceof ContainerSlotNode
38
- );
39
- }
40
-
41
- constructor(typeName: string, props: ListViewProps, container: Gtk.ListView, rootContainer: Container) {
42
- super(typeName, props, container, rootContainer);
43
-
44
- const flat = props.renderHeader != null;
45
-
46
- this.list = new ListModel(
47
- { owner: this, signalStore: this.signalStore },
48
- {
49
- autoexpand: flat ? undefined : props.autoexpand,
50
- selectionMode: props.selectionMode,
51
- selected: props.selected,
52
- onSelectionChanged: props.onSelectionChanged,
53
- },
54
- flat,
55
- );
56
-
57
- if (flat) {
58
- const store = this.list.getFlatStore();
59
- this.flatRenderer = new GridItemRenderer(this.signalStore);
60
- this.flatRenderer.setStore(store);
61
- store.setOnItemUpdated((id) => this.flatRenderer?.rebindItem(id));
62
- this.container.setFactory(this.flatRenderer.getFactory());
63
- } else {
64
- const store = this.list.getStore();
65
- this.treeRenderer = new ListItemRenderer(this.signalStore);
66
- this.treeRenderer.setStore(store);
67
- store.setOnItemUpdated((id) => this.treeRenderer?.rebindItem(id));
68
- this.container.setFactory(this.treeRenderer.getFactory());
69
- }
70
- }
71
-
72
- public override appendChild(child: ListViewChild): void {
73
- super.appendChild(child);
74
- if (child instanceof ListItemNode || child instanceof ListSectionNode) {
75
- this.list.appendChild(child);
76
- }
77
- }
78
-
79
- public override insertBefore(child: ListViewChild, before: ListViewChild): void {
80
- super.insertBefore(child, before);
81
- if (
82
- (child instanceof ListItemNode || child instanceof ListSectionNode) &&
83
- (before instanceof ListItemNode || before instanceof ListSectionNode)
84
- ) {
85
- this.list.insertBefore(child, before);
86
- }
87
- }
88
-
89
- public override removeChild(child: ListViewChild): void {
90
- if (child instanceof ListItemNode || child instanceof ListSectionNode) {
91
- this.list.removeChild(child);
92
- }
93
- super.removeChild(child);
94
- }
95
-
96
- public override finalizeInitialChildren(props: ListViewProps): boolean {
97
- super.finalizeInitialChildren(props);
98
- return true;
99
- }
100
-
101
- public override commitUpdate(oldProps: ListViewProps | null, newProps: ListViewProps): void {
102
- super.commitUpdate(oldProps ? filterProps(oldProps, OWN_PROPS) : null, filterProps(newProps, OWN_PROPS));
103
- this.applyOwnProps(oldProps, newProps);
104
- }
105
-
106
- public override commitMount(): void {
107
- super.commitMount();
108
- this.list.flushBatch();
109
- this.container.setModel(this.list.getSelectionModel());
110
- }
111
-
112
- public override detachDeletedInstance(): void {
113
- this.treeRenderer?.dispose();
114
- this.flatRenderer?.dispose();
115
- this.headerRenderer?.dispose();
116
- super.detachDeletedInstance();
117
- }
118
-
119
- private applyOwnProps(oldProps: ListViewProps | null, newProps: ListViewProps): void {
120
- if (hasChanged(oldProps, newProps, "renderItem")) {
121
- if (this.treeRenderer) {
122
- this.treeRenderer.setRenderFn(newProps.renderItem ?? null);
123
- }
124
- if (this.flatRenderer) {
125
- const renderItem = newProps.renderItem;
126
- this.flatRenderer.setRenderFn(renderItem ? (item: unknown) => renderItem(item, null) : null);
127
- }
128
- }
129
-
130
- if (hasChanged(oldProps, newProps, "estimatedItemHeight")) {
131
- const height = newProps.estimatedItemHeight ?? null;
132
- if (this.treeRenderer) {
133
- this.treeRenderer.setEstimatedItemHeight(height);
134
- }
135
- if (this.flatRenderer) {
136
- this.flatRenderer.setEstimatedItemHeight(height);
137
- }
138
- }
139
-
140
- if (hasChanged(oldProps, newProps, "renderHeader")) {
141
- this.headerRenderer = updateHeaderRenderer(
142
- this.headerRenderer,
143
- {
144
- signalStore: this.signalStore,
145
- isEnabled: () => this.list.isFlatMode(),
146
- resolveItem: (id) => this.list.getFlatStore().getHeaderValue(id),
147
- setFactory: (factory) => this.container.setHeaderFactory(factory),
148
- },
149
- newProps.renderHeader,
150
- );
151
- }
152
-
153
- const previousModel = this.list.getSelectionModel();
154
- this.list.updateProps(
155
- oldProps ? filterProps(oldProps, RENDERER_PROPS) : null,
156
- filterProps(newProps, RENDERER_PROPS),
157
- );
158
- const currentModel = this.list.getSelectionModel();
159
-
160
- if (previousModel !== currentModel) {
161
- this.container.setModel(currentModel);
162
- }
163
- }
164
- }
@@ -1,250 +0,0 @@
1
- import type * as Gio from "@gtkx/ffi/gio";
2
- import type * as GObject from "@gtkx/ffi/gobject";
3
- import * as Gtk from "@gtkx/ffi/gtk";
4
- import type { GtkListViewProps } from "../../jsx.js";
5
- import { ListStore } from "../internal/list-store.js";
6
- import { getSelectionFromStore, resolveSelectionIndices } from "../internal/selection-helpers.js";
7
- import { SelectionModelController } from "../internal/selection-model-controller.js";
8
- import type { SignalStore } from "../internal/signal-store.js";
9
- import { TreeStore } from "../internal/tree-store.js";
10
- import { ListItemNode } from "../list-item.js";
11
- import { ListSectionNode } from "../list-section.js";
12
-
13
- export type ListModelProps = Pick<GtkListViewProps, "autoexpand" | "selectionMode" | "selected" | "onSelectionChanged">;
14
-
15
- type ListModelConfig = {
16
- owner: object;
17
- signalStore: SignalStore;
18
- };
19
-
20
- export class ListModel {
21
- private config: ListModelConfig;
22
- private flatMode: boolean;
23
-
24
- private treeStore: TreeStore | null = null;
25
- private treeListModel: Gtk.TreeListModel | null = null;
26
-
27
- private flatStore: ListStore | null = null;
28
-
29
- private selectionManager: SelectionModelController;
30
- private initialSelected: string[] | null | undefined;
31
-
32
- constructor(config: ListModelConfig, props: ListModelProps = {}, flat = false) {
33
- this.config = config;
34
- this.flatMode = flat;
35
- this.initialSelected = props.selected;
36
-
37
- let model: Gio.ListModel;
38
-
39
- if (flat) {
40
- const store = new ListStore();
41
- store.beginBatch();
42
- this.flatStore = store;
43
- model = store.getModel();
44
- } else {
45
- const store = new TreeStore();
46
- store.beginBatch();
47
- this.treeStore = store;
48
- this.treeListModel = new Gtk.TreeListModel(
49
- store.getRootModel(),
50
- false,
51
- props.autoexpand ?? false,
52
- (item: GObject.Object) => this.createChildModel(item),
53
- );
54
- model = this.treeListModel;
55
- }
56
-
57
- this.selectionManager = new SelectionModelController(
58
- { ...config, ...props },
59
- model,
60
- () => this.getSelection(),
61
- (ids) => this.resolveSelectionIndices(ids),
62
- () => this.getNItems(),
63
- );
64
- }
65
-
66
- public isFlatMode(): boolean {
67
- return this.flatMode;
68
- }
69
-
70
- public flushBatch(): void {
71
- if (this.flatStore) {
72
- this.flatStore.flushBatch();
73
- const model = this.flatStore.getModel();
74
- if (this.selectionManager.getSelectionModel().getModel() !== model) {
75
- this.selectionManager.update(null, { ...this.config }, model);
76
- }
77
- } else if (this.treeStore) {
78
- this.treeStore.flushBatch();
79
- }
80
- this.selectionManager.reapplySelection(this.initialSelected);
81
- this.initialSelected = undefined;
82
- }
83
-
84
- private createChildModel(item: GObject.Object): Gio.ListModel | null {
85
- if (!this.treeStore) return null;
86
- if (!(item instanceof Gtk.StringObject)) return null;
87
- const parentId = item.getString();
88
- return this.treeStore.getChildrenModel(parentId);
89
- }
90
-
91
- public getStore(): TreeStore {
92
- if (!this.treeStore) {
93
- throw new Error("getStore() called in flat mode. Use getFlatStore() instead.");
94
- }
95
- return this.treeStore;
96
- }
97
-
98
- public getFlatStore(): ListStore {
99
- if (!this.flatStore) {
100
- throw new Error("getFlatStore() called in tree mode. Use getStore() instead.");
101
- }
102
- return this.flatStore;
103
- }
104
-
105
- public setOnItemUpdated(callback: (id: string) => void): void {
106
- if (this.flatStore) {
107
- this.flatStore.setOnItemUpdated(callback);
108
- } else if (this.treeStore) {
109
- this.treeStore.setOnItemUpdated(callback);
110
- }
111
- }
112
-
113
- public getSelectionModel(): Gtk.NoSelection | Gtk.SingleSelection | Gtk.MultiSelection {
114
- return this.selectionManager.getSelectionModel();
115
- }
116
-
117
- public appendChild(child: ListItemNode | ListSectionNode): void {
118
- if (this.flatStore) {
119
- if (child instanceof ListSectionNode) {
120
- this.flatStore.addSection(child.props.id, child.props.value);
121
- child.setStore(this.flatStore);
122
- } else {
123
- child.setStore(this.flatStore);
124
- this.flatStore.addItem(child.props.id, child.props.value);
125
- }
126
- } else if (child instanceof ListItemNode && this.treeStore) {
127
- child.setStore(this.treeStore);
128
- this.addItemWithChildren(child);
129
- }
130
- }
131
-
132
- private addItemWithChildren(node: ListItemNode, parentId?: string): void {
133
- if (!this.treeStore) return;
134
- const id = node.props.id;
135
-
136
- for (const child of node.getChildNodes()) {
137
- this.addItemWithChildren(child, id);
138
- }
139
-
140
- this.treeStore.addItem(id, ListItemNode.createItemData(node.props), parentId);
141
- }
142
-
143
- public insertBefore(child: ListItemNode | ListSectionNode, before: ListItemNode | ListSectionNode): void {
144
- if (this.flatStore) {
145
- if (child instanceof ListSectionNode) {
146
- this.flatStore.addSection(child.props.id, child.props.value);
147
- child.setStore(this.flatStore);
148
- return;
149
- }
150
- if (before instanceof ListSectionNode) {
151
- child.setStore(this.flatStore);
152
- this.flatStore.addItem(child.props.id, child.props.value);
153
- return;
154
- }
155
- child.setStore(this.flatStore);
156
- this.flatStore.insertItemBefore(child.props.id, before.props.id, child.props.value);
157
- } else if (child instanceof ListItemNode && before instanceof ListItemNode && this.treeStore) {
158
- child.setStore(this.treeStore);
159
- this.treeStore.insertItemBefore(child.props.id, before.props.id, ListItemNode.createItemData(child.props));
160
- }
161
- }
162
-
163
- public removeChild(child: ListItemNode | ListSectionNode): void {
164
- if (this.flatStore) {
165
- if (child instanceof ListSectionNode) {
166
- this.flatStore.removeSection(child.props.id);
167
- child.setStore(null);
168
- } else {
169
- this.flatStore.removeItem(child.props.id);
170
- child.setStore(null);
171
- }
172
- } else if (child instanceof ListItemNode && this.treeStore) {
173
- this.treeStore.removeItem(child.props.id);
174
- child.setStore(null);
175
- }
176
- }
177
-
178
- public updateProps(oldProps: ListModelProps | null, newProps: ListModelProps): void {
179
- if (this.treeListModel) {
180
- if (!oldProps || oldProps.autoexpand !== newProps.autoexpand) {
181
- this.treeListModel.setAutoexpand(newProps.autoexpand ?? false);
182
- }
183
- }
184
-
185
- const model = this.flatStore ? this.flatStore.getModel() : this.treeListModel;
186
- if (model) {
187
- this.selectionManager.update(
188
- oldProps ? { ...this.config, ...oldProps } : null,
189
- { ...this.config, ...newProps },
190
- model,
191
- );
192
- }
193
- }
194
-
195
- private getNItems(): number {
196
- if (this.flatStore) {
197
- return this.flatStore.getNItems();
198
- }
199
- if (this.treeListModel) {
200
- return this.treeListModel.getNItems();
201
- }
202
- return 0;
203
- }
204
-
205
- private getSelection(): string[] {
206
- const selection = this.selectionManager.getSelectionModel().getSelection();
207
-
208
- if (this.flatStore) {
209
- return getSelectionFromStore(selection, this.flatStore);
210
- }
211
-
212
- const size = selection.getSize();
213
- const ids: string[] = [];
214
- for (let i = 0; i < size; i++) {
215
- const index = selection.getNth(i);
216
- if (!this.treeListModel) continue;
217
- const row = this.treeListModel.getRow(index);
218
- if (!row) continue;
219
- const item = row.getItem();
220
- if (item instanceof Gtk.StringObject) {
221
- ids.push(item.getString());
222
- }
223
- }
224
-
225
- return ids;
226
- }
227
-
228
- private resolveSelectionIndices(ids: string[]): Gtk.Bitset {
229
- if (this.flatStore) {
230
- return resolveSelectionIndices(ids, this.flatStore);
231
- }
232
-
233
- const selected = new Gtk.Bitset();
234
- if (!this.treeListModel) return selected;
235
- const nItems = this.treeListModel.getNItems();
236
- const idSet = new Set(ids);
237
-
238
- for (let i = 0; i < nItems; i++) {
239
- const row = this.treeListModel.getRow(i);
240
- if (!row) continue;
241
-
242
- const item = row.getItem();
243
- if (item instanceof Gtk.StringObject && idSet.has(item.getString())) {
244
- selected.add(i);
245
- }
246
- }
247
-
248
- return selected;
249
- }
250
- }