@gtkx/react 0.17.2 → 0.18.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.
- package/README.md +7 -7
- package/dist/factory.d.ts +0 -1
- package/dist/factory.js +21 -8
- package/dist/generated/internal.d.ts +4 -51
- package/dist/generated/internal.js +626 -412
- package/dist/generated/jsx.d.ts +453 -958
- package/dist/host-config.d.ts +1 -1
- package/dist/host-config.js +18 -23
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/jsx.d.ts +579 -302
- package/dist/jsx.js +37 -179
- package/dist/metadata.d.ts +3 -0
- package/dist/metadata.js +26 -0
- package/dist/node.d.ts +20 -12
- package/dist/node.js +72 -17
- package/dist/nodes/adjustable.d.ts +3 -16
- package/dist/nodes/adjustable.js +5 -22
- package/dist/nodes/alert-dialog-response.d.ts +14 -1
- package/dist/nodes/alert-dialog-response.js +36 -62
- package/dist/nodes/animation.d.ts +37 -1
- package/dist/nodes/animation.js +162 -105
- package/dist/nodes/application.d.ts +11 -1
- package/dist/nodes/application.js +17 -38
- package/dist/nodes/calendar.d.ts +13 -0
- package/dist/nodes/calendar.js +10 -16
- package/dist/nodes/color-dialog-button.d.ts +13 -0
- package/dist/nodes/color-dialog-button.js +10 -38
- package/dist/nodes/column-view-column.d.ts +13 -11
- package/dist/nodes/column-view-column.js +27 -23
- package/dist/nodes/column-view.d.ts +31 -0
- package/dist/nodes/column-view.js +44 -44
- package/dist/nodes/container-slot.d.ts +15 -0
- package/dist/nodes/container-slot.js +68 -0
- package/dist/nodes/dialog.d.ts +6 -8
- package/dist/nodes/dialog.js +12 -13
- package/dist/nodes/drawing-area.d.ts +12 -0
- package/dist/nodes/drawing-area.js +24 -24
- package/dist/nodes/drop-down.d.ts +22 -0
- package/dist/nodes/drop-down.js +72 -0
- package/dist/nodes/event-controller.d.ts +8 -17
- package/dist/nodes/event-controller.js +20 -42
- package/dist/nodes/fixed-child.d.ts +18 -1
- package/dist/nodes/fixed-child.js +52 -36
- package/dist/nodes/font-dialog-button.d.ts +13 -0
- package/dist/nodes/font-dialog-button.js +12 -35
- package/dist/nodes/grid-child.d.ts +17 -1
- package/dist/nodes/grid-child.js +57 -37
- package/dist/nodes/grid-view.d.ts +24 -0
- package/dist/nodes/grid-view.js +73 -0
- package/dist/nodes/internal/base-item-renderer.d.ts +7 -9
- package/dist/nodes/internal/base-item-renderer.js +15 -18
- package/dist/nodes/internal/grid-item-renderer.d.ts +17 -0
- package/dist/nodes/internal/grid-item-renderer.js +59 -0
- package/dist/nodes/internal/list-item-renderer.d.ts +14 -9
- package/dist/nodes/internal/list-item-renderer.js +96 -35
- package/dist/nodes/internal/list-store.d.ts +5 -0
- package/dist/nodes/internal/list-store.js +39 -9
- package/dist/nodes/internal/predicates.d.ts +4 -19
- package/dist/nodes/internal/predicates.js +1 -20
- package/dist/nodes/internal/props.d.ts +5 -0
- package/dist/nodes/internal/props.js +42 -0
- package/dist/nodes/internal/{selection-model.d.ts → selection-model-controller.d.ts} +4 -9
- package/dist/nodes/internal/{selection-model.js → selection-model-controller.js} +6 -15
- package/dist/nodes/internal/signal-store.js +12 -5
- package/dist/nodes/internal/simple-list-store.d.ts +5 -0
- package/dist/nodes/internal/simple-list-store.js +42 -13
- package/dist/nodes/internal/text-buffer-controller.d.ts +4 -12
- package/dist/nodes/internal/text-buffer-controller.js +32 -33
- package/dist/nodes/internal/tree-store.d.ts +7 -0
- package/dist/nodes/internal/tree-store.js +75 -18
- package/dist/nodes/internal/widget.d.ts +7 -0
- package/dist/nodes/internal/widget.js +68 -0
- package/dist/nodes/level-bar.d.ts +10 -0
- package/dist/nodes/level-bar.js +11 -22
- package/dist/nodes/list-item.d.ts +17 -9
- package/dist/nodes/list-item.js +67 -12
- package/dist/nodes/list-view.d.ts +23 -0
- package/dist/nodes/list-view.js +27 -31
- package/dist/nodes/menu.d.ts +2 -4
- package/dist/nodes/menu.js +0 -6
- package/dist/nodes/models/grid.d.ts +27 -0
- package/dist/nodes/models/grid.js +68 -0
- package/dist/nodes/models/list.d.ts +15 -13
- package/dist/nodes/models/list.js +48 -26
- package/dist/nodes/models/menu.d.ts +15 -16
- package/dist/nodes/models/menu.js +63 -93
- package/dist/nodes/navigation-page.d.ts +16 -10
- package/dist/nodes/navigation-page.js +108 -31
- package/dist/nodes/navigation-view.d.ts +15 -0
- package/dist/nodes/navigation-view.js +15 -65
- package/dist/nodes/notebook-page-tab.d.ts +10 -12
- package/dist/nodes/notebook-page-tab.js +24 -27
- package/dist/nodes/notebook-page.d.ts +19 -16
- package/dist/nodes/notebook-page.js +75 -56
- package/dist/nodes/notebook.d.ts +10 -1
- package/dist/nodes/notebook.js +10 -22
- package/dist/nodes/overlay-child.d.ts +17 -1
- package/dist/nodes/overlay-child.js +53 -75
- package/dist/nodes/popover-menu.d.ts +15 -0
- package/dist/nodes/popover-menu.js +13 -26
- package/dist/nodes/scale.d.ts +8 -0
- package/dist/nodes/scale.js +2 -11
- package/dist/nodes/scrolled-window.d.ts +9 -0
- package/dist/nodes/scrolled-window.js +5 -11
- package/dist/nodes/search-bar.d.ts +9 -0
- package/dist/nodes/search-bar.js +8 -33
- package/dist/nodes/shortcut-controller.d.ts +9 -1
- package/dist/nodes/shortcut-controller.js +12 -25
- package/dist/nodes/shortcut.d.ts +11 -33
- package/dist/nodes/shortcut.js +19 -15
- package/dist/nodes/slot.d.ts +16 -15
- package/dist/nodes/slot.js +63 -57
- package/dist/nodes/source-view.d.ts +16 -0
- package/dist/nodes/source-view.js +44 -44
- package/dist/nodes/stack-page.d.ts +21 -1
- package/dist/nodes/stack-page.js +68 -17
- package/dist/nodes/stack.d.ts +11 -0
- package/dist/nodes/stack.js +8 -26
- package/dist/nodes/text-anchor.d.ts +11 -30
- package/dist/nodes/text-anchor.js +20 -22
- package/dist/nodes/text-content.d.ts +1 -0
- package/dist/nodes/text-content.js +1 -1
- package/dist/nodes/text-paintable.d.ts +10 -15
- package/dist/nodes/text-paintable.js +16 -9
- package/dist/nodes/text-segment.d.ts +12 -10
- package/dist/nodes/text-segment.js +19 -11
- package/dist/nodes/text-tag.d.ts +20 -119
- package/dist/nodes/text-tag.js +153 -119
- package/dist/nodes/text-view.d.ts +13 -18
- package/dist/nodes/text-view.js +17 -17
- package/dist/nodes/toggle-group.d.ts +9 -0
- package/dist/nodes/toggle-group.js +8 -33
- package/dist/nodes/toggle.d.ts +15 -1
- package/dist/nodes/toggle.js +34 -52
- package/dist/nodes/virtual.d.ts +3 -10
- package/dist/nodes/virtual.js +1 -14
- package/dist/nodes/web-view.d.ts +9 -0
- package/dist/nodes/web-view.js +10 -24
- package/dist/nodes/widget.d.ts +17 -13
- package/dist/nodes/widget.js +185 -112
- package/dist/nodes/window.d.ts +20 -21
- package/dist/nodes/window.js +54 -35
- package/dist/registry.d.ts +17 -6
- package/dist/registry.js +104 -5
- package/dist/render.d.ts +1 -10
- package/dist/render.js +1 -13
- package/package.json +6 -6
- package/dist/animation/css-builder.d.ts +0 -3
- package/dist/animation/css-builder.js +0 -53
- package/dist/animation/types.d.ts +0 -120
- package/dist/animation/types.js +0 -1
- package/dist/nodes/abstract/positional-child.d.ts +0 -9
- package/dist/nodes/abstract/positional-child.js +0 -29
- package/dist/nodes/abstract/virtual-container.d.ts +0 -21
- package/dist/nodes/abstract/virtual-container.js +0 -68
- package/dist/nodes/abstract/virtual-single-child.d.ts +0 -18
- package/dist/nodes/abstract/virtual-single-child.js +0 -55
- package/dist/nodes/action-row-child.d.ts +0 -1
- package/dist/nodes/action-row-child.js +0 -30
- package/dist/nodes/autowrapped.d.ts +0 -1
- package/dist/nodes/autowrapped.js +0 -115
- package/dist/nodes/expander-row-child.d.ts +0 -1
- package/dist/nodes/expander-row-child.js +0 -30
- package/dist/nodes/grid.d.ts +0 -1
- package/dist/nodes/grid.js +0 -41
- package/dist/nodes/index.d.ts +0 -56
- package/dist/nodes/index.js +0 -56
- package/dist/nodes/internal/child-attachment.d.ts +0 -26
- package/dist/nodes/internal/child-attachment.js +0 -48
- package/dist/nodes/internal/deferred-action.d.ts +0 -9
- package/dist/nodes/internal/deferred-action.js +0 -22
- package/dist/nodes/internal/text-tag-styles.d.ts +0 -43
- package/dist/nodes/internal/text-tag-styles.js +0 -52
- package/dist/nodes/internal/tree-list-item-renderer.d.ts +0 -26
- package/dist/nodes/internal/tree-list-item-renderer.js +0 -134
- package/dist/nodes/internal/utils.d.ts +0 -12
- package/dist/nodes/internal/utils.js +0 -92
- package/dist/nodes/models/tree-list.d.ts +0 -28
- package/dist/nodes/models/tree-list.js +0 -113
- package/dist/nodes/pack-child.d.ts +0 -1
- package/dist/nodes/pack-child.js +0 -30
- package/dist/nodes/simple-list-item.d.ts +0 -9
- package/dist/nodes/simple-list-item.js +0 -9
- package/dist/nodes/simple-list-view.d.ts +0 -1
- package/dist/nodes/simple-list-view.js +0 -74
- package/dist/nodes/toolbar-child.d.ts +0 -1
- package/dist/nodes/toolbar-child.js +0 -30
- package/dist/nodes/tree-list-item.d.ts +0 -22
- package/dist/nodes/tree-list-item.js +0 -90
- package/dist/nodes/tree-list-view.d.ts +0 -1
- package/dist/nodes/tree-list-view.js +0 -77
- package/dist/scheduler.d.ts +0 -26
- package/dist/scheduler.js +0 -42
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { getNativeId } from "@gtkx/ffi";
|
|
2
1
|
import * as Gtk from "@gtkx/ffi/gtk";
|
|
3
2
|
import { createFiberRoot } from "../../fiber-root.js";
|
|
4
3
|
import { reconciler } from "../../reconciler.js";
|
|
@@ -25,7 +24,7 @@ export class BaseItemRenderer {
|
|
|
25
24
|
}
|
|
26
25
|
getStore() {
|
|
27
26
|
if (!this.store) {
|
|
28
|
-
throw new Error(`Expected
|
|
27
|
+
throw new Error(`Expected store to be set on ${this.constructor.name}`);
|
|
29
28
|
}
|
|
30
29
|
return this.store;
|
|
31
30
|
}
|
|
@@ -34,7 +33,8 @@ export class BaseItemRenderer {
|
|
|
34
33
|
this.fiberRoots.clear();
|
|
35
34
|
this.tornDown.clear();
|
|
36
35
|
}
|
|
37
|
-
onSetupComplete(
|
|
36
|
+
onSetupComplete(_listItem) { }
|
|
37
|
+
onTeardown(_listItem) { }
|
|
38
38
|
createBox() {
|
|
39
39
|
const box = new Gtk.Box(Gtk.Orientation.HORIZONTAL);
|
|
40
40
|
box.setValign(Gtk.Align.CENTER);
|
|
@@ -50,37 +50,34 @@ export class BaseItemRenderer {
|
|
|
50
50
|
}
|
|
51
51
|
initializeFactory() {
|
|
52
52
|
this.signalStore.set(this, this.factory, "setup", (listItem) => {
|
|
53
|
-
const
|
|
54
|
-
const container = this.onSetup(listItem, ptr);
|
|
53
|
+
const container = this.onSetup(listItem);
|
|
55
54
|
const fiberRoot = createFiberRoot(container);
|
|
56
|
-
this.fiberRoots.set(
|
|
57
|
-
const element = this.renderItem(
|
|
55
|
+
this.fiberRoots.set(listItem, fiberRoot);
|
|
56
|
+
const element = this.renderItem(listItem);
|
|
58
57
|
reconciler.getInstance().updateContainer(element, fiberRoot, null, () => {
|
|
59
|
-
if (this.tornDown.has(
|
|
58
|
+
if (this.tornDown.has(listItem))
|
|
60
59
|
return;
|
|
61
|
-
this.onSetupComplete(
|
|
60
|
+
this.onSetupComplete(listItem);
|
|
62
61
|
});
|
|
63
62
|
});
|
|
64
63
|
this.signalStore.set(this, this.factory, "bind", (listItem) => {
|
|
65
|
-
const
|
|
66
|
-
const fiberRoot = this.fiberRoots.get(ptr);
|
|
64
|
+
const fiberRoot = this.fiberRoots.get(listItem);
|
|
67
65
|
if (!fiberRoot)
|
|
68
66
|
return;
|
|
69
|
-
this.onBind(listItem,
|
|
67
|
+
this.onBind(listItem, fiberRoot);
|
|
70
68
|
});
|
|
71
69
|
this.signalStore.set(this, this.factory, "unbind", (listItem) => {
|
|
72
70
|
this.onUnbind(listItem);
|
|
73
71
|
});
|
|
74
72
|
this.signalStore.set(this, this.factory, "teardown", (listItem) => {
|
|
75
|
-
const
|
|
76
|
-
const fiberRoot = this.fiberRoots.get(ptr);
|
|
73
|
+
const fiberRoot = this.fiberRoots.get(listItem);
|
|
77
74
|
if (fiberRoot) {
|
|
78
|
-
this.tornDown.add(
|
|
79
|
-
this.onTeardown(listItem
|
|
75
|
+
this.tornDown.add(listItem);
|
|
76
|
+
this.onTeardown(listItem);
|
|
80
77
|
reconciler.getInstance().updateContainer(null, fiberRoot, null, () => { });
|
|
81
78
|
queueMicrotask(() => {
|
|
82
|
-
this.fiberRoots.delete(
|
|
83
|
-
this.tornDown.delete(
|
|
79
|
+
this.fiberRoots.delete(listItem);
|
|
80
|
+
this.tornDown.delete(listItem);
|
|
84
81
|
});
|
|
85
82
|
}
|
|
86
83
|
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as Gtk from "@gtkx/ffi/gtk";
|
|
2
|
+
import type { ReactNode } from "react";
|
|
3
|
+
import type Reconciler from "react-reconciler";
|
|
4
|
+
import { BaseItemRenderer } from "./base-item-renderer.js";
|
|
5
|
+
import type { ListStore } from "./list-store.js";
|
|
6
|
+
export type GridRenderItemFn<T> = (item: T | null) => ReactNode;
|
|
7
|
+
export declare class GridItemRenderer extends BaseItemRenderer<ListStore> {
|
|
8
|
+
private renderFn;
|
|
9
|
+
private boundItems;
|
|
10
|
+
setRenderFn(renderFn: GridRenderItemFn<unknown> | null): void;
|
|
11
|
+
rebindItem(id: string): void;
|
|
12
|
+
protected renderItem(_listItem: Gtk.ListItem): ReactNode;
|
|
13
|
+
private getItemFromListItem;
|
|
14
|
+
protected onSetup(listItem: Gtk.ListItem): Gtk.Widget;
|
|
15
|
+
protected onBind(listItem: Gtk.ListItem, fiberRoot: Reconciler.FiberRoot): void;
|
|
16
|
+
protected onUnbind(listItem: Gtk.ListItem): void;
|
|
17
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import * as Gtk from "@gtkx/ffi/gtk";
|
|
2
|
+
import { reconciler } from "../../reconciler.js";
|
|
3
|
+
import { BaseItemRenderer } from "./base-item-renderer.js";
|
|
4
|
+
export class GridItemRenderer extends BaseItemRenderer {
|
|
5
|
+
renderFn = () => null;
|
|
6
|
+
boundItems = new Map();
|
|
7
|
+
setRenderFn(renderFn) {
|
|
8
|
+
this.renderFn = renderFn;
|
|
9
|
+
}
|
|
10
|
+
rebindItem(id) {
|
|
11
|
+
const listItem = this.boundItems.get(id);
|
|
12
|
+
if (!listItem)
|
|
13
|
+
return;
|
|
14
|
+
const fiberRoot = this.fiberRoots.get(listItem);
|
|
15
|
+
if (!fiberRoot)
|
|
16
|
+
return;
|
|
17
|
+
const item = this.getStore().getItem(id);
|
|
18
|
+
const element = this.renderFn?.(item);
|
|
19
|
+
reconciler.getInstance().updateContainer(element, fiberRoot, null, () => { });
|
|
20
|
+
}
|
|
21
|
+
renderItem(_listItem) {
|
|
22
|
+
return this.renderFn?.(null);
|
|
23
|
+
}
|
|
24
|
+
getItemFromListItem(listItem) {
|
|
25
|
+
const stringObject = listItem.getItem();
|
|
26
|
+
if (!(stringObject instanceof Gtk.StringObject))
|
|
27
|
+
return null;
|
|
28
|
+
return stringObject.getString();
|
|
29
|
+
}
|
|
30
|
+
onSetup(listItem) {
|
|
31
|
+
const box = this.createBox();
|
|
32
|
+
listItem.setChild(box);
|
|
33
|
+
return box;
|
|
34
|
+
}
|
|
35
|
+
onBind(listItem, fiberRoot) {
|
|
36
|
+
const id = this.getItemFromListItem(listItem);
|
|
37
|
+
if (id !== null) {
|
|
38
|
+
this.boundItems.set(id, listItem);
|
|
39
|
+
}
|
|
40
|
+
const item = id !== null ? this.getStore().getItem(id) : null;
|
|
41
|
+
const element = this.renderFn?.(item);
|
|
42
|
+
reconciler.getInstance().updateContainer(element, fiberRoot, null, () => {
|
|
43
|
+
if (this.tornDown.has(listItem))
|
|
44
|
+
return;
|
|
45
|
+
if (this.estimatedItemHeight !== null)
|
|
46
|
+
return;
|
|
47
|
+
const currentFiberRoot = this.fiberRoots.get(listItem);
|
|
48
|
+
if (!currentFiberRoot)
|
|
49
|
+
return;
|
|
50
|
+
this.clearBoxSizeRequest(currentFiberRoot.containerInfo);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
onUnbind(listItem) {
|
|
54
|
+
const id = this.getItemFromListItem(listItem);
|
|
55
|
+
if (id !== null) {
|
|
56
|
+
this.boundItems.delete(id);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -2,18 +2,23 @@ import * as Gtk from "@gtkx/ffi/gtk";
|
|
|
2
2
|
import type { ReactNode } from "react";
|
|
3
3
|
import type Reconciler from "react-reconciler";
|
|
4
4
|
import { BaseItemRenderer } from "./base-item-renderer.js";
|
|
5
|
-
import type {
|
|
6
|
-
export type RenderItemFn<T> = (item: T | null) => ReactNode;
|
|
7
|
-
export declare class ListItemRenderer extends BaseItemRenderer<
|
|
5
|
+
import type { TreeStore } from "./tree-store.js";
|
|
6
|
+
export type RenderItemFn<T> = (item: T | null, row: Gtk.TreeListRow | null) => ReactNode;
|
|
7
|
+
export declare class ListItemRenderer extends BaseItemRenderer<TreeStore> {
|
|
8
|
+
private expanders;
|
|
9
|
+
private setupComplete;
|
|
10
|
+
private pendingBinds;
|
|
8
11
|
private renderFn;
|
|
9
12
|
private boundItems;
|
|
10
13
|
setRenderFn(renderFn: RenderItemFn<unknown> | null): void;
|
|
11
14
|
rebindItem(id: string): void;
|
|
12
|
-
|
|
13
|
-
protected renderItem(
|
|
14
|
-
protected
|
|
15
|
-
protected
|
|
16
|
-
protected onBind(listItem: Gtk.ListItem,
|
|
15
|
+
dispose(): void;
|
|
16
|
+
protected renderItem(_listItem: Gtk.ListItem): ReactNode;
|
|
17
|
+
protected onSetup(listItem: Gtk.ListItem): Gtk.Widget;
|
|
18
|
+
protected onSetupComplete(listItem: Gtk.ListItem): void;
|
|
19
|
+
protected onBind(listItem: Gtk.ListItem, fiberRoot: Reconciler.FiberRoot): void;
|
|
17
20
|
protected onUnbind(listItem: Gtk.ListItem): void;
|
|
18
|
-
protected onTeardown(
|
|
21
|
+
protected onTeardown(listItem: Gtk.ListItem): void;
|
|
22
|
+
private processPendingBind;
|
|
23
|
+
private renderBind;
|
|
19
24
|
}
|
|
@@ -2,62 +2,123 @@ import * as Gtk from "@gtkx/ffi/gtk";
|
|
|
2
2
|
import { reconciler } from "../../reconciler.js";
|
|
3
3
|
import { BaseItemRenderer } from "./base-item-renderer.js";
|
|
4
4
|
export class ListItemRenderer extends BaseItemRenderer {
|
|
5
|
+
expanders = new Map();
|
|
6
|
+
setupComplete = new Set();
|
|
7
|
+
pendingBinds = new Map();
|
|
5
8
|
renderFn = () => null;
|
|
6
9
|
boundItems = new Map();
|
|
7
10
|
setRenderFn(renderFn) {
|
|
8
11
|
this.renderFn = renderFn;
|
|
9
12
|
}
|
|
10
13
|
rebindItem(id) {
|
|
11
|
-
const
|
|
12
|
-
if (
|
|
14
|
+
const binding = this.boundItems.get(id);
|
|
15
|
+
if (!binding)
|
|
13
16
|
return;
|
|
14
|
-
const fiberRoot = this.fiberRoots.get(
|
|
17
|
+
const fiberRoot = this.fiberRoots.get(binding.listItem);
|
|
15
18
|
if (!fiberRoot)
|
|
16
19
|
return;
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
getStoreTypeName() {
|
|
22
|
-
return "list store";
|
|
20
|
+
const expander = this.expanders.get(binding.listItem);
|
|
21
|
+
if (!expander)
|
|
22
|
+
return;
|
|
23
|
+
this.renderBind(binding.listItem, expander, binding.treeListRow, id, fiberRoot);
|
|
23
24
|
}
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
dispose() {
|
|
26
|
+
super.dispose();
|
|
27
|
+
this.expanders.clear();
|
|
28
|
+
this.setupComplete.clear();
|
|
29
|
+
this.pendingBinds.clear();
|
|
30
|
+
this.boundItems.clear();
|
|
26
31
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
if (!(stringObject instanceof Gtk.StringObject))
|
|
30
|
-
return null;
|
|
31
|
-
return stringObject.getString();
|
|
32
|
+
renderItem(_listItem) {
|
|
33
|
+
return this.renderFn?.(null, null);
|
|
32
34
|
}
|
|
33
|
-
onSetup(listItem
|
|
35
|
+
onSetup(listItem) {
|
|
36
|
+
const expander = new Gtk.TreeExpander();
|
|
34
37
|
const box = this.createBox();
|
|
35
|
-
|
|
38
|
+
expander.setChild(box);
|
|
39
|
+
listItem.setChild(expander);
|
|
40
|
+
this.expanders.set(listItem, expander);
|
|
36
41
|
return box;
|
|
37
42
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
43
|
+
onSetupComplete(listItem) {
|
|
44
|
+
this.setupComplete.add(listItem);
|
|
45
|
+
this.processPendingBind(listItem);
|
|
46
|
+
}
|
|
47
|
+
onBind(listItem, fiberRoot) {
|
|
48
|
+
const expander = this.expanders.get(listItem);
|
|
49
|
+
if (!expander)
|
|
50
|
+
return;
|
|
51
|
+
const treeListRow = listItem.getItem();
|
|
52
|
+
if (!(treeListRow instanceof Gtk.TreeListRow))
|
|
53
|
+
return;
|
|
54
|
+
expander.setListRow(treeListRow);
|
|
55
|
+
const stringObject = treeListRow.getItem();
|
|
56
|
+
if (!(stringObject instanceof Gtk.StringObject))
|
|
57
|
+
return;
|
|
58
|
+
const id = stringObject.getString();
|
|
59
|
+
this.boundItems.set(id, { listItem, treeListRow });
|
|
60
|
+
if (!this.setupComplete.has(listItem)) {
|
|
61
|
+
this.pendingBinds.set(listItem, { treeListRow, expander, id });
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
this.renderBind(listItem, expander, treeListRow, id, fiberRoot);
|
|
65
|
+
}
|
|
66
|
+
onUnbind(listItem) {
|
|
67
|
+
const expander = listItem.getChild();
|
|
68
|
+
if (expander instanceof Gtk.TreeExpander) {
|
|
69
|
+
expander.setListRow(null);
|
|
70
|
+
const treeListRow = listItem.getItem();
|
|
71
|
+
if (treeListRow instanceof Gtk.TreeListRow) {
|
|
72
|
+
const stringObject = treeListRow.getItem();
|
|
73
|
+
if (stringObject instanceof Gtk.StringObject) {
|
|
74
|
+
this.boundItems.delete(stringObject.getString());
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
onTeardown(listItem) {
|
|
80
|
+
this.expanders.delete(listItem);
|
|
81
|
+
this.setupComplete.delete(listItem);
|
|
82
|
+
this.pendingBinds.delete(listItem);
|
|
83
|
+
}
|
|
84
|
+
processPendingBind(listItem) {
|
|
85
|
+
const pending = this.pendingBinds.get(listItem);
|
|
86
|
+
if (!pending)
|
|
87
|
+
return;
|
|
88
|
+
this.pendingBinds.delete(listItem);
|
|
89
|
+
const fiberRoot = this.fiberRoots.get(listItem);
|
|
90
|
+
if (fiberRoot) {
|
|
91
|
+
this.renderBind(listItem, pending.expander, pending.treeListRow, pending.id, fiberRoot);
|
|
42
92
|
}
|
|
43
|
-
|
|
44
|
-
|
|
93
|
+
}
|
|
94
|
+
renderBind(listItem, expander, treeListRow, id, fiberRoot) {
|
|
95
|
+
const itemData = this.getStore().getItem(id);
|
|
96
|
+
if (itemData) {
|
|
97
|
+
expander.setIndentForDepth(itemData.indentForDepth ?? true);
|
|
98
|
+
expander.setHideExpander(itemData.hideExpander ?? false);
|
|
99
|
+
if (itemData.indentForIcon !== undefined) {
|
|
100
|
+
expander.setIndentForIcon(itemData.indentForIcon);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
expander.setIndentForIcon(treeListRow.isExpandable());
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
expander.setIndentForIcon(treeListRow.isExpandable());
|
|
108
|
+
}
|
|
109
|
+
const element = this.renderFn?.(itemData?.value ?? null, treeListRow);
|
|
45
110
|
reconciler.getInstance().updateContainer(element, fiberRoot, null, () => {
|
|
46
|
-
if (this.tornDown.has(
|
|
111
|
+
if (this.tornDown.has(listItem))
|
|
47
112
|
return;
|
|
48
113
|
if (this.estimatedItemHeight !== null)
|
|
49
114
|
return;
|
|
50
|
-
const
|
|
51
|
-
if (!
|
|
115
|
+
const currentExpander = this.expanders.get(listItem);
|
|
116
|
+
if (!currentExpander)
|
|
52
117
|
return;
|
|
53
|
-
|
|
118
|
+
const box = currentExpander.getChild();
|
|
119
|
+
if (box) {
|
|
120
|
+
this.clearBoxSizeRequest(box);
|
|
121
|
+
}
|
|
54
122
|
});
|
|
55
123
|
}
|
|
56
|
-
onUnbind(listItem) {
|
|
57
|
-
const id = this.getItemFromListItem(listItem);
|
|
58
|
-
if (id !== null) {
|
|
59
|
-
this.boundItems.delete(id);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
onTeardown(_listItem, _ptr) { }
|
|
63
124
|
}
|
|
@@ -3,13 +3,18 @@ export type ItemUpdatedCallback = (id: string) => void;
|
|
|
3
3
|
export declare class ListStore {
|
|
4
4
|
private model;
|
|
5
5
|
private ids;
|
|
6
|
+
private idToIndex;
|
|
6
7
|
private items;
|
|
7
8
|
private onItemUpdated;
|
|
9
|
+
private pendingBatch;
|
|
8
10
|
setOnItemUpdated(callback: ItemUpdatedCallback | null): void;
|
|
11
|
+
beginBatch(): void;
|
|
12
|
+
flushBatch(): void;
|
|
9
13
|
addItem(id: string, item: unknown): void;
|
|
10
14
|
removeItem(id: string): void;
|
|
11
15
|
insertItemBefore(id: string, beforeId: string, item: unknown): void;
|
|
12
16
|
updateItem(id: string, item: unknown): void;
|
|
13
17
|
getItem(id: string): unknown;
|
|
14
18
|
getModel(): Gtk.StringList;
|
|
19
|
+
private rebuildIndices;
|
|
15
20
|
}
|
|
@@ -2,43 +2,68 @@ import * as Gtk from "@gtkx/ffi/gtk";
|
|
|
2
2
|
export class ListStore {
|
|
3
3
|
model = new Gtk.StringList();
|
|
4
4
|
ids = [];
|
|
5
|
+
idToIndex = new Map();
|
|
5
6
|
items = new Map();
|
|
6
7
|
onItemUpdated = null;
|
|
8
|
+
pendingBatch = null;
|
|
7
9
|
setOnItemUpdated(callback) {
|
|
8
10
|
this.onItemUpdated = callback;
|
|
9
11
|
}
|
|
12
|
+
beginBatch() {
|
|
13
|
+
this.pendingBatch = [];
|
|
14
|
+
}
|
|
15
|
+
flushBatch() {
|
|
16
|
+
const batch = this.pendingBatch;
|
|
17
|
+
this.pendingBatch = null;
|
|
18
|
+
if (batch && batch.length > 0) {
|
|
19
|
+
this.model.splice(0, 0, batch);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
10
22
|
addItem(id, item) {
|
|
11
23
|
this.items.set(id, item);
|
|
12
|
-
const existingIndex = this.
|
|
13
|
-
if (existingIndex
|
|
24
|
+
const existingIndex = this.idToIndex.get(id);
|
|
25
|
+
if (existingIndex !== undefined) {
|
|
14
26
|
this.model.remove(existingIndex);
|
|
15
27
|
this.ids.splice(existingIndex, 1);
|
|
28
|
+
this.rebuildIndices(existingIndex);
|
|
16
29
|
}
|
|
30
|
+
this.idToIndex.set(id, this.ids.length);
|
|
17
31
|
this.ids.push(id);
|
|
18
|
-
this.
|
|
32
|
+
if (this.pendingBatch) {
|
|
33
|
+
this.pendingBatch.push(id);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
this.model.append(id);
|
|
37
|
+
}
|
|
19
38
|
}
|
|
20
39
|
removeItem(id) {
|
|
21
|
-
const index = this.
|
|
22
|
-
if (index
|
|
40
|
+
const index = this.idToIndex.get(id);
|
|
41
|
+
if (index === undefined)
|
|
23
42
|
return;
|
|
24
43
|
this.model.remove(index);
|
|
25
44
|
this.ids.splice(index, 1);
|
|
45
|
+
this.idToIndex.delete(id);
|
|
46
|
+
this.rebuildIndices(index);
|
|
26
47
|
this.items.delete(id);
|
|
27
48
|
}
|
|
28
49
|
insertItemBefore(id, beforeId, item) {
|
|
29
50
|
this.items.set(id, item);
|
|
30
|
-
const existingIndex = this.
|
|
31
|
-
if (existingIndex
|
|
51
|
+
const existingIndex = this.idToIndex.get(id);
|
|
52
|
+
if (existingIndex !== undefined) {
|
|
32
53
|
this.model.remove(existingIndex);
|
|
33
54
|
this.ids.splice(existingIndex, 1);
|
|
55
|
+
this.idToIndex.delete(id);
|
|
56
|
+
this.rebuildIndices(existingIndex);
|
|
34
57
|
}
|
|
35
|
-
const beforeIndex = this.
|
|
36
|
-
if (beforeIndex
|
|
58
|
+
const beforeIndex = this.idToIndex.get(beforeId);
|
|
59
|
+
if (beforeIndex === undefined) {
|
|
60
|
+
this.idToIndex.set(id, this.ids.length);
|
|
37
61
|
this.ids.push(id);
|
|
38
62
|
this.model.append(id);
|
|
39
63
|
}
|
|
40
64
|
else {
|
|
41
65
|
this.ids.splice(beforeIndex, 0, id);
|
|
66
|
+
this.rebuildIndices(beforeIndex);
|
|
42
67
|
this.model.splice(beforeIndex, 0, [id]);
|
|
43
68
|
}
|
|
44
69
|
}
|
|
@@ -57,4 +82,9 @@ export class ListStore {
|
|
|
57
82
|
getModel() {
|
|
58
83
|
return this.model;
|
|
59
84
|
}
|
|
85
|
+
rebuildIndices(fromIndex) {
|
|
86
|
+
for (let i = fromIndex; i < this.ids.length; i++) {
|
|
87
|
+
this.idToIndex.set(this.ids[i], i);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
60
90
|
}
|
|
@@ -4,17 +4,8 @@
|
|
|
4
4
|
* These predicates check for specific APIs that widgets may or may not expose.
|
|
5
5
|
* GTK widgets don't have a consistent interface - different widgets support
|
|
6
6
|
* different child management APIs - so runtime checking is necessary.
|
|
7
|
-
*
|
|
8
|
-
* Predicate evaluation order matters in WidgetNode.appendChild/removeChild:
|
|
9
|
-
* 1. isReorderable (Box, etc.) - reorderChildAfter/insertChildAfter
|
|
10
|
-
* 2. isInsertable (ListBox, etc.) - insert
|
|
11
|
-
* 3. isAppendable (most containers) - append
|
|
12
|
-
* 4. isAddable (some legacy widgets) - add
|
|
13
|
-
* 5. isContentWidget (ActionBar, etc.) - setContent
|
|
14
|
-
* 6. isSingleChild (Bin subclasses) - setChild
|
|
15
7
|
*/
|
|
16
8
|
import * as Gtk from "@gtkx/ffi/gtk";
|
|
17
|
-
import type { Node } from "../../node.js";
|
|
18
9
|
type AppendableWidget = Gtk.Widget & {
|
|
19
10
|
append: (child: Gtk.Widget) => void;
|
|
20
11
|
};
|
|
@@ -43,9 +34,9 @@ type EditableWidget = Gtk.Widget & {
|
|
|
43
34
|
setPosition: (position: number) => void;
|
|
44
35
|
getText: () => string;
|
|
45
36
|
};
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
37
|
+
type BufferedWidget = Gtk.Widget & {
|
|
38
|
+
getBuffer: () => Gtk.TextBuffer;
|
|
39
|
+
setBuffer: (buffer?: Gtk.TextBuffer | null) => void;
|
|
49
40
|
};
|
|
50
41
|
export declare const isAppendable: (obj: unknown) => obj is AppendableWidget;
|
|
51
42
|
export declare const isAddable: (obj: unknown) => obj is AddableWidget;
|
|
@@ -55,11 +46,5 @@ export declare const isRemovable: (obj: unknown) => obj is RemovableWidget;
|
|
|
55
46
|
export declare const isReorderable: (obj: unknown) => obj is ReorderableWidget;
|
|
56
47
|
export declare const isInsertable: (obj: unknown) => obj is InsertableWidget;
|
|
57
48
|
export declare const isEditable: (obj: unknown) => obj is EditableWidget;
|
|
58
|
-
export declare const
|
|
59
|
-
export type Attachable = {
|
|
60
|
-
canBeChildOf(parent: Node): boolean;
|
|
61
|
-
attachTo(parent: Node): void;
|
|
62
|
-
detachFrom(parent: Node): void;
|
|
63
|
-
};
|
|
64
|
-
export declare function isAttachable(node: Node): node is Node & Attachable;
|
|
49
|
+
export declare const isBuffered: (obj: unknown) => obj is BufferedWidget;
|
|
65
50
|
export {};
|
|
@@ -4,17 +4,8 @@
|
|
|
4
4
|
* These predicates check for specific APIs that widgets may or may not expose.
|
|
5
5
|
* GTK widgets don't have a consistent interface - different widgets support
|
|
6
6
|
* different child management APIs - so runtime checking is necessary.
|
|
7
|
-
*
|
|
8
|
-
* Predicate evaluation order matters in WidgetNode.appendChild/removeChild:
|
|
9
|
-
* 1. isReorderable (Box, etc.) - reorderChildAfter/insertChildAfter
|
|
10
|
-
* 2. isInsertable (ListBox, etc.) - insert
|
|
11
|
-
* 3. isAppendable (most containers) - append
|
|
12
|
-
* 4. isAddable (some legacy widgets) - add
|
|
13
|
-
* 5. isContentWidget (ActionBar, etc.) - setContent
|
|
14
|
-
* 6. isSingleChild (Bin subclasses) - setChild
|
|
15
7
|
*/
|
|
16
8
|
import * as Gtk from "@gtkx/ffi/gtk";
|
|
17
|
-
import { resolveContainerClass } from "../../factory.js";
|
|
18
9
|
export const isAppendable = (obj) => obj instanceof Gtk.Widget && "append" in obj && typeof obj.append === "function";
|
|
19
10
|
export const isAddable = (obj) => obj instanceof Gtk.Widget && "add" in obj && typeof obj.add === "function";
|
|
20
11
|
export const isContentWidget = (obj) => obj instanceof Gtk.Widget && "setContent" in obj && typeof obj.setContent === "function";
|
|
@@ -37,18 +28,8 @@ export const isEditable = (obj) => obj instanceof Gtk.Widget &&
|
|
|
37
28
|
typeof obj.setPosition === "function" &&
|
|
38
29
|
"getText" in obj &&
|
|
39
30
|
typeof obj.getText === "function";
|
|
40
|
-
const isBuffered = (obj) => obj instanceof Gtk.Widget &&
|
|
31
|
+
export const isBuffered = (obj) => obj instanceof Gtk.Widget &&
|
|
41
32
|
"getBuffer" in obj &&
|
|
42
33
|
typeof obj.getBuffer === "function" &&
|
|
43
34
|
"setBuffer" in obj &&
|
|
44
35
|
typeof obj.setBuffer === "function";
|
|
45
|
-
export const isBufferedType = (type) => {
|
|
46
|
-
const containerClass = resolveContainerClass(type);
|
|
47
|
-
return containerClass !== null && isBuffered(containerClass.prototype);
|
|
48
|
-
};
|
|
49
|
-
export function isAttachable(node) {
|
|
50
|
-
const candidate = node;
|
|
51
|
-
return (typeof candidate.canBeChildOf === "function" &&
|
|
52
|
-
typeof candidate.attachTo === "function" &&
|
|
53
|
-
typeof candidate.detachFrom === "function");
|
|
54
|
-
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Props } from "../../types.js";
|
|
2
|
+
export declare const filterProps: <T extends Props>(props: T, excludeKeys: readonly string[]) => T;
|
|
3
|
+
export declare const hasChanged: <T>(oldProps: T | null, newProps: T, key: keyof T) => boolean;
|
|
4
|
+
export declare const shallowArrayEqual: <T extends Record<string, unknown>>(a: T[], b: T[]) => boolean;
|
|
5
|
+
export declare const primitiveArrayEqual: <T extends string | number | boolean>(a: T[] | null | undefined, b: T[] | null | undefined) => boolean;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export const filterProps = (props, excludeKeys) => {
|
|
2
|
+
const result = {};
|
|
3
|
+
for (const key of Object.keys(props)) {
|
|
4
|
+
if (!excludeKeys.includes(key)) {
|
|
5
|
+
result[key] = props[key];
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
return result;
|
|
9
|
+
};
|
|
10
|
+
export const hasChanged = (oldProps, newProps, key) => !oldProps || oldProps[key] !== newProps[key];
|
|
11
|
+
export const shallowArrayEqual = (a, b) => {
|
|
12
|
+
if (a.length !== b.length)
|
|
13
|
+
return false;
|
|
14
|
+
for (let i = 0; i < a.length; i++) {
|
|
15
|
+
const itemA = a[i];
|
|
16
|
+
const itemB = b[i];
|
|
17
|
+
if (!itemA || !itemB)
|
|
18
|
+
return false;
|
|
19
|
+
const keysA = Object.keys(itemA);
|
|
20
|
+
const keysB = Object.keys(itemB);
|
|
21
|
+
if (keysA.length !== keysB.length)
|
|
22
|
+
return false;
|
|
23
|
+
for (const key of keysA) {
|
|
24
|
+
if (itemA[key] !== itemB[key])
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return true;
|
|
29
|
+
};
|
|
30
|
+
export const primitiveArrayEqual = (a, b) => {
|
|
31
|
+
if (a === b)
|
|
32
|
+
return true;
|
|
33
|
+
if (!a || !b)
|
|
34
|
+
return false;
|
|
35
|
+
if (a.length !== b.length)
|
|
36
|
+
return false;
|
|
37
|
+
for (let i = 0; i < a.length; i++) {
|
|
38
|
+
if (a[i] !== b[i])
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
return true;
|
|
42
|
+
};
|
|
@@ -1,21 +1,16 @@
|
|
|
1
1
|
import type * as Gio from "@gtkx/ffi/gio";
|
|
2
2
|
import * as Gtk from "@gtkx/ffi/gtk";
|
|
3
|
+
import type { GtkListViewProps } from "../../jsx.js";
|
|
3
4
|
import type { SignalStore } from "./signal-store.js";
|
|
4
5
|
type SelectionModel = Gtk.NoSelection | Gtk.SingleSelection | Gtk.MultiSelection;
|
|
5
|
-
export type SelectionModelConfig = {
|
|
6
|
+
export type SelectionModelConfig = Pick<GtkListViewProps, "selectionMode" | "selected" | "onSelectionChanged"> & {
|
|
6
7
|
owner: object;
|
|
7
8
|
signalStore: SignalStore;
|
|
8
|
-
selectionMode?: Gtk.SelectionMode;
|
|
9
|
-
selected?: string[];
|
|
10
|
-
onSelectionChanged?: (ids: string[]) => void;
|
|
11
9
|
};
|
|
12
|
-
export declare class
|
|
10
|
+
export declare class SelectionModelController {
|
|
13
11
|
private owner;
|
|
14
12
|
private signalStore;
|
|
15
13
|
private selectionModel;
|
|
16
|
-
private handleSelectionChange;
|
|
17
|
-
private pendingSelection;
|
|
18
|
-
private selectionAction;
|
|
19
14
|
private getSelection;
|
|
20
15
|
private resolveSelectionIndices;
|
|
21
16
|
private getItemCount;
|
|
@@ -24,7 +19,7 @@ export declare class SelectionModelManager {
|
|
|
24
19
|
update(oldProps: SelectionModelConfig | null, newProps: SelectionModelConfig, model: Gio.ListModel): SelectionModel;
|
|
25
20
|
private initSelectionHandler;
|
|
26
21
|
private createSelectionModel;
|
|
22
|
+
reapplySelection(ids?: string[] | null): void;
|
|
27
23
|
private setSelection;
|
|
28
|
-
private applySelection;
|
|
29
24
|
}
|
|
30
25
|
export {};
|
|
@@ -1,13 +1,8 @@
|
|
|
1
1
|
import * as Gtk from "@gtkx/ffi/gtk";
|
|
2
|
-
|
|
3
|
-
import { DeferredAction } from "./deferred-action.js";
|
|
4
|
-
export class SelectionModelManager {
|
|
2
|
+
export class SelectionModelController {
|
|
5
3
|
owner;
|
|
6
4
|
signalStore;
|
|
7
5
|
selectionModel;
|
|
8
|
-
handleSelectionChange = null;
|
|
9
|
-
pendingSelection = null;
|
|
10
|
-
selectionAction;
|
|
11
6
|
getSelection;
|
|
12
7
|
resolveSelectionIndices;
|
|
13
8
|
getItemCount;
|
|
@@ -19,7 +14,6 @@ export class SelectionModelManager {
|
|
|
19
14
|
this.getSelection = getSelection;
|
|
20
15
|
this.resolveSelectionIndices = resolveSelectionIndices;
|
|
21
16
|
this.getItemCount = getItemCount;
|
|
22
|
-
this.selectionAction = new DeferredAction(() => this.applySelection(), CommitPriority.LOW);
|
|
23
17
|
this.initSelectionHandler(config.onSelectionChanged);
|
|
24
18
|
this.setSelection(config.selected);
|
|
25
19
|
}
|
|
@@ -48,10 +42,10 @@ export class SelectionModelManager {
|
|
|
48
42
|
this.signalStore.set(this.owner, this.selectionModel, "selection-changed", null);
|
|
49
43
|
return;
|
|
50
44
|
}
|
|
51
|
-
|
|
45
|
+
const handler = () => {
|
|
52
46
|
onSelectionChanged(this.getSelection());
|
|
53
47
|
};
|
|
54
|
-
this.signalStore.set(this.owner, this.selectionModel, "selection-changed",
|
|
48
|
+
this.signalStore.set(this.owner, this.selectionModel, "selection-changed", handler);
|
|
55
49
|
}
|
|
56
50
|
createSelectionModel(mode, model) {
|
|
57
51
|
const selectionMode = mode ?? Gtk.SelectionMode.SINGLE;
|
|
@@ -66,14 +60,11 @@ export class SelectionModelManager {
|
|
|
66
60
|
selectionModel.setCanUnselect(selectionMode !== Gtk.SelectionMode.BROWSE);
|
|
67
61
|
return selectionModel;
|
|
68
62
|
}
|
|
69
|
-
|
|
70
|
-
this.
|
|
71
|
-
this.selectionAction.schedule();
|
|
63
|
+
reapplySelection(ids) {
|
|
64
|
+
this.setSelection(ids);
|
|
72
65
|
}
|
|
73
|
-
|
|
74
|
-
const ids = this.pendingSelection;
|
|
66
|
+
setSelection(ids) {
|
|
75
67
|
const nItems = this.getItemCount();
|
|
76
|
-
this.pendingSelection = null;
|
|
77
68
|
const selected = ids ? this.resolveSelectionIndices(ids) : new Gtk.Bitset();
|
|
78
69
|
const mask = Gtk.Bitset.newRange(0, nItems);
|
|
79
70
|
if (this.selectionModel instanceof Gtk.SingleSelection) {
|