@gtkx/react 0.15.0 → 0.16.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.
Files changed (186) hide show
  1. package/README.md +1 -0
  2. package/dist/errors.js +3 -0
  3. package/dist/factory.d.ts +3 -2
  4. package/dist/factory.js +1 -1
  5. package/dist/generated/internal.d.ts +28 -1
  6. package/dist/generated/internal.js +93 -18
  7. package/dist/generated/jsx.d.ts +1489 -1300
  8. package/dist/generated/jsx.js +475 -0
  9. package/dist/host-config.d.ts +3 -1
  10. package/dist/host-config.js +31 -11
  11. package/dist/jsx.d.ts +107 -166
  12. package/dist/jsx.js +58 -69
  13. package/dist/node.d.ts +3 -1
  14. package/dist/node.js +5 -3
  15. package/dist/nodes/abstract/positional-child.d.ts +9 -0
  16. package/dist/nodes/abstract/positional-child.js +29 -0
  17. package/dist/nodes/abstract/positional-parent.d.ts +18 -0
  18. package/dist/nodes/abstract/positional-parent.js +48 -0
  19. package/dist/nodes/abstract/virtual-container.d.ts +17 -0
  20. package/dist/nodes/abstract/virtual-container.js +59 -0
  21. package/dist/nodes/abstract/virtual-single-child.d.ts +18 -0
  22. package/dist/nodes/abstract/virtual-single-child.js +54 -0
  23. package/dist/nodes/action-row-child.d.ts +0 -13
  24. package/dist/nodes/action-row-child.js +14 -12
  25. package/dist/nodes/action-row.d.ts +6 -1
  26. package/dist/nodes/action-row.js +4 -37
  27. package/dist/nodes/adjustable.d.ts +23 -0
  28. package/dist/nodes/adjustable.js +62 -0
  29. package/dist/nodes/alert-dialog-response.d.ts +1 -0
  30. package/dist/nodes/alert-dialog-response.js +86 -0
  31. package/dist/nodes/animation/animation-controller.d.ts +17 -0
  32. package/dist/nodes/animation/animation-controller.js +107 -0
  33. package/dist/nodes/animation/animation-factory.d.ts +15 -0
  34. package/dist/nodes/animation/animation-factory.js +25 -0
  35. package/dist/nodes/animation/animation-node.d.ts +9 -0
  36. package/dist/nodes/animation/animation-node.js +126 -0
  37. package/dist/nodes/animation/animation-style-sheet.d.ts +16 -0
  38. package/dist/nodes/animation/animation-style-sheet.js +74 -0
  39. package/dist/nodes/animation/index.d.ts +4 -0
  40. package/dist/nodes/animation/index.js +1 -0
  41. package/dist/nodes/animation/property-mapper.d.ts +11 -0
  42. package/dist/nodes/animation/property-mapper.js +36 -0
  43. package/dist/nodes/animation/transform-state.d.ts +11 -0
  44. package/dist/nodes/animation/transform-state.js +57 -0
  45. package/dist/nodes/animation/widget-registry.d.ts +5 -0
  46. package/dist/nodes/animation/widget-registry.js +42 -0
  47. package/dist/nodes/application.js +17 -7
  48. package/dist/nodes/autowrapped.js +37 -43
  49. package/dist/nodes/calendar.js +17 -43
  50. package/dist/nodes/color-dialog-button.d.ts +1 -0
  51. package/dist/nodes/color-dialog-button.js +70 -0
  52. package/dist/nodes/column-view-column.d.ts +3 -3
  53. package/dist/nodes/column-view-column.js +1 -1
  54. package/dist/nodes/column-view.js +36 -39
  55. package/dist/nodes/dialog.d.ts +11 -0
  56. package/dist/nodes/dialog.js +20 -0
  57. package/dist/nodes/drawing-area.js +24 -7
  58. package/dist/nodes/event-controller.d.ts +1 -0
  59. package/dist/nodes/event-controller.js +96 -0
  60. package/dist/nodes/expander-row-child.d.ts +0 -14
  61. package/dist/nodes/expander-row-child.js +14 -12
  62. package/dist/nodes/expander-row.d.ts +6 -1
  63. package/dist/nodes/expander-row.js +11 -48
  64. package/dist/nodes/fixed-child.js +48 -36
  65. package/dist/nodes/font-dialog-button.d.ts +1 -0
  66. package/dist/nodes/font-dialog-button.js +90 -0
  67. package/dist/nodes/grid-child.js +39 -45
  68. package/dist/nodes/grid.d.ts +1 -0
  69. package/dist/nodes/grid.js +41 -0
  70. package/dist/nodes/index.d.ts +17 -9
  71. package/dist/nodes/index.js +17 -9
  72. package/dist/nodes/internal/base-item-renderer.d.ts +29 -0
  73. package/dist/nodes/internal/base-item-renderer.js +88 -0
  74. package/dist/nodes/internal/base-store.d.ts +9 -0
  75. package/dist/nodes/internal/base-store.js +20 -0
  76. package/dist/nodes/internal/child-attachment.d.ts +26 -0
  77. package/dist/nodes/internal/child-attachment.js +48 -0
  78. package/dist/nodes/internal/deferred-action.d.ts +8 -0
  79. package/dist/nodes/internal/deferred-action.js +19 -0
  80. package/dist/nodes/internal/list-item-renderer.d.ts +14 -15
  81. package/dist/nodes/internal/list-item-renderer.js +51 -77
  82. package/dist/nodes/internal/list-store.d.ts +7 -6
  83. package/dist/nodes/internal/list-store.js +20 -24
  84. package/dist/nodes/internal/predicates.d.ts +25 -2
  85. package/dist/nodes/internal/predicates.js +53 -41
  86. package/dist/nodes/internal/selection-model.d.ts +30 -0
  87. package/dist/nodes/internal/selection-model.js +91 -0
  88. package/dist/nodes/internal/signal-store.d.ts +5 -4
  89. package/dist/nodes/internal/signal-store.js +30 -28
  90. package/dist/nodes/internal/simple-list-store.js +6 -9
  91. package/dist/nodes/internal/text-buffer-controller.d.ts +43 -0
  92. package/dist/nodes/internal/text-buffer-controller.js +287 -0
  93. package/dist/nodes/internal/text-tag-styles.d.ts +43 -0
  94. package/dist/nodes/internal/text-tag-styles.js +52 -0
  95. package/dist/nodes/internal/tree-list-item-renderer.d.ts +15 -14
  96. package/dist/nodes/internal/tree-list-item-renderer.js +85 -96
  97. package/dist/nodes/internal/tree-store.d.ts +10 -9
  98. package/dist/nodes/internal/tree-store.js +31 -35
  99. package/dist/nodes/internal/utils.d.ts +7 -4
  100. package/dist/nodes/internal/utils.js +50 -5
  101. package/dist/nodes/level-bar.js +19 -54
  102. package/dist/nodes/list-item.d.ts +6 -3
  103. package/dist/nodes/list-item.js +7 -4
  104. package/dist/nodes/list-view.js +15 -11
  105. package/dist/nodes/menu.d.ts +3 -3
  106. package/dist/nodes/menu.js +3 -3
  107. package/dist/nodes/models/list.d.ts +11 -13
  108. package/dist/nodes/models/list.js +16 -73
  109. package/dist/nodes/models/menu.d.ts +8 -7
  110. package/dist/nodes/models/menu.js +43 -50
  111. package/dist/nodes/models/tree-list.d.ts +6 -12
  112. package/dist/nodes/models/tree-list.js +30 -93
  113. package/dist/nodes/navigation-page.d.ts +1 -0
  114. package/dist/nodes/navigation-page.js +27 -32
  115. package/dist/nodes/navigation-view.js +17 -28
  116. package/dist/nodes/notebook-page-tab.d.ts +3 -3
  117. package/dist/nodes/notebook-page-tab.js +11 -14
  118. package/dist/nodes/notebook-page.d.ts +7 -5
  119. package/dist/nodes/notebook-page.js +45 -25
  120. package/dist/nodes/notebook.js +2 -2
  121. package/dist/nodes/overlay-child.js +90 -30
  122. package/dist/nodes/pack-child.d.ts +0 -13
  123. package/dist/nodes/pack-child.js +14 -12
  124. package/dist/nodes/pack.d.ts +6 -1
  125. package/dist/nodes/pack.js +4 -37
  126. package/dist/nodes/popover-menu.js +2 -2
  127. package/dist/nodes/scale.js +15 -45
  128. package/dist/nodes/scrolled-window.js +7 -6
  129. package/dist/nodes/search-bar.d.ts +1 -0
  130. package/dist/nodes/search-bar.js +40 -0
  131. package/dist/nodes/shortcut-controller.d.ts +1 -37
  132. package/dist/nodes/shortcut-controller.js +24 -8
  133. package/dist/nodes/shortcut.d.ts +5 -4
  134. package/dist/nodes/shortcut.js +11 -5
  135. package/dist/nodes/simple-list-view.js +2 -3
  136. package/dist/nodes/slot.d.ts +6 -9
  137. package/dist/nodes/slot.js +27 -42
  138. package/dist/nodes/source-view.js +80 -29
  139. package/dist/nodes/stack-page.js +20 -22
  140. package/dist/nodes/stack.js +19 -5
  141. package/dist/nodes/text-anchor.d.ts +41 -0
  142. package/dist/nodes/text-anchor.js +59 -0
  143. package/dist/nodes/text-content.d.ts +10 -0
  144. package/dist/nodes/text-content.js +1 -0
  145. package/dist/nodes/text-paintable.d.ts +17 -0
  146. package/dist/nodes/text-paintable.js +34 -0
  147. package/dist/nodes/text-segment.d.ts +15 -0
  148. package/dist/nodes/text-segment.js +29 -0
  149. package/dist/nodes/text-tag.d.ts +136 -0
  150. package/dist/nodes/text-tag.js +202 -0
  151. package/dist/nodes/text-view.d.ts +30 -0
  152. package/dist/nodes/text-view.js +49 -21
  153. package/dist/nodes/toggle-group.js +24 -32
  154. package/dist/nodes/toggle.d.ts +1 -15
  155. package/dist/nodes/toggle.js +40 -32
  156. package/dist/nodes/toolbar-child.js +14 -16
  157. package/dist/nodes/tree-list-item.d.ts +7 -5
  158. package/dist/nodes/tree-list-item.js +24 -36
  159. package/dist/nodes/tree-list-view.js +7 -6
  160. package/dist/nodes/virtual.d.ts +1 -1
  161. package/dist/nodes/widget.d.ts +2 -16
  162. package/dist/nodes/widget.js +105 -294
  163. package/dist/nodes/window.d.ts +9 -3
  164. package/dist/nodes/window.js +29 -15
  165. package/dist/registry.d.ts +1 -1
  166. package/dist/render.js +8 -6
  167. package/dist/scheduler.d.ts +11 -1
  168. package/dist/scheduler.js +16 -4
  169. package/dist/types.d.ts +2 -136
  170. package/package.json +3 -3
  171. package/dist/nodes/adjustment.d.ts +0 -48
  172. package/dist/nodes/adjustment.js +0 -70
  173. package/dist/nodes/calendar-mark.d.ts +0 -15
  174. package/dist/nodes/calendar-mark.js +0 -29
  175. package/dist/nodes/internal/constants.d.ts +0 -1
  176. package/dist/nodes/internal/constants.js +0 -24
  177. package/dist/nodes/level-bar-offset.d.ts +0 -13
  178. package/dist/nodes/level-bar-offset.js +0 -35
  179. package/dist/nodes/scale-mark.d.ts +0 -17
  180. package/dist/nodes/scale-mark.js +0 -38
  181. package/dist/nodes/source-buffer.d.ts +0 -73
  182. package/dist/nodes/source-buffer.js +0 -149
  183. package/dist/nodes/text-buffer.d.ts +0 -43
  184. package/dist/nodes/text-buffer.js +0 -81
  185. package/dist/nodes/virtual-child.d.ts +0 -18
  186. package/dist/nodes/virtual-child.js +0 -62
