@gtkx/react 1.4.0 → 1.6.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 +1 -1
- package/dist/adw/element-behaviors.js +35 -120
- package/dist/adw/element-behaviors.js.map +1 -1
- package/dist/components/element.d.ts +6 -1
- package/dist/components/element.d.ts.map +1 -1
- package/dist/components/element.js +6 -3
- package/dist/components/element.js.map +1 -1
- package/dist/element-behaviors.js +29 -124
- package/dist/element-behaviors.js.map +1 -1
- package/dist/reconciler/behaviors.d.ts +27 -8
- package/dist/reconciler/behaviors.d.ts.map +1 -1
- package/dist/reconciler/behaviors.js +60 -31
- package/dist/reconciler/behaviors.js.map +1 -1
- package/dist/reconciler/instance.d.ts.map +1 -1
- package/dist/reconciler/instance.js +5 -4
- package/dist/reconciler/instance.js.map +1 -1
- package/dist/reconciler/metadata.d.ts.map +1 -1
- package/dist/reconciler/metadata.js +17 -3
- package/dist/reconciler/metadata.js.map +1 -1
- package/package.json +5 -5
- package/src/adw/element-behaviors.ts +40 -177
- package/src/components/element.tsx +11 -3
- package/src/element-behaviors.ts +35 -175
- package/src/reconciler/behaviors.ts +114 -56
- package/src/reconciler/instance.ts +5 -4
- package/src/reconciler/metadata.ts +25 -3
|
@@ -1,22 +1,26 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
+
import { createApplication, getClassType, getInstanceType, TYPE_INVALID, typeIsA, } from "@gtkx/runtime";
|
|
3
|
+
import { isDeepEqual, kebabCase, structuredClone, unsanitizeIdentifier } from "@gtkx/utils";
|
|
3
4
|
import { getPropertyName } from "./metadata.js";
|
|
4
5
|
import { applyWrite } from "./signals.js";
|
|
5
6
|
import { hasSameText } from "./text.js";
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
const childClassType = (cls) => typeof cls === "function" ? getClassType(cls) : TYPE_INVALID;
|
|
8
|
+
const isChildInstance = (child, cls) => {
|
|
9
|
+
if (child instanceof cls) {
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
const type = childClassType(cls);
|
|
13
|
+
return type !== TYPE_INVALID && typeIsA(getInstanceType(child), type);
|
|
11
14
|
};
|
|
15
|
+
const childMatcher = (cls) => (child) => cls !== undefined && isChildInstance(child, cls);
|
|
12
16
|
const slotAttach = (slotName, isMatch, attach) => (object, child, info) => {
|
|
13
17
|
if (info.slot !== slotName || !isMatch(child)) {
|
|
14
18
|
return;
|
|
15
19
|
}
|
|
16
20
|
return attach(object, child, info) ?? true;
|
|
17
21
|
};
|
|
18
|
-
const slot = (slotName,
|
|
19
|
-
const matches = childMatcher(
|
|
22
|
+
const slot = (slotName, childClass, hooks) => {
|
|
23
|
+
const matches = childMatcher(childClass);
|
|
20
24
|
const { attach, detach, reorder, resolve } = hooks;
|
|
21
25
|
const behavior = { attach: slotAttach(slotName, matches, attach) };
|
|
22
26
|
if (reorder !== undefined) {
|
|
@@ -74,18 +78,19 @@ const list = (prop, hooks) => {
|
|
|
74
78
|
}
|
|
75
79
|
return behavior;
|
|
76
80
|
};
|
|
77
|
-
const settleDeferred = (object, state, prop,
|
|
78
|
-
if (!state.isPresent || Object.is(
|
|
81
|
+
const settleDeferred = (object, state, prop, ops) => {
|
|
82
|
+
if (!state.isPresent || Object.is(ops.read(object), state.desired)) {
|
|
79
83
|
return;
|
|
80
84
|
}
|
|
81
|
-
|
|
85
|
+
const desired = state.desired;
|
|
86
|
+
if (ops.canApply !== undefined && !ops.canApply(object, desired)) {
|
|
82
87
|
return;
|
|
83
88
|
}
|
|
84
89
|
applyWrite(prop, () => {
|
|
85
|
-
|
|
90
|
+
ops.write(object, desired);
|
|
86
91
|
});
|
|
87
92
|
};
|
|
88
|
-
const scheduleSettle = (object, state, prop,
|
|
93
|
+
const scheduleSettle = (object, state, prop, ops) => {
|
|
89
94
|
if (state.isScheduled) {
|
|
90
95
|
return;
|
|
91
96
|
}
|
|
@@ -93,36 +98,36 @@ const scheduleSettle = (object, state, prop, canApply) => {
|
|
|
93
98
|
queueMicrotask(() => {
|
|
94
99
|
state.isScheduled = false;
|
|
95
100
|
if (state.disconnect !== null) {
|
|
96
|
-
settleDeferred(object, state, prop,
|
|
101
|
+
settleDeferred(object, state, prop, ops);
|
|
97
102
|
}
|
|
98
103
|
});
|
|
99
104
|
};
|
|
100
|
-
const watchDrift = (object, state, prop,
|
|
105
|
+
const watchDrift = (object, state, prop, ops) => {
|
|
101
106
|
if (state.disconnect !== null) {
|
|
102
107
|
return;
|
|
103
108
|
}
|
|
104
|
-
const signal = `notify::${getPropertyName(object, prop) ?? unsanitizeIdentifier(kebabCase(prop))}`;
|
|
109
|
+
const signal = ops.signal ?? `notify::${getPropertyName(object, prop) ?? unsanitizeIdentifier(kebabCase(prop))}`;
|
|
105
110
|
const handler = () => {
|
|
106
|
-
scheduleSettle(object, state, prop,
|
|
111
|
+
scheduleSettle(object, state, prop, ops);
|
|
107
112
|
};
|
|
108
113
|
object.on(signal, handler);
|
|
109
114
|
state.disconnect = () => {
|
|
110
115
|
object.off(signal, handler);
|
|
111
116
|
};
|
|
112
117
|
};
|
|
113
|
-
const
|
|
118
|
+
const deferredBehavior = (prop, ops) => ({
|
|
114
119
|
deferred: [prop],
|
|
115
120
|
initialize: () => ({ desired: undefined, isPresent: false, isScheduled: false, disconnect: null }),
|
|
116
121
|
update: (_object, _prev, next, context) => {
|
|
117
122
|
const state = context;
|
|
118
|
-
state.desired = next[prop];
|
|
119
|
-
state.isPresent =
|
|
123
|
+
state.desired = ops.parse === undefined ? next[prop] : ops.parse(next[prop]);
|
|
124
|
+
state.isPresent = state.desired !== undefined;
|
|
120
125
|
return [prop];
|
|
121
126
|
},
|
|
122
127
|
flush: (object, context) => {
|
|
123
128
|
const state = context;
|
|
124
|
-
settleDeferred(object, state, prop,
|
|
125
|
-
watchDrift(object, state, prop,
|
|
129
|
+
settleDeferred(object, state, prop, ops);
|
|
130
|
+
watchDrift(object, state, prop, ops);
|
|
126
131
|
},
|
|
127
132
|
teardown: (_object, context) => {
|
|
128
133
|
const state = context;
|
|
@@ -130,6 +135,14 @@ const deferred = (prop, canApply) => ({
|
|
|
130
135
|
state.disconnect = null;
|
|
131
136
|
},
|
|
132
137
|
});
|
|
138
|
+
const deferredWith = (prop, hooks) => deferredBehavior(prop, {
|
|
139
|
+
...hooks,
|
|
140
|
+
read: hooks.read ?? ((object) => Reflect.get(object, prop)),
|
|
141
|
+
write: hooks.write ?? ((object, value) => {
|
|
142
|
+
Reflect.set(object, prop, value);
|
|
143
|
+
}),
|
|
144
|
+
});
|
|
145
|
+
const deferred = (prop, canApply) => deferredWith(prop, { canApply });
|
|
133
146
|
const controlledText = (prop) => value(prop, (object, next) => {
|
|
134
147
|
if (!hasSameText(object, prop, next)) {
|
|
135
148
|
applyWrite(prop, () => {
|
|
@@ -137,7 +150,7 @@ const controlledText = (prop) => value(prop, (object, next) => {
|
|
|
137
150
|
});
|
|
138
151
|
}
|
|
139
152
|
});
|
|
140
|
-
const childSetterSlot = () => slot("children",
|
|
153
|
+
const childSetterSlot = () => slot("children", Gtk.Widget, {
|
|
141
154
|
attach: (parent, child) => {
|
|
142
155
|
parent.setChild(child);
|
|
143
156
|
},
|
|
@@ -145,7 +158,7 @@ const childSetterSlot = () => slot("children", "GtkWidget", {
|
|
|
145
158
|
parent.setChild(null);
|
|
146
159
|
},
|
|
147
160
|
});
|
|
148
|
-
const contentSetterSlot = (
|
|
161
|
+
const contentSetterSlot = (childClass) => slot("children", childClass, {
|
|
149
162
|
attach: (parent, child) => {
|
|
150
163
|
parent.setContent(child);
|
|
151
164
|
},
|
|
@@ -153,7 +166,7 @@ const contentSetterSlot = (childType = "GtkWidget") => slot("children", childTyp
|
|
|
153
166
|
parent.setContent(null);
|
|
154
167
|
},
|
|
155
168
|
});
|
|
156
|
-
const boxSlot = () => slot("children",
|
|
169
|
+
const boxSlot = () => slot("children", Gtk.Widget, {
|
|
157
170
|
attach: (box, child, info) => box.insertChildAfter(child, info.sibling),
|
|
158
171
|
detach: (box, child) => {
|
|
159
172
|
box.remove(child);
|
|
@@ -162,8 +175,25 @@ const boxSlot = () => slot("children", "GtkWidget", {
|
|
|
162
175
|
box.reorderChildAfter(child, info.sibling);
|
|
163
176
|
},
|
|
164
177
|
});
|
|
165
|
-
const
|
|
166
|
-
const
|
|
178
|
+
const callMethod = (parent, method, argument) => parent[method](argument);
|
|
179
|
+
const methodSlot = (slotName, childClass, add, remove) => {
|
|
180
|
+
const hooks = { attach: (parent, child) => callMethod(parent, add, child) };
|
|
181
|
+
if (remove !== undefined) {
|
|
182
|
+
hooks.detach = (parent, child) => {
|
|
183
|
+
callMethod(parent, remove, child);
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
return slot(slotName, childClass, hooks);
|
|
187
|
+
};
|
|
188
|
+
const setterSlot = (slotName, childClass, setter) => slot(slotName, childClass, {
|
|
189
|
+
attach: (parent, child) => {
|
|
190
|
+
callMethod(parent, setter, child);
|
|
191
|
+
},
|
|
192
|
+
detach: (parent) => {
|
|
193
|
+
callMethod(parent, setter, null);
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
const indexedSlot = (slotName, childClass) => slot(slotName, childClass, {
|
|
167
197
|
attach: (parent, child, info) => {
|
|
168
198
|
parent.insert(child, info.index);
|
|
169
199
|
},
|
|
@@ -175,7 +205,6 @@ const indexedSlot = (slotName, childType) => slot(slotName, childType, {
|
|
|
175
205
|
parent.insert(child, info.index);
|
|
176
206
|
},
|
|
177
207
|
});
|
|
178
|
-
const adoptedChildrenSlot = (childType, add, remove) => addRemoveSlot("children", childType, add, remove);
|
|
179
208
|
const wrappedRow = (Wrapper, setChild, rows, child) => {
|
|
180
209
|
if (child instanceof Wrapper) {
|
|
181
210
|
return child;
|
|
@@ -196,7 +225,7 @@ const removeWrappedRow = (Wrapper, parent, child, rows) => {
|
|
|
196
225
|
}
|
|
197
226
|
};
|
|
198
227
|
const wrappingIndexedSlot = (Wrapper, setChild) => ({
|
|
199
|
-
...slot("children",
|
|
228
|
+
...slot("children", Gtk.Widget, {
|
|
200
229
|
attach: (parent, child, info) => parent.insert(wrappedRow(Wrapper, setChild, info.context, child), info.index),
|
|
201
230
|
detach: (parent, child, info) => {
|
|
202
231
|
removeWrappedRow(Wrapper, parent, child, info.context);
|
|
@@ -207,5 +236,5 @@ const wrappingIndexedSlot = (Wrapper, setChild) => ({
|
|
|
207
236
|
const applicationCreator = (base) => ({
|
|
208
237
|
create: (props) => createApplication(base, props),
|
|
209
238
|
});
|
|
210
|
-
export { applicationCreator, childMatcher, slot, value, list, deferred, controlledText, childSetterSlot, contentSetterSlot, boxSlot,
|
|
239
|
+
export { applicationCreator, childMatcher, slot, value, list, deferred, deferredWith, controlledText, childSetterSlot, contentSetterSlot, boxSlot, methodSlot, setterSlot, indexedSlot, wrappingIndexedSlot, };
|
|
211
240
|
//# sourceMappingURL=behaviors.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"behaviors.js","sourceRoot":"","sources":["../../src/reconciler/behaviors.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as GObject from \"@gtkx/gi/gobject\";\nimport type * as Gtk from \"@gtkx/gi/gtk\";\nimport {\n type AnyClass,\n type ApplicationClass,\n type CommandLineApplication,\n createApplication,\n getClassType,\n TYPE_INVALID,\n typeFromName,\n typeIsA,\n} from \"@gtkx/runtime\";\nimport { getOrInsert, isDeepEqual, kebabCase, structuredClone, unsanitizeIdentifier } from \"@gtkx/utils\";\nimport type { DetachInfo, ElementBehavior, PlaceInfo, Props } from \"./registry.js\";\nimport { getPropertyName } from \"./metadata.js\";\nimport { applyWrite } from \"./signals.js\";\nimport { hasSameText } from \"./text.js\";\n\ntype SlotHooks<P extends GObject.Object, C extends GObject.Object> = {\n attach: (parent: P, child: C, info: PlaceInfo) => unknown;\n detach?: (parent: P, child: C, info: DetachInfo) => void;\n reorder?: (parent: P, child: C, info: PlaceInfo) => unknown;\n resolve?: (parent: P, child: C) => GObject.Object | null;\n};\n\ntype ValueApply<P extends GObject.Object, V> = (object: P, value: V) => void;\n\ntype ListHooks<P extends GObject.Object, I, H> = {\n add?: (parent: P, item: I) => H;\n remove?: (parent: P, item: I, handle: H) => void;\n clear?: (parent: P) => void;\n};\n\ntype ListEntry = { item: unknown; handle: unknown };\ntype ListState = { snapshot: unknown[]; entries: ListEntry[] };\ntype DeferredState = { desired: unknown; isPresent: boolean; isScheduled: boolean; disconnect: (() => void) | null };\ntype CanApply<P extends GObject.Object, V> = (object: P, value: V) => boolean;\ntype ChildSetter = GObject.Object & { setChild: (child: Gtk.Widget | null) => void };\ntype ContentSetter<C extends Gtk.Widget> = GObject.Object & { setContent: (content: C | null) => void };\n\ntype BoxLike = GObject.Object & {\n remove: (child: Gtk.Widget) => void;\n insertChildAfter: (child: Gtk.Widget, sibling: Gtk.Widget | null) => unknown;\n reorderChildAfter: (child: Gtk.Widget, sibling: Gtk.Widget | null) => void;\n};\n\ntype RowCache = WeakMap<GObject.Object, Gtk.Widget>;\n\ntype IndexedChildHost<C extends GObject.Object> = GObject.Object & {\n remove: (child: C) => void;\n insert: (child: C, position: number) => unknown;\n};\n\nconst childTypeCache: Map<string, bigint> = new Map();\n\nconst childTypeFor = (name: string): bigint => getOrInsert(childTypeCache, name, typeFromName);\n\nconst childMatcher =\n (name: string): ((child: GObject.Object) => boolean) =>\n (child) => {\n const type = childTypeFor(name);\n\n return type === TYPE_INVALID || typeIsA(getClassType(child.constructor as AnyClass), type);\n };\n\nconst slotAttach =\n <P extends GObject.Object, C extends GObject.Object>(\n slotName: string,\n isMatch: (child: GObject.Object) => boolean,\n attach: SlotHooks<P, C>[\"attach\"],\n ): NonNullable<ElementBehavior[\"attach\"]> =>\n (object, child, info) => {\n if (info.slot !== slotName || !isMatch(child)) {\n return;\n }\n\n return attach(object as P, child as C, info) ?? true;\n };\n\nconst slot = <P extends GObject.Object, C extends GObject.Object>(\n slotName: string,\n childType: string,\n hooks: SlotHooks<P, C>,\n): ElementBehavior => {\n const matches = childMatcher(childType);\n const { attach, detach, reorder, resolve } = hooks;\n const behavior: ElementBehavior = { attach: slotAttach(slotName, matches, attach) };\n\n if (reorder !== undefined) {\n behavior.reorder = (object, child, info) => reorder(object as P, child as C, info) ?? true;\n }\n\n if (detach !== undefined) {\n behavior.detach = (object, child, info) => {\n detach(object as P, child as C, info);\n };\n }\n\n if (resolve !== undefined) {\n behavior.resolve = (object, child) => resolve(object as P, child as C);\n }\n\n return behavior;\n};\n\nconst value = <P extends GObject.Object, V>(\n prop: string,\n apply: ValueApply<P, V>,\n): ElementBehavior<P> => ({\n update: (object, prev, next) => {\n if (!Object.is(prev[prop], next[prop]) && next[prop] !== undefined) {\n apply(object, next[prop] as V);\n }\n\n return [prop];\n },\n});\n\nconst teardownList = <P extends GObject.Object, I, H>(\n object: P,\n entries: ListEntry[],\n hooks: ListHooks<P, I, H>,\n): void => {\n if (hooks.clear !== undefined) {\n hooks.clear(object);\n\n return;\n }\n\n for (const entry of entries) {\n hooks.remove?.(object, entry.item as I, entry.handle as H);\n }\n};\n\nconst listUpdate = <P extends GObject.Object, I, H>(\n prop: string,\n hooks: ListHooks<P, I, H>,\n): NonNullable<ElementBehavior<P>[\"update\"]> => {\n const { add } = hooks;\n\n return (object, _prev, next, context) => {\n const state = context as ListState;\n const raw = next[prop];\n const items: unknown[] = Array.isArray(raw) ? raw : [];\n\n if (isDeepEqual(state.snapshot, items)) {\n return [prop];\n }\n\n teardownList(object, state.entries, hooks);\n state.entries = items.map((item) => ({ item, handle: add?.(object, item as I) }));\n state.snapshot = structuredClone(items);\n\n return [prop];\n };\n};\n\nconst list = <P extends GObject.Object, I, H = void>(\n prop: string,\n hooks: ListHooks<P, I, H>,\n): ElementBehavior<P> => {\n const behavior: ElementBehavior<P> = {\n initialize: (): ListState => ({ snapshot: [], entries: [] }),\n update: listUpdate(prop, hooks),\n };\n\n if (hooks.remove === undefined && hooks.clear === undefined) {\n behavior.constructOnly = [prop];\n }\n\n return behavior;\n};\n\nconst settleDeferred = <P extends GObject.Object, V>(\n object: GObject.Object,\n state: DeferredState,\n prop: string,\n canApply: CanApply<P, V> | undefined,\n): void => {\n if (!state.isPresent || Object.is(Reflect.get(object, prop), state.desired)) {\n return;\n }\n\n if (canApply !== undefined && !canApply(object as P, state.desired as V)) {\n return;\n }\n\n applyWrite(prop, () => {\n Reflect.set(object, prop, state.desired);\n });\n};\n\nconst scheduleSettle = <P extends GObject.Object, V>(\n object: GObject.Object,\n state: DeferredState,\n prop: string,\n canApply: CanApply<P, V> | undefined,\n): void => {\n if (state.isScheduled) {\n return;\n }\n\n state.isScheduled = true;\n\n queueMicrotask(() => {\n state.isScheduled = false;\n\n if (state.disconnect !== null) {\n settleDeferred(object, state, prop, canApply);\n }\n });\n};\n\nconst watchDrift = <P extends GObject.Object, V>(\n object: GObject.Object,\n state: DeferredState,\n prop: string,\n canApply: CanApply<P, V> | undefined,\n): void => {\n if (state.disconnect !== null) {\n return;\n }\n\n const signal = `notify::${getPropertyName(object, prop) ?? unsanitizeIdentifier(kebabCase(prop))}`;\n\n const handler = (): undefined => {\n scheduleSettle(object, state, prop, canApply);\n };\n\n object.on(signal, handler);\n\n state.disconnect = (): void => {\n object.off(signal, handler);\n };\n};\n\nconst deferred = <P extends GObject.Object, V>(\n prop: string,\n canApply?: CanApply<P, V>,\n): ElementBehavior<P> => ({\n deferred: [prop],\n initialize: (): DeferredState => ({ desired: undefined, isPresent: false, isScheduled: false, disconnect: null }),\n update: (_object, _prev, next, context) => {\n const state = context as DeferredState;\n state.desired = next[prop];\n state.isPresent = next[prop] !== undefined;\n\n return [prop];\n },\n flush: (object, context) => {\n const state = context as DeferredState;\n settleDeferred(object, state, prop, canApply);\n watchDrift(object, state, prop, canApply);\n },\n teardown: (_object, context) => {\n const state = context as DeferredState;\n state.disconnect?.();\n state.disconnect = null;\n },\n});\n\nconst controlledText = (prop: string): ElementBehavior =>\n value(prop, (object, next) => {\n if (!hasSameText(object, prop, next)) {\n applyWrite(prop, () => {\n Reflect.set(object, prop, next);\n });\n }\n });\n\nconst childSetterSlot = <P extends ChildSetter>(): ElementBehavior<P> =>\n slot<P, Gtk.Widget>(\"children\", \"GtkWidget\", {\n attach: (parent, child) => {\n parent.setChild(child);\n },\n detach: (parent) => {\n parent.setChild(null);\n },\n });\n\nconst contentSetterSlot = <P extends ContentSetter<C>, C extends Gtk.Widget = Gtk.Widget>(\n childType = \"GtkWidget\",\n): ElementBehavior<P> =>\n slot<P, C>(\"children\", childType, {\n attach: (parent, child) => {\n parent.setContent(child);\n },\n detach: (parent) => {\n parent.setContent(null);\n },\n });\n\nconst boxSlot = <P extends BoxLike>(): ElementBehavior<P> =>\n slot<P, Gtk.Widget>(\"children\", \"GtkWidget\", {\n attach: (box, child, info) => box.insertChildAfter(child, info.sibling as Gtk.Widget | null),\n detach: (box, child) => {\n box.remove(child);\n },\n reorder: (box, child, info) => {\n box.reorderChildAfter(child, info.sibling as Gtk.Widget | null);\n },\n });\n\nconst addRemoveSlot = <C extends GObject.Object, P extends GObject.Object>(\n slotName: string,\n childType: string,\n add: (parent: P, child: C) => unknown,\n remove: (parent: P, child: C) => void,\n): ElementBehavior => slot<P, C>(slotName, childType, { attach: add, detach: remove });\n\nconst indexedSlot = <P extends IndexedChildHost<C>, C extends GObject.Object>(\n slotName: string,\n childType: string,\n): ElementBehavior<P> =>\n slot<P, C>(slotName, childType, {\n attach: (parent, child, info) => {\n parent.insert(child, info.index);\n },\n detach: (parent, child) => {\n parent.remove(child);\n },\n reorder: (parent, child, info) => {\n parent.remove(child);\n parent.insert(child, info.index);\n },\n });\n\nconst adoptedChildrenSlot = <P extends GObject.Object, C extends GObject.Object>(\n childType: string,\n add: (parent: P, item: C) => unknown,\n remove: (parent: P, item: C) => void,\n): ElementBehavior => addRemoveSlot<C, P>(\"children\", childType, add, remove);\n\nconst wrappedRow = <W extends Gtk.Widget>(\n Wrapper: new (props: Props) => W,\n setChild: (wrapper: W, inner: Gtk.Widget) => void,\n rows: RowCache,\n child: Gtk.Widget,\n): Gtk.Widget => {\n if (child instanceof Wrapper) {\n return child;\n }\n\n const existing = rows.get(child);\n\n if (existing !== undefined) {\n return existing;\n }\n\n const wrapper = new Wrapper({});\n setChild(wrapper, child);\n rows.set(child, wrapper);\n\n return wrapper;\n};\n\nconst removeWrappedRow = (\n Wrapper: new (props: Props) => Gtk.Widget,\n parent: IndexedChildHost<Gtk.Widget>,\n child: Gtk.Widget,\n rows: RowCache,\n): void => {\n const row = child instanceof Wrapper ? child : rows.get(child);\n\n if (row !== undefined) {\n parent.remove(row);\n }\n};\n\nconst wrappingIndexedSlot = <W extends Gtk.Widget, P extends IndexedChildHost<Gtk.Widget>>(\n Wrapper: new (props: Props) => W,\n setChild: (wrapper: W, inner: Gtk.Widget) => void,\n): ElementBehavior<P> => ({\n ...slot<P, Gtk.Widget>(\"children\", \"GtkWidget\", {\n attach: (parent, child, info) =>\n parent.insert(wrappedRow(Wrapper, setChild, info.context as RowCache, child), info.index),\n detach: (parent, child, info) => {\n removeWrappedRow(Wrapper, parent, child, info.context as RowCache);\n },\n }),\n initialize: (): RowCache => new WeakMap(),\n});\n\nconst applicationCreator = <P extends GObject.Object & CommandLineApplication, C extends Props>(\n base: ApplicationClass<P, C>,\n): ElementBehavior<P> => ({\n create: (props) => createApplication(base, props as C),\n});\n\nexport {\n applicationCreator,\n childMatcher,\n slot,\n value,\n list,\n deferred,\n controlledText,\n childSetterSlot,\n contentSetterSlot,\n boxSlot,\n addRemoveSlot,\n adoptedChildrenSlot,\n indexedSlot,\n wrappingIndexedSlot,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"behaviors.js","sourceRoot":"","sources":["../../src/reconciler/behaviors.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as GObject from \"@gtkx/gi/gobject\";\nimport * as Gtk from \"@gtkx/gi/gtk\";\nimport {\n type ApplicationClass,\n type CommandLineApplication,\n createApplication,\n getClassType,\n getInstanceType,\n TYPE_INVALID,\n typeIsA,\n} from \"@gtkx/runtime\";\nimport { isDeepEqual, kebabCase, structuredClone, unsanitizeIdentifier } from \"@gtkx/utils\";\nimport type { DetachInfo, ElementBehavior, PlaceInfo, Props } from \"./registry.js\";\nimport { getPropertyName } from \"./metadata.js\";\nimport { applyWrite } from \"./signals.js\";\nimport { hasSameText } from \"./text.js\";\n\ntype SlotHooks<P extends GObject.Object, C extends GObject.Object> = {\n attach: (parent: P, child: C, info: PlaceInfo) => unknown;\n detach?: (parent: P, child: C, info: DetachInfo) => void;\n reorder?: (parent: P, child: C, info: PlaceInfo) => unknown;\n resolve?: (parent: P, child: C) => GObject.Object | null;\n};\n\ntype ValueApply<P extends GObject.Object, V> = (object: P, value: V) => void;\n\ntype ListHooks<P extends GObject.Object, I, H> = {\n add?: (parent: P, item: I) => H;\n remove?: (parent: P, item: I, handle: H) => void;\n clear?: (parent: P) => void;\n};\n\ntype ListEntry = { item: unknown; handle: unknown };\ntype ListState = { snapshot: unknown[]; entries: ListEntry[] };\ntype DeferredState = { desired: unknown; isPresent: boolean; isScheduled: boolean; disconnect: (() => void) | null };\ntype CanApply<P extends GObject.Object, V> = (object: P, value: V) => boolean;\n\ntype DeferredOps<P extends GObject.Object, V> = {\n canApply?: CanApply<P, V> | undefined;\n parse?: ((value: unknown) => V | undefined) | undefined;\n read: (object: P) => unknown;\n write: (object: P, value: V) => void;\n signal?: string | undefined;\n};\n\ntype DeferredHooks<P extends GObject.Object, V> = Omit<DeferredOps<P, V>, \"read\" | \"write\"> & {\n read?: ((object: P) => unknown) | undefined;\n write?: ((object: P, value: V) => void) | undefined;\n};\n\ntype ChildSetter = GObject.Object & { setChild: (child: Gtk.Widget | null) => void };\ntype ContentSetter<C extends Gtk.Widget> = GObject.Object & { setContent: (content: C | null) => void };\ntype MatchingKey<P, F> = keyof P & string & { [K in keyof P]: P[K] extends F ? K : never }[keyof P];\ntype MethodKey<P, A> = MatchingKey<P, (argument: A) => unknown>;\n\ntype BoxLike = GObject.Object & {\n remove: (child: Gtk.Widget) => void;\n insertChildAfter: (child: Gtk.Widget, sibling: Gtk.Widget | null) => unknown;\n reorderChildAfter: (child: Gtk.Widget, sibling: Gtk.Widget | null) => void;\n};\n\ntype RowCache = WeakMap<GObject.Object, Gtk.Widget>;\n\ntype IndexedChildHost<C extends GObject.Object> = GObject.Object & {\n remove: (child: C) => void;\n insert: (child: C, position: number) => unknown;\n};\n\ntype ChildClass<C extends GObject.Object> =\n (abstract new (...args: never[]) => C) |\n { [Symbol.hasInstance]: (value: unknown) => value is C };\n\nconst childClassType = (cls: ChildClass<GObject.Object>): bigint =>\n typeof cls === \"function\" ? getClassType(cls) : TYPE_INVALID;\n\nconst isChildInstance = <C extends GObject.Object>(child: GObject.Object, cls: ChildClass<C>): child is C => {\n if (child instanceof cls) {\n return true;\n }\n\n const type = childClassType(cls);\n\n return type !== TYPE_INVALID && typeIsA(getInstanceType(child), type);\n};\n\nconst childMatcher =\n <C extends GObject.Object>(cls: ChildClass<C> | undefined): ((child: GObject.Object) => child is C) =>\n (child): child is C =>\n cls !== undefined && isChildInstance(child, cls);\n\nconst slotAttach =\n <P extends GObject.Object, C extends GObject.Object>(\n slotName: string,\n isMatch: (child: GObject.Object) => child is C,\n attach: SlotHooks<P, C>[\"attach\"],\n ): NonNullable<ElementBehavior[\"attach\"]> =>\n (object, child, info) => {\n if (info.slot !== slotName || !isMatch(child)) {\n return;\n }\n\n return attach(object as P, child, info) ?? true;\n };\n\nconst slot = <P extends GObject.Object, C extends GObject.Object>(\n slotName: string,\n childClass: ChildClass<C> | undefined,\n hooks: SlotHooks<P, C>,\n): ElementBehavior => {\n const matches = childMatcher(childClass);\n const { attach, detach, reorder, resolve } = hooks;\n const behavior: ElementBehavior = { attach: slotAttach(slotName, matches, attach) };\n\n if (reorder !== undefined) {\n behavior.reorder = (object, child, info) => reorder(object as P, child as C, info) ?? true;\n }\n\n if (detach !== undefined) {\n behavior.detach = (object, child, info) => {\n detach(object as P, child as C, info);\n };\n }\n\n if (resolve !== undefined) {\n behavior.resolve = (object, child) => resolve(object as P, child as C);\n }\n\n return behavior;\n};\n\nconst value = <P extends GObject.Object, V>(\n prop: string,\n apply: ValueApply<P, V>,\n): ElementBehavior<P> => ({\n update: (object, prev, next) => {\n if (!Object.is(prev[prop], next[prop]) && next[prop] !== undefined) {\n apply(object, next[prop] as V);\n }\n\n return [prop];\n },\n});\n\nconst teardownList = <P extends GObject.Object, I, H>(\n object: P,\n entries: ListEntry[],\n hooks: ListHooks<P, I, H>,\n): void => {\n if (hooks.clear !== undefined) {\n hooks.clear(object);\n\n return;\n }\n\n for (const entry of entries) {\n hooks.remove?.(object, entry.item as I, entry.handle as H);\n }\n};\n\nconst listUpdate = <P extends GObject.Object, I, H>(\n prop: string,\n hooks: ListHooks<P, I, H>,\n): NonNullable<ElementBehavior<P>[\"update\"]> => {\n const { add } = hooks;\n\n return (object, _prev, next, context) => {\n const state = context as ListState;\n const raw = next[prop];\n const items: unknown[] = Array.isArray(raw) ? raw : [];\n\n if (isDeepEqual(state.snapshot, items)) {\n return [prop];\n }\n\n teardownList(object, state.entries, hooks);\n state.entries = items.map((item) => ({ item, handle: add?.(object, item as I) }));\n state.snapshot = structuredClone(items);\n\n return [prop];\n };\n};\n\nconst list = <P extends GObject.Object, I, H = void>(\n prop: string,\n hooks: ListHooks<P, I, H>,\n): ElementBehavior<P> => {\n const behavior: ElementBehavior<P> = {\n initialize: (): ListState => ({ snapshot: [], entries: [] }),\n update: listUpdate(prop, hooks),\n };\n\n if (hooks.remove === undefined && hooks.clear === undefined) {\n behavior.constructOnly = [prop];\n }\n\n return behavior;\n};\n\nconst settleDeferred = <P extends GObject.Object, V>(\n object: P,\n state: DeferredState,\n prop: string,\n ops: DeferredOps<P, V>,\n): void => {\n if (!state.isPresent || Object.is(ops.read(object), state.desired)) {\n return;\n }\n\n const desired = state.desired as V;\n\n if (ops.canApply !== undefined && !ops.canApply(object, desired)) {\n return;\n }\n\n applyWrite(prop, () => {\n ops.write(object, desired);\n });\n};\n\nconst scheduleSettle = <P extends GObject.Object, V>(\n object: P,\n state: DeferredState,\n prop: string,\n ops: DeferredOps<P, V>,\n): void => {\n if (state.isScheduled) {\n return;\n }\n\n state.isScheduled = true;\n\n queueMicrotask(() => {\n state.isScheduled = false;\n\n if (state.disconnect !== null) {\n settleDeferred(object, state, prop, ops);\n }\n });\n};\n\nconst watchDrift = <P extends GObject.Object, V>(\n object: P,\n state: DeferredState,\n prop: string,\n ops: DeferredOps<P, V>,\n): void => {\n if (state.disconnect !== null) {\n return;\n }\n\n const signal = ops.signal ?? `notify::${getPropertyName(object, prop) ?? unsanitizeIdentifier(kebabCase(prop))}`;\n\n const handler = (): undefined => {\n scheduleSettle(object, state, prop, ops);\n };\n\n object.on(signal, handler);\n\n state.disconnect = (): void => {\n object.off(signal, handler);\n };\n};\n\nconst deferredBehavior = <P extends GObject.Object, V>(prop: string, ops: DeferredOps<P, V>): ElementBehavior<P> => ({\n deferred: [prop],\n initialize: (): DeferredState => ({ desired: undefined, isPresent: false, isScheduled: false, disconnect: null }),\n update: (_object, _prev, next, context) => {\n const state = context as DeferredState;\n state.desired = ops.parse === undefined ? next[prop] : ops.parse(next[prop]);\n state.isPresent = state.desired !== undefined;\n\n return [prop];\n },\n flush: (object, context) => {\n const state = context as DeferredState;\n settleDeferred(object, state, prop, ops);\n watchDrift(object, state, prop, ops);\n },\n teardown: (_object, context) => {\n const state = context as DeferredState;\n state.disconnect?.();\n state.disconnect = null;\n },\n});\n\nconst deferredWith = <P extends GObject.Object, V>(prop: string, hooks: DeferredHooks<P, V>): ElementBehavior<P> =>\n deferredBehavior<P, V>(prop, {\n ...hooks,\n read: hooks.read ?? ((object) => Reflect.get(object, prop)),\n write: hooks.write ?? ((object, value) => {\n Reflect.set(object, prop, value);\n }),\n });\n\nconst deferred = <P extends GObject.Object, V>(prop: string, canApply?: CanApply<P, V>): ElementBehavior<P> =>\n deferredWith<P, V>(prop, { canApply });\n\nconst controlledText = (prop: string): ElementBehavior =>\n value(prop, (object, next) => {\n if (!hasSameText(object, prop, next)) {\n applyWrite(prop, () => {\n Reflect.set(object, prop, next);\n });\n }\n });\n\nconst childSetterSlot = <P extends ChildSetter>(): ElementBehavior<P> =>\n slot<P, Gtk.Widget>(\"children\", Gtk.Widget, {\n attach: (parent, child) => {\n parent.setChild(child);\n },\n detach: (parent) => {\n parent.setChild(null);\n },\n });\n\nconst contentSetterSlot = <P extends ContentSetter<C>, C extends Gtk.Widget = Gtk.Widget>(\n childClass: ChildClass<C>,\n): ElementBehavior<P> =>\n slot<P, C>(\"children\", childClass, {\n attach: (parent, child) => {\n parent.setContent(child);\n },\n detach: (parent) => {\n parent.setContent(null);\n },\n });\n\nconst boxSlot = <P extends BoxLike>(): ElementBehavior<P> =>\n slot<P, Gtk.Widget>(\"children\", Gtk.Widget, {\n attach: (box, child, info) => box.insertChildAfter(child, info.sibling as Gtk.Widget | null),\n detach: (box, child) => {\n box.remove(child);\n },\n reorder: (box, child, info) => {\n box.reorderChildAfter(child, info.sibling as Gtk.Widget | null);\n },\n });\n\nconst callMethod = <P extends GObject.Object, A>(parent: P, method: MethodKey<P, A>, argument: A): unknown =>\n (parent[method] as (argument: A) => unknown)(argument);\n\nconst methodSlot = <P extends GObject.Object, C extends GObject.Object>(\n slotName: string,\n childClass: ChildClass<C> | undefined,\n add: MethodKey<P, C>,\n remove?: MethodKey<P, C>,\n): ElementBehavior => {\n const hooks: SlotHooks<P, C> = { attach: (parent, child) => callMethod(parent, add, child) };\n\n if (remove !== undefined) {\n hooks.detach = (parent, child) => {\n callMethod(parent, remove, child);\n };\n }\n\n return slot<P, C>(slotName, childClass, hooks);\n};\n\nconst setterSlot = <P extends GObject.Object, C extends GObject.Object>(\n slotName: string,\n childClass: ChildClass<C> | undefined,\n setter: MethodKey<P, C | null>,\n): ElementBehavior =>\n slot<P, C>(slotName, childClass, {\n attach: (parent, child) => {\n callMethod<P, C | null>(parent, setter, child);\n },\n detach: (parent) => {\n callMethod<P, C | null>(parent, setter, null);\n },\n });\n\nconst indexedSlot = <P extends IndexedChildHost<C>, C extends GObject.Object>(\n slotName: string,\n childClass: ChildClass<C> | undefined,\n): ElementBehavior<P> =>\n slot<P, C>(slotName, childClass, {\n attach: (parent, child, info) => {\n parent.insert(child, info.index);\n },\n detach: (parent, child) => {\n parent.remove(child);\n },\n reorder: (parent, child, info) => {\n parent.remove(child);\n parent.insert(child, info.index);\n },\n });\n\nconst wrappedRow = <W extends Gtk.Widget>(\n Wrapper: new (props: Props) => W,\n setChild: (wrapper: W, inner: Gtk.Widget) => void,\n rows: RowCache,\n child: Gtk.Widget,\n): Gtk.Widget => {\n if (child instanceof Wrapper) {\n return child;\n }\n\n const existing = rows.get(child);\n\n if (existing !== undefined) {\n return existing;\n }\n\n const wrapper = new Wrapper({});\n setChild(wrapper, child);\n rows.set(child, wrapper);\n\n return wrapper;\n};\n\nconst removeWrappedRow = (\n Wrapper: new (props: Props) => Gtk.Widget,\n parent: IndexedChildHost<Gtk.Widget>,\n child: Gtk.Widget,\n rows: RowCache,\n): void => {\n const row = child instanceof Wrapper ? child : rows.get(child);\n\n if (row !== undefined) {\n parent.remove(row);\n }\n};\n\nconst wrappingIndexedSlot = <W extends Gtk.Widget, P extends IndexedChildHost<Gtk.Widget>>(\n Wrapper: new (props: Props) => W,\n setChild: (wrapper: W, inner: Gtk.Widget) => void,\n): ElementBehavior<P> => ({\n ...slot<P, Gtk.Widget>(\"children\", Gtk.Widget, {\n attach: (parent, child, info) =>\n parent.insert(wrappedRow(Wrapper, setChild, info.context as RowCache, child), info.index),\n detach: (parent, child, info) => {\n removeWrappedRow(Wrapper, parent, child, info.context as RowCache);\n },\n }),\n initialize: (): RowCache => new WeakMap(),\n});\n\nconst applicationCreator = <P extends GObject.Object & CommandLineApplication, C extends Props>(\n base: ApplicationClass<P, C>,\n): ElementBehavior<P> => ({\n create: (props) => createApplication(base, props as C),\n});\n\nexport {\n applicationCreator,\n childMatcher,\n slot,\n value,\n list,\n deferred,\n deferredWith,\n controlledText,\n childSetterSlot,\n contentSetterSlot,\n boxSlot,\n methodSlot,\n setterSlot,\n indexedSlot,\n wrappingIndexedSlot,\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../../src/reconciler/instance.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../../src/reconciler/instance.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAIH,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,QAAQ,EAChB,MAAM,WAAW,CAAC;AA2DnB,QAAA,MAAM,kBAAkB,GAAI,UAAU,MAAM,EAAE,OAAO,KAAK,EAAE,UAAU,QAAQ,KAAG,WAAW,GAAG,QAW9F,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { TYPE_INVALID, typeFromName, typeIsA } from "@gtkx/runtime";
|
|
2
|
+
import { getExactWrapperClass } from "@gtkx/runtime/internal";
|
|
2
3
|
import { getOrInsert, pickBy } from "@gtkx/utils";
|
|
3
4
|
import { typeInfoFor } from "./metadata.js";
|
|
4
5
|
import { createElementNode, createLazyNode, } from "./node.js";
|
|
@@ -30,13 +31,13 @@ const contentKindFor = (type) => getOrInsert(contentKinds, type, findContentKind
|
|
|
30
31
|
const constructInput = (info, props) => pickBy(props, (value, name) => value !== undefined &&
|
|
31
32
|
!info.deferred.has(name) &&
|
|
32
33
|
(info.constructOnly.has(name) || info.construct.has(name)));
|
|
33
|
-
const instantiate = (type, input) => {
|
|
34
|
-
const cls =
|
|
34
|
+
const instantiate = (typeName, type, input) => {
|
|
35
|
+
const cls = getExactWrapperClass(type, typeName);
|
|
35
36
|
return new cls(input);
|
|
36
37
|
};
|
|
37
38
|
const createObject = (typeName, type, input) => {
|
|
38
39
|
const create = ELEMENTS[typeName]?.behaviors?.find((behavior) => behavior.create !== undefined)?.create;
|
|
39
|
-
return create === undefined ? instantiate(type, input) : create(input);
|
|
40
|
+
return create === undefined ? instantiate(typeName, type, input) : create(input);
|
|
40
41
|
};
|
|
41
42
|
const resolveElementNode = (typeName, props, dispatch) => {
|
|
42
43
|
const info = typeInfoFor(typeName);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instance.js","sourceRoot":"","sources":["../../src/reconciler/instance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"instance.js","sourceRoot":"","sources":["../../src/reconciler/instance.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as GObject from \"@gtkx/gi/gobject\";\nimport { TYPE_INVALID, typeFromName, typeIsA } from \"@gtkx/runtime\";\nimport { getExactWrapperClass } from \"@gtkx/runtime/internal\";\nimport { getOrInsert, pickBy } from \"@gtkx/utils\";\nimport type { Props } from \"./registry.js\";\nimport { type TypeInfo, typeInfoFor } from \"./metadata.js\";\nimport {\n type ContentKind,\n createElementNode,\n createLazyNode,\n type Dispatch,\n type ElementNode,\n type LazyNode,\n} from \"./node.js\";\nimport { ELEMENTS } from \"./registry.js\";\n\ntype WidgetConstructor = new (props: Props) => GObject.Object;\ntype ContentType = { kind: ContentKind; type: bigint };\n\nconst CONTENT_TYPE_NAMES: { kind: ContentKind; name: string }[] = [\n { kind: \"label\", name: \"GtkLabel\" },\n { kind: \"buffer\", name: \"GtkTextBuffer\" },\n { kind: \"tag\", name: \"GtkTextTag\" },\n { kind: \"anchor\", name: \"GtkTextChildAnchor\" },\n];\n\nconst getContentTypes = createContentTypeCache();\nconst contentKinds: Map<bigint, ContentKind | null> = new Map();\n\nfunction createContentTypeCache(): () => ContentType[] {\n let cached: ContentType[] | null = null;\n\n return () => {\n cached ??= CONTENT_TYPE_NAMES.map((entry) => ({ kind: entry.kind, type: typeFromName(entry.name) }));\n\n return cached;\n };\n}\n\nconst findContentKind = (type: bigint): ContentKind | null => {\n for (const entry of getContentTypes()) {\n if (entry.type !== TYPE_INVALID && typeIsA(type, entry.type)) {\n return entry.kind;\n }\n }\n\n return null;\n};\n\nconst contentKindFor = (type: bigint): ContentKind | null => getOrInsert(contentKinds, type, findContentKind);\n\nconst constructInput = (info: TypeInfo, props: Props): Props =>\n pickBy(\n props,\n (value, name) =>\n value !== undefined &&\n !info.deferred.has(name) &&\n (info.constructOnly.has(name) || info.construct.has(name)),\n );\n\nconst instantiate = (typeName: string, type: bigint, input: Props): GObject.Object => {\n const cls = getExactWrapperClass(type, typeName) as WidgetConstructor;\n\n return new cls(input);\n};\n\nconst createObject = (typeName: string, type: bigint, input: Props): GObject.Object => {\n const create = ELEMENTS[typeName]?.behaviors?.find((behavior) => behavior.create !== undefined)?.create;\n\n return create === undefined ? instantiate(typeName, type, input) : create(input);\n};\n\nconst resolveElementNode = (typeName: string, props: Props, dispatch: Dispatch): ElementNode | LazyNode => {\n const info = typeInfoFor(typeName);\n\n if (info.isLazy) {\n return createLazyNode(typeName, props, dispatch);\n }\n\n const type = typeFromName(typeName);\n const object = createObject(typeName, type, constructInput(info, props));\n\n return createElementNode(typeName, object, dispatch, contentKindFor(type));\n};\n\nexport { resolveElementNode };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/reconciler/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,OAAO,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/reconciler/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAiBjD,OAAO,EAAc,KAAK,aAAa,EAA6B,MAAM,qBAAqB,CAAC;AAChG,OAAO,EAAiB,KAAK,eAAe,EAAY,MAAM,eAAe,CAAC;AAE9E,KAAK,QAAQ,GAAG;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC1C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,qBAAqB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC,CAAC;AAwIF,QAAA,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG,QAInC,CAAC;AAQF,QAAA,MAAM,WAAW,GAAI,MAAM,QAAQ,EAAE,UAAU,MAAM,KAAG,OAAmD,CAAC;AAK5G,QAAA,MAAM,eAAe,GAAI,QAAQ,OAAO,CAAC,MAAM,EAAE,UAAU,MAAM,KAAG,MAAM,GAAG,SAK5E,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,QAAQ,EAAE,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { getClassType, getDeclaredPropertyName, TYPE_INVALID, typeFromName, typeInterfaces, typeName, typeParent, } from "@gtkx/runtime";
|
|
2
|
+
import { elementMetadataVersion, registeredElementProperties, registeredElementSignals, } from "@gtkx/runtime/internal";
|
|
2
3
|
import { getOrInsert } from "@gtkx/utils";
|
|
3
4
|
import { properties, signals, userEventSignals } from "virtual:gtkx-config";
|
|
4
5
|
import { deferredProps, ELEMENTS } from "./registry.js";
|
|
@@ -10,6 +11,16 @@ const FLAGS = 1;
|
|
|
10
11
|
const DEFAULT_VALUE = 2;
|
|
11
12
|
const ancestryCache = new Map();
|
|
12
13
|
const typeInfoCache = new Map();
|
|
14
|
+
const metadataCacheState = { seenVersion: elementMetadataVersion() };
|
|
15
|
+
const dropStaleCaches = () => {
|
|
16
|
+
const current = elementMetadataVersion();
|
|
17
|
+
if (metadataCacheState.seenVersion === current) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
metadataCacheState.seenVersion = current;
|
|
21
|
+
ancestryCache.clear();
|
|
22
|
+
typeInfoCache.clear();
|
|
23
|
+
};
|
|
13
24
|
const addAncestor = (names, seen, name) => {
|
|
14
25
|
if (name === null || seen.has(name)) {
|
|
15
26
|
return;
|
|
@@ -38,7 +49,7 @@ const addAll = (target, source) => {
|
|
|
38
49
|
}
|
|
39
50
|
};
|
|
40
51
|
const accumulateAncestor = (info, ancestor) => {
|
|
41
|
-
Object.assign(info.signals, signals[ancestor] ?? {});
|
|
52
|
+
Object.assign(info.signals, registeredElementSignals[ancestor] ?? signals[ancestor] ?? {});
|
|
42
53
|
addAll(info.userEventSignals, userEventSignals[ancestor]);
|
|
43
54
|
info.behaviors.push(...(ELEMENTS[ancestor]?.behaviors ?? []));
|
|
44
55
|
};
|
|
@@ -92,12 +103,15 @@ const buildTypeInfo = (name) => {
|
|
|
92
103
|
resolveBehaviorFlags(info);
|
|
93
104
|
info.isLazy = chain.some((ancestor) => ELEMENTS[ancestor]?.isLazy === true);
|
|
94
105
|
for (const ancestor of chain.toReversed()) {
|
|
95
|
-
Object.assign(info.properties, properties[ancestor] ?? {});
|
|
106
|
+
Object.assign(info.properties, registeredElementProperties[ancestor] ?? properties[ancestor] ?? {});
|
|
96
107
|
}
|
|
97
108
|
resolveProperties(info);
|
|
98
109
|
return info;
|
|
99
110
|
};
|
|
100
|
-
const typeInfoFor = (name) =>
|
|
111
|
+
const typeInfoFor = (name) => {
|
|
112
|
+
dropStaleCaches();
|
|
113
|
+
return getOrInsert(typeInfoCache, name, buildTypeInfo);
|
|
114
|
+
};
|
|
101
115
|
const getTypeInfo = (object) => {
|
|
102
116
|
const name = typeName(getClassType(object.constructor));
|
|
103
117
|
return name === null ? undefined : typeInfoFor(name);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/reconciler/metadata.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as GObject from \"@gtkx/gi/gobject\";\nimport {\n type AnyClass,\n getClassType,\n getDeclaredPropertyName,\n TYPE_INVALID,\n typeFromName,\n typeInterfaces,\n typeName,\n typeParent,\n} from \"@gtkx/runtime\";\nimport { getOrInsert } from \"@gtkx/utils\";\nimport { properties, type PropertyEntry, signals, userEventSignals } from \"virtual:gtkx-config\";\nimport { deferredProps, type ElementBehavior, ELEMENTS } from \"./registry.js\";\n\ntype TypeInfo = {\n typeName: string;\n properties: Record<string, PropertyEntry>;\n signals: Record<string, string>;\n userEventSignals: Set<string>;\n behaviors: ElementBehavior[];\n deferred: Set<string>;\n declaredConstructOnly: Set<string>;\n isLazy: boolean;\n hasFlush: boolean;\n constructOnly: Set<string>;\n construct: Set<string>;\n defaults: Record<string, unknown>;\n};\n\nconst WRITABLE = 2;\nconst CONSTRUCT = 4;\nconst CONSTRUCT_ONLY = 8;\nconst NAME = 0;\nconst FLAGS = 1;\nconst DEFAULT_VALUE = 2;\nconst ancestryCache: Map<string, string[]> = new Map();\nconst typeInfoCache: Map<string, TypeInfo> = new Map();\n\nconst addAncestor = (names: string[], seen: Set<string>, name: string | null): void => {\n if (name === null || seen.has(name)) {\n return;\n }\n\n seen.add(name);\n names.push(name);\n};\n\nconst buildAncestry = (name: string): string[] => {\n const names: string[] = [];\n const seen: Set<string> = new Set();\n let type = typeFromName(name);\n\n while (type !== TYPE_INVALID) {\n addAncestor(names, seen, typeName(type));\n\n for (const iface of typeInterfaces(type)) {\n addAncestor(names, seen, typeName(iface));\n }\n\n type = typeParent(type);\n }\n\n return names;\n};\n\nconst ancestryFor = (name: string): string[] => getOrInsert(ancestryCache, name, buildAncestry);\n\nconst addAll = <T>(target: Set<T>, source: Iterable<T> | undefined): void => {\n const items = source ?? [];\n\n for (const item of items) {\n target.add(item);\n }\n};\n\nconst accumulateAncestor = (info: TypeInfo, ancestor: string): void => {\n Object.assign(info.signals, signals[ancestor] ?? {});\n addAll(info.userEventSignals, userEventSignals[ancestor]);\n info.behaviors.push(...(ELEMENTS[ancestor]?.behaviors ?? []));\n};\n\nconst resolveProperty = (info: TypeInfo, name: string, entry: PropertyEntry): void => {\n if ((entry[FLAGS] & CONSTRUCT_ONLY) !== 0) {\n info.constructOnly.add(name);\n }\n\n if ((entry[FLAGS] & (WRITABLE | CONSTRUCT | CONSTRUCT_ONLY)) !== 0) {\n info.construct.add(name);\n }\n\n if (entry.length > DEFAULT_VALUE) {\n info.defaults[name] = entry[DEFAULT_VALUE];\n }\n};\n\nconst resolveProperties = (info: TypeInfo): void => {\n for (const [name, entry] of Object.entries(info.properties)) {\n resolveProperty(info, name, entry);\n }\n};\n\nconst applyBehaviorFlags = (info: TypeInfo, behavior: ElementBehavior): void => {\n if (behavior.flush !== undefined) {\n info.hasFlush = true;\n }\n\n addAll(info.deferred, deferredProps(behavior));\n addAll(info.declaredConstructOnly, behavior.constructOnly);\n};\n\nconst resolveBehaviorFlags = (info: TypeInfo): void => {\n for (const behavior of info.behaviors) {\n applyBehaviorFlags(info, behavior);\n }\n};\n\nconst buildTypeInfo = (name: string): TypeInfo => {\n const chain = ancestryFor(name);\n\n const info: TypeInfo = {\n typeName: name,\n properties: {},\n signals: {},\n userEventSignals: new Set(),\n behaviors: [],\n deferred: new Set(),\n declaredConstructOnly: new Set(),\n isLazy: false,\n hasFlush: false,\n constructOnly: new Set(),\n construct: new Set(),\n defaults: {},\n };\n\n for (const ancestor of chain) {\n accumulateAncestor(info, ancestor);\n }\n\n resolveBehaviorFlags(info);\n info.isLazy = chain.some((ancestor) => ELEMENTS[ancestor]?.isLazy === true);\n\n for (const ancestor of chain.toReversed()) {\n Object.assign(info.properties, properties[ancestor] ?? {});\n }\n\n resolveProperties(info);\n\n return info;\n};\n\nconst typeInfoFor = (name: string): TypeInfo => getOrInsert(typeInfoCache, name, buildTypeInfo);\n\nconst getTypeInfo = (object: GObject.Object): TypeInfo | undefined => {\n const name = typeName(getClassType(object.constructor as AnyClass));\n\n return name === null ? undefined : typeInfoFor(name);\n};\n\nconst hasProperty = (info: TypeInfo, accessor: string): boolean => Object.hasOwn(info.properties, accessor);\n\nconst propertyNameFor = (info: TypeInfo, accessor: string): string | undefined =>\n info.properties[accessor]?.[NAME];\n\nconst getPropertyName = (object: GObject.Object, accessor: string): string | undefined => {\n const info = getTypeInfo(object);\n\n return (info === undefined ? undefined : propertyNameFor(info, accessor)) ??\n getDeclaredPropertyName(object, accessor);\n};\n\nexport { getPropertyName, hasProperty, typeInfoFor, type TypeInfo };\n"]}
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/reconciler/metadata.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as GObject from \"@gtkx/gi/gobject\";\nimport {\n type AnyClass,\n getClassType,\n getDeclaredPropertyName,\n TYPE_INVALID,\n typeFromName,\n typeInterfaces,\n typeName,\n typeParent,\n} from \"@gtkx/runtime\";\nimport {\n elementMetadataVersion,\n registeredElementProperties,\n registeredElementSignals,\n} from \"@gtkx/runtime/internal\";\nimport { getOrInsert } from \"@gtkx/utils\";\nimport { properties, type PropertyEntry, signals, userEventSignals } from \"virtual:gtkx-config\";\nimport { deferredProps, type ElementBehavior, ELEMENTS } from \"./registry.js\";\n\ntype TypeInfo = {\n typeName: string;\n properties: Record<string, PropertyEntry>;\n signals: Record<string, string>;\n userEventSignals: Set<string>;\n behaviors: ElementBehavior[];\n deferred: Set<string>;\n declaredConstructOnly: Set<string>;\n isLazy: boolean;\n hasFlush: boolean;\n constructOnly: Set<string>;\n construct: Set<string>;\n defaults: Record<string, unknown>;\n};\n\nconst WRITABLE = 2;\nconst CONSTRUCT = 4;\nconst CONSTRUCT_ONLY = 8;\nconst NAME = 0;\nconst FLAGS = 1;\nconst DEFAULT_VALUE = 2;\nconst ancestryCache: Map<string, string[]> = new Map();\nconst typeInfoCache: Map<string, TypeInfo> = new Map();\nconst metadataCacheState = { seenVersion: elementMetadataVersion() };\n\nconst dropStaleCaches = (): void => {\n const current = elementMetadataVersion();\n\n if (metadataCacheState.seenVersion === current) {\n return;\n }\n\n metadataCacheState.seenVersion = current;\n ancestryCache.clear();\n typeInfoCache.clear();\n};\n\nconst addAncestor = (names: string[], seen: Set<string>, name: string | null): void => {\n if (name === null || seen.has(name)) {\n return;\n }\n\n seen.add(name);\n names.push(name);\n};\n\nconst buildAncestry = (name: string): string[] => {\n const names: string[] = [];\n const seen: Set<string> = new Set();\n let type = typeFromName(name);\n\n while (type !== TYPE_INVALID) {\n addAncestor(names, seen, typeName(type));\n\n for (const iface of typeInterfaces(type)) {\n addAncestor(names, seen, typeName(iface));\n }\n\n type = typeParent(type);\n }\n\n return names;\n};\n\nconst ancestryFor = (name: string): string[] => getOrInsert(ancestryCache, name, buildAncestry);\n\nconst addAll = <T>(target: Set<T>, source: Iterable<T> | undefined): void => {\n const items = source ?? [];\n\n for (const item of items) {\n target.add(item);\n }\n};\n\nconst accumulateAncestor = (info: TypeInfo, ancestor: string): void => {\n Object.assign(info.signals, registeredElementSignals[ancestor] ?? signals[ancestor] ?? {});\n addAll(info.userEventSignals, userEventSignals[ancestor]);\n info.behaviors.push(...(ELEMENTS[ancestor]?.behaviors ?? []));\n};\n\nconst resolveProperty = (info: TypeInfo, name: string, entry: PropertyEntry): void => {\n if ((entry[FLAGS] & CONSTRUCT_ONLY) !== 0) {\n info.constructOnly.add(name);\n }\n\n if ((entry[FLAGS] & (WRITABLE | CONSTRUCT | CONSTRUCT_ONLY)) !== 0) {\n info.construct.add(name);\n }\n\n if (entry.length > DEFAULT_VALUE) {\n info.defaults[name] = entry[DEFAULT_VALUE];\n }\n};\n\nconst resolveProperties = (info: TypeInfo): void => {\n for (const [name, entry] of Object.entries(info.properties)) {\n resolveProperty(info, name, entry);\n }\n};\n\nconst applyBehaviorFlags = (info: TypeInfo, behavior: ElementBehavior): void => {\n if (behavior.flush !== undefined) {\n info.hasFlush = true;\n }\n\n addAll(info.deferred, deferredProps(behavior));\n addAll(info.declaredConstructOnly, behavior.constructOnly);\n};\n\nconst resolveBehaviorFlags = (info: TypeInfo): void => {\n for (const behavior of info.behaviors) {\n applyBehaviorFlags(info, behavior);\n }\n};\n\nconst buildTypeInfo = (name: string): TypeInfo => {\n const chain = ancestryFor(name);\n\n const info: TypeInfo = {\n typeName: name,\n properties: {},\n signals: {},\n userEventSignals: new Set(),\n behaviors: [],\n deferred: new Set(),\n declaredConstructOnly: new Set(),\n isLazy: false,\n hasFlush: false,\n constructOnly: new Set(),\n construct: new Set(),\n defaults: {},\n };\n\n for (const ancestor of chain) {\n accumulateAncestor(info, ancestor);\n }\n\n resolveBehaviorFlags(info);\n info.isLazy = chain.some((ancestor) => ELEMENTS[ancestor]?.isLazy === true);\n\n for (const ancestor of chain.toReversed()) {\n Object.assign(info.properties, registeredElementProperties[ancestor] ?? properties[ancestor] ?? {});\n }\n\n resolveProperties(info);\n\n return info;\n};\n\nconst typeInfoFor = (name: string): TypeInfo => {\n dropStaleCaches();\n\n return getOrInsert(typeInfoCache, name, buildTypeInfo);\n};\n\nconst getTypeInfo = (object: GObject.Object): TypeInfo | undefined => {\n const name = typeName(getClassType(object.constructor as AnyClass));\n\n return name === null ? undefined : typeInfoFor(name);\n};\n\nconst hasProperty = (info: TypeInfo, accessor: string): boolean => Object.hasOwn(info.properties, accessor);\n\nconst propertyNameFor = (info: TypeInfo, accessor: string): string | undefined =>\n info.properties[accessor]?.[NAME];\n\nconst getPropertyName = (object: GObject.Object, accessor: string): string | undefined => {\n const info = getTypeInfo(object);\n\n return (info === undefined ? undefined : propertyNameFor(info, accessor)) ??\n getDeclaredPropertyName(object, accessor);\n};\n\nexport { getPropertyName, hasProperty, typeInfoFor, type TypeInfo };\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gtkx/react",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"description": "React reconciler for GTK. Renders real GTK4 widget trees.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"gtkx",
|
|
@@ -86,10 +86,10 @@
|
|
|
86
86
|
},
|
|
87
87
|
"dependencies": {
|
|
88
88
|
"react-reconciler": "^0.33.0",
|
|
89
|
-
"@gtkx/config": "1.
|
|
90
|
-
"@gtkx/runtime": "1.
|
|
91
|
-
"@gtkx/
|
|
92
|
-
"@gtkx/
|
|
89
|
+
"@gtkx/config": "1.6.0",
|
|
90
|
+
"@gtkx/runtime": "1.6.0",
|
|
91
|
+
"@gtkx/utils": "1.6.0",
|
|
92
|
+
"@gtkx/css": "1.6.0"
|
|
93
93
|
},
|
|
94
94
|
"devDependencies": {
|
|
95
95
|
"@types/react": "^19.2.18",
|