@gtkx/react 0.19.0 → 0.20.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 (189) hide show
  1. package/dist/components/list.d.ts +35 -0
  2. package/dist/components/list.d.ts.map +1 -0
  3. package/dist/components/list.js +40 -0
  4. package/dist/components/list.js.map +1 -0
  5. package/dist/generated/internal.d.ts +5 -6
  6. package/dist/generated/internal.d.ts.map +1 -1
  7. package/dist/generated/internal.js +3473 -260
  8. package/dist/generated/internal.js.map +1 -1
  9. package/dist/generated/jsx.d.ts +0 -324
  10. package/dist/generated/jsx.d.ts.map +1 -1
  11. package/dist/generated/jsx.js +0 -324
  12. package/dist/generated/jsx.js.map +1 -1
  13. package/dist/host-config.d.ts.map +1 -1
  14. package/dist/host-config.js +2 -0
  15. package/dist/host-config.js.map +1 -1
  16. package/dist/jsx.d.ts +42 -105
  17. package/dist/jsx.d.ts.map +1 -1
  18. package/dist/jsx.js +2 -66
  19. package/dist/jsx.js.map +1 -1
  20. package/dist/metadata.d.ts.map +1 -1
  21. package/dist/metadata.js +7 -3
  22. package/dist/metadata.js.map +1 -1
  23. package/dist/node.d.ts +0 -4
  24. package/dist/node.d.ts.map +1 -1
  25. package/dist/node.js +19 -41
  26. package/dist/node.js.map +1 -1
  27. package/dist/nodes/application.d.ts.map +1 -1
  28. package/dist/nodes/application.js +4 -0
  29. package/dist/nodes/application.js.map +1 -1
  30. package/dist/nodes/column-view-column.d.ts +19 -19
  31. package/dist/nodes/column-view-column.d.ts.map +1 -1
  32. package/dist/nodes/column-view-column.js +130 -119
  33. package/dist/nodes/column-view-column.js.map +1 -1
  34. package/dist/nodes/event-controller.d.ts.map +1 -1
  35. package/dist/nodes/event-controller.js +3 -9
  36. package/dist/nodes/event-controller.js.map +1 -1
  37. package/dist/nodes/internal/accessible.d.ts.map +1 -1
  38. package/dist/nodes/internal/accessible.js.map +1 -1
  39. package/dist/nodes/internal/bound-item.d.ts +4 -0
  40. package/dist/nodes/internal/bound-item.d.ts.map +1 -0
  41. package/dist/nodes/internal/bound-item.js +2 -0
  42. package/dist/nodes/internal/bound-item.js.map +1 -0
  43. package/dist/nodes/internal/construct.d.ts +1 -8
  44. package/dist/nodes/internal/construct.d.ts.map +1 -1
  45. package/dist/nodes/internal/construct.js +30 -54
  46. package/dist/nodes/internal/construct.js.map +1 -1
  47. package/dist/nodes/internal/widget.d.ts.map +1 -1
  48. package/dist/nodes/internal/widget.js +4 -1
  49. package/dist/nodes/internal/widget.js.map +1 -1
  50. package/dist/nodes/list-item-node.d.ts +12 -0
  51. package/dist/nodes/list-item-node.d.ts.map +1 -0
  52. package/dist/nodes/list-item-node.js +23 -0
  53. package/dist/nodes/list-item-node.js.map +1 -0
  54. package/dist/nodes/list.d.ts +100 -0
  55. package/dist/nodes/list.d.ts.map +1 -0
  56. package/dist/nodes/list.js +950 -0
  57. package/dist/nodes/list.js.map +1 -0
  58. package/dist/nodes/notebook-page.d.ts.map +1 -1
  59. package/dist/nodes/notebook-page.js +4 -0
  60. package/dist/nodes/notebook-page.js.map +1 -1
  61. package/dist/nodes/widget.d.ts.map +1 -1
  62. package/dist/nodes/widget.js +9 -8
  63. package/dist/nodes/widget.js.map +1 -1
  64. package/dist/nodes/window.d.ts.map +1 -1
  65. package/dist/nodes/window.js +2 -2
  66. package/dist/nodes/window.js.map +1 -1
  67. package/dist/registry.d.ts +0 -2
  68. package/dist/registry.d.ts.map +1 -1
  69. package/dist/registry.js +4 -13
  70. package/dist/registry.js.map +1 -1
  71. package/dist/types.d.ts +2 -2
  72. package/dist/types.d.ts.map +1 -1
  73. package/package.json +5 -4
  74. package/src/components/list.tsx +83 -0
  75. package/src/generated/internal.ts +3479 -258
  76. package/src/generated/jsx.ts +0 -324
  77. package/src/host-config.ts +2 -0
  78. package/src/jsx.ts +49 -141
  79. package/src/metadata.ts +6 -3
  80. package/src/node.ts +23 -39
  81. package/src/nodes/application.ts +5 -0
  82. package/src/nodes/column-view-column.ts +125 -128
  83. package/src/nodes/event-controller.ts +3 -11
  84. package/src/nodes/internal/accessible.ts +0 -1
  85. package/src/nodes/internal/bound-item.ts +4 -0
  86. package/src/nodes/internal/construct.ts +38 -68
  87. package/src/nodes/internal/widget.ts +3 -1
  88. package/src/nodes/list-item-node.ts +29 -0
  89. package/src/nodes/list.ts +1082 -0
  90. package/src/nodes/notebook-page.ts +4 -0
  91. package/src/nodes/widget.ts +8 -13
  92. package/src/nodes/window.ts +2 -2
  93. package/src/registry.ts +11 -19
  94. package/src/types.ts +7 -2
  95. package/dist/fiber-root.d.ts +0 -4
  96. package/dist/fiber-root.d.ts.map +0 -1
  97. package/dist/fiber-root.js +0 -6
  98. package/dist/fiber-root.js.map +0 -1
  99. package/dist/nodes/column-view.d.ts +0 -37
  100. package/dist/nodes/column-view.d.ts.map +0 -1
  101. package/dist/nodes/column-view.js +0 -205
  102. package/dist/nodes/column-view.js.map +0 -1
  103. package/dist/nodes/drop-down.d.ts +0 -37
  104. package/dist/nodes/drop-down.d.ts.map +0 -1
  105. package/dist/nodes/drop-down.js +0 -231
  106. package/dist/nodes/drop-down.js.map +0 -1
  107. package/dist/nodes/grid-view.d.ts +0 -30
  108. package/dist/nodes/grid-view.d.ts.map +0 -1
  109. package/dist/nodes/grid-view.js +0 -90
  110. package/dist/nodes/grid-view.js.map +0 -1
  111. package/dist/nodes/internal/base-item-renderer.d.ts +0 -28
  112. package/dist/nodes/internal/base-item-renderer.d.ts.map +0 -1
  113. package/dist/nodes/internal/base-item-renderer.js +0 -85
  114. package/dist/nodes/internal/base-item-renderer.js.map +0 -1
  115. package/dist/nodes/internal/grid-item-renderer.d.ts +0 -20
  116. package/dist/nodes/internal/grid-item-renderer.d.ts.map +0 -1
  117. package/dist/nodes/internal/grid-item-renderer.js +0 -66
  118. package/dist/nodes/internal/grid-item-renderer.js.map +0 -1
  119. package/dist/nodes/internal/header-item-renderer.d.ts +0 -23
  120. package/dist/nodes/internal/header-item-renderer.d.ts.map +0 -1
  121. package/dist/nodes/internal/header-item-renderer.js +0 -87
  122. package/dist/nodes/internal/header-item-renderer.js.map +0 -1
  123. package/dist/nodes/internal/header-renderer-manager.d.ts +0 -13
  124. package/dist/nodes/internal/header-renderer-manager.d.ts.map +0 -1
  125. package/dist/nodes/internal/header-renderer-manager.js +0 -20
  126. package/dist/nodes/internal/header-renderer-manager.js.map +0 -1
  127. package/dist/nodes/internal/list-item-renderer.d.ts +0 -27
  128. package/dist/nodes/internal/list-item-renderer.d.ts.map +0 -1
  129. package/dist/nodes/internal/list-item-renderer.js +0 -131
  130. package/dist/nodes/internal/list-item-renderer.js.map +0 -1
  131. package/dist/nodes/internal/list-store.d.ts +0 -21
  132. package/dist/nodes/internal/list-store.d.ts.map +0 -1
  133. package/dist/nodes/internal/list-store.js +0 -90
  134. package/dist/nodes/internal/list-store.js.map +0 -1
  135. package/dist/nodes/internal/sectioned-list-store.d.ts +0 -50
  136. package/dist/nodes/internal/sectioned-list-store.d.ts.map +0 -1
  137. package/dist/nodes/internal/sectioned-list-store.js +0 -250
  138. package/dist/nodes/internal/sectioned-list-store.js.map +0 -1
  139. package/dist/nodes/internal/selection-helpers.d.ts +0 -12
  140. package/dist/nodes/internal/selection-helpers.d.ts.map +0 -1
  141. package/dist/nodes/internal/selection-helpers.js +0 -25
  142. package/dist/nodes/internal/selection-helpers.js.map +0 -1
  143. package/dist/nodes/internal/selection-model-controller.d.ts +0 -26
  144. package/dist/nodes/internal/selection-model-controller.d.ts.map +0 -1
  145. package/dist/nodes/internal/selection-model-controller.js +0 -82
  146. package/dist/nodes/internal/selection-model-controller.js.map +0 -1
  147. package/dist/nodes/internal/simple-list-store.d.ts +0 -15
  148. package/dist/nodes/internal/simple-list-store.d.ts.map +0 -1
  149. package/dist/nodes/internal/simple-list-store.js +0 -110
  150. package/dist/nodes/internal/simple-list-store.js.map +0 -1
  151. package/dist/nodes/internal/tree-store.d.ts +0 -37
  152. package/dist/nodes/internal/tree-store.d.ts.map +0 -1
  153. package/dist/nodes/internal/tree-store.js +0 -253
  154. package/dist/nodes/internal/tree-store.js.map +0 -1
  155. package/dist/nodes/list-item.d.ts +0 -24
  156. package/dist/nodes/list-item.d.ts.map +0 -1
  157. package/dist/nodes/list-item.js +0 -83
  158. package/dist/nodes/list-item.js.map +0 -1
  159. package/dist/nodes/list-section.d.ts +0 -27
  160. package/dist/nodes/list-section.d.ts.map +0 -1
  161. package/dist/nodes/list-section.js +0 -43
  162. package/dist/nodes/list-section.js.map +0 -1
  163. package/dist/nodes/list-view.d.ts +0 -32
  164. package/dist/nodes/list-view.d.ts.map +0 -1
  165. package/dist/nodes/list-view.js +0 -123
  166. package/dist/nodes/list-view.js.map +0 -1
  167. package/dist/nodes/models/list.d.ts +0 -39
  168. package/dist/nodes/models/list.d.ts.map +0 -1
  169. package/dist/nodes/models/list.js +0 -207
  170. package/dist/nodes/models/list.js.map +0 -1
  171. package/src/fiber-root.ts +0 -20
  172. package/src/nodes/column-view.ts +0 -262
  173. package/src/nodes/drop-down.ts +0 -284
  174. package/src/nodes/grid-view.ts +0 -119
  175. package/src/nodes/internal/base-item-renderer.ts +0 -107
  176. package/src/nodes/internal/grid-item-renderer.ts +0 -78
  177. package/src/nodes/internal/header-item-renderer.ts +0 -105
  178. package/src/nodes/internal/header-renderer-manager.ts +0 -33
  179. package/src/nodes/internal/list-item-renderer.ts +0 -162
  180. package/src/nodes/internal/list-store.ts +0 -107
  181. package/src/nodes/internal/sectioned-list-store.ts +0 -287
  182. package/src/nodes/internal/selection-helpers.ts +0 -35
  183. package/src/nodes/internal/selection-model-controller.ts +0 -119
  184. package/src/nodes/internal/simple-list-store.ts +0 -116
  185. package/src/nodes/internal/tree-store.ts +0 -289
  186. package/src/nodes/list-item.ts +0 -107
  187. package/src/nodes/list-section.ts +0 -64
  188. package/src/nodes/list-view.ts +0 -164
  189. 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
- }