@@ -1,6 +1,6 @@
1
- import { batch } from "@gtkx/ffi";
2
1
  import * as Adw from "@gtkx/ffi/adw";
3
2
  import { registerNodeClass } from "../registry.js";
3
+ import { hasChanged } from "./internal/utils.js";
4
4
  import { SlotNode } from "./slot.js";
5
5
  export class NavigationPageNode extends SlotNode {
6
6
  static priority = 1;
@@ -9,48 +9,43 @@ export class NavigationPageNode extends SlotNode {
9
9
  }
10
10
  updateProps(oldProps, newProps) {
11
11
  super.updateProps(oldProps, newProps);
12
+ this.applyOwnProps(oldProps, newProps);
13
+ }
14
+ applyOwnProps(oldProps, newProps) {
12
15
  const child = this.child;
13
16
  if (!(child instanceof Adw.NavigationPage)) {
14
17
  return;
15
18
  }
16
- if (!oldProps || oldProps.id !== newProps.id) {
17
- if (newProps.id !== undefined) {
18
- child.setTag(newProps.id);
19
- }
19
+ if (hasChanged(oldProps, newProps, "id") && newProps.id !== undefined) {
20
+ child.setTag(newProps.id);
20
21
  }
21
- if (!oldProps || oldProps.title !== newProps.title) {
22
- if (newProps.title !== undefined) {
23
- child.setTitle(newProps.title);
24
- }
22
+ if (hasChanged(oldProps, newProps, "title") && newProps.title !== undefined) {
23
+ child.setTitle(newProps.title);
25
24
  }
26
- if (!oldProps || oldProps.canPop !== newProps.canPop) {
27
- if (newProps.canPop !== undefined) {
28
- child.setCanPop(newProps.canPop);
29
- }
25
+ if (hasChanged(oldProps, newProps, "canPop") && newProps.canPop !== undefined) {
26
+ child.setCanPop(newProps.canPop);
30
27
  }
31
28
  }
32
29
  onChildChange(oldChild) {
33
- batch(() => {
34
- const navigationView = this.getParent();
35
- const title = this.props.title ?? "";
36
- if (this.child) {
37
- this.child = this.props.id
38
- ? Adw.NavigationPage.newWithTag(this.child, title, this.props.id)
39
- : new Adw.NavigationPage(this.child, title);
40
- this.updateProps(null, this.props);
41
- }
42
- if (navigationView instanceof Adw.NavigationView) {
43
- if (oldChild instanceof Adw.NavigationPage) {
44
- navigationView.remove(oldChild);
45
- }
46
- if (this.child) {
47
- navigationView.add(this.child);
48
- }
30
+ const navigationView = this.getParent();
31
+ const title = this.props.title ?? "";
32
+ if (this.child) {
33
+ this.child = this.props.id
34
+ ? Adw.NavigationPage.newWithTag(this.child, title, this.props.id)
35
+ : new Adw.NavigationPage(this.child, title);
36
+ this.updateProps(null, this.props);
37
+ }
38
+ if (navigationView instanceof Adw.NavigationView) {
39
+ if (oldChild instanceof Adw.NavigationPage) {
40
+ navigationView.remove(oldChild);
49
41
  }
50
- else {
51
- super.onChildChange(oldChild);
42
+ if (this.child) {
43
+ navigationView.add(this.child);
52
44
  }
53
- });
45
+ }
46
+ else {
47
+ super.onChildChange(oldChild);
48
+ }
54
49
  }
55
50
  }
56
51
  registerNodeClass(NavigationPageNode);
@@ -1,16 +1,15 @@
1
1
  import * as Adw from "@gtkx/ffi/adw";
2
2
  import { registerNodeClass } from "../registry.js";
3
- import { scheduleAfterCommit } from "../scheduler.js";
4
- import { signalStore } from "./internal/signal-store.js";
5
- import { filterProps, isContainerType } from "./internal/utils.js";
3
+ import { CommitPriority, scheduleAfterCommit } from "../scheduler.js";
4
+ import { filterProps, hasChanged, matchesAnyClass, primitiveArrayEqual } from "./internal/utils.js";
6
5
  import { NavigationPageNode } from "./navigation-page.js";
7
6
  import { SlotNode } from "./slot.js";
8
7
  import { WidgetNode } from "./widget.js";
9
- const PROPS = ["history", "onHistoryChanged"];
8
+ const OWN_PROPS = ["history", "onHistoryChanged"];
10
9
  class NavigationViewNode extends WidgetNode {
11
10
  static priority = 1;
12
11
  static matches(_type, containerOrClass) {
13
- return isContainerType(Adw.NavigationView, containerOrClass);
12
+ return matchesAnyClass([Adw.NavigationView], containerOrClass);
14
13
  }
15
14
  appendChild(child) {
16
15
  if (child instanceof NavigationPageNode) {
@@ -45,35 +44,38 @@ class NavigationViewNode extends WidgetNode {
45
44
  throw new Error(`Cannot remove '${child.typeName}' from 'NavigationView': expected x.NavigationPage or Widget`);
46
45
  }
47
46
  updateProps(oldProps, newProps) {
47
+ super.updateProps(oldProps ? filterProps(oldProps, OWN_PROPS) : null, filterProps(newProps, OWN_PROPS));
48
+ this.applyOwnProps(oldProps, newProps);
49
+ }
50
+ applyOwnProps(oldProps, newProps) {
48
51
  const oldHistory = oldProps?.history;
49
52
  const newHistory = newProps.history;
50
- if (newHistory && !this.arraysEqual(oldHistory, newHistory)) {
53
+ if (newHistory && !primitiveArrayEqual(oldHistory, newHistory)) {
51
54
  this.syncHistory(newHistory);
52
55
  }
53
- if (!oldProps || oldProps.onHistoryChanged !== newProps.onHistoryChanged) {
56
+ if (hasChanged(oldProps, newProps, "onHistoryChanged")) {
54
57
  const onHistoryChanged = newProps.onHistoryChanged;
55
58
  if (onHistoryChanged) {
56
59
  const handleHistoryChanged = () => {
57
60
  const history = this.getCurrentHistory();
58
61
  onHistoryChanged(history);
59
62
  };
60
- signalStore.set(this, this.container, "popped", handleHistoryChanged);
61
- signalStore.set(this, this.container, "pushed", handleHistoryChanged);
62
- signalStore.set(this, this.container, "replaced", handleHistoryChanged);
63
+ this.signalStore.set(this, this.container, "popped", handleHistoryChanged);
64
+ this.signalStore.set(this, this.container, "pushed", handleHistoryChanged);
65
+ this.signalStore.set(this, this.container, "replaced", handleHistoryChanged);
63
66
  }
64
67
  else {
65
- signalStore.set(this, this.container, "popped", null);
66
- signalStore.set(this, this.container, "pushed", null);
67
- signalStore.set(this, this.container, "replaced", null);
68
+ this.signalStore.set(this, this.container, "popped", null);
69
+ this.signalStore.set(this, this.container, "pushed", null);
70
+ this.signalStore.set(this, this.container, "replaced", null);
68
71
  }
69
72
  }
70
- super.updateProps(filterProps(oldProps ?? {}, PROPS), filterProps(newProps, PROPS));
71
73
  }
72
74
  syncHistory(history) {
73
75
  const container = this.container;
74
76
  scheduleAfterCommit(() => {
75
77
  container.replaceWithTags(history, history.length);
76
- });
78
+ }, CommitPriority.NORMAL);
77
79
  }
78
80
  getCurrentHistory() {
79
81
  const stack = this.container.getNavigationStack();
@@ -88,18 +90,5 @@ class NavigationViewNode extends WidgetNode {
88
90
  }
89
91
  return history;
90
92
  }
91
- arraysEqual(a, b) {
92
- if (a === b)
93
- return true;
94
- if (!a || !b)
95
- return false;
96
- if (a.length !== b.length)
97
- return false;
98
- for (let i = 0; i < a.length; i++) {
99
- if (a[i] !== b[i])
100
- return false;
101
- }
102
- return true;
103
- }
104
93
  }
105
94
  registerNodeClass(NavigationViewNode);
@@ -4,10 +4,10 @@ import { SlotNode } from "./slot.js";
4
4
  type Props = Partial<SlotProps>;
5
5
  export declare class NotebookPageTabNode extends SlotNode<Props> {
6
6
  static priority: number;
7
- private notebook?;
8
- private page?;
7
+ private notebook;
8
+ private page;
9
9
  static matches(type: string): boolean;
10
- setPage(notebook?: Gtk.Notebook, page?: Gtk.Widget): void;
10
+ setPage(notebook: Gtk.Notebook | null, page: Gtk.Widget | null): void;
11
11
  updateProps(oldProps: Props | null, newProps: Props): void;
12
12
  private getNotebook;
13
13
  private getPage;
@@ -1,10 +1,9 @@
1
- import { batch } from "@gtkx/ffi";
2
1
  import { registerNodeClass } from "../registry.js";
3
2
  import { SlotNode } from "./slot.js";
4
3
  export class NotebookPageTabNode extends SlotNode {
5
4
  static priority = 1;
6
- notebook;
7
- page;
5
+ notebook = null;
6
+ page = null;
8
7
  static matches(type) {
9
8
  return type === "NotebookPageTab";
10
9
  }
@@ -29,17 +28,15 @@ export class NotebookPageTabNode extends SlotNode {
29
28
  return this.page;
30
29
  }
31
30
  onChildChange(_oldChild) {
32
- batch(() => {
33
- if (!this.notebook || !this.page) {
34
- return;
35
- }
36
- const notebook = this.getNotebook();
37
- const page = this.getPage();
38
- if (notebook.pageNum(page) === -1) {
39
- return;
40
- }
41
- notebook.setTabLabel(page, this.child);
42
- });
31
+ if (!this.notebook || !this.page) {
32
+ return;
33
+ }
34
+ const notebook = this.getNotebook();
35
+ const page = this.getPage();
36
+ if (notebook.pageNum(page) === -1) {
37
+ return;
38
+ }
39
+ notebook.setTabLabel(page, this.child);
43
40
  }
44
41
  }
45
42
  registerNodeClass(NotebookPageTabNode);
@@ -5,18 +5,20 @@ import { SlotNode } from "./slot.js";
5
5
  type Props = Partial<NotebookPageProps>;
6
6
  export declare class NotebookPageNode extends SlotNode<Props> {
7
7
  static priority: number;
8
- position?: number | null;
9
- private tabNode?;
8
+ position: number | null;
9
+ private tabNode;
10
10
  static matches(type: string): boolean;
11
- setNotebook(notebook?: Gtk.Notebook): void;
12
- setPosition(position?: number | null): void;
11
+ setParent(parent: Gtk.Widget | null): void;
12
+ setPosition(position: number | null): void;
13
13
  private getNotebook;
14
14
  private updateTabNode;
15
15
  appendChild(child: Node): void;
16
- removeChild(child?: Node): void;
16
+ removeChild(child: Node): void;
17
17
  unmount(): void;
18
18
  updateProps(oldProps: Props | null, newProps: Props): void;
19
+ protected applyOwnProps(oldProps: Props | null, newProps: Props): void;
19
20
  private attachPage;
21
+ private applyPageProps;
20
22
  private detachPage;
21
23
  protected onChildChange(oldChild: Gtk.Widget | null): void;
22
24
  }
@@ -1,19 +1,19 @@
1
- import { batch } from "@gtkx/ffi";
2
1
  import * as Gtk from "@gtkx/ffi/gtk";
3
2
  import { registerNodeClass } from "../registry.js";
4
- import { scheduleAfterCommit } from "../scheduler.js";
3
+ import { CommitPriority, scheduleAfterCommit } from "../scheduler.js";
4
+ import { hasChanged } from "./internal/utils.js";
5
5
  import { NotebookPageTabNode } from "./notebook-page-tab.js";
6
6
  import { SlotNode } from "./slot.js";
7
7
  import { WidgetNode } from "./widget.js";
8
8
  export class NotebookPageNode extends SlotNode {
9
9
  static priority = 1;
10
- position;
11
- tabNode;
10
+ position = null;
11
+ tabNode = null;
12
12
  static matches(type) {
13
13
  return type === "NotebookPage";
14
14
  }
15
- setNotebook(notebook) {
16
- this.setParent(notebook);
15
+ setParent(parent) {
16
+ super.setParent(parent);
17
17
  this.updateTabNode();
18
18
  }
19
19
  setPosition(position) {
@@ -35,7 +35,7 @@ export class NotebookPageNode extends SlotNode {
35
35
  this.tabNode = child;
36
36
  scheduleAfterCommit(() => {
37
37
  this.updateTabNode();
38
- });
38
+ }, CommitPriority.NORMAL);
39
39
  return;
40
40
  }
41
41
  if (!(child instanceof WidgetNode)) {
@@ -48,26 +48,31 @@ export class NotebookPageNode extends SlotNode {
48
48
  this.onChildChange(oldChild ?? null);
49
49
  }
50
50
  this.updateTabNode();
51
- });
51
+ }, CommitPriority.NORMAL);
52
52
  }
53
53
  removeChild(child) {
54
54
  if (child instanceof NotebookPageTabNode) {
55
- this.tabNode = undefined;
55
+ this.tabNode = null;
56
56
  return;
57
57
  }
58
- super.removeChild();
58
+ super.removeChild(child);
59
59
  }
60
60
  unmount() {
61
- this.tabNode = undefined;
61
+ this.tabNode = null;
62
62
  super.unmount();
63
63
  }
64
64
  updateProps(oldProps, newProps) {
65
65
  super.updateProps(oldProps, newProps);
66
- if (!oldProps || oldProps.label !== newProps.label) {
67
- if (this.child && this.parent && !this.tabNode?.child) {
68
- const tabLabel = this.getNotebook().getTabLabel(this.child);
69
- tabLabel.setLabel(newProps.label ?? "");
70
- }
66
+ this.applyOwnProps(oldProps, newProps);
67
+ }
68
+ applyOwnProps(oldProps, newProps) {
69
+ if (hasChanged(oldProps, newProps, "label") && this.child && this.parent && !this.tabNode?.child) {
70
+ const tabLabel = this.getNotebook().getTabLabel(this.child);
71
+ tabLabel.setLabel(newProps.label ?? "");
72
+ }
73
+ const pagePropsChanged = hasChanged(oldProps, newProps, "tabExpand") || hasChanged(oldProps, newProps, "tabFill");
74
+ if (this.child && this.parent && pagePropsChanged) {
75
+ this.applyPageProps();
71
76
  }
72
77
  }
73
78
  attachPage() {
@@ -84,9 +89,26 @@ export class NotebookPageNode extends SlotNode {
84
89
  }
85
90
  if (this.position != null) {
86
91
  notebook.insertPage(child, this.position, tabLabel);
92
+ }
93
+ else {
94
+ notebook.appendPage(child, tabLabel);
95
+ }
96
+ this.applyPageProps();
97
+ }
98
+ applyPageProps() {
99
+ const child = this.child;
100
+ if (!child || !this.parent)
87
101
  return;
102
+ const notebook = this.getNotebook();
103
+ const page = notebook.getPage(child);
104
+ if (!page)
105
+ return;
106
+ if (this.props.tabExpand !== undefined) {
107
+ page.setTabExpand(this.props.tabExpand);
108
+ }
109
+ if (this.props.tabFill !== undefined) {
110
+ page.setTabFill(this.props.tabFill);
88
111
  }
89
- notebook.appendPage(child, tabLabel);
90
112
  }
91
113
  detachPage(childToDetach) {
92
114
  const notebook = this.getNotebook();
@@ -94,14 +116,12 @@ export class NotebookPageNode extends SlotNode {
94
116
  notebook.removePage(pageNum);
95
117
  }
96
118
  onChildChange(oldChild) {
97
- batch(() => {
98
- if (oldChild) {
99
- this.detachPage(oldChild);
100
- }
101
- if (this.child) {
102
- this.attachPage();
103
- }
104
- });
119
+ if (oldChild) {
120
+ this.detachPage(oldChild);
121
+ }
122
+ if (this.child) {
123
+ this.attachPage();
124
+ }
105
125
  }
106
126
  }
107
127
  registerNodeClass(NotebookPageNode);
@@ -12,7 +12,7 @@ class NotebookNode extends WidgetNode {
12
12
  if (!(child instanceof NotebookPageNode)) {
13
13
  throw new Error(`Cannot append '${child.typeName}' to 'Notebook': expected x.NotebookPage`);
14
14
  }
15
- child.setNotebook(this.container);
15
+ child.setParent(this.container);
16
16
  }
17
17
  insertBefore(child, before) {
18
18
  if (!(child instanceof NotebookPageNode) || !(before instanceof NotebookPageNode)) {
@@ -20,7 +20,7 @@ class NotebookNode extends WidgetNode {
20
20
  }
21
21
  const beforePosition = this.container.pageNum(before.getChild());
22
22
  child.setPosition(beforePosition);
23
- child.setNotebook(this.container);
23
+ child.setParent(this.container);
24
24
  }
25
25
  removeChild(child) {
26
26
  if (!(child instanceof NotebookPageNode)) {
@@ -1,49 +1,109 @@
1
- import { batch, isObjectEqual } from "@gtkx/ffi";
1
+ import { isObjectEqual } from "@gtkx/ffi";
2
2
  import { registerNodeClass } from "../registry.js";
3
- import { SlotNode } from "./slot.js";
4
- class OverlayChildNode extends SlotNode {
3
+ import { CommitPriority, scheduleAfterCommit } from "../scheduler.js";
4
+ import { VirtualNode } from "./virtual.js";
5
+ import { WidgetNode } from "./widget.js";
6
+ class OverlayChildNode extends VirtualNode {
5
7
  static priority = 1;
6
8
  static matches(type) {
7
9
  return type === "OverlayChild";
8
10
  }
9
- getOverlay() {
10
- if (!this.parent) {
11
- throw new Error("Expected parent widget to be set on OverlayChildNode");
11
+ parent = null;
12
+ children = new Set();
13
+ canBeChildOf(parent) {
14
+ return parent instanceof WidgetNode;
15
+ }
16
+ attachTo(parent) {
17
+ if (parent instanceof WidgetNode) {
18
+ this.parent = parent.container;
12
19
  }
13
- return this.parent;
14
20
  }
15
- updateProps(oldProps, newProps) {
16
- super.updateProps(oldProps, newProps);
17
- if (!this.parent || !this.child) {
18
- return;
21
+ detachFrom(_parent) { }
22
+ unmount() {
23
+ if (this.parent && this.children.size > 0) {
24
+ const parent = this.parent;
25
+ const children = [...this.children];
26
+ this.children.clear();
27
+ for (const child of children) {
28
+ const currentParent = child.getParent();
29
+ if (currentParent && isObjectEqual(currentParent, parent)) {
30
+ parent.removeOverlay(child);
31
+ }
32
+ }
19
33
  }
20
- const overlay = this.getOverlay();
21
- if (!oldProps || oldProps.measure !== newProps.measure) {
22
- overlay.setMeasureOverlay(this.child, newProps.measure ?? false);
34
+ this.parent = null;
35
+ super.unmount();
36
+ }
37
+ appendChild(child) {
38
+ if (!(child instanceof WidgetNode)) {
39
+ throw new Error(`Cannot append '${child.typeName}' to '${this.typeName}': expected Widget`);
23
40
  }
24
- if (!oldProps || oldProps.clipOverlay !== newProps.clipOverlay) {
25
- overlay.setClipOverlay(this.child, newProps.clipOverlay ?? false);
41
+ const widget = child.container;
42
+ this.children.add(widget);
43
+ scheduleAfterCommit(() => {
44
+ if (this.parent) {
45
+ this.attachChild(widget);
46
+ }
47
+ }, CommitPriority.NORMAL);
48
+ }
49
+ insertBefore(child, _before) {
50
+ if (!(child instanceof WidgetNode)) {
51
+ throw new Error(`Cannot insert '${child.typeName}' into '${this.typeName}': expected Widget`);
26
52
  }
53
+ const widget = child.container;
54
+ this.children.add(widget);
55
+ scheduleAfterCommit(() => {
56
+ if (this.parent) {
57
+ this.attachChild(widget);
58
+ }
59
+ }, CommitPriority.NORMAL);
27
60
  }
28
- onChildChange(oldChild) {
29
- const overlay = this.getOverlay();
30
- batch(() => {
31
- if (oldChild) {
32
- const parent = oldChild.getParent();
33
- if (parent && isObjectEqual(parent, overlay)) {
34
- overlay.removeOverlay(oldChild);
61
+ removeChild(child) {
62
+ if (!(child instanceof WidgetNode)) {
63
+ throw new Error(`Cannot remove '${child.typeName}' from '${this.typeName}': expected Widget`);
64
+ }
65
+ const widget = child.container;
66
+ const parent = this.parent;
67
+ this.children.delete(widget);
68
+ scheduleAfterCommit(() => {
69
+ if (parent) {
70
+ const currentParent = widget.getParent();
71
+ if (currentParent && isObjectEqual(currentParent, parent)) {
72
+ parent.removeOverlay(widget);
35
73
  }
36
74
  }
37
- if (this.child) {
38
- overlay.addOverlay(this.child);
39
- if (this.props.measure !== undefined) {
40
- overlay.setMeasureOverlay(this.child, this.props.measure);
75
+ }, CommitPriority.HIGH);
76
+ }
77
+ updateProps(oldProps, newProps) {
78
+ super.updateProps(oldProps, newProps);
79
+ if (!this.parent) {
80
+ return;
81
+ }
82
+ const measureChanged = oldProps?.measure !== newProps.measure;
83
+ const clipOverlayChanged = oldProps?.clipOverlay !== newProps.clipOverlay;
84
+ if (measureChanged || clipOverlayChanged) {
85
+ const parent = this.parent;
86
+ for (const child of this.children) {
87
+ if (measureChanged) {
88
+ parent.setMeasureOverlay(child, newProps.measure ?? false);
41
89
  }
42
- if (this.props.clipOverlay !== undefined) {
43
- overlay.setClipOverlay(this.child, this.props.clipOverlay);
90
+ if (clipOverlayChanged) {
91
+ parent.setClipOverlay(child, newProps.clipOverlay ?? false);
44
92
  }
45
93
  }
46
- });
94
+ }
95
+ }
96
+ attachChild(widget) {
97
+ if (!this.parent) {
98
+ return;
99
+ }
100
+ this.parent.addOverlay(widget);
101
+ if (this.props.measure !== undefined) {
102
+ this.parent.setMeasureOverlay(widget, this.props.measure);
103
+ }
104
+ if (this.props.clipOverlay !== undefined) {
105
+ this.parent.setClipOverlay(widget, this.props.clipOverlay);
106
+ }
47
107
  }
48
108
  }
49
109
  registerNodeClass(OverlayChildNode);
@@ -1,14 +1 @@
1
- import type * as Gtk from "@gtkx/ffi/gtk";
2
- import { VirtualChildNode } from "./virtual-child.js";
3
- type PackableWidget = Gtk.Widget & {
4
- packStart(child: Gtk.Widget): void;
5
- packEnd(child: Gtk.Widget): void;
6
- remove(child: Gtk.Widget): void;
7
- };
8
- export declare class PackChild extends VirtualChildNode<PackableWidget> {
9
- static priority: number;
10
- static matches(type: string): boolean;
11
- protected getPositionLabel(): string;
12
- protected attachChild(parent: PackableWidget, widget: Gtk.Widget): void;
13
- }
14
1
  export {};
@@ -1,20 +1,22 @@
1
1
  import { registerNodeClass } from "../registry.js";
2
- import { VirtualChildNode } from "./virtual-child.js";
3
- export class PackChild extends VirtualChildNode {
2
+ import { VirtualContainerNode } from "./abstract/virtual-container.js";
3
+ class PackStartNode extends VirtualContainerNode {
4
4
  static priority = 1;
5
5
  static matches(type) {
6
- return type === "PackStart" || type === "PackEnd";
6
+ return type === "PackStart";
7
7
  }
8
- getPositionLabel() {
9
- return this.typeName === "PackStart" ? "start" : "end";
8
+ attachChild(parent, widget) {
9
+ parent.packStart(widget);
10
+ }
11
+ }
12
+ class PackEndNode extends VirtualContainerNode {
13
+ static priority = 1;
14
+ static matches(type) {
15
+ return type === "PackEnd";
10
16
  }
11
17
  attachChild(parent, widget) {
12
- if (this.getPositionLabel() === "start") {
13
- parent.packStart(widget);
14
- }
15
- else {
16
- parent.packEnd(widget);
17
- }
18
+ parent.packEnd(widget);
18
19
  }
19
20
  }
20
- registerNodeClass(PackChild);
21
+ registerNodeClass(PackStartNode);
22
+ registerNodeClass(PackEndNode);
@@ -1 +1,6 @@
1
- export {};
1
+ import type * as Gtk from "@gtkx/ffi/gtk";
2
+ export type PackableWidget = Gtk.Widget & {
3
+ packStart(child: Gtk.Widget): void;
4
+ packEnd(child: Gtk.Widget): void;
5
+ remove(child: Gtk.Widget): void;
6
+ };
@@ -1,46 +1,13 @@
1
1
  import { PACK_INTERFACE_METHODS } from "../generated/internal.js";
2
2
  import { registerNodeClass } from "../registry.js";
3
+ import { PositionalParentNode } from "./abstract/positional-parent.js";
3
4
  import { matchesInterface } from "./internal/utils.js";
4
- import { PackChild } from "./pack-child.js";
5
- import { SlotNode } from "./slot.js";
6
- import { WidgetNode } from "./widget.js";
7
- class PackNode extends WidgetNode {
5
+ class PackNode extends PositionalParentNode {
8
6
  static priority = 0;
7
+ acceptedPositionalChildTypes = new Set(["PackStart", "PackEnd"]);
8
+ containerTypeName = "Pack";
9
9
  static matches(_type, containerOrClass) {
10
10
  return matchesInterface(PACK_INTERFACE_METHODS, containerOrClass);
11
11
  }
12
- appendChild(child) {
13
- if (child instanceof PackChild) {
14
- child.setParent(this.container);
15
- return;
16
- }
17
- if (child instanceof SlotNode || child instanceof WidgetNode) {
18
- super.appendChild(child);
19
- return;
20
- }
21
- throw new Error(`Cannot append '${child.typeName}' to 'Pack': expected x.PackStart, x.PackEnd, or Widget`);
22
- }
23
- insertBefore(child, before) {
24
- if (child instanceof PackChild) {
25
- child.setParent(this.container);
26
- return;
27
- }
28
- if (child instanceof SlotNode || child instanceof WidgetNode) {
29
- super.insertBefore(child, before);
30
- return;
31
- }
32
- throw new Error(`Cannot insert '${child.typeName}' into 'Pack': expected x.PackStart, x.PackEnd, or Widget`);
33
- }
34
- removeChild(child) {
35
- if (child instanceof PackChild) {
36
- child.unmount();
37
- return;
38
- }
39
- if (child instanceof SlotNode || child instanceof WidgetNode) {
40
- super.removeChild(child);
41
- return;
42
- }
43
- throw new Error(`Cannot remove '${child.typeName}' from 'Pack': expected x.PackStart, x.PackEnd, or Widget`);
44
- }
45
12
  }
46
13
  registerNodeClass(PackNode);