@gtkx/react 0.18.0 → 0.18.2
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/dist/errors.d.ts +1 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +1 -0
- package/dist/errors.js.map +1 -0
- package/dist/factory.d.ts +1 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/factory.js +1 -0
- package/dist/factory.js.map +1 -0
- package/dist/fiber-root.d.ts +1 -0
- package/dist/fiber-root.d.ts.map +1 -0
- package/dist/fiber-root.js +1 -0
- package/dist/fiber-root.js.map +1 -0
- package/dist/generated/internal.d.ts +1 -0
- package/dist/generated/internal.d.ts.map +1 -0
- package/dist/generated/internal.js +1 -0
- package/dist/generated/internal.js.map +1 -0
- package/dist/generated/jsx.d.ts +1 -0
- package/dist/generated/jsx.d.ts.map +1 -0
- package/dist/generated/jsx.js +1 -0
- package/dist/generated/jsx.js.map +1 -0
- package/dist/generated/registry.d.ts +1 -0
- package/dist/generated/registry.d.ts.map +1 -0
- package/dist/generated/registry.js +1 -0
- package/dist/generated/registry.js.map +1 -0
- package/dist/host-config.d.ts +1 -0
- package/dist/host-config.d.ts.map +1 -0
- package/dist/host-config.js +1 -0
- package/dist/host-config.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -0
- package/dist/jsx.d.ts +1 -0
- package/dist/jsx.d.ts.map +1 -0
- package/dist/jsx.js +1 -0
- package/dist/jsx.js.map +1 -0
- package/dist/metadata.d.ts +1 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +1 -0
- package/dist/metadata.js.map +1 -0
- package/dist/node.d.ts +1 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +1 -0
- package/dist/node.js.map +1 -0
- package/dist/nodes/adjustable.d.ts +1 -0
- package/dist/nodes/adjustable.d.ts.map +1 -0
- package/dist/nodes/adjustable.js +1 -0
- package/dist/nodes/adjustable.js.map +1 -0
- package/dist/nodes/alert-dialog-response.d.ts +1 -0
- package/dist/nodes/alert-dialog-response.d.ts.map +1 -0
- package/dist/nodes/alert-dialog-response.js +1 -0
- package/dist/nodes/alert-dialog-response.js.map +1 -0
- package/dist/nodes/animation.d.ts +1 -0
- package/dist/nodes/animation.d.ts.map +1 -0
- package/dist/nodes/animation.js +1 -0
- package/dist/nodes/animation.js.map +1 -0
- package/dist/nodes/application.d.ts +1 -0
- package/dist/nodes/application.d.ts.map +1 -0
- package/dist/nodes/application.js +1 -0
- package/dist/nodes/application.js.map +1 -0
- package/dist/nodes/calendar.d.ts +1 -0
- package/dist/nodes/calendar.d.ts.map +1 -0
- package/dist/nodes/calendar.js +1 -0
- package/dist/nodes/calendar.js.map +1 -0
- package/dist/nodes/color-dialog-button.d.ts +1 -0
- package/dist/nodes/color-dialog-button.d.ts.map +1 -0
- package/dist/nodes/color-dialog-button.js +1 -0
- package/dist/nodes/color-dialog-button.js.map +1 -0
- package/dist/nodes/column-view-column.d.ts +1 -0
- package/dist/nodes/column-view-column.d.ts.map +1 -0
- package/dist/nodes/column-view-column.js +1 -0
- package/dist/nodes/column-view-column.js.map +1 -0
- package/dist/nodes/column-view.d.ts +1 -0
- package/dist/nodes/column-view.d.ts.map +1 -0
- package/dist/nodes/column-view.js +1 -0
- package/dist/nodes/column-view.js.map +1 -0
- package/dist/nodes/container-slot.d.ts +1 -0
- package/dist/nodes/container-slot.d.ts.map +1 -0
- package/dist/nodes/container-slot.js +1 -0
- package/dist/nodes/container-slot.js.map +1 -0
- package/dist/nodes/dialog.d.ts +1 -0
- package/dist/nodes/dialog.d.ts.map +1 -0
- package/dist/nodes/dialog.js +1 -0
- package/dist/nodes/dialog.js.map +1 -0
- package/dist/nodes/drawing-area.d.ts +1 -0
- package/dist/nodes/drawing-area.d.ts.map +1 -0
- package/dist/nodes/drawing-area.js +1 -0
- package/dist/nodes/drawing-area.js.map +1 -0
- package/dist/nodes/drop-down.d.ts +1 -0
- package/dist/nodes/drop-down.d.ts.map +1 -0
- package/dist/nodes/drop-down.js +1 -0
- package/dist/nodes/drop-down.js.map +1 -0
- package/dist/nodes/event-controller.d.ts +1 -0
- package/dist/nodes/event-controller.d.ts.map +1 -0
- package/dist/nodes/event-controller.js +1 -0
- package/dist/nodes/event-controller.js.map +1 -0
- package/dist/nodes/fixed-child.d.ts +1 -0
- package/dist/nodes/fixed-child.d.ts.map +1 -0
- package/dist/nodes/fixed-child.js +1 -0
- package/dist/nodes/fixed-child.js.map +1 -0
- package/dist/nodes/font-dialog-button.d.ts +1 -0
- package/dist/nodes/font-dialog-button.d.ts.map +1 -0
- package/dist/nodes/font-dialog-button.js +1 -0
- package/dist/nodes/font-dialog-button.js.map +1 -0
- package/dist/nodes/grid-child.d.ts +1 -0
- package/dist/nodes/grid-child.d.ts.map +1 -0
- package/dist/nodes/grid-child.js +1 -0
- package/dist/nodes/grid-child.js.map +1 -0
- package/dist/nodes/grid-view.d.ts +1 -0
- package/dist/nodes/grid-view.d.ts.map +1 -0
- package/dist/nodes/grid-view.js +1 -0
- package/dist/nodes/grid-view.js.map +1 -0
- package/dist/nodes/internal/base-item-renderer.d.ts +1 -0
- package/dist/nodes/internal/base-item-renderer.d.ts.map +1 -0
- package/dist/nodes/internal/base-item-renderer.js +1 -0
- package/dist/nodes/internal/base-item-renderer.js.map +1 -0
- package/dist/nodes/internal/grid-item-renderer.d.ts +1 -0
- package/dist/nodes/internal/grid-item-renderer.d.ts.map +1 -0
- package/dist/nodes/internal/grid-item-renderer.js +1 -0
- package/dist/nodes/internal/grid-item-renderer.js.map +1 -0
- package/dist/nodes/internal/list-item-renderer.d.ts +1 -0
- package/dist/nodes/internal/list-item-renderer.d.ts.map +1 -0
- package/dist/nodes/internal/list-item-renderer.js +1 -0
- package/dist/nodes/internal/list-item-renderer.js.map +1 -0
- package/dist/nodes/internal/list-store.d.ts +1 -0
- package/dist/nodes/internal/list-store.d.ts.map +1 -0
- package/dist/nodes/internal/list-store.js +1 -0
- package/dist/nodes/internal/list-store.js.map +1 -0
- package/dist/nodes/internal/predicates.d.ts +1 -0
- package/dist/nodes/internal/predicates.d.ts.map +1 -0
- package/dist/nodes/internal/predicates.js +1 -0
- package/dist/nodes/internal/predicates.js.map +1 -0
- package/dist/nodes/internal/props.d.ts +1 -0
- package/dist/nodes/internal/props.d.ts.map +1 -0
- package/dist/nodes/internal/props.js +1 -0
- package/dist/nodes/internal/props.js.map +1 -0
- package/dist/nodes/internal/selection-model-controller.d.ts +1 -0
- package/dist/nodes/internal/selection-model-controller.d.ts.map +1 -0
- package/dist/nodes/internal/selection-model-controller.js +1 -0
- package/dist/nodes/internal/selection-model-controller.js.map +1 -0
- package/dist/nodes/internal/signal-store.d.ts +1 -0
- package/dist/nodes/internal/signal-store.d.ts.map +1 -0
- package/dist/nodes/internal/signal-store.js +1 -0
- package/dist/nodes/internal/signal-store.js.map +1 -0
- package/dist/nodes/internal/simple-list-store.d.ts +1 -0
- package/dist/nodes/internal/simple-list-store.d.ts.map +1 -0
- package/dist/nodes/internal/simple-list-store.js +1 -0
- package/dist/nodes/internal/simple-list-store.js.map +1 -0
- package/dist/nodes/internal/text-buffer-controller.d.ts +1 -0
- package/dist/nodes/internal/text-buffer-controller.d.ts.map +1 -0
- package/dist/nodes/internal/text-buffer-controller.js +1 -0
- package/dist/nodes/internal/text-buffer-controller.js.map +1 -0
- package/dist/nodes/internal/tree-store.d.ts +1 -0
- package/dist/nodes/internal/tree-store.d.ts.map +1 -0
- package/dist/nodes/internal/tree-store.js +1 -0
- package/dist/nodes/internal/tree-store.js.map +1 -0
- package/dist/nodes/internal/widget.d.ts +1 -0
- package/dist/nodes/internal/widget.d.ts.map +1 -0
- package/dist/nodes/internal/widget.js +1 -0
- package/dist/nodes/internal/widget.js.map +1 -0
- package/dist/nodes/level-bar.d.ts +1 -0
- package/dist/nodes/level-bar.d.ts.map +1 -0
- package/dist/nodes/level-bar.js +1 -0
- package/dist/nodes/level-bar.js.map +1 -0
- package/dist/nodes/list-item.d.ts +1 -0
- package/dist/nodes/list-item.d.ts.map +1 -0
- package/dist/nodes/list-item.js +1 -0
- package/dist/nodes/list-item.js.map +1 -0
- package/dist/nodes/list-view.d.ts +1 -0
- package/dist/nodes/list-view.d.ts.map +1 -0
- package/dist/nodes/list-view.js +1 -0
- package/dist/nodes/list-view.js.map +1 -0
- package/dist/nodes/menu.d.ts +1 -0
- package/dist/nodes/menu.d.ts.map +1 -0
- package/dist/nodes/menu.js +1 -0
- package/dist/nodes/menu.js.map +1 -0
- package/dist/nodes/models/grid.d.ts +1 -0
- package/dist/nodes/models/grid.d.ts.map +1 -0
- package/dist/nodes/models/grid.js +1 -0
- package/dist/nodes/models/grid.js.map +1 -0
- package/dist/nodes/models/list.d.ts +1 -0
- package/dist/nodes/models/list.d.ts.map +1 -0
- package/dist/nodes/models/list.js +1 -0
- package/dist/nodes/models/list.js.map +1 -0
- package/dist/nodes/models/menu.d.ts +1 -0
- package/dist/nodes/models/menu.d.ts.map +1 -0
- package/dist/nodes/models/menu.js +1 -0
- package/dist/nodes/models/menu.js.map +1 -0
- package/dist/nodes/navigation-page.d.ts +1 -0
- package/dist/nodes/navigation-page.d.ts.map +1 -0
- package/dist/nodes/navigation-page.js +1 -0
- package/dist/nodes/navigation-page.js.map +1 -0
- package/dist/nodes/navigation-view.d.ts +1 -0
- package/dist/nodes/navigation-view.d.ts.map +1 -0
- package/dist/nodes/navigation-view.js +1 -0
- package/dist/nodes/navigation-view.js.map +1 -0
- package/dist/nodes/notebook-page-tab.d.ts +1 -0
- package/dist/nodes/notebook-page-tab.d.ts.map +1 -0
- package/dist/nodes/notebook-page-tab.js +1 -0
- package/dist/nodes/notebook-page-tab.js.map +1 -0
- package/dist/nodes/notebook-page.d.ts +1 -0
- package/dist/nodes/notebook-page.d.ts.map +1 -0
- package/dist/nodes/notebook-page.js +1 -0
- package/dist/nodes/notebook-page.js.map +1 -0
- package/dist/nodes/notebook.d.ts +1 -0
- package/dist/nodes/notebook.d.ts.map +1 -0
- package/dist/nodes/notebook.js +1 -0
- package/dist/nodes/notebook.js.map +1 -0
- package/dist/nodes/overlay-child.d.ts +1 -0
- package/dist/nodes/overlay-child.d.ts.map +1 -0
- package/dist/nodes/overlay-child.js +1 -0
- package/dist/nodes/overlay-child.js.map +1 -0
- package/dist/nodes/popover-menu.d.ts +1 -0
- package/dist/nodes/popover-menu.d.ts.map +1 -0
- package/dist/nodes/popover-menu.js +1 -0
- package/dist/nodes/popover-menu.js.map +1 -0
- package/dist/nodes/scale.d.ts +1 -0
- package/dist/nodes/scale.d.ts.map +1 -0
- package/dist/nodes/scale.js +1 -0
- package/dist/nodes/scale.js.map +1 -0
- package/dist/nodes/scrolled-window.d.ts +1 -0
- package/dist/nodes/scrolled-window.d.ts.map +1 -0
- package/dist/nodes/scrolled-window.js +1 -0
- package/dist/nodes/scrolled-window.js.map +1 -0
- package/dist/nodes/search-bar.d.ts +1 -0
- package/dist/nodes/search-bar.d.ts.map +1 -0
- package/dist/nodes/search-bar.js +1 -0
- package/dist/nodes/search-bar.js.map +1 -0
- package/dist/nodes/shortcut-controller.d.ts +1 -0
- package/dist/nodes/shortcut-controller.d.ts.map +1 -0
- package/dist/nodes/shortcut-controller.js +1 -0
- package/dist/nodes/shortcut-controller.js.map +1 -0
- package/dist/nodes/shortcut.d.ts +1 -0
- package/dist/nodes/shortcut.d.ts.map +1 -0
- package/dist/nodes/shortcut.js +1 -0
- package/dist/nodes/shortcut.js.map +1 -0
- package/dist/nodes/slot.d.ts +1 -0
- package/dist/nodes/slot.d.ts.map +1 -0
- package/dist/nodes/slot.js +1 -0
- package/dist/nodes/slot.js.map +1 -0
- package/dist/nodes/source-view.d.ts +1 -0
- package/dist/nodes/source-view.d.ts.map +1 -0
- package/dist/nodes/source-view.js +1 -0
- package/dist/nodes/source-view.js.map +1 -0
- package/dist/nodes/stack-page.d.ts +1 -0
- package/dist/nodes/stack-page.d.ts.map +1 -0
- package/dist/nodes/stack-page.js +1 -0
- package/dist/nodes/stack-page.js.map +1 -0
- package/dist/nodes/stack.d.ts +1 -0
- package/dist/nodes/stack.d.ts.map +1 -0
- package/dist/nodes/stack.js +1 -0
- package/dist/nodes/stack.js.map +1 -0
- package/dist/nodes/text-anchor.d.ts +1 -0
- package/dist/nodes/text-anchor.d.ts.map +1 -0
- package/dist/nodes/text-anchor.js +1 -0
- package/dist/nodes/text-anchor.js.map +1 -0
- package/dist/nodes/text-content.d.ts +1 -0
- package/dist/nodes/text-content.d.ts.map +1 -0
- package/dist/nodes/text-content.js +1 -0
- package/dist/nodes/text-content.js.map +1 -0
- package/dist/nodes/text-paintable.d.ts +1 -0
- package/dist/nodes/text-paintable.d.ts.map +1 -0
- package/dist/nodes/text-paintable.js +1 -0
- package/dist/nodes/text-paintable.js.map +1 -0
- package/dist/nodes/text-segment.d.ts +1 -0
- package/dist/nodes/text-segment.d.ts.map +1 -0
- package/dist/nodes/text-segment.js +1 -0
- package/dist/nodes/text-segment.js.map +1 -0
- package/dist/nodes/text-tag.d.ts +1 -0
- package/dist/nodes/text-tag.d.ts.map +1 -0
- package/dist/nodes/text-tag.js +1 -0
- package/dist/nodes/text-tag.js.map +1 -0
- package/dist/nodes/text-view.d.ts +1 -0
- package/dist/nodes/text-view.d.ts.map +1 -0
- package/dist/nodes/text-view.js +1 -0
- package/dist/nodes/text-view.js.map +1 -0
- package/dist/nodes/toggle-group.d.ts +1 -0
- package/dist/nodes/toggle-group.d.ts.map +1 -0
- package/dist/nodes/toggle-group.js +1 -0
- package/dist/nodes/toggle-group.js.map +1 -0
- package/dist/nodes/toggle.d.ts +1 -0
- package/dist/nodes/toggle.d.ts.map +1 -0
- package/dist/nodes/toggle.js +1 -0
- package/dist/nodes/toggle.js.map +1 -0
- package/dist/nodes/virtual.d.ts +1 -0
- package/dist/nodes/virtual.d.ts.map +1 -0
- package/dist/nodes/virtual.js +1 -0
- package/dist/nodes/virtual.js.map +1 -0
- package/dist/nodes/web-view.d.ts +1 -0
- package/dist/nodes/web-view.d.ts.map +1 -0
- package/dist/nodes/web-view.js +1 -0
- package/dist/nodes/web-view.js.map +1 -0
- package/dist/nodes/widget.d.ts +1 -0
- package/dist/nodes/widget.d.ts.map +1 -0
- package/dist/nodes/widget.js +1 -0
- package/dist/nodes/widget.js.map +1 -0
- package/dist/nodes/window.d.ts +1 -0
- package/dist/nodes/window.d.ts.map +1 -0
- package/dist/nodes/window.js +1 -0
- package/dist/nodes/window.js.map +1 -0
- package/dist/portal.d.ts +1 -0
- package/dist/portal.d.ts.map +1 -0
- package/dist/portal.js +1 -0
- package/dist/portal.js.map +1 -0
- package/dist/reconciler.d.ts +1 -0
- package/dist/reconciler.d.ts.map +1 -0
- package/dist/reconciler.js +1 -0
- package/dist/reconciler.js.map +1 -0
- package/dist/registry.d.ts +1 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +1 -0
- package/dist/registry.js.map +1 -0
- package/dist/render.d.ts +1 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +1 -0
- package/dist/render.js.map +1 -0
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -0
- package/package.json +6 -4
- package/src/errors.ts +52 -0
- package/src/factory.ts +62 -0
- package/src/fiber-root.ts +20 -0
- package/src/generated/internal.ts +2134 -0
- package/src/generated/jsx.ts +20068 -0
- package/src/generated/registry.ts +16 -0
- package/src/host-config.ts +186 -0
- package/src/index.ts +11 -0
- package/src/jsx.ts +1294 -0
- package/src/metadata.ts +36 -0
- package/src/node.ts +109 -0
- package/src/nodes/adjustable.ts +68 -0
- package/src/nodes/alert-dialog-response.ts +78 -0
- package/src/nodes/animation.ts +402 -0
- package/src/nodes/application.ts +56 -0
- package/src/nodes/calendar.ts +38 -0
- package/src/nodes/color-dialog-button.ts +69 -0
- package/src/nodes/column-view-column.ts +84 -0
- package/src/nodes/column-view.ts +192 -0
- package/src/nodes/container-slot.ts +87 -0
- package/src/nodes/dialog.ts +25 -0
- package/src/nodes/drawing-area.ts +51 -0
- package/src/nodes/drop-down.ts +92 -0
- package/src/nodes/event-controller.ts +100 -0
- package/src/nodes/fixed-child.ts +108 -0
- package/src/nodes/font-dialog-button.ts +97 -0
- package/src/nodes/grid-child.ts +103 -0
- package/src/nodes/grid-view.ts +96 -0
- package/src/nodes/internal/base-item-renderer.ts +108 -0
- package/src/nodes/internal/grid-item-renderer.ts +71 -0
- package/src/nodes/internal/list-item-renderer.ts +155 -0
- package/src/nodes/internal/list-store.ts +105 -0
- package/src/nodes/internal/predicates.ts +80 -0
- package/src/nodes/internal/props.ts +51 -0
- package/src/nodes/internal/selection-model-controller.ts +115 -0
- package/src/nodes/internal/signal-store.ts +141 -0
- package/src/nodes/internal/simple-list-store.ts +99 -0
- package/src/nodes/internal/text-buffer-controller.ts +374 -0
- package/src/nodes/internal/tree-store.ts +237 -0
- package/src/nodes/internal/widget.ts +78 -0
- package/src/nodes/level-bar.ts +36 -0
- package/src/nodes/list-item.ts +107 -0
- package/src/nodes/list-view.ts +97 -0
- package/src/nodes/menu.ts +27 -0
- package/src/nodes/models/grid.ts +105 -0
- package/src/nodes/models/list.ts +140 -0
- package/src/nodes/models/menu.ts +310 -0
- package/src/nodes/navigation-page.ts +154 -0
- package/src/nodes/navigation-view.ts +58 -0
- package/src/nodes/notebook-page-tab.ts +55 -0
- package/src/nodes/notebook-page.ts +185 -0
- package/src/nodes/notebook.ts +28 -0
- package/src/nodes/overlay-child.ts +109 -0
- package/src/nodes/popover-menu.ts +59 -0
- package/src/nodes/scale.ts +28 -0
- package/src/nodes/scrolled-window.ts +23 -0
- package/src/nodes/search-bar.ts +27 -0
- package/src/nodes/shortcut-controller.ts +27 -0
- package/src/nodes/shortcut.ts +69 -0
- package/src/nodes/slot.ts +138 -0
- package/src/nodes/source-view.ts +130 -0
- package/src/nodes/stack-page.ts +170 -0
- package/src/nodes/stack.ts +35 -0
- package/src/nodes/text-anchor.ts +74 -0
- package/src/nodes/text-content.ts +14 -0
- package/src/nodes/text-paintable.ts +51 -0
- package/src/nodes/text-segment.ts +55 -0
- package/src/nodes/text-tag.ts +287 -0
- package/src/nodes/text-view.ts +93 -0
- package/src/nodes/toggle-group.ts +27 -0
- package/src/nodes/toggle.ts +72 -0
- package/src/nodes/virtual.ts +16 -0
- package/src/nodes/web-view.ts +22 -0
- package/src/nodes/widget.ts +398 -0
- package/src/nodes/window.ts +159 -0
- package/src/portal.ts +37 -0
- package/src/reconciler.ts +52 -0
- package/src/registry.ts +123 -0
- package/src/render.tsx +192 -0
- package/src/types.ts +7 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import * as Gtk from "@gtkx/ffi/gtk";
|
|
2
|
+
import { Node } from "../node.js";
|
|
3
|
+
import type { Container, Props } from "../types.js";
|
|
4
|
+
import { MenuNode } from "./menu.js";
|
|
5
|
+
import { MenuModel } from "./models/menu.js";
|
|
6
|
+
|
|
7
|
+
export class ApplicationNode extends Node<Gtk.Application, Props, Node, Node> {
|
|
8
|
+
private menu: MenuModel;
|
|
9
|
+
|
|
10
|
+
constructor(typeName: string, props: Props, container: Gtk.Application, rootContainer: Container) {
|
|
11
|
+
super(typeName, props, container, rootContainer);
|
|
12
|
+
const application = rootContainer instanceof Gtk.Application ? rootContainer : undefined;
|
|
13
|
+
this.menu = new MenuModel("root", {}, rootContainer, container, application);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
public override isValidChild(): boolean {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public override appendChild(child: Node): void {
|
|
21
|
+
if (child instanceof MenuNode) {
|
|
22
|
+
this.menu.appendChild(child);
|
|
23
|
+
this.container.setMenubar(this.menu.getMenu());
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
super.appendChild(child);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
public override insertBefore(child: Node, before: Node): void {
|
|
31
|
+
if (child instanceof MenuNode) {
|
|
32
|
+
if (before instanceof MenuNode) {
|
|
33
|
+
this.menu.insertBefore(child, before);
|
|
34
|
+
} else {
|
|
35
|
+
this.menu.appendChild(child);
|
|
36
|
+
}
|
|
37
|
+
this.container.setMenubar(this.menu.getMenu());
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
super.insertBefore(child, before);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public override removeChild(child: Node): void {
|
|
45
|
+
if (child instanceof MenuNode) {
|
|
46
|
+
this.menu.removeChild(child);
|
|
47
|
+
|
|
48
|
+
if (this.menu.getMenu().getNItems() === 0) {
|
|
49
|
+
this.container.setMenubar(null);
|
|
50
|
+
}
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
super.removeChild(child);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type * as Gtk from "@gtkx/ffi/gtk";
|
|
2
|
+
import type { GtkCalendarProps } from "../jsx.js";
|
|
3
|
+
import type { Node } from "../node.js";
|
|
4
|
+
import { EventControllerNode } from "./event-controller.js";
|
|
5
|
+
import { filterProps, primitiveArrayEqual } from "./internal/props.js";
|
|
6
|
+
import { WidgetNode } from "./widget.js";
|
|
7
|
+
|
|
8
|
+
const OWN_PROPS = ["markedDays"] as const;
|
|
9
|
+
|
|
10
|
+
type CalendarProps = Pick<GtkCalendarProps, (typeof OWN_PROPS)[number]>;
|
|
11
|
+
|
|
12
|
+
export class CalendarNode extends WidgetNode<Gtk.Calendar, CalendarProps, EventControllerNode> {
|
|
13
|
+
public override isValidChild(child: Node): boolean {
|
|
14
|
+
return child instanceof EventControllerNode;
|
|
15
|
+
}
|
|
16
|
+
private appliedMarks: number[] = [];
|
|
17
|
+
|
|
18
|
+
public override commitUpdate(oldProps: CalendarProps | null, newProps: CalendarProps): void {
|
|
19
|
+
super.commitUpdate(oldProps ? filterProps(oldProps, OWN_PROPS) : null, filterProps(newProps, OWN_PROPS));
|
|
20
|
+
this.applyOwnProps(newProps);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
private applyOwnProps(newProps: CalendarProps): void {
|
|
24
|
+
const newMarkedDays = newProps.markedDays ?? [];
|
|
25
|
+
|
|
26
|
+
if (primitiveArrayEqual(this.appliedMarks, newMarkedDays)) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
this.container.clearMarks();
|
|
31
|
+
|
|
32
|
+
for (const day of newMarkedDays) {
|
|
33
|
+
this.container.markDay(day);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
this.appliedMarks = [...newMarkedDays];
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import * as Gtk from "@gtkx/ffi/gtk";
|
|
2
|
+
import type { GtkColorDialogButtonProps } from "../jsx.js";
|
|
3
|
+
import type { Container } from "../types.js";
|
|
4
|
+
import { filterProps, hasChanged } from "./internal/props.js";
|
|
5
|
+
import { WidgetNode } from "./widget.js";
|
|
6
|
+
|
|
7
|
+
const OWN_PROPS = ["rgba", "onRgbaChanged", "title", "modal", "withAlpha"] as const;
|
|
8
|
+
|
|
9
|
+
type ColorDialogButtonProps = Pick<GtkColorDialogButtonProps, (typeof OWN_PROPS)[number]>;
|
|
10
|
+
|
|
11
|
+
export class ColorDialogButtonNode extends WidgetNode<Gtk.ColorDialogButton, ColorDialogButtonProps> {
|
|
12
|
+
private dialog: Gtk.ColorDialog;
|
|
13
|
+
|
|
14
|
+
public static override createContainer(
|
|
15
|
+
_props: ColorDialogButtonProps,
|
|
16
|
+
containerClass: typeof Gtk.Widget,
|
|
17
|
+
): Container | null {
|
|
18
|
+
const dialog = new Gtk.ColorDialog();
|
|
19
|
+
const button = new (containerClass as typeof Gtk.ColorDialogButton)(dialog);
|
|
20
|
+
return button;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
constructor(
|
|
24
|
+
typeName: string,
|
|
25
|
+
props: ColorDialogButtonProps,
|
|
26
|
+
container: Gtk.ColorDialogButton,
|
|
27
|
+
rootContainer: Container,
|
|
28
|
+
) {
|
|
29
|
+
super(typeName, props, container, rootContainer);
|
|
30
|
+
const dialog = container.getDialog();
|
|
31
|
+
if (!dialog) {
|
|
32
|
+
throw new Error("ColorDialogButton must have a dialog");
|
|
33
|
+
}
|
|
34
|
+
this.dialog = dialog;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
public override commitUpdate(oldProps: ColorDialogButtonProps | null, newProps: ColorDialogButtonProps): void {
|
|
38
|
+
super.commitUpdate(oldProps ? filterProps(oldProps, OWN_PROPS) : null, filterProps(newProps, OWN_PROPS));
|
|
39
|
+
this.applyOwnProps(oldProps, newProps);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
private applyOwnProps(oldProps: ColorDialogButtonProps | null, newProps: ColorDialogButtonProps): void {
|
|
43
|
+
if (hasChanged(oldProps, newProps, "title")) {
|
|
44
|
+
this.dialog.setTitle(newProps.title ?? "");
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (hasChanged(oldProps, newProps, "modal")) {
|
|
48
|
+
this.dialog.setModal(newProps.modal ?? true);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (hasChanged(oldProps, newProps, "withAlpha")) {
|
|
52
|
+
this.dialog.setWithAlpha(newProps.withAlpha ?? true);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (hasChanged(oldProps, newProps, "rgba") && newProps.rgba) {
|
|
56
|
+
this.container.setRgba(newProps.rgba);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (hasChanged(oldProps, newProps, "onRgbaChanged")) {
|
|
60
|
+
const callback = newProps.onRgbaChanged;
|
|
61
|
+
this.signalStore.set(
|
|
62
|
+
this,
|
|
63
|
+
this.container,
|
|
64
|
+
"notify::rgba",
|
|
65
|
+
callback ? () => callback(this.container.getRgba()) : undefined,
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import * as Gtk from "@gtkx/ffi/gtk";
|
|
2
|
+
import type { ColumnViewColumnProps } from "../jsx.js";
|
|
3
|
+
import type { Node } from "../node.js";
|
|
4
|
+
import type { Container } from "../types.js";
|
|
5
|
+
import { ListItemRenderer } from "./internal/list-item-renderer.js";
|
|
6
|
+
import { hasChanged } from "./internal/props.js";
|
|
7
|
+
import type { TreeStore } from "./internal/tree-store.js";
|
|
8
|
+
import { VirtualNode } from "./virtual.js";
|
|
9
|
+
import { WidgetNode } from "./widget.js";
|
|
10
|
+
|
|
11
|
+
export class ColumnViewColumnNode extends VirtualNode<ColumnViewColumnProps, WidgetNode<Gtk.ColumnView>, never> {
|
|
12
|
+
public override isValidChild(_child: Node): boolean {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
public override isValidParent(parent: Node): boolean {
|
|
17
|
+
return parent instanceof WidgetNode && parent.container instanceof Gtk.ColumnView;
|
|
18
|
+
}
|
|
19
|
+
private column: Gtk.ColumnViewColumn;
|
|
20
|
+
private itemRenderer: ListItemRenderer;
|
|
21
|
+
|
|
22
|
+
constructor(typeName: string, props: ColumnViewColumnProps, container: undefined, rootContainer: Container) {
|
|
23
|
+
super(typeName, props, container, rootContainer);
|
|
24
|
+
this.itemRenderer = new ListItemRenderer(this.signalStore);
|
|
25
|
+
this.column = new Gtk.ColumnViewColumn();
|
|
26
|
+
this.column.setFactory(this.itemRenderer.getFactory());
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
public override commitUpdate(oldProps: ColumnViewColumnProps | null, newProps: ColumnViewColumnProps): void {
|
|
30
|
+
super.commitUpdate(oldProps, newProps);
|
|
31
|
+
this.applyOwnProps(oldProps, newProps);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public override detachDeletedInstance(): void {
|
|
35
|
+
this.itemRenderer.dispose();
|
|
36
|
+
super.detachDeletedInstance();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
public getColumn(): Gtk.ColumnViewColumn {
|
|
40
|
+
return this.column;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
public setStore(model: TreeStore | null): void {
|
|
44
|
+
this.itemRenderer.setStore(model);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
public setEstimatedRowHeight(height: number | null): void {
|
|
48
|
+
this.itemRenderer.setEstimatedItemHeight(height);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
private applyOwnProps(oldProps: ColumnViewColumnProps | null, newProps: ColumnViewColumnProps): void {
|
|
52
|
+
if (hasChanged(oldProps, newProps, "renderCell")) {
|
|
53
|
+
this.itemRenderer.setRenderFn(newProps.renderCell);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (hasChanged(oldProps, newProps, "title")) {
|
|
57
|
+
this.column.setTitle(newProps.title);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (hasChanged(oldProps, newProps, "expand")) {
|
|
61
|
+
this.column.setExpand(newProps.expand ?? false);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (hasChanged(oldProps, newProps, "resizable")) {
|
|
65
|
+
this.column.setResizable(newProps.resizable ?? false);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (hasChanged(oldProps, newProps, "fixedWidth")) {
|
|
69
|
+
this.column.setFixedWidth(newProps.fixedWidth ?? -1);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (hasChanged(oldProps, newProps, "id")) {
|
|
73
|
+
this.column.setId(newProps.id);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (hasChanged(oldProps, newProps, "sortable")) {
|
|
77
|
+
if (newProps.sortable) {
|
|
78
|
+
this.column.setSorter(new Gtk.StringSorter());
|
|
79
|
+
} else {
|
|
80
|
+
this.column.setSorter(null);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import * as Gtk from "@gtkx/ffi/gtk";
|
|
2
|
+
import type { GtkColumnViewProps } from "../jsx.js";
|
|
3
|
+
import type { Node } from "../node.js";
|
|
4
|
+
import type { Container } from "../types.js";
|
|
5
|
+
import { ColumnViewColumnNode } from "./column-view-column.js";
|
|
6
|
+
import { filterProps, hasChanged } from "./internal/props.js";
|
|
7
|
+
import { ListItemNode } from "./list-item.js";
|
|
8
|
+
import { ListModel, type ListModelProps } from "./models/list.js";
|
|
9
|
+
import { WidgetNode } from "./widget.js";
|
|
10
|
+
|
|
11
|
+
const OWN_PROPS = ["sortColumn", "sortOrder", "onSortChanged", "estimatedRowHeight"] as const;
|
|
12
|
+
|
|
13
|
+
type ColumnViewProps = Pick<GtkColumnViewProps, (typeof OWN_PROPS)[number]> & ListModelProps;
|
|
14
|
+
type ColumnViewChild = ListItemNode | ColumnViewColumnNode;
|
|
15
|
+
|
|
16
|
+
export class ColumnViewNode extends WidgetNode<Gtk.ColumnView, ColumnViewProps, ColumnViewChild> {
|
|
17
|
+
private handleSortChange: (() => void) | null = null;
|
|
18
|
+
private list: ListModel;
|
|
19
|
+
|
|
20
|
+
public override isValidChild(child: Node): boolean {
|
|
21
|
+
return child instanceof ListItemNode || child instanceof ColumnViewColumnNode;
|
|
22
|
+
}
|
|
23
|
+
private columnNodes = new Set<ColumnViewColumnNode>();
|
|
24
|
+
private estimatedRowHeight: number | null = null;
|
|
25
|
+
|
|
26
|
+
constructor(typeName: string, props: ColumnViewProps, container: Gtk.ColumnView, rootContainer: Container) {
|
|
27
|
+
super(typeName, props, container, rootContainer);
|
|
28
|
+
this.list = new ListModel(
|
|
29
|
+
{ owner: this, signalStore: this.signalStore },
|
|
30
|
+
{
|
|
31
|
+
selectionMode: props.selectionMode,
|
|
32
|
+
selected: props.selected,
|
|
33
|
+
onSelectionChanged: props.onSelectionChanged,
|
|
34
|
+
},
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public override appendChild(child: ColumnViewChild): void {
|
|
39
|
+
super.appendChild(child);
|
|
40
|
+
|
|
41
|
+
if (child instanceof ListItemNode) {
|
|
42
|
+
this.list.appendChild(child);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const existingColumn = this.findColumnInView(child.getColumn());
|
|
47
|
+
|
|
48
|
+
if (existingColumn) {
|
|
49
|
+
this.container.removeColumn(existingColumn);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
child.setStore(this.list.getStore());
|
|
53
|
+
child.setEstimatedRowHeight(this.estimatedRowHeight);
|
|
54
|
+
this.container.appendColumn(child.getColumn());
|
|
55
|
+
this.columnNodes.add(child);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
public override insertBefore(child: ColumnViewChild, before: ColumnViewChild): void {
|
|
59
|
+
super.insertBefore(child, before);
|
|
60
|
+
|
|
61
|
+
if (child instanceof ListItemNode) {
|
|
62
|
+
if (before instanceof ListItemNode) {
|
|
63
|
+
this.list.insertBefore(child, before);
|
|
64
|
+
}
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const existingColumn = this.findColumnInView(child.getColumn());
|
|
69
|
+
|
|
70
|
+
if (existingColumn) {
|
|
71
|
+
this.container.removeColumn(existingColumn);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
child.setStore(this.list.getStore());
|
|
75
|
+
child.setEstimatedRowHeight(this.estimatedRowHeight);
|
|
76
|
+
|
|
77
|
+
if (before instanceof ColumnViewColumnNode) {
|
|
78
|
+
const beforeIndex = this.getColumnIndex(before.getColumn());
|
|
79
|
+
this.container.insertColumn(beforeIndex, child.getColumn());
|
|
80
|
+
} else {
|
|
81
|
+
this.container.appendColumn(child.getColumn());
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
this.columnNodes.add(child);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
public override removeChild(child: ColumnViewChild): void {
|
|
88
|
+
if (child instanceof ListItemNode) {
|
|
89
|
+
this.list.removeChild(child);
|
|
90
|
+
super.removeChild(child);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const existingColumn = this.findColumnInView(child.getColumn());
|
|
95
|
+
|
|
96
|
+
if (existingColumn) {
|
|
97
|
+
this.container.removeColumn(existingColumn);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
child.setStore(null);
|
|
101
|
+
this.columnNodes.delete(child);
|
|
102
|
+
super.removeChild(child);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
public override finalizeInitialChildren(props: ColumnViewProps): boolean {
|
|
106
|
+
super.finalizeInitialChildren(props);
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
public override commitUpdate(oldProps: ColumnViewProps | null, newProps: ColumnViewProps): void {
|
|
111
|
+
super.commitUpdate(oldProps ? filterProps(oldProps, OWN_PROPS) : null, filterProps(newProps, OWN_PROPS));
|
|
112
|
+
this.applyOwnProps(oldProps, newProps);
|
|
113
|
+
this.list.updateProps(oldProps ? filterProps(oldProps, OWN_PROPS) : null, filterProps(newProps, OWN_PROPS));
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
public override commitMount(): void {
|
|
117
|
+
super.commitMount();
|
|
118
|
+
this.list.flushBatch();
|
|
119
|
+
this.container.setModel(this.list.getSelectionModel());
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
public override detachDeletedInstance(): void {
|
|
123
|
+
this.columnNodes.clear();
|
|
124
|
+
super.detachDeletedInstance();
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
private applyOwnProps(oldProps: ColumnViewProps | null, newProps: ColumnViewProps): void {
|
|
128
|
+
if (hasChanged(oldProps, newProps, "onSortChanged")) {
|
|
129
|
+
const sorter = this.container.getSorter();
|
|
130
|
+
const onSortChanged = newProps.onSortChanged;
|
|
131
|
+
|
|
132
|
+
if (sorter instanceof Gtk.ColumnViewSorter) {
|
|
133
|
+
this.handleSortChange = () => {
|
|
134
|
+
onSortChanged?.(sorter.getPrimarySortColumn()?.getId() ?? null, sorter.getPrimarySortOrder());
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
this.signalStore.set(this, sorter, "changed", this.handleSortChange);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
if (hasChanged(oldProps, newProps, "sortColumn") || hasChanged(oldProps, newProps, "sortOrder")) {
|
|
142
|
+
const sortColumn = newProps.sortColumn;
|
|
143
|
+
const sortOrder = newProps.sortOrder ?? Gtk.SortType.ASCENDING;
|
|
144
|
+
|
|
145
|
+
if (!sortColumn) {
|
|
146
|
+
this.container.sortByColumn(sortOrder, undefined);
|
|
147
|
+
} else {
|
|
148
|
+
this.container.sortByColumn(sortOrder, this.getColumn(sortColumn));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (hasChanged(oldProps, newProps, "estimatedRowHeight")) {
|
|
153
|
+
this.estimatedRowHeight = newProps.estimatedRowHeight ?? null;
|
|
154
|
+
for (const column of this.columnNodes) {
|
|
155
|
+
column.setEstimatedRowHeight(this.estimatedRowHeight);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
private findColumn<T>(predicate: (column: Gtk.ColumnViewColumn, index: number) => T | null): T | null {
|
|
161
|
+
const columns = this.container.getColumns();
|
|
162
|
+
for (let i = 0; i < columns.getNItems(); i++) {
|
|
163
|
+
const column = columns.getObject(i);
|
|
164
|
+
if (!(column instanceof Gtk.ColumnViewColumn)) continue;
|
|
165
|
+
const result = predicate(column, i);
|
|
166
|
+
if (result !== null) return result;
|
|
167
|
+
}
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
private getColumn(columnId: string): Gtk.ColumnViewColumn {
|
|
172
|
+
const column = this.findColumn((col) => (col.getId() === columnId ? col : null));
|
|
173
|
+
if (!column) {
|
|
174
|
+
throw new Error(`Unable to find column '${columnId}' in ${this.typeName}`);
|
|
175
|
+
}
|
|
176
|
+
return column;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
private getColumnIndex(column: Gtk.ColumnViewColumn): number {
|
|
180
|
+
const targetId = column.getId();
|
|
181
|
+
const index = this.findColumn((col, i) => (col.getId() === targetId ? i : null));
|
|
182
|
+
if (index === null) {
|
|
183
|
+
throw new Error(`Unable to find column '${targetId}' in ${this.typeName}`);
|
|
184
|
+
}
|
|
185
|
+
return index;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
private findColumnInView(column: Gtk.ColumnViewColumn): Gtk.ColumnViewColumn | null {
|
|
189
|
+
const targetId = column.getId();
|
|
190
|
+
return this.findColumn((col) => (col.getId() === targetId ? col : null));
|
|
191
|
+
}
|
|
192
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type * as Gtk from "@gtkx/ffi/gtk";
|
|
2
|
+
import type { ContainerSlotProps } from "../jsx.js";
|
|
3
|
+
import type { Node } from "../node.js";
|
|
4
|
+
import { isRemovable } from "./internal/predicates.js";
|
|
5
|
+
import { VirtualNode } from "./virtual.js";
|
|
6
|
+
import { WidgetNode } from "./widget.js";
|
|
7
|
+
|
|
8
|
+
export class ContainerSlotNode extends VirtualNode<ContainerSlotProps, WidgetNode, WidgetNode> {
|
|
9
|
+
public override isValidChild(child: Node): boolean {
|
|
10
|
+
return child instanceof WidgetNode;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
public override isValidParent(parent: Node): boolean {
|
|
14
|
+
return parent instanceof WidgetNode;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public override setParent(parent: WidgetNode | null): void {
|
|
18
|
+
if (!parent && this.parent) {
|
|
19
|
+
this.detachAllChildren(this.parent.container);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
super.setParent(parent);
|
|
23
|
+
|
|
24
|
+
if (parent) {
|
|
25
|
+
for (const child of this.children) {
|
|
26
|
+
this.attachToParent(parent.container, child.container);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public override appendChild(child: WidgetNode): void {
|
|
32
|
+
super.appendChild(child);
|
|
33
|
+
|
|
34
|
+
if (this.parent) {
|
|
35
|
+
this.attachToParent(this.parent.container, child.container);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
public override insertBefore(child: WidgetNode, before: WidgetNode): void {
|
|
40
|
+
super.insertBefore(child, before);
|
|
41
|
+
|
|
42
|
+
if (this.parent) {
|
|
43
|
+
this.attachToParent(this.parent.container, child.container);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
public override removeChild(child: WidgetNode): void {
|
|
48
|
+
if (this.parent && isRemovable(this.parent.container)) {
|
|
49
|
+
const widget = child.container;
|
|
50
|
+
const currentParent = widget.getParent();
|
|
51
|
+
if (currentParent && currentParent === this.parent.container) {
|
|
52
|
+
this.parent.container.remove(widget);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
super.removeChild(child);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
public override detachDeletedInstance(): void {
|
|
60
|
+
if (this.parent) {
|
|
61
|
+
this.detachAllChildren(this.parent.container);
|
|
62
|
+
}
|
|
63
|
+
super.detachDeletedInstance();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
private attachToParent(parent: Gtk.Widget, child: Gtk.Widget): void {
|
|
67
|
+
const methodName = this.props.id;
|
|
68
|
+
const method = parent[methodName as keyof Gtk.Widget];
|
|
69
|
+
|
|
70
|
+
if (typeof method !== "function") {
|
|
71
|
+
throw new Error(`Method '${methodName}' not found on '${parent.constructor.name}'`);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
(method as (child: Gtk.Widget) => void).call(parent, child);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
private detachAllChildren(parent: Gtk.Widget): void {
|
|
78
|
+
if (!isRemovable(parent)) return;
|
|
79
|
+
|
|
80
|
+
for (const child of this.children) {
|
|
81
|
+
const currentParent = child.container.getParent();
|
|
82
|
+
if (currentParent && currentParent === parent) {
|
|
83
|
+
parent.remove(child.container);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type * as Adw from "@gtkx/ffi/adw";
|
|
2
|
+
import type { Props } from "../types.js";
|
|
3
|
+
import { WidgetNode } from "./widget.js";
|
|
4
|
+
import { WindowNode } from "./window.js";
|
|
5
|
+
|
|
6
|
+
export class DialogNode extends WidgetNode<Adw.Dialog> {
|
|
7
|
+
protected override shouldAttachToParent(): boolean {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
public override finalizeInitialChildren(props: Props): boolean {
|
|
12
|
+
this.commitUpdate(null, props);
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
public override commitMount(): void {
|
|
17
|
+
const parent = this.parent instanceof WindowNode ? this.parent.container : undefined;
|
|
18
|
+
this.container.present(parent);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
public override detachDeletedInstance(): void {
|
|
22
|
+
this.container.forceClose();
|
|
23
|
+
super.detachDeletedInstance();
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type * as Gtk from "@gtkx/ffi/gtk";
|
|
2
|
+
import type { GtkDrawingAreaProps } from "../jsx.js";
|
|
3
|
+
import type { Node } from "../node.js";
|
|
4
|
+
import { EventControllerNode } from "./event-controller.js";
|
|
5
|
+
import { filterProps, hasChanged } from "./internal/props.js";
|
|
6
|
+
import { WidgetNode } from "./widget.js";
|
|
7
|
+
|
|
8
|
+
const OWN_PROPS = ["onDraw"] as const;
|
|
9
|
+
|
|
10
|
+
type DrawFunc = (self: Gtk.DrawingArea, cr: import("@gtkx/ffi/cairo").Context, width: number, height: number) => void;
|
|
11
|
+
type DrawingAreaProps = Pick<GtkDrawingAreaProps, (typeof OWN_PROPS)[number]>;
|
|
12
|
+
type PendingDrawFunc = { container: Gtk.DrawingArea; fn: DrawFunc };
|
|
13
|
+
|
|
14
|
+
const pendingDrawFuncs: PendingDrawFunc[] = [];
|
|
15
|
+
|
|
16
|
+
function ensurePendingBatch(): PendingDrawFunc[] {
|
|
17
|
+
if (pendingDrawFuncs.length === 0) {
|
|
18
|
+
queueMicrotask(flushPendingDrawFuncs);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return pendingDrawFuncs;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function flushPendingDrawFuncs(): void {
|
|
25
|
+
const batch = pendingDrawFuncs.splice(0);
|
|
26
|
+
|
|
27
|
+
for (const { container, fn } of batch) {
|
|
28
|
+
container.setDrawFunc(fn);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export class DrawingAreaNode extends WidgetNode<Gtk.DrawingArea, DrawingAreaProps, EventControllerNode> {
|
|
33
|
+
public override isValidChild(child: Node): boolean {
|
|
34
|
+
return child instanceof EventControllerNode;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
public override commitUpdate(oldProps: DrawingAreaProps | null, newProps: DrawingAreaProps): void {
|
|
38
|
+
super.commitUpdate(oldProps ? filterProps(oldProps, OWN_PROPS) : null, filterProps(newProps, OWN_PROPS));
|
|
39
|
+
this.applyOwnProps(oldProps, newProps);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
private applyOwnProps(oldProps: DrawingAreaProps | null, newProps: DrawingAreaProps): void {
|
|
43
|
+
if (hasChanged(oldProps, newProps, "onDraw")) {
|
|
44
|
+
if (this.container.getAllocatedWidth() > 0) {
|
|
45
|
+
this.container.setDrawFunc(newProps.onDraw);
|
|
46
|
+
} else if (newProps.onDraw) {
|
|
47
|
+
ensurePendingBatch().push({ container: this.container, fn: newProps.onDraw });
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|