git0 0.2.10 → 0.2.11
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/TypeScript-React-Starter/LICENSE +21 -0
- package/TypeScript-React-Starter/README-CRA.md +1281 -0
- package/TypeScript-React-Starter/README.md +810 -0
- package/TypeScript-React-Starter/package.json +28 -0
- package/TypeScript-React-Starter/public/favicon.ico +0 -0
- package/TypeScript-React-Starter/public/index.html +31 -0
- package/TypeScript-React-Starter/src/App.css +24 -0
- package/TypeScript-React-Starter/src/App.test.tsx +8 -0
- package/TypeScript-React-Starter/src/App.tsx +23 -0
- package/TypeScript-React-Starter/src/actions/index.tsx +24 -0
- package/TypeScript-React-Starter/src/components/Hello.css +13 -0
- package/TypeScript-React-Starter/src/components/Hello.test.tsx +30 -0
- package/TypeScript-React-Starter/src/components/Hello.tsx +35 -0
- package/TypeScript-React-Starter/src/constants/index.tsx +6 -0
- package/TypeScript-React-Starter/src/containers/Hello.tsx +20 -0
- package/TypeScript-React-Starter/src/index.css +5 -0
- package/TypeScript-React-Starter/src/index.tsx +22 -0
- package/TypeScript-React-Starter/src/logo.svg +7 -0
- package/TypeScript-React-Starter/src/reducers/index.tsx +15 -0
- package/TypeScript-React-Starter/src/types/index.tsx +5 -0
- package/TypeScript-React-Starter/tsconfig.json +29 -0
- package/TypeScript-React-Starter/tslint.json +11 -0
- package/TypeScript-React-Starter/yarn.lock +4785 -0
- package/package.json +2 -2
- package/src/github-api.js +1 -0
- package/svelte-nodegui/.all-contributorsrc +60 -0
- package/svelte-nodegui/.vscode/launch.json +29 -0
- package/svelte-nodegui/CHANGELOG.md +153 -0
- package/svelte-nodegui/LICENSE +22 -0
- package/svelte-nodegui/README.md +151 -0
- package/svelte-nodegui/demo/.editorconfig +15 -0
- package/svelte-nodegui/demo/.vscode/extensions.json +3 -0
- package/svelte-nodegui/demo/livereload.js +29 -0
- package/svelte-nodegui/demo/package-lock.json +3514 -0
- package/svelte-nodegui/demo/package.json +35 -0
- package/svelte-nodegui/demo/src/App.svelte +29 -0
- package/svelte-nodegui/demo/src/app.ts +31 -0
- package/svelte-nodegui/demo/tsconfig.json +40 -0
- package/svelte-nodegui/demo/webpack.config.js +110 -0
- package/svelte-nodegui/extras/assets/kitchen.png +0 -0
- package/svelte-nodegui/extras/assets/nodegui.png +0 -0
- package/svelte-nodegui/extras/assets/nodegui_white.png +0 -0
- package/svelte-nodegui/extras/assets/start_icon.png +0 -0
- package/svelte-nodegui/extras/legal/logo/thanks.md +13 -0
- package/svelte-nodegui/extras/legal/yode/LICENSE +21 -0
- package/svelte-nodegui/extras/legal/yoga/LICENSE +0 -0
- package/svelte-nodegui/extras/logo/nodegui-circle.png +0 -0
- package/svelte-nodegui/extras/logo/nodegui.png +0 -0
- package/svelte-nodegui/extras/logo/nodegui.svg +4 -0
- package/svelte-nodegui/nativescript-svelte-todo.gif +0 -0
- package/svelte-nodegui/package-lock.json +1749 -0
- package/svelte-nodegui/package.json +44 -0
- package/svelte-nodegui/repl-workers/bundler/commonjs.js +58 -0
- package/svelte-nodegui/repl-workers/bundler/index.js +353 -0
- package/svelte-nodegui/repl-workers/package-lock.json +484 -0
- package/svelte-nodegui/repl-workers/package.json +21 -0
- package/svelte-nodegui/repl-workers/rollup.config.js +21 -0
- package/svelte-nodegui/rollup.config.js +81 -0
- package/svelte-nodegui/scripts/create-pkg.js +42 -0
- package/svelte-nodegui/src/components/AsComponent.svelte +16 -0
- package/svelte-nodegui/src/components/SlotComponent.svelte +4 -0
- package/svelte-nodegui/src/components/Template.svelte +10 -0
- package/svelte-nodegui/src/components/Template.svelte.d.ts +6 -0
- package/svelte-nodegui/src/components/index.ts +2 -0
- package/svelte-nodegui/src/dom/index.ts +132 -0
- package/svelte-nodegui/src/dom/nativescript-vue-next/LICENCE +21 -0
- package/svelte-nodegui/src/dom/nativescript-vue-next/index.ts +19 -0
- package/svelte-nodegui/src/dom/nativescript-vue-next/runtime/index.ts +21 -0
- package/svelte-nodegui/src/dom/nativescript-vue-next/runtime/nodes.ts +890 -0
- package/svelte-nodegui/src/dom/nativescript-vue-next/runtime/registry.ts +262 -0
- package/svelte-nodegui/src/dom/nativescript-vue-next/runtime/runtimeHelpers.ts +20 -0
- package/svelte-nodegui/src/dom/react-nodegui/LICENSE +21 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/AbstractComponents/RNAbstractButton.ts +67 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/Action/RNAction.ts +146 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/Action/index.ts +37 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/AnimatedImage/RNAnimatedImage.ts +76 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/AnimatedImage/index.ts +45 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/BoxView/RNBoxView.ts +99 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/BoxView/index.ts +49 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/Button/RNButton.ts +71 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/Button/index.ts +49 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/CheckBox/RNCheckBox.ts +71 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/CheckBox/index.ts +50 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/ComboBox/RNComboBox.ts +118 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/ComboBox/index.ts +50 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/Dial/RNDial.ts +69 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/Dial/index.ts +41 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/GridView/GridColumn/RNGridColumn.ts +95 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/GridView/GridColumn/index.ts +49 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/GridView/GridRow/RNGridRow.ts +141 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/GridView/GridRow/index.ts +47 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/GridView/RNGridView.ts +185 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/GridView/index.ts +51 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/GridView/utils.ts +59 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/Image/RNImage.ts +135 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/Image/index.ts +46 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/LineEdit/RNLineEdit.ts +82 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/LineEdit/index.ts +41 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/Menu/RNMenu.ts +49 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/Menu/index.ts +44 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/MenuBar/RNMenuBar.ts +51 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/MenuBar/index.ts +42 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/PlainTextEdit/RNPlainTextEdit.ts +82 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/PlainTextEdit/index.ts +44 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/ProgressBar/RNProgressBar.ts +78 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/ProgressBar/index.ts +43 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/RadioButton/RNRadioButton.ts +50 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/RadioButton/index.ts +43 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/ScrollArea/RNScrollArea.ts +51 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/ScrollArea/index.ts +44 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/Slider/RNSlider.ts +97 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/Slider/index.ts +46 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/SpinBox/RNSpinBox.ts +88 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/SpinBox/index.ts +49 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/Svg/RNSvg.ts +67 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/Svg/index.ts +43 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/SystemTrayIcon/RNSystemTrayIcon.ts +141 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/SystemTrayIcon/index.ts +43 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/Tab/RNTab.ts +69 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/Tab/index.ts +48 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/TabItem/RNTabItem.ts +72 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/TabItem/index.ts +40 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/Text/RNText.ts +65 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/Text/index.ts +49 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/View/RNView.ts +306 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/View/index.ts +44 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/Window/RNWindow.ts +66 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/Window/index.ts +50 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/components/config.ts +95 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/index.ts +52 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/reconciler/index.ts +226 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/utils/decoupleFromReact.ts +2 -0
- package/svelte-nodegui/src/dom/react-nodegui/src/utils/helpers.ts +14 -0
- package/svelte-nodegui/src/dom/shared/Logger.ts +16 -0
- package/svelte-nodegui/src/dom/shared/index.ts +1 -0
- package/svelte-nodegui/src/dom/svelte/HeadElement.ts +41 -0
- package/svelte-nodegui/src/dom/svelte/RNObject.ts +95 -0
- package/svelte-nodegui/src/dom/svelte/StyleElement.ts +92 -0
- package/svelte-nodegui/src/dom/svelte/SvelteNodeGUIDocument.ts +124 -0
- package/svelte-nodegui/src/dom/svelte/TemplateElement.ts +16 -0
- package/svelte-nodegui/src/dom/svelte-elements.ts +111 -0
- package/svelte-nodegui/src/index.ts +62 -0
- package/svelte-nodegui/src/svelte-nodegui.ts +159 -0
- package/svelte-nodegui/src/transitions/bezier.ts +112 -0
- package/svelte-nodegui/src/transitions/index.ts +227 -0
- package/svelte-nodegui/tsconfig.json +19 -0
- package/svelte-nodegui/website/README.md +33 -0
- package/svelte-nodegui/website/blog/2019-05-30-welcome.md +12 -0
- package/svelte-nodegui/website/docs/api/classes/renderer.md +49 -0
- package/svelte-nodegui/website/docs/api/classes/rnaction.md +608 -0
- package/svelte-nodegui/website/docs/api/classes/rngridcolumn.md +232 -0
- package/svelte-nodegui/website/docs/api/classes/rngridrow.md +247 -0
- package/svelte-nodegui/website/docs/api/classes/rnmenu.md +1337 -0
- package/svelte-nodegui/website/docs/api/classes/rnmenubar.md +1341 -0
- package/svelte-nodegui/website/docs/api/globals.md +832 -0
- package/svelte-nodegui/website/docs/api/index.md +0 -0
- package/svelte-nodegui/website/docs/api/interfaces/_react_proxy_.reactproxycomponent.md +38 -0
- package/svelte-nodegui/website/docs/api/interfaces/abstractbuttonprops.md +306 -0
- package/svelte-nodegui/website/docs/api/interfaces/actionprops.md +115 -0
- package/svelte-nodegui/website/docs/api/interfaces/animatedimageprops.md +297 -0
- package/svelte-nodegui/website/docs/api/interfaces/boxviewprops.md +245 -0
- package/svelte-nodegui/website/docs/api/interfaces/buttonprops.md +313 -0
- package/svelte-nodegui/website/docs/api/interfaces/checkboxprops.md +313 -0
- package/svelte-nodegui/website/docs/api/interfaces/comboboxprops.md +343 -0
- package/svelte-nodegui/website/docs/api/interfaces/datawithoffset.md +32 -0
- package/svelte-nodegui/website/docs/api/interfaces/dialprops.md +259 -0
- package/svelte-nodegui/website/docs/api/interfaces/gridviewprops.md +273 -0
- package/svelte-nodegui/website/docs/api/interfaces/imageprops.md +311 -0
- package/svelte-nodegui/website/docs/api/interfaces/lineeditprops.md +266 -0
- package/svelte-nodegui/website/docs/api/interfaces/menubarprops.md +245 -0
- package/svelte-nodegui/website/docs/api/interfaces/menuprops.md +245 -0
- package/svelte-nodegui/website/docs/api/interfaces/plaintexteditprops.md +259 -0
- package/svelte-nodegui/website/docs/api/interfaces/progressbarprops.md +266 -0
- package/svelte-nodegui/website/docs/api/interfaces/radiobuttonprops.md +282 -0
- package/svelte-nodegui/website/docs/api/interfaces/scrollareaprops.md +245 -0
- package/svelte-nodegui/website/docs/api/interfaces/sliderprops.md +329 -0
- package/svelte-nodegui/website/docs/api/interfaces/spinboxprops.md +273 -0
- package/svelte-nodegui/website/docs/api/interfaces/systemtrayiconprops.md +97 -0
- package/svelte-nodegui/website/docs/api/interfaces/tabitemprops.md +28 -0
- package/svelte-nodegui/website/docs/api/interfaces/tabprops.md +245 -0
- package/svelte-nodegui/website/docs/api/interfaces/textprops.md +277 -0
- package/svelte-nodegui/website/docs/api/interfaces/viewprops.md +261 -0
- package/svelte-nodegui/website/docs/api/interfaces/windowprops.md +245 -0
- package/svelte-nodegui/website/docs/api/modules/_react_proxy_.md +29 -0
- package/svelte-nodegui/website/docs/doc1.md +162 -0
- package/svelte-nodegui/website/docs/guides/custom-nodegui-native-plugin.md +6 -0
- package/svelte-nodegui/website/docs/guides/debugging-in-vscode.md +39 -0
- package/svelte-nodegui/website/docs/guides/debugging.md +59 -0
- package/svelte-nodegui/website/docs/guides/getting-started.md +141 -0
- package/svelte-nodegui/website/docs/guides/handle-events.md +188 -0
- package/svelte-nodegui/website/docs/guides/images.md +62 -0
- package/svelte-nodegui/website/docs/guides/layout.md +281 -0
- package/svelte-nodegui/website/docs/guides/networking.md +31 -0
- package/svelte-nodegui/website/docs/guides/packaging.md +32 -0
- package/svelte-nodegui/website/docs/guides/scroll-view.md +69 -0
- package/svelte-nodegui/website/docs/guides/styling.md +208 -0
- package/svelte-nodegui/website/docs/guides/tutorial.md +82 -0
- package/svelte-nodegui/website/docs/guides/using-native-node-modules.md +55 -0
- package/svelte-nodegui/website/docs/mdx.md +22 -0
- package/svelte-nodegui/website/docs/scripts/fixdocs.js +21 -0
- package/svelte-nodegui/website/docusaurus.config.js +131 -0
- package/svelte-nodegui/website/package.json +33 -0
- package/svelte-nodegui/website/sidebars.js +77 -0
- package/svelte-nodegui/website/src/components/CodeExample.js +42 -0
- package/svelte-nodegui/website/src/components/CreateNativeApps.js +46 -0
- package/svelte-nodegui/website/src/components/Features.js +62 -0
- package/svelte-nodegui/website/src/components/Hero.js +85 -0
- package/svelte-nodegui/website/src/components/SplitView.js +18 -0
- package/svelte-nodegui/website/src/components/Talks.js +68 -0
- package/svelte-nodegui/website/src/components/Try.js +83 -0
- package/svelte-nodegui/website/src/components/common.js +41 -0
- package/svelte-nodegui/website/src/components/styles.css +61 -0
- package/svelte-nodegui/website/src/css/custom.css +34 -0
- package/svelte-nodegui/website/src/pages/index.js +32 -0
- package/svelte-nodegui/website/src/pages/styles.module.css +35 -0
- package/svelte-nodegui/website/static/CNAME +1 -0
- package/svelte-nodegui/website/static/img/box-layout-1.png +0 -0
- package/svelte-nodegui/website/static/img/box-layout-2.png +0 -0
- package/svelte-nodegui/website/static/img/code-sample.png +0 -0
- package/svelte-nodegui/website/static/img/demo.png +0 -0
- package/svelte-nodegui/website/static/img/favicon.ico +0 -0
- package/svelte-nodegui/website/static/img/flex-layout-1.png +0 -0
- package/svelte-nodegui/website/static/img/grid-layout-1.png +0 -0
- package/svelte-nodegui/website/static/img/logo-circle.png +0 -0
- package/svelte-nodegui/website/static/img/logo.png +0 -0
- package/svelte-nodegui/website/static/img/logo.svg +5 -0
- package/svelte-nodegui/website/static/img/logox200.png +0 -0
- package/svelte-nodegui/website/static/img/undraw_building_websites.svg +1 -0
- package/svelte-nodegui/website/static/img/undraw_code_review.svg +1 -0
- package/svelte-nodegui/website/static/img/undraw_docusaurus_mountain.svg +170 -0
- package/svelte-nodegui/website/static/img/undraw_docusaurus_react.svg +169 -0
- package/svelte-nodegui/website/static/img/undraw_docusaurus_tree.svg +1 -0
- package/svelte-nodegui/website/static/img/undraw_react.svg +1 -0
- package/svelte-nodegui/website/static/img/undraw_website_setup.svg +1 -0
- package/svelte-nodegui/website/static/img/undraw_windows.svg +11 -0
- package/svelte-nodegui/website/website/sidebars.js +32 -0
- package/svelte-nodegui/website/yarn.lock +10533 -0
- package/bun.lock +0 -159
- package/docs-config/bun.lock +0 -6139
package/svelte-nodegui/src/dom/react-nodegui/src/components/GridView/GridColumn/RNGridColumn.ts
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { FunctionComponentElement } from "../../../utils/decoupleFromReact";
|
|
2
|
+
import { Component, NodeWidget } from "@nodegui/nodegui";
|
|
3
|
+
import { RNComponent } from "../../config";
|
|
4
|
+
import { RNGridRow } from "../GridRow/RNGridRow";
|
|
5
|
+
|
|
6
|
+
export type GridColumnProps = {
|
|
7
|
+
/**
|
|
8
|
+
* The number of horizontal units to occupy
|
|
9
|
+
*/
|
|
10
|
+
width?: number;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const setGridColumnProps = (
|
|
14
|
+
widget: RNGridColumn,
|
|
15
|
+
parentRow: RNGridRow,
|
|
16
|
+
newProps: GridColumnProps,
|
|
17
|
+
oldProps: GridColumnProps
|
|
18
|
+
) => {
|
|
19
|
+
if (widget.actualWidget) {
|
|
20
|
+
// TODO: Optimize this
|
|
21
|
+
parentRow.parentGrid?.layout?.removeWidget(widget.actualWidget);
|
|
22
|
+
parentRow.parentGrid?.layout?.addWidget(
|
|
23
|
+
widget.actualWidget,
|
|
24
|
+
parentRow.rowIndex ?? 0,
|
|
25
|
+
widget.columnIndex ?? 0,
|
|
26
|
+
parentRow.height ?? 1,
|
|
27
|
+
widget.width ?? 1
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const setter: GridColumnProps = {
|
|
32
|
+
set width(width: number) {
|
|
33
|
+
widget.width = width;
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
Object.assign(setter, newProps);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export class RNGridColumn extends Component implements RNComponent {
|
|
40
|
+
native: any;
|
|
41
|
+
actualWidget?: NodeWidget<any>;
|
|
42
|
+
parentRow?: RNGridRow;
|
|
43
|
+
latestProps?: GridColumnProps;
|
|
44
|
+
prevProps?: GridColumnProps;
|
|
45
|
+
columnIndex?: number;
|
|
46
|
+
width?: number;
|
|
47
|
+
|
|
48
|
+
setParentRowAndUpdateProps(parentRow: RNGridRow, index: number): void {
|
|
49
|
+
this.parentRow = parentRow;
|
|
50
|
+
this.columnIndex = index;
|
|
51
|
+
setGridColumnProps(
|
|
52
|
+
this,
|
|
53
|
+
parentRow,
|
|
54
|
+
this.latestProps ?? {},
|
|
55
|
+
this.prevProps ?? {}
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
remove(): void {
|
|
60
|
+
if (!this.actualWidget) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
this.parentRow?.parentGrid?.layout?.removeWidget(this.actualWidget);
|
|
65
|
+
this.actualWidget.close();
|
|
66
|
+
this.actualWidget = undefined;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/* RNComponent */
|
|
70
|
+
|
|
71
|
+
setProps(newProps: GridColumnProps, oldProps: GridColumnProps): void {
|
|
72
|
+
if (this.parentRow) {
|
|
73
|
+
setGridColumnProps(this, this.parentRow, newProps, oldProps);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
this.latestProps = newProps;
|
|
77
|
+
this.prevProps = oldProps;
|
|
78
|
+
}
|
|
79
|
+
appendInitialChild(child: NodeWidget<any>): void {
|
|
80
|
+
if (this.actualWidget) {
|
|
81
|
+
throw new Error("Grid column can have only one child");
|
|
82
|
+
}
|
|
83
|
+
this.actualWidget = child;
|
|
84
|
+
}
|
|
85
|
+
appendChild(child: NodeWidget<any>): void {
|
|
86
|
+
this.appendInitialChild(child);
|
|
87
|
+
}
|
|
88
|
+
insertBefore(child: NodeWidget<any>, beforeChild: NodeWidget<any>): void {
|
|
89
|
+
this.appendInitialChild(child);
|
|
90
|
+
}
|
|
91
|
+
removeChild(child: NodeWidget<any>): void {
|
|
92
|
+
this.remove();
|
|
93
|
+
}
|
|
94
|
+
static tagName: string = "gridcolumn";
|
|
95
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { Fiber } from "../../../utils/decoupleFromReact";
|
|
2
|
+
import { GridColumnProps, RNGridColumn } from "./RNGridColumn";
|
|
3
|
+
import { AppContainer } from "../../../reconciler";
|
|
4
|
+
import { registerComponent, ComponentConfig } from "../../config";
|
|
5
|
+
|
|
6
|
+
class GridColumnConfig extends ComponentConfig {
|
|
7
|
+
tagName = RNGridColumn.tagName;
|
|
8
|
+
shouldSetTextContent(nextProps: GridColumnProps): boolean {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
createInstance(
|
|
12
|
+
newProps: GridColumnProps,
|
|
13
|
+
rootInstance: AppContainer,
|
|
14
|
+
context: any,
|
|
15
|
+
workInProgress: Fiber
|
|
16
|
+
): RNGridColumn {
|
|
17
|
+
const widget = new RNGridColumn();
|
|
18
|
+
widget.setProps(newProps, newProps);
|
|
19
|
+
return widget;
|
|
20
|
+
}
|
|
21
|
+
finalizeInitialChildren(
|
|
22
|
+
instance: RNGridColumn,
|
|
23
|
+
newProps: GridColumnProps,
|
|
24
|
+
rootContainerInstance: AppContainer,
|
|
25
|
+
context: any
|
|
26
|
+
): boolean {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
commitMount(
|
|
30
|
+
instance: RNGridColumn,
|
|
31
|
+
newProps: GridColumnProps,
|
|
32
|
+
internalInstanceHandle: any
|
|
33
|
+
): void {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
commitUpdate(
|
|
37
|
+
instance: RNGridColumn,
|
|
38
|
+
updatePayload: any,
|
|
39
|
+
oldProps: GridColumnProps,
|
|
40
|
+
newProps: GridColumnProps,
|
|
41
|
+
finishedWork: Fiber
|
|
42
|
+
): void {
|
|
43
|
+
instance.setProps(newProps, oldProps);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export const GridColumn = registerComponent<GridColumnProps>(
|
|
48
|
+
new GridColumnConfig()
|
|
49
|
+
);
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import type { FunctionComponentElement } from "../../../utils/decoupleFromReact";
|
|
2
|
+
import { GridColumnProps, RNGridColumn } from "../GridColumn/RNGridColumn";
|
|
3
|
+
import { Component } from "@nodegui/nodegui";
|
|
4
|
+
import { RNComponent } from "../../config";
|
|
5
|
+
import { RNGridView } from "../RNGridView";
|
|
6
|
+
import {
|
|
7
|
+
DataWithOffset,
|
|
8
|
+
updateDisplacedChildren,
|
|
9
|
+
offsetForIndex,
|
|
10
|
+
} from "../utils";
|
|
11
|
+
|
|
12
|
+
export type GridRowProps = {
|
|
13
|
+
children:
|
|
14
|
+
| Array<FunctionComponentElement<GridColumnProps>>
|
|
15
|
+
| FunctionComponentElement<GridColumnProps>;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* The number of vertical units to occupy
|
|
19
|
+
*/
|
|
20
|
+
height?: number;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const setGridRowProps = (
|
|
24
|
+
widget: RNGridRow,
|
|
25
|
+
parentGrid: RNGridView,
|
|
26
|
+
newProps: Omit<GridRowProps, "children">,
|
|
27
|
+
oldProps: Omit<GridRowProps, "children">
|
|
28
|
+
) => {
|
|
29
|
+
const setter: Omit<GridRowProps, "children"> = {
|
|
30
|
+
set height(height: number) {
|
|
31
|
+
widget.height = height;
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
Object.assign(setter, newProps);
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export class RNGridRow extends Component implements RNComponent {
|
|
38
|
+
native: any;
|
|
39
|
+
parentGrid?: RNGridView;
|
|
40
|
+
latestProps?: GridRowProps;
|
|
41
|
+
prevProps?: GridRowProps;
|
|
42
|
+
childColumns: Array<DataWithOffset<RNGridColumn>> = [];
|
|
43
|
+
rowIndex?: number;
|
|
44
|
+
height?: number;
|
|
45
|
+
|
|
46
|
+
setParentGridAndUpdateProps(parentGrid: RNGridView, index: number): void {
|
|
47
|
+
this.parentGrid = parentGrid;
|
|
48
|
+
this.rowIndex = index;
|
|
49
|
+
setGridRowProps(
|
|
50
|
+
this,
|
|
51
|
+
parentGrid,
|
|
52
|
+
this.latestProps ?? {},
|
|
53
|
+
this.prevProps ?? {}
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
this.updateChildren();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
updateChildren(startIndex = 0): void {
|
|
60
|
+
updateDisplacedChildren<RNGridColumn, RNGridRow>(
|
|
61
|
+
startIndex,
|
|
62
|
+
this.childColumns,
|
|
63
|
+
this,
|
|
64
|
+
"width",
|
|
65
|
+
"setParentRowAndUpdateProps"
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
remove(): void {
|
|
70
|
+
this.childColumns.forEach(({ data }) => data.remove());
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/* RNComponent */
|
|
74
|
+
|
|
75
|
+
setProps(newProps: GridRowProps, oldProps: GridRowProps): void {
|
|
76
|
+
if (this.parentGrid) {
|
|
77
|
+
setGridRowProps(this, this.parentGrid, newProps, oldProps);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
this.latestProps = newProps;
|
|
81
|
+
this.prevProps = oldProps;
|
|
82
|
+
}
|
|
83
|
+
appendInitialChild(child: RNGridColumn): void {
|
|
84
|
+
this.appendChild(child);
|
|
85
|
+
}
|
|
86
|
+
appendChild(child: RNGridColumn): void {
|
|
87
|
+
if (!(child instanceof RNGridColumn)) {
|
|
88
|
+
throw new Error("GridColumn is the only supported child of GridRow");
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const offset = offsetForIndex<RNGridColumn>(
|
|
92
|
+
this.childColumns.length,
|
|
93
|
+
this.childColumns,
|
|
94
|
+
"width"
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
child.setParentRowAndUpdateProps(this, offset);
|
|
98
|
+
|
|
99
|
+
this.childColumns.push({
|
|
100
|
+
offset,
|
|
101
|
+
data: child,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
insertBefore(child: RNGridColumn, beforeChild: RNGridColumn): void {
|
|
105
|
+
const prevIndex = this.childColumns.findIndex(
|
|
106
|
+
({ data }) => data === beforeChild
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
if (prevIndex === -1) {
|
|
110
|
+
throw new Error(
|
|
111
|
+
"Attempted to insert child GridColumn before nonexistent column"
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const offset = offsetForIndex<RNGridColumn>(
|
|
116
|
+
prevIndex,
|
|
117
|
+
this.childColumns,
|
|
118
|
+
"width"
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
this.childColumns.splice(prevIndex, 0, {
|
|
122
|
+
offset,
|
|
123
|
+
data: child,
|
|
124
|
+
});
|
|
125
|
+
// Update displaced children
|
|
126
|
+
this.updateChildren(prevIndex);
|
|
127
|
+
}
|
|
128
|
+
removeChild(child: RNGridColumn): void {
|
|
129
|
+
const prevIndex = this.childColumns.findIndex(({ data }) => data === child);
|
|
130
|
+
|
|
131
|
+
if (prevIndex !== -1) {
|
|
132
|
+
this.childColumns.splice(prevIndex, 1);
|
|
133
|
+
this.updateChildren(prevIndex);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Actually remove child from layout
|
|
137
|
+
child.remove();
|
|
138
|
+
child.parentRow = undefined;
|
|
139
|
+
}
|
|
140
|
+
static tagName: string = "gridrow";
|
|
141
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { Fiber } from "../../../utils/decoupleFromReact";
|
|
2
|
+
import { AppContainer } from "../../../reconciler";
|
|
3
|
+
import { registerComponent, ComponentConfig } from "../../config";
|
|
4
|
+
import { RNGridRow, GridRowProps } from "./RNGridRow";
|
|
5
|
+
|
|
6
|
+
class GridRowConfig extends ComponentConfig {
|
|
7
|
+
tagName = RNGridRow.tagName;
|
|
8
|
+
shouldSetTextContent(nextProps: GridRowProps): boolean {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
createInstance(
|
|
12
|
+
newProps: GridRowProps,
|
|
13
|
+
rootInstance: AppContainer,
|
|
14
|
+
context: any,
|
|
15
|
+
workInProgress: Fiber
|
|
16
|
+
): RNGridRow {
|
|
17
|
+
const widget = new RNGridRow();
|
|
18
|
+
widget.setProps(newProps, newProps);
|
|
19
|
+
return widget;
|
|
20
|
+
}
|
|
21
|
+
finalizeInitialChildren(
|
|
22
|
+
instance: RNGridRow,
|
|
23
|
+
newProps: GridRowProps,
|
|
24
|
+
rootContainerInstance: AppContainer,
|
|
25
|
+
context: any
|
|
26
|
+
): boolean {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
commitMount(
|
|
30
|
+
instance: RNGridRow,
|
|
31
|
+
newProps: GridRowProps,
|
|
32
|
+
internalInstanceHandle: any
|
|
33
|
+
): void {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
commitUpdate(
|
|
37
|
+
instance: RNGridRow,
|
|
38
|
+
updatePayload: any,
|
|
39
|
+
oldProps: GridRowProps,
|
|
40
|
+
newProps: GridRowProps,
|
|
41
|
+
finishedWork: Fiber
|
|
42
|
+
): void {
|
|
43
|
+
instance.setProps(newProps, oldProps);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export const GridRow = registerComponent<GridRowProps>(new GridRowConfig());
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import type { FunctionComponentElement } from "../../utils/decoupleFromReact";
|
|
2
|
+
import { QGridLayoutSignals, QGridLayout, QWidget } from "@nodegui/nodegui";
|
|
3
|
+
import { ViewProps, setViewProps } from "../View/RNView";
|
|
4
|
+
import { RNComponent } from "../config";
|
|
5
|
+
import { RNGridRow, GridRowProps } from "./GridRow/RNGridRow";
|
|
6
|
+
import {
|
|
7
|
+
DataWithOffset,
|
|
8
|
+
offsetForIndex,
|
|
9
|
+
updateDisplacedChildren,
|
|
10
|
+
} from "./utils";
|
|
11
|
+
|
|
12
|
+
export type GridViewColumnProps = {
|
|
13
|
+
[ColumnIndex: number]: {
|
|
14
|
+
stretch?: number;
|
|
15
|
+
minWidth?: number;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export type GridViewRowProps = {
|
|
20
|
+
[RowIndex: number]: {
|
|
21
|
+
stretch?: number;
|
|
22
|
+
minHeight?: number;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export interface GridViewProps extends ViewProps<QGridLayoutSignals> {
|
|
27
|
+
children:
|
|
28
|
+
| Array<FunctionComponentElement<GridRowProps>>
|
|
29
|
+
| FunctionComponentElement<GridRowProps>;
|
|
30
|
+
|
|
31
|
+
columnProps?: GridViewColumnProps;
|
|
32
|
+
rowProps?: GridViewRowProps;
|
|
33
|
+
|
|
34
|
+
horizontalSpacing?: number;
|
|
35
|
+
verticalSpacing?: number;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const setGridViewProps = (
|
|
39
|
+
widget: RNGridView,
|
|
40
|
+
newProps: Omit<GridViewProps, "children">,
|
|
41
|
+
oldProps: Omit<GridViewProps, "children">
|
|
42
|
+
) => {
|
|
43
|
+
const setter: Omit<GridViewProps, "children"> = {
|
|
44
|
+
set horizontalSpacing(spacing: number) {
|
|
45
|
+
widget.layout?.setHorizontalSpacing(spacing);
|
|
46
|
+
},
|
|
47
|
+
set verticalSpacing(spacing: number) {
|
|
48
|
+
widget.layout?.setVerticalSpacing(spacing);
|
|
49
|
+
},
|
|
50
|
+
set columnProps(props: GridViewColumnProps) {
|
|
51
|
+
for (const indexString of Object.keys(props)) {
|
|
52
|
+
const index = parseInt(indexString, 10);
|
|
53
|
+
const { stretch, minWidth } = props[index];
|
|
54
|
+
|
|
55
|
+
widget.layout?.setColumnStretch(index, stretch ?? 0);
|
|
56
|
+
widget.layout?.setColumnMinimumWidth(index, minWidth ?? 0);
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
set rowProps(props: GridViewRowProps) {
|
|
60
|
+
for (const indexString of Object.keys(props)) {
|
|
61
|
+
const index = parseInt(indexString, 10);
|
|
62
|
+
const { stretch, minHeight } = props[index];
|
|
63
|
+
|
|
64
|
+
widget.layout?.setRowStretch(index, stretch ?? 0);
|
|
65
|
+
widget.layout?.setRowMinimumHeight(index, minHeight ?? 0);
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
Object.assign(setter, newProps);
|
|
70
|
+
setViewProps(widget, newProps, oldProps);
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* @ignore
|
|
75
|
+
*/
|
|
76
|
+
export class RNGridView extends QWidget implements RNComponent {
|
|
77
|
+
native: any;
|
|
78
|
+
_layout?: QGridLayout;
|
|
79
|
+
initialProps?: GridViewProps;
|
|
80
|
+
childRows: Array<DataWithOffset<RNGridRow>> = [];
|
|
81
|
+
|
|
82
|
+
get layout() {
|
|
83
|
+
return this.layout;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
set layout(l: QGridLayout) {
|
|
87
|
+
this._layout = l;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
updateChildren(startIndex = 0): void {
|
|
91
|
+
updateDisplacedChildren<RNGridRow, RNGridView>(
|
|
92
|
+
startIndex,
|
|
93
|
+
this.childRows,
|
|
94
|
+
this,
|
|
95
|
+
"height",
|
|
96
|
+
"setParentGridAndUpdateProps"
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/* RNComponent */
|
|
101
|
+
|
|
102
|
+
setProps(newProps: GridViewProps, oldProps: GridViewProps): void {
|
|
103
|
+
if (this.layout) {
|
|
104
|
+
setGridViewProps(this, newProps, oldProps);
|
|
105
|
+
} else {
|
|
106
|
+
this.initialProps = newProps;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
appendInitialChild(child: RNGridRow): void {
|
|
110
|
+
this.appendChild(child);
|
|
111
|
+
}
|
|
112
|
+
appendChild(child: RNGridRow): void {
|
|
113
|
+
if (!(child instanceof RNGridRow)) {
|
|
114
|
+
throw new Error("GridRow is the only supported child of GridView");
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const updateChild = () => {
|
|
118
|
+
const offset = offsetForIndex<RNGridRow>(
|
|
119
|
+
this.childRows.length,
|
|
120
|
+
this.childRows,
|
|
121
|
+
"height"
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
child.setParentGridAndUpdateProps(this, offset);
|
|
125
|
+
|
|
126
|
+
this.childRows.push({
|
|
127
|
+
offset,
|
|
128
|
+
data: child,
|
|
129
|
+
});
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
if (this.layout) {
|
|
133
|
+
updateChild();
|
|
134
|
+
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const layout = new QGridLayout();
|
|
139
|
+
this.setLayout(layout);
|
|
140
|
+
this.layout = layout;
|
|
141
|
+
|
|
142
|
+
// Newly created layout, so set initial props
|
|
143
|
+
if (this.initialProps) {
|
|
144
|
+
setGridViewProps(this, this.initialProps, {});
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
updateChild();
|
|
148
|
+
}
|
|
149
|
+
insertBefore(child: RNGridRow, beforeChild: RNGridRow): void {
|
|
150
|
+
const prevIndex = this.childRows.findIndex(
|
|
151
|
+
({ data }) => data === beforeChild
|
|
152
|
+
);
|
|
153
|
+
|
|
154
|
+
if (prevIndex === -1) {
|
|
155
|
+
throw new Error(
|
|
156
|
+
"Attempted to insert child GridRow before nonexistent row"
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
const offset = offsetForIndex<RNGridRow>(
|
|
161
|
+
prevIndex,
|
|
162
|
+
this.childRows,
|
|
163
|
+
"height"
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
this.childRows.splice(prevIndex, 0, {
|
|
167
|
+
offset,
|
|
168
|
+
data: child,
|
|
169
|
+
});
|
|
170
|
+
// Update displaced children
|
|
171
|
+
this.updateChildren(prevIndex);
|
|
172
|
+
}
|
|
173
|
+
removeChild(child: RNGridRow): void {
|
|
174
|
+
const prevIndex = this.childRows.findIndex(({ data }) => data === child);
|
|
175
|
+
|
|
176
|
+
if (prevIndex !== -1) {
|
|
177
|
+
this.childRows.splice(prevIndex, 1);
|
|
178
|
+
this.updateChildren(prevIndex);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
child.remove();
|
|
182
|
+
child.parentGrid = undefined;
|
|
183
|
+
}
|
|
184
|
+
static tagName: string = "gridview";
|
|
185
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { registerComponent, ComponentConfig } from "../config";
|
|
2
|
+
import type { Fiber } from "../../utils/decoupleFromReact";
|
|
3
|
+
import { AppContainer } from "../../reconciler";
|
|
4
|
+
import { RNGridView, GridViewProps } from "./RNGridView";
|
|
5
|
+
|
|
6
|
+
class GridViewConfig extends ComponentConfig {
|
|
7
|
+
tagName = RNGridView.tagName;
|
|
8
|
+
shouldSetTextContent(nextProps: GridViewProps): boolean {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
createInstance(
|
|
12
|
+
newProps: GridViewProps,
|
|
13
|
+
rootInstance: AppContainer,
|
|
14
|
+
context: any,
|
|
15
|
+
workInProgress: Fiber
|
|
16
|
+
): RNGridView {
|
|
17
|
+
const widget = new RNGridView();
|
|
18
|
+
widget.setProps(newProps, {
|
|
19
|
+
children: [],
|
|
20
|
+
});
|
|
21
|
+
return widget;
|
|
22
|
+
}
|
|
23
|
+
finalizeInitialChildren(
|
|
24
|
+
instance: RNGridView,
|
|
25
|
+
newProps: GridViewProps,
|
|
26
|
+
rootContainerInstance: AppContainer,
|
|
27
|
+
context: any
|
|
28
|
+
): boolean {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
commitMount(
|
|
32
|
+
instance: RNGridView,
|
|
33
|
+
newProps: GridViewProps,
|
|
34
|
+
internalInstanceHandle: any
|
|
35
|
+
): void {
|
|
36
|
+
if (newProps.visible !== false) {
|
|
37
|
+
instance.show();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
commitUpdate(
|
|
41
|
+
instance: RNGridView,
|
|
42
|
+
updatePayload: any,
|
|
43
|
+
oldProps: GridViewProps,
|
|
44
|
+
newProps: GridViewProps,
|
|
45
|
+
finishedWork: Fiber
|
|
46
|
+
): void {
|
|
47
|
+
instance.setProps(newProps, oldProps);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export const GridView = registerComponent<GridViewProps>(new GridViewConfig());
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export interface DataWithOffset<T> {
|
|
2
|
+
offset: number;
|
|
3
|
+
data: T;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
type SetParentFunc<T> = (parent: T, index: number) => void;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Extract the keys of type `T` matching type `TType`
|
|
10
|
+
*/
|
|
11
|
+
type KeysOfType<T, TType> = {
|
|
12
|
+
[Key in keyof T]-?: T[Key] extends TType | undefined ? Key : never;
|
|
13
|
+
}[keyof T];
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Show TypeScript that the fields we're interested in are of type `TType`
|
|
17
|
+
*/
|
|
18
|
+
type OnlyType<T, TType> = {
|
|
19
|
+
[Key in KeysOfType<T, TType>]?: TType;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export const offsetForIndex = <T>(
|
|
23
|
+
index: number,
|
|
24
|
+
items: Array<DataWithOffset<OnlyType<T, number>>>,
|
|
25
|
+
sizeKey: keyof OnlyType<T, number>
|
|
26
|
+
) => {
|
|
27
|
+
let offset = 0;
|
|
28
|
+
|
|
29
|
+
if (index > 0) {
|
|
30
|
+
const previousChild = items[index - 1];
|
|
31
|
+
offset = previousChild.offset + (previousChild.data[sizeKey] ?? 1);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return offset;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
type Allowed<TItem, TParent> = OnlyType<TItem, SetParentFunc<TParent>>;
|
|
38
|
+
export function updateDisplacedChildren<TItem, TParent>(
|
|
39
|
+
startIndex: number,
|
|
40
|
+
items: Array<
|
|
41
|
+
DataWithOffset<
|
|
42
|
+
OnlyType<TItem, number> & Allowed<TItem, TParent>
|
|
43
|
+
>
|
|
44
|
+
>,
|
|
45
|
+
parent: TParent,
|
|
46
|
+
sizeKey: keyof OnlyType<TItem, number>,
|
|
47
|
+
setParentFuncKey: keyof Allowed<TItem, TParent>
|
|
48
|
+
) {
|
|
49
|
+
let offset = offsetForIndex(startIndex, items, sizeKey);
|
|
50
|
+
|
|
51
|
+
for (let i = startIndex; i < items.length; i++) {
|
|
52
|
+
const displacedChild = items[i];
|
|
53
|
+
|
|
54
|
+
displacedChild.offset = offset;
|
|
55
|
+
displacedChild.data[setParentFuncKey]?.(parent, offset);
|
|
56
|
+
|
|
57
|
+
offset += displacedChild.data[sizeKey] ?? 1;
|
|
58
|
+
}
|
|
59
|
+
};
|