@react-x11/components 0.3.0 → 0.4.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 +6 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/qml/containers.d.ts +3 -0
- package/dist/qml/containers.d.ts.map +1 -0
- package/dist/qml/containers.js +331 -0
- package/dist/qml/containers.js.map +1 -0
- package/dist/qml/controls.d.ts +12 -0
- package/dist/qml/controls.d.ts.map +1 -0
- package/dist/qml/controls.js +21 -0
- package/dist/qml/controls.js.map +1 -0
- package/dist/qml/globals.d.ts +6 -0
- package/dist/qml/globals.d.ts.map +1 -0
- package/dist/qml/globals.js +25 -0
- package/dist/qml/globals.js.map +1 -0
- package/dist/qml/index.d.ts +15 -0
- package/dist/qml/index.d.ts.map +1 -0
- package/dist/qml/index.js +25 -0
- package/dist/qml/index.js.map +1 -0
- package/dist/qml/interaction.d.ts +12 -0
- package/dist/qml/interaction.d.ts.map +1 -0
- package/dist/qml/interaction.js +246 -0
- package/dist/qml/interaction.js.map +1 -0
- package/dist/qml/ir.d.ts +106 -0
- package/dist/qml/ir.d.ts.map +1 -0
- package/dist/qml/ir.js +7 -0
- package/dist/qml/ir.js.map +1 -0
- package/dist/qml/layouts.d.ts +3 -0
- package/dist/qml/layouts.d.ts.map +1 -0
- package/dist/qml/layouts.js +122 -0
- package/dist/qml/layouts.js.map +1 -0
- package/dist/qml/models.d.ts +14 -0
- package/dist/qml/models.d.ts.map +1 -0
- package/dist/qml/models.js +80 -0
- package/dist/qml/models.js.map +1 -0
- package/dist/qml/objects.d.ts +228 -0
- package/dist/qml/objects.d.ts.map +1 -0
- package/dist/qml/objects.js +1103 -0
- package/dist/qml/objects.js.map +1 -0
- package/dist/qml/parse.d.ts +10 -0
- package/dist/qml/parse.d.ts.map +1 -0
- package/dist/qml/parse.js +607 -0
- package/dist/qml/parse.js.map +1 -0
- package/dist/qml/qtquick.d.ts +7 -0
- package/dist/qml/qtquick.d.ts.map +1 -0
- package/dist/qml/qtquick.js +347 -0
- package/dist/qml/qtquick.js.map +1 -0
- package/dist/qml/react.d.ts +83 -0
- package/dist/qml/react.d.ts.map +1 -0
- package/dist/qml/react.js +323 -0
- package/dist/qml/react.js.map +1 -0
- package/dist/qml/resolver.d.ts +38 -0
- package/dist/qml/resolver.d.ts.map +1 -0
- package/dist/qml/resolver.js +64 -0
- package/dist/qml/resolver.js.map +1 -0
- package/dist/qml/slots.d.ts +65 -0
- package/dist/qml/slots.d.ts.map +1 -0
- package/dist/qml/slots.js +230 -0
- package/dist/qml/slots.js.map +1 -0
- package/dist/qml/states.d.ts +5 -0
- package/dist/qml/states.d.ts.map +1 -0
- package/dist/qml/states.js +276 -0
- package/dist/qml/states.js.map +1 -0
- package/dist/qml/view-utils.d.ts +42 -0
- package/dist/qml/view-utils.d.ts.map +1 -0
- package/dist/qml/view-utils.js +121 -0
- package/dist/qml/view-utils.js.map +1 -0
- package/dist/tabs/hx.d.ts +18 -0
- package/dist/tabs/hx.d.ts.map +1 -0
- package/dist/tabs/hx.js +10 -0
- package/dist/tabs/hx.js.map +1 -0
- package/dist/tabs/index.d.ts +143 -0
- package/dist/tabs/index.d.ts.map +1 -0
- package/dist/tabs/index.js +602 -0
- package/dist/tabs/index.js.map +1 -0
- package/dist/terminal/vt/index.d.ts +1 -1
- package/dist/terminal/vt/index.d.ts.map +1 -1
- package/dist/terminal/vt/index.js +3 -3
- package/dist/terminal/vt/index.js.map +1 -1
- package/dist/terminal/vt/pty.d.ts +16 -0
- package/dist/terminal/vt/pty.d.ts.map +1 -1
- package/dist/terminal/vt/pty.js +186 -0
- package/dist/terminal/vt/pty.js.map +1 -1
- package/package.json +11 -1
- package/src/index.ts +44 -0
- package/src/qml/containers.tsx +380 -0
- package/src/qml/controls.tsx +47 -0
- package/src/qml/globals.ts +33 -0
- package/src/qml/index.ts +67 -0
- package/src/qml/interaction.tsx +317 -0
- package/src/qml/ir.ts +80 -0
- package/src/qml/layouts.tsx +141 -0
- package/src/qml/models.ts +101 -0
- package/src/qml/objects.ts +1431 -0
- package/src/qml/parse.ts +624 -0
- package/src/qml/qtquick.tsx +413 -0
- package/src/qml/react.tsx +454 -0
- package/src/qml/resolver.ts +99 -0
- package/src/qml/slots.ts +249 -0
- package/src/qml/states.ts +318 -0
- package/src/qml/view-utils.ts +140 -0
- package/src/tabs/hx.ts +31 -0
- package/src/tabs/index.ts +850 -0
- package/src/terminal/vt/index.ts +4 -2
- package/src/terminal/vt/pty.ts +243 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interaction.d.ts","sourceRoot":"","sources":["../../src/qml/interaction.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAe7C,OAAO,EAAE,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAoF5D;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkBxE;AAyED,yDAAyD;AACzD,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAepE;AA+CD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAoDvD,CAAC"}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react-x11/jsx-runtime";
|
|
2
|
+
// Pointer and keyboard: MouseArea, the `Keys` attached handlers, `focus`/
|
|
3
|
+
// `activeFocus`, and the two text editors over core's `<textinput>` /
|
|
4
|
+
// `<textarea>`.
|
|
5
|
+
import { useEffect } from 'react';
|
|
6
|
+
import { XK_BACKSPACE, XK_DELETE, XK_DOWN, XK_ESCAPE, XK_KP_ENTER, XK_LEFT, XK_RETURN, XK_RIGHT, XK_SPACE, XK_TAB, XK_UP, } from 'react-x11/keysyms';
|
|
7
|
+
import { QmlInstance } from './objects.js';
|
|
8
|
+
import { renderQmlChildren, geometryStyle } from './react.js';
|
|
9
|
+
import { applyMotion, captureNode, hostNode, num, qmlColor, str, } from './view-utils.js';
|
|
10
|
+
// Qt's modifier flags, so `mouse.modifiers & Qt.ShiftModifier` reads as
|
|
11
|
+
// ported code expects.
|
|
12
|
+
const SHIFT = 0x02000000;
|
|
13
|
+
const CTRL = 0x04000000;
|
|
14
|
+
const ALT = 0x08000000;
|
|
15
|
+
const META = 0x10000000;
|
|
16
|
+
const modifiersOf = (e) => (e.shiftKey ? SHIFT : 0) |
|
|
17
|
+
(e.ctrlKey ? CTRL : 0) |
|
|
18
|
+
(e.altKey ? ALT : 0) |
|
|
19
|
+
(e.metaKey ? META : 0);
|
|
20
|
+
const NAMED_KEYS = {
|
|
21
|
+
[XK_RETURN]: 'Return',
|
|
22
|
+
[XK_KP_ENTER]: 'Enter',
|
|
23
|
+
[XK_ESCAPE]: 'Escape',
|
|
24
|
+
[XK_UP]: 'Up',
|
|
25
|
+
[XK_DOWN]: 'Down',
|
|
26
|
+
[XK_LEFT]: 'Left',
|
|
27
|
+
[XK_RIGHT]: 'Right',
|
|
28
|
+
[XK_TAB]: 'Tab',
|
|
29
|
+
[XK_SPACE]: 'Space',
|
|
30
|
+
[XK_DELETE]: 'Delete',
|
|
31
|
+
[XK_BACKSPACE]: 'Back',
|
|
32
|
+
};
|
|
33
|
+
function dispatchKeys(inst, e) {
|
|
34
|
+
const ev = {
|
|
35
|
+
key: e.keysym ?? 0,
|
|
36
|
+
text: e.key ?? '',
|
|
37
|
+
modifiers: modifiersOf(e),
|
|
38
|
+
accepted: false,
|
|
39
|
+
};
|
|
40
|
+
const named = NAMED_KEYS[ev.key];
|
|
41
|
+
if (named)
|
|
42
|
+
inst.attachedHandlers.get(`Keys.on${named}Pressed`)?.(ev);
|
|
43
|
+
if (!ev.accepted)
|
|
44
|
+
inst.attachedHandlers.get('Keys.onPressed')?.(ev);
|
|
45
|
+
if (ev.accepted)
|
|
46
|
+
e.stopPropagation?.();
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* The focus/keyboard props an Item earns from `focus: true`, `Keys.*`
|
|
50
|
+
* handlers, or being told to be focusable. `activeFocus` follows the real
|
|
51
|
+
* focus events.
|
|
52
|
+
*/
|
|
53
|
+
export function keyFocusProps(inst) {
|
|
54
|
+
const wantsFocus = inst.slots.get('focus')?.peek() === true;
|
|
55
|
+
let hasKeys = false;
|
|
56
|
+
for (const k of inst.attachedHandlers.keys()) {
|
|
57
|
+
if (k.startsWith('Keys.')) {
|
|
58
|
+
hasKeys = true;
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (!wantsFocus && !hasKeys)
|
|
63
|
+
return {};
|
|
64
|
+
const props = {
|
|
65
|
+
focusable: true,
|
|
66
|
+
onFocus: () => inst.slots.get('activeFocus')?.assign(true),
|
|
67
|
+
onBlur: () => inst.slots.get('activeFocus')?.assign(false),
|
|
68
|
+
};
|
|
69
|
+
if (wantsFocus)
|
|
70
|
+
props.autoFocus = true;
|
|
71
|
+
if (hasKeys)
|
|
72
|
+
props.onKeyDown = (e) => dispatchKeys(inst, e);
|
|
73
|
+
return props;
|
|
74
|
+
}
|
|
75
|
+
// --- MouseArea -------------------------------------------------------------
|
|
76
|
+
function MouseAreaView({ inst }) {
|
|
77
|
+
const enabled = inst.slot('enabled').peek() !== false;
|
|
78
|
+
const hoverEnabled = inst.slot('hoverEnabled').peek() === true;
|
|
79
|
+
const style = geometryStyle(inst);
|
|
80
|
+
applyMotion(inst, style);
|
|
81
|
+
const mouse = (e) => {
|
|
82
|
+
const abs = hostNode(inst)?.abs;
|
|
83
|
+
return {
|
|
84
|
+
x: e.x - (abs?.x ?? 0),
|
|
85
|
+
y: e.y - (abs?.y ?? 0),
|
|
86
|
+
button: e.button,
|
|
87
|
+
modifiers: modifiersOf(e),
|
|
88
|
+
accepted: true,
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
const handlers = {};
|
|
92
|
+
if (enabled) {
|
|
93
|
+
handlers.onClick = (e) => {
|
|
94
|
+
e.stopPropagation?.();
|
|
95
|
+
inst.emit('clicked', mouse(e));
|
|
96
|
+
if (e.detail === 2)
|
|
97
|
+
inst.emit('doubleClicked', mouse(e));
|
|
98
|
+
};
|
|
99
|
+
handlers.onMouseDown = (e) => {
|
|
100
|
+
e.stopPropagation?.();
|
|
101
|
+
inst.slot('pressed').assign(true);
|
|
102
|
+
inst.emit('pressed', mouse(e));
|
|
103
|
+
};
|
|
104
|
+
handlers.onMouseUp = (e) => {
|
|
105
|
+
e.stopPropagation?.();
|
|
106
|
+
inst.slot('pressed').assign(false);
|
|
107
|
+
inst.emit('released', mouse(e));
|
|
108
|
+
};
|
|
109
|
+
handlers.onMouseMove = (e) => {
|
|
110
|
+
inst.emit('positionChanged', mouse(e));
|
|
111
|
+
};
|
|
112
|
+
handlers.onWheel = (e) => {
|
|
113
|
+
inst.emit('wheel', {
|
|
114
|
+
...mouse(e),
|
|
115
|
+
angleDelta: { x: e.deltaX ?? 0, y: e.deltaY ?? 0 },
|
|
116
|
+
});
|
|
117
|
+
};
|
|
118
|
+
if (hoverEnabled) {
|
|
119
|
+
handlers.onMouseEnter = () => {
|
|
120
|
+
inst.slot('containsMouse').assign(true);
|
|
121
|
+
inst.emit('entered');
|
|
122
|
+
};
|
|
123
|
+
handlers.onMouseLeave = () => {
|
|
124
|
+
inst.slot('containsMouse').assign(false);
|
|
125
|
+
inst.emit('exited');
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return (_jsx("box", { ref: captureNode(inst), style: style, ...handlers, ...keyFocusProps(inst), children: renderQmlChildren(inst) }));
|
|
130
|
+
}
|
|
131
|
+
// --- TextInput / TextEdit --------------------------------------------------
|
|
132
|
+
/** The font/colour subset Text and the editors share. */
|
|
133
|
+
export function applyFontStyle(inst, style) {
|
|
134
|
+
const color = inst.slots.get('color')?.peek();
|
|
135
|
+
if (color !== undefined)
|
|
136
|
+
style.color = qmlColor(color);
|
|
137
|
+
const px = num(inst.slots.get('font.pixelSize')?.peek());
|
|
138
|
+
const pt = num(inst.slots.get('font.pointSize')?.peek());
|
|
139
|
+
if (px)
|
|
140
|
+
style.fontSize = px;
|
|
141
|
+
else if (pt)
|
|
142
|
+
style.fontSize = Math.round((pt * 96) / 72); // CSS's 1pt
|
|
143
|
+
const family = inst.slots.get('font.family')?.peek();
|
|
144
|
+
if (family)
|
|
145
|
+
style.fontFamily = String(family);
|
|
146
|
+
if (inst.slots.get('font.bold')?.peek())
|
|
147
|
+
style.fontWeight = 700;
|
|
148
|
+
else {
|
|
149
|
+
const weight = num(inst.slots.get('font.weight')?.peek());
|
|
150
|
+
if (weight)
|
|
151
|
+
style.fontWeight = weight;
|
|
152
|
+
}
|
|
153
|
+
if (inst.slots.get('font.italic')?.peek())
|
|
154
|
+
style.fontStyle = 'italic';
|
|
155
|
+
}
|
|
156
|
+
function useImplicitLineHeight(inst, text) {
|
|
157
|
+
useEffect(() => {
|
|
158
|
+
const node = hostNode(inst);
|
|
159
|
+
if (!node?.app?.fonts || !node.resolvedTextStyle)
|
|
160
|
+
return;
|
|
161
|
+
try {
|
|
162
|
+
const probe = node.app.fonts.layout(text || 'Mg', node.resolvedTextStyle());
|
|
163
|
+
inst.slots.get('implicitHeight')?.assign(Math.ceil(probe.height) + 8);
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
// No fonts loaded (headless without the fonts option): leave 0.
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
function editorView(tag) {
|
|
171
|
+
return function EditorView({ inst }) {
|
|
172
|
+
const style = geometryStyle(inst);
|
|
173
|
+
applyFontStyle(inst, style);
|
|
174
|
+
applyMotion(inst, style);
|
|
175
|
+
const text = str(inst.slot('text').peek());
|
|
176
|
+
useImplicitLineHeight(inst, text);
|
|
177
|
+
const maxLen = num(inst.slots.get('maximumLength')?.peek());
|
|
178
|
+
const props = {
|
|
179
|
+
ref: captureNode(inst),
|
|
180
|
+
style,
|
|
181
|
+
value: text,
|
|
182
|
+
onChange: (ev) => inst.slot('text').set(ev.value),
|
|
183
|
+
...keyFocusProps(inst),
|
|
184
|
+
};
|
|
185
|
+
if (tag === 'textinput') {
|
|
186
|
+
props.onSubmit = () => inst.emit('accepted');
|
|
187
|
+
if (maxLen > 0 && maxLen < 32767)
|
|
188
|
+
props.maxLength = maxLen;
|
|
189
|
+
return _jsx("textinput", { ...props });
|
|
190
|
+
}
|
|
191
|
+
return _jsx("textarea", { ...props });
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
// --- the type definitions --------------------------------------------------
|
|
195
|
+
export const interactionTypes = {
|
|
196
|
+
MouseArea: {
|
|
197
|
+
extends: 'Item',
|
|
198
|
+
view: MouseAreaView,
|
|
199
|
+
properties: {
|
|
200
|
+
pressed: { default: false },
|
|
201
|
+
containsMouse: { default: false },
|
|
202
|
+
hoverEnabled: { default: false },
|
|
203
|
+
},
|
|
204
|
+
signals: {
|
|
205
|
+
clicked: ['mouse'],
|
|
206
|
+
doubleClicked: ['mouse'],
|
|
207
|
+
pressed: ['mouse'],
|
|
208
|
+
released: ['mouse'],
|
|
209
|
+
positionChanged: ['mouse'],
|
|
210
|
+
entered: [],
|
|
211
|
+
exited: [],
|
|
212
|
+
wheel: ['wheel'],
|
|
213
|
+
},
|
|
214
|
+
},
|
|
215
|
+
TextInput: {
|
|
216
|
+
extends: 'Item',
|
|
217
|
+
view: editorView('textinput'),
|
|
218
|
+
properties: {
|
|
219
|
+
text: { default: '' },
|
|
220
|
+
color: { default: undefined },
|
|
221
|
+
maximumLength: { default: 32767 },
|
|
222
|
+
'font.pixelSize': { default: 0 },
|
|
223
|
+
'font.pointSize': { default: 0 },
|
|
224
|
+
'font.family': { default: '' },
|
|
225
|
+
'font.bold': { default: false },
|
|
226
|
+
'font.italic': { default: false },
|
|
227
|
+
'font.weight': { default: 0 },
|
|
228
|
+
},
|
|
229
|
+
signals: { accepted: [], editingFinished: [] },
|
|
230
|
+
},
|
|
231
|
+
TextEdit: {
|
|
232
|
+
extends: 'Item',
|
|
233
|
+
view: editorView('textarea'),
|
|
234
|
+
properties: {
|
|
235
|
+
text: { default: '' },
|
|
236
|
+
color: { default: undefined },
|
|
237
|
+
'font.pixelSize': { default: 0 },
|
|
238
|
+
'font.pointSize': { default: 0 },
|
|
239
|
+
'font.family': { default: '' },
|
|
240
|
+
'font.bold': { default: false },
|
|
241
|
+
'font.italic': { default: false },
|
|
242
|
+
'font.weight': { default: 0 },
|
|
243
|
+
},
|
|
244
|
+
},
|
|
245
|
+
};
|
|
246
|
+
//# sourceMappingURL=interaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interaction.js","sourceRoot":"","sources":["../../src/qml/interaction.tsx"],"names":[],"mappings":"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"}
|
package/dist/qml/ir.d.ts
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
export interface QmlImport {
|
|
2
|
+
/** `import QtQuick 2.15` — a registry module name. */
|
|
3
|
+
module?: string;
|
|
4
|
+
/** `import "./widgets"` — a path import (resolved by the host app). */
|
|
5
|
+
path?: string;
|
|
6
|
+
version?: string;
|
|
7
|
+
alias?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ObjectIR {
|
|
10
|
+
type: string;
|
|
11
|
+
id: string | null;
|
|
12
|
+
members: MemberIR[];
|
|
13
|
+
loc: number;
|
|
14
|
+
}
|
|
15
|
+
export type ValueIR =
|
|
16
|
+
/** A JavaScript expression, compiled lazily by the runtime. */
|
|
17
|
+
{
|
|
18
|
+
kind: 'expr';
|
|
19
|
+
src: string;
|
|
20
|
+
loc: number;
|
|
21
|
+
}
|
|
22
|
+
/** `prop: { …statements }` — a script binding (still reactive). */
|
|
23
|
+
| {
|
|
24
|
+
kind: 'block';
|
|
25
|
+
src: string;
|
|
26
|
+
loc: number;
|
|
27
|
+
}
|
|
28
|
+
/** `delegate: Component { … }`, `background: Rectangle { … }`. */
|
|
29
|
+
| {
|
|
30
|
+
kind: 'object';
|
|
31
|
+
object: ObjectIR;
|
|
32
|
+
}
|
|
33
|
+
/** `states: [State { … }, …]` — an array of object templates. */
|
|
34
|
+
| {
|
|
35
|
+
kind: 'array';
|
|
36
|
+
items: ValueIR[];
|
|
37
|
+
};
|
|
38
|
+
export interface AliasTargetIR {
|
|
39
|
+
kind: 'alias-target';
|
|
40
|
+
path: string[];
|
|
41
|
+
}
|
|
42
|
+
export type MemberIR = {
|
|
43
|
+
kind: 'property';
|
|
44
|
+
name: string;
|
|
45
|
+
propType: string;
|
|
46
|
+
readonly: boolean;
|
|
47
|
+
default: boolean;
|
|
48
|
+
required: boolean;
|
|
49
|
+
value: ValueIR | AliasTargetIR | null;
|
|
50
|
+
loc: number;
|
|
51
|
+
} | {
|
|
52
|
+
kind: 'signal';
|
|
53
|
+
name: string;
|
|
54
|
+
params: Array<{
|
|
55
|
+
type: string;
|
|
56
|
+
name: string;
|
|
57
|
+
}>;
|
|
58
|
+
loc: number;
|
|
59
|
+
} | {
|
|
60
|
+
kind: 'function';
|
|
61
|
+
name: string;
|
|
62
|
+
params: string[];
|
|
63
|
+
body: string;
|
|
64
|
+
loc: number;
|
|
65
|
+
} | {
|
|
66
|
+
kind: 'binding';
|
|
67
|
+
path: string[];
|
|
68
|
+
value: ValueIR;
|
|
69
|
+
loc: number;
|
|
70
|
+
} | {
|
|
71
|
+
kind: 'group';
|
|
72
|
+
bindings: BindingMemberIR[];
|
|
73
|
+
loc: number;
|
|
74
|
+
} | {
|
|
75
|
+
kind: 'object';
|
|
76
|
+
object: ObjectIR;
|
|
77
|
+
loc: number;
|
|
78
|
+
} | {
|
|
79
|
+
kind: 'value-source';
|
|
80
|
+
object: ObjectIR;
|
|
81
|
+
on: string[];
|
|
82
|
+
loc: number;
|
|
83
|
+
} | {
|
|
84
|
+
kind: 'id';
|
|
85
|
+
id: string;
|
|
86
|
+
loc: number;
|
|
87
|
+
} | {
|
|
88
|
+
kind: 'inline-component';
|
|
89
|
+
name: string;
|
|
90
|
+
object: ObjectIR;
|
|
91
|
+
loc: number;
|
|
92
|
+
};
|
|
93
|
+
export type BindingMemberIR = Extract<MemberIR, {
|
|
94
|
+
kind: 'binding';
|
|
95
|
+
}>;
|
|
96
|
+
export interface QmlDocument {
|
|
97
|
+
fileName: string;
|
|
98
|
+
imports: QmlImport[];
|
|
99
|
+
pragmas: string[];
|
|
100
|
+
root: ObjectIR;
|
|
101
|
+
/** How this document was loaded — set by the engine when a resolver is
|
|
102
|
+
* in play, so the type names it uses can resolve `.qml` files relative
|
|
103
|
+
* to it (resolver.ts). */
|
|
104
|
+
load?: import('./resolver.js').DocLoad;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=ir.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ir.d.ts","sourceRoot":"","sources":["../../src/qml/ir.ts"],"names":[],"mappings":"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"}
|
package/dist/qml/ir.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// The intermediate representation both halves share: the parser produces it,
|
|
2
|
+
// the runtime instantiates it, and the future compiler will serialize it.
|
|
3
|
+
// Everything is plain data — no methods, no cycles — so a document parses
|
|
4
|
+
// once and instantiates many times (a Repeater's delegate is one ObjectIR,
|
|
5
|
+
// however many rows exist).
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=ir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ir.js","sourceRoot":"","sources":["../../src/qml/ir.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,0EAA0E;AAC1E,0EAA0E;AAC1E,2EAA2E;AAC3E,4BAA4B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layouts.d.ts","sourceRoot":"","sources":["../../src/qml/layouts.tsx"],"names":[],"mappings":"AAuBA,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAkH5D,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAGlD,CAAC"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react-x11/jsx-runtime";
|
|
2
|
+
// QtQuick.Layouts — RowLayout and ColumnLayout, lowered onto yoga.
|
|
3
|
+
//
|
|
4
|
+
// This is react-x11's home turf: the container renders a flex `<box>` and
|
|
5
|
+
// every child renders as a flex item styled from its `Layout.*` attached
|
|
6
|
+
// properties (react.tsx, `layoutChildStyle`) — `fillWidth` is `flexGrow`,
|
|
7
|
+
// `preferredWidth` is the basis, `alignment` is `alignSelf`, margins are
|
|
8
|
+
// margins. Yoga decides the geometry; the renderer never re-implements it.
|
|
9
|
+
//
|
|
10
|
+
// What QML still needs from that arrangement is *readable geometry*:
|
|
11
|
+
// `item.x` and `item.width` are ordinary properties other bindings consume.
|
|
12
|
+
// After each layout pass the container reads its children's laid-out rects
|
|
13
|
+
// and `reflect()`s them into the x/y/width/height slots — a write that
|
|
14
|
+
// disturbs no binding and no flag, so the implicit-width default keeps
|
|
15
|
+
// meaning "content-sized" and an author `width:` keeps reading as a size
|
|
16
|
+
// hint. Expressions see yoga's answer; yoga sees the hints.
|
|
17
|
+
//
|
|
18
|
+
// GridLayout is not here yet — yoga has no grid, and a half-true one would
|
|
19
|
+
// be worse than the clear unknown-type error; RowLayout, ColumnLayout and
|
|
20
|
+
// the full Layout.* set cover the linked reference page.
|
|
21
|
+
import { useEffect } from 'react';
|
|
22
|
+
import { QmlInstance } from './objects.js';
|
|
23
|
+
import { renderQmlChildren, geometryStyle, preferredSpan } from './react.js';
|
|
24
|
+
import { applyMotion, captureNode, hostNode, initItem, num, } from './view-utils.js';
|
|
25
|
+
import { afterLayout, cancelAfterLayout, } from '../internal/timers.js';
|
|
26
|
+
function isRow(inst) {
|
|
27
|
+
return inst.typeInfo.name === 'RowLayout';
|
|
28
|
+
}
|
|
29
|
+
/** Reflect yoga's answers into the managed children's geometry slots. */
|
|
30
|
+
function feedbackLayout(inst) {
|
|
31
|
+
if (inst.destroyed)
|
|
32
|
+
return;
|
|
33
|
+
const containerAbs = hostNode(inst)?.abs;
|
|
34
|
+
if (!containerAbs)
|
|
35
|
+
return;
|
|
36
|
+
for (const child of inst.visualChildren()) {
|
|
37
|
+
const abs = hostNode(child)?.abs;
|
|
38
|
+
if (!abs)
|
|
39
|
+
continue; // a custom view without captureNode: skip quietly
|
|
40
|
+
child.slots.get('x')?.reflect(abs.x - containerAbs.x);
|
|
41
|
+
child.slots.get('y')?.reflect(abs.y - containerAbs.y);
|
|
42
|
+
child.slots.get('width')?.reflect(abs.width);
|
|
43
|
+
child.slots.get('height')?.reflect(abs.height);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function LayoutView({ inst }) {
|
|
47
|
+
const horizontal = isRow(inst);
|
|
48
|
+
const style = geometryStyle(inst);
|
|
49
|
+
style.display = 'flex';
|
|
50
|
+
style.flexDirection = horizontal ? 'row' : 'column';
|
|
51
|
+
style.gap = num(inst.slot('spacing').peek());
|
|
52
|
+
applyMotion(inst, style);
|
|
53
|
+
// Feed geometry back after the layout flush — and again whenever any
|
|
54
|
+
// child re-renders (its size hints may have moved yoga). A reflect that
|
|
55
|
+
// changes nothing notifies nobody, so this settles.
|
|
56
|
+
useEffect(() => {
|
|
57
|
+
let tick = null;
|
|
58
|
+
const schedule = () => {
|
|
59
|
+
cancelAfterLayout(tick);
|
|
60
|
+
tick = afterLayout(() => feedbackLayout(inst));
|
|
61
|
+
};
|
|
62
|
+
schedule();
|
|
63
|
+
const offs = inst.visualChildren().map((c) => c.subscribe(schedule));
|
|
64
|
+
return () => {
|
|
65
|
+
cancelAfterLayout(tick);
|
|
66
|
+
offs.forEach((off) => off());
|
|
67
|
+
};
|
|
68
|
+
});
|
|
69
|
+
return (_jsx("box", { ref: captureNode(inst), style: style, children: renderQmlChildren(inst) }));
|
|
70
|
+
}
|
|
71
|
+
/** The container's own size hint: sum of children's preferred spans on the
|
|
72
|
+
* main axis (plus spacing), max on the cross — tracked bindings, so a
|
|
73
|
+
* child's hint change resizes a content-sized layout. */
|
|
74
|
+
function layoutImplicit(inst) {
|
|
75
|
+
const horizontal = isRow(inst);
|
|
76
|
+
const tracked = (slot) => slot.get();
|
|
77
|
+
const mainExtent = () => {
|
|
78
|
+
let sum = 0;
|
|
79
|
+
let count = 0;
|
|
80
|
+
const spacing = num(inst.slot('spacing').get());
|
|
81
|
+
for (const child of inst.visualChildren()) {
|
|
82
|
+
if (child.slot('visible').get() === false)
|
|
83
|
+
continue;
|
|
84
|
+
sum += preferredSpan(child, horizontal, tracked) ?? 0;
|
|
85
|
+
count++;
|
|
86
|
+
}
|
|
87
|
+
return sum + spacing * Math.max(0, count - 1);
|
|
88
|
+
};
|
|
89
|
+
const crossExtent = () => {
|
|
90
|
+
let max = 0;
|
|
91
|
+
for (const child of inst.visualChildren()) {
|
|
92
|
+
if (child.slot('visible').get() === false)
|
|
93
|
+
continue;
|
|
94
|
+
max = Math.max(max, preferredSpan(child, !horizontal, tracked) ?? 0);
|
|
95
|
+
}
|
|
96
|
+
return max;
|
|
97
|
+
};
|
|
98
|
+
inst
|
|
99
|
+
.slot(horizontal ? 'implicitWidth' : 'implicitHeight')
|
|
100
|
+
.setBinding(mainExtent);
|
|
101
|
+
inst
|
|
102
|
+
.slot(horizontal ? 'implicitHeight' : 'implicitWidth')
|
|
103
|
+
.setBinding(crossExtent);
|
|
104
|
+
}
|
|
105
|
+
function layoutInit(inst) {
|
|
106
|
+
initItem(inst);
|
|
107
|
+
layoutImplicit(inst);
|
|
108
|
+
}
|
|
109
|
+
const layoutContainer = {
|
|
110
|
+
extends: 'Item',
|
|
111
|
+
managesChildLayout: true,
|
|
112
|
+
view: LayoutView,
|
|
113
|
+
// Qt's RowLayout/ColumnLayout default spacing.
|
|
114
|
+
properties: { spacing: { default: 5 } },
|
|
115
|
+
init: layoutInit,
|
|
116
|
+
onStructure: layoutImplicit, // a Repeater spliced new children in
|
|
117
|
+
};
|
|
118
|
+
export const layoutTypes = {
|
|
119
|
+
RowLayout: { ...layoutContainer },
|
|
120
|
+
ColumnLayout: { ...layoutContainer },
|
|
121
|
+
};
|
|
122
|
+
//# sourceMappingURL=layouts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layouts.js","sourceRoot":"","sources":["../../src/qml/layouts.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type QmlTypeDef } from './objects.js';
|
|
2
|
+
import { Slot } from './slots.js';
|
|
3
|
+
export declare const modelTypes: Record<string, QmlTypeDef>;
|
|
4
|
+
export interface ResolvedModel {
|
|
5
|
+
rows: unknown[];
|
|
6
|
+
/** Present for a ListModel: the revision slot a consumer watches. */
|
|
7
|
+
revSlot: Slot | null;
|
|
8
|
+
}
|
|
9
|
+
/** number | array | ListModel → rows a Repeater/ListView can walk. */
|
|
10
|
+
export declare function resolveModel(value: unknown): ResolvedModel;
|
|
11
|
+
/** The context properties a delegate row sees: index, modelData, and — for
|
|
12
|
+
* object rows — each role by name, the way QML exposes ListModel roles. */
|
|
13
|
+
export declare function delegateExtras(rows: unknown[], index: number): Record<string, unknown>;
|
|
14
|
+
//# sourceMappingURL=models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/qml/models.ts"],"names":[],"mappings":"AAQA,OAAO,EAA2B,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAYlC,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAyCjD,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,qEAAqE;IACrE,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC;CACtB;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,CAa1D;AAED;2EAC2E;AAC3E,wBAAgB,cAAc,CAC5B,IAAI,EAAE,OAAO,EAAE,EACf,KAAK,EAAE,MAAM,GACZ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASzB"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// ListModel / ListElement, and the one helper every model consumer shares.
|
|
2
|
+
//
|
|
3
|
+
// A ListModel is rows of plain objects. Inline `ListElement` children seed
|
|
4
|
+
// it; the mutation methods (`append`, `remove`, `set`, …) are facade
|
|
5
|
+
// methods, and every mutation bumps a hidden revision slot the consumers
|
|
6
|
+
// (Repeater, ListView) watch — a coarse rebuild, which is the honest P1
|
|
7
|
+
// answer; incremental delegate reuse is DelegateModel's job, later.
|
|
8
|
+
import { QmlInstance, instanceOf } from './objects.js';
|
|
9
|
+
import { Slot } from './slots.js';
|
|
10
|
+
const rowsOf = (m) => m.state.rows;
|
|
11
|
+
function mutate(m, fn) {
|
|
12
|
+
fn(rowsOf(m));
|
|
13
|
+
m.slot('count').assign(rowsOf(m).length);
|
|
14
|
+
m.slot('__rev').assign(m.slot('__rev').peek() + 1);
|
|
15
|
+
}
|
|
16
|
+
export const modelTypes = {
|
|
17
|
+
ListElement: {
|
|
18
|
+
nonVisual: true,
|
|
19
|
+
dynamicProperties: true,
|
|
20
|
+
properties: {},
|
|
21
|
+
},
|
|
22
|
+
ListModel: {
|
|
23
|
+
nonVisual: true,
|
|
24
|
+
properties: { count: { default: 0 }, __rev: { default: 0 } },
|
|
25
|
+
init(m) {
|
|
26
|
+
const rows = [];
|
|
27
|
+
for (const el of m.children) {
|
|
28
|
+
if (el.typeInfo.name !== 'ListElement')
|
|
29
|
+
continue;
|
|
30
|
+
const row = {};
|
|
31
|
+
for (const [name, slot] of el.slots)
|
|
32
|
+
row[name] = slot.peek();
|
|
33
|
+
rows.push(row);
|
|
34
|
+
}
|
|
35
|
+
m.state.rows = rows;
|
|
36
|
+
m.slot('count').assign(rows.length);
|
|
37
|
+
m.methods.set('get', (i) => rowsOf(m)[Number(i)]);
|
|
38
|
+
m.methods.set('append', (row) => mutate(m, (r) => r.push(row)));
|
|
39
|
+
m.methods.set('insert', (i, row) => mutate(m, (r) => r.splice(Number(i), 0, row)));
|
|
40
|
+
m.methods.set('remove', (i, n) => mutate(m, (r) => r.splice(Number(i), n === undefined ? 1 : Number(n))));
|
|
41
|
+
m.methods.set('set', (i, row) => mutate(m, (r) => {
|
|
42
|
+
r[Number(i)] = { ...r[Number(i)], ...row };
|
|
43
|
+
}));
|
|
44
|
+
m.methods.set('setProperty', (i, name, value) => mutate(m, (r) => {
|
|
45
|
+
r[Number(i)] = { ...r[Number(i)], [String(name)]: value };
|
|
46
|
+
}));
|
|
47
|
+
m.methods.set('clear', () => mutate(m, (r) => (r.length = 0)));
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
/** number | array | ListModel → rows a Repeater/ListView can walk. */
|
|
52
|
+
export function resolveModel(value) {
|
|
53
|
+
const inst = instanceOf(value);
|
|
54
|
+
if (inst && inst.typeInfo.name === 'ListModel') {
|
|
55
|
+
return { rows: rowsOf(inst), revSlot: inst.slot('__rev') };
|
|
56
|
+
}
|
|
57
|
+
if (typeof value === 'number') {
|
|
58
|
+
return {
|
|
59
|
+
rows: Array.from({ length: Math.max(0, Math.floor(value)) }, (_, i) => i),
|
|
60
|
+
revSlot: null,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
if (Array.isArray(value))
|
|
64
|
+
return { rows: value, revSlot: null };
|
|
65
|
+
return { rows: [], revSlot: null };
|
|
66
|
+
}
|
|
67
|
+
/** The context properties a delegate row sees: index, modelData, and — for
|
|
68
|
+
* object rows — each role by name, the way QML exposes ListModel roles. */
|
|
69
|
+
export function delegateExtras(rows, index) {
|
|
70
|
+
const data = rows[index];
|
|
71
|
+
const extras = { index, modelData: data };
|
|
72
|
+
if (data && typeof data === 'object' && !Array.isArray(data)) {
|
|
73
|
+
for (const [k, v] of Object.entries(data)) {
|
|
74
|
+
if (!(k in extras))
|
|
75
|
+
extras[k] = v;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return extras;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/qml/models.ts"],"names":[],"mappings":"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"}
|