@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.
Files changed (401) hide show
  1. package/dist/errors.d.ts +1 -0
  2. package/dist/errors.d.ts.map +1 -0
  3. package/dist/errors.js +1 -0
  4. package/dist/errors.js.map +1 -0
  5. package/dist/factory.d.ts +1 -0
  6. package/dist/factory.d.ts.map +1 -0
  7. package/dist/factory.js +1 -0
  8. package/dist/factory.js.map +1 -0
  9. package/dist/fiber-root.d.ts +1 -0
  10. package/dist/fiber-root.d.ts.map +1 -0
  11. package/dist/fiber-root.js +1 -0
  12. package/dist/fiber-root.js.map +1 -0
  13. package/dist/generated/internal.d.ts +1 -0
  14. package/dist/generated/internal.d.ts.map +1 -0
  15. package/dist/generated/internal.js +1 -0
  16. package/dist/generated/internal.js.map +1 -0
  17. package/dist/generated/jsx.d.ts +1 -0
  18. package/dist/generated/jsx.d.ts.map +1 -0
  19. package/dist/generated/jsx.js +1 -0
  20. package/dist/generated/jsx.js.map +1 -0
  21. package/dist/generated/registry.d.ts +1 -0
  22. package/dist/generated/registry.d.ts.map +1 -0
  23. package/dist/generated/registry.js +1 -0
  24. package/dist/generated/registry.js.map +1 -0
  25. package/dist/host-config.d.ts +1 -0
  26. package/dist/host-config.d.ts.map +1 -0
  27. package/dist/host-config.js +1 -0
  28. package/dist/host-config.js.map +1 -0
  29. package/dist/index.d.ts +1 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +1 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/jsx.d.ts +1 -0
  34. package/dist/jsx.d.ts.map +1 -0
  35. package/dist/jsx.js +1 -0
  36. package/dist/jsx.js.map +1 -0
  37. package/dist/metadata.d.ts +1 -0
  38. package/dist/metadata.d.ts.map +1 -0
  39. package/dist/metadata.js +1 -0
  40. package/dist/metadata.js.map +1 -0
  41. package/dist/node.d.ts +1 -0
  42. package/dist/node.d.ts.map +1 -0
  43. package/dist/node.js +1 -0
  44. package/dist/node.js.map +1 -0
  45. package/dist/nodes/adjustable.d.ts +1 -0
  46. package/dist/nodes/adjustable.d.ts.map +1 -0
  47. package/dist/nodes/adjustable.js +1 -0
  48. package/dist/nodes/adjustable.js.map +1 -0
  49. package/dist/nodes/alert-dialog-response.d.ts +1 -0
  50. package/dist/nodes/alert-dialog-response.d.ts.map +1 -0
  51. package/dist/nodes/alert-dialog-response.js +1 -0
  52. package/dist/nodes/alert-dialog-response.js.map +1 -0
  53. package/dist/nodes/animation.d.ts +1 -0
  54. package/dist/nodes/animation.d.ts.map +1 -0
  55. package/dist/nodes/animation.js +1 -0
  56. package/dist/nodes/animation.js.map +1 -0
  57. package/dist/nodes/application.d.ts +1 -0
  58. package/dist/nodes/application.d.ts.map +1 -0
  59. package/dist/nodes/application.js +1 -0
  60. package/dist/nodes/application.js.map +1 -0
  61. package/dist/nodes/calendar.d.ts +1 -0
  62. package/dist/nodes/calendar.d.ts.map +1 -0
  63. package/dist/nodes/calendar.js +1 -0
  64. package/dist/nodes/calendar.js.map +1 -0
  65. package/dist/nodes/color-dialog-button.d.ts +1 -0
  66. package/dist/nodes/color-dialog-button.d.ts.map +1 -0
  67. package/dist/nodes/color-dialog-button.js +1 -0
  68. package/dist/nodes/color-dialog-button.js.map +1 -0
  69. package/dist/nodes/column-view-column.d.ts +1 -0
  70. package/dist/nodes/column-view-column.d.ts.map +1 -0
  71. package/dist/nodes/column-view-column.js +1 -0
  72. package/dist/nodes/column-view-column.js.map +1 -0
  73. package/dist/nodes/column-view.d.ts +1 -0
  74. package/dist/nodes/column-view.d.ts.map +1 -0
  75. package/dist/nodes/column-view.js +1 -0
  76. package/dist/nodes/column-view.js.map +1 -0
  77. package/dist/nodes/container-slot.d.ts +1 -0
  78. package/dist/nodes/container-slot.d.ts.map +1 -0
  79. package/dist/nodes/container-slot.js +1 -0
  80. package/dist/nodes/container-slot.js.map +1 -0
  81. package/dist/nodes/dialog.d.ts +1 -0
  82. package/dist/nodes/dialog.d.ts.map +1 -0
  83. package/dist/nodes/dialog.js +1 -0
  84. package/dist/nodes/dialog.js.map +1 -0
  85. package/dist/nodes/drawing-area.d.ts +1 -0
  86. package/dist/nodes/drawing-area.d.ts.map +1 -0
  87. package/dist/nodes/drawing-area.js +1 -0
  88. package/dist/nodes/drawing-area.js.map +1 -0
  89. package/dist/nodes/drop-down.d.ts +1 -0
  90. package/dist/nodes/drop-down.d.ts.map +1 -0
  91. package/dist/nodes/drop-down.js +1 -0
  92. package/dist/nodes/drop-down.js.map +1 -0
  93. package/dist/nodes/event-controller.d.ts +1 -0
  94. package/dist/nodes/event-controller.d.ts.map +1 -0
  95. package/dist/nodes/event-controller.js +1 -0
  96. package/dist/nodes/event-controller.js.map +1 -0
  97. package/dist/nodes/fixed-child.d.ts +1 -0
  98. package/dist/nodes/fixed-child.d.ts.map +1 -0
  99. package/dist/nodes/fixed-child.js +1 -0
  100. package/dist/nodes/fixed-child.js.map +1 -0
  101. package/dist/nodes/font-dialog-button.d.ts +1 -0
  102. package/dist/nodes/font-dialog-button.d.ts.map +1 -0
  103. package/dist/nodes/font-dialog-button.js +1 -0
  104. package/dist/nodes/font-dialog-button.js.map +1 -0
  105. package/dist/nodes/grid-child.d.ts +1 -0
  106. package/dist/nodes/grid-child.d.ts.map +1 -0
  107. package/dist/nodes/grid-child.js +1 -0
  108. package/dist/nodes/grid-child.js.map +1 -0
  109. package/dist/nodes/grid-view.d.ts +1 -0
  110. package/dist/nodes/grid-view.d.ts.map +1 -0
  111. package/dist/nodes/grid-view.js +1 -0
  112. package/dist/nodes/grid-view.js.map +1 -0
  113. package/dist/nodes/internal/base-item-renderer.d.ts +1 -0
  114. package/dist/nodes/internal/base-item-renderer.d.ts.map +1 -0
  115. package/dist/nodes/internal/base-item-renderer.js +1 -0
  116. package/dist/nodes/internal/base-item-renderer.js.map +1 -0
  117. package/dist/nodes/internal/grid-item-renderer.d.ts +1 -0
  118. package/dist/nodes/internal/grid-item-renderer.d.ts.map +1 -0
  119. package/dist/nodes/internal/grid-item-renderer.js +1 -0
  120. package/dist/nodes/internal/grid-item-renderer.js.map +1 -0
  121. package/dist/nodes/internal/list-item-renderer.d.ts +1 -0
  122. package/dist/nodes/internal/list-item-renderer.d.ts.map +1 -0
  123. package/dist/nodes/internal/list-item-renderer.js +1 -0
  124. package/dist/nodes/internal/list-item-renderer.js.map +1 -0
  125. package/dist/nodes/internal/list-store.d.ts +1 -0
  126. package/dist/nodes/internal/list-store.d.ts.map +1 -0
  127. package/dist/nodes/internal/list-store.js +1 -0
  128. package/dist/nodes/internal/list-store.js.map +1 -0
  129. package/dist/nodes/internal/predicates.d.ts +1 -0
  130. package/dist/nodes/internal/predicates.d.ts.map +1 -0
  131. package/dist/nodes/internal/predicates.js +1 -0
  132. package/dist/nodes/internal/predicates.js.map +1 -0
  133. package/dist/nodes/internal/props.d.ts +1 -0
  134. package/dist/nodes/internal/props.d.ts.map +1 -0
  135. package/dist/nodes/internal/props.js +1 -0
  136. package/dist/nodes/internal/props.js.map +1 -0
  137. package/dist/nodes/internal/selection-model-controller.d.ts +1 -0
  138. package/dist/nodes/internal/selection-model-controller.d.ts.map +1 -0
  139. package/dist/nodes/internal/selection-model-controller.js +1 -0
  140. package/dist/nodes/internal/selection-model-controller.js.map +1 -0
  141. package/dist/nodes/internal/signal-store.d.ts +1 -0
  142. package/dist/nodes/internal/signal-store.d.ts.map +1 -0
  143. package/dist/nodes/internal/signal-store.js +1 -0
  144. package/dist/nodes/internal/signal-store.js.map +1 -0
  145. package/dist/nodes/internal/simple-list-store.d.ts +1 -0
  146. package/dist/nodes/internal/simple-list-store.d.ts.map +1 -0
  147. package/dist/nodes/internal/simple-list-store.js +1 -0
  148. package/dist/nodes/internal/simple-list-store.js.map +1 -0
  149. package/dist/nodes/internal/text-buffer-controller.d.ts +1 -0
  150. package/dist/nodes/internal/text-buffer-controller.d.ts.map +1 -0
  151. package/dist/nodes/internal/text-buffer-controller.js +1 -0
  152. package/dist/nodes/internal/text-buffer-controller.js.map +1 -0
  153. package/dist/nodes/internal/tree-store.d.ts +1 -0
  154. package/dist/nodes/internal/tree-store.d.ts.map +1 -0
  155. package/dist/nodes/internal/tree-store.js +1 -0
  156. package/dist/nodes/internal/tree-store.js.map +1 -0
  157. package/dist/nodes/internal/widget.d.ts +1 -0
  158. package/dist/nodes/internal/widget.d.ts.map +1 -0
  159. package/dist/nodes/internal/widget.js +1 -0
  160. package/dist/nodes/internal/widget.js.map +1 -0
  161. package/dist/nodes/level-bar.d.ts +1 -0
  162. package/dist/nodes/level-bar.d.ts.map +1 -0
  163. package/dist/nodes/level-bar.js +1 -0
  164. package/dist/nodes/level-bar.js.map +1 -0
  165. package/dist/nodes/list-item.d.ts +1 -0
  166. package/dist/nodes/list-item.d.ts.map +1 -0
  167. package/dist/nodes/list-item.js +1 -0
  168. package/dist/nodes/list-item.js.map +1 -0
  169. package/dist/nodes/list-view.d.ts +1 -0
  170. package/dist/nodes/list-view.d.ts.map +1 -0
  171. package/dist/nodes/list-view.js +1 -0
  172. package/dist/nodes/list-view.js.map +1 -0
  173. package/dist/nodes/menu.d.ts +1 -0
  174. package/dist/nodes/menu.d.ts.map +1 -0
  175. package/dist/nodes/menu.js +1 -0
  176. package/dist/nodes/menu.js.map +1 -0
  177. package/dist/nodes/models/grid.d.ts +1 -0
  178. package/dist/nodes/models/grid.d.ts.map +1 -0
  179. package/dist/nodes/models/grid.js +1 -0
  180. package/dist/nodes/models/grid.js.map +1 -0
  181. package/dist/nodes/models/list.d.ts +1 -0
  182. package/dist/nodes/models/list.d.ts.map +1 -0
  183. package/dist/nodes/models/list.js +1 -0
  184. package/dist/nodes/models/list.js.map +1 -0
  185. package/dist/nodes/models/menu.d.ts +1 -0
  186. package/dist/nodes/models/menu.d.ts.map +1 -0
  187. package/dist/nodes/models/menu.js +1 -0
  188. package/dist/nodes/models/menu.js.map +1 -0
  189. package/dist/nodes/navigation-page.d.ts +1 -0
  190. package/dist/nodes/navigation-page.d.ts.map +1 -0
  191. package/dist/nodes/navigation-page.js +1 -0
  192. package/dist/nodes/navigation-page.js.map +1 -0
  193. package/dist/nodes/navigation-view.d.ts +1 -0
  194. package/dist/nodes/navigation-view.d.ts.map +1 -0
  195. package/dist/nodes/navigation-view.js +1 -0
  196. package/dist/nodes/navigation-view.js.map +1 -0
  197. package/dist/nodes/notebook-page-tab.d.ts +1 -0
  198. package/dist/nodes/notebook-page-tab.d.ts.map +1 -0
  199. package/dist/nodes/notebook-page-tab.js +1 -0
  200. package/dist/nodes/notebook-page-tab.js.map +1 -0
  201. package/dist/nodes/notebook-page.d.ts +1 -0
  202. package/dist/nodes/notebook-page.d.ts.map +1 -0
  203. package/dist/nodes/notebook-page.js +1 -0
  204. package/dist/nodes/notebook-page.js.map +1 -0
  205. package/dist/nodes/notebook.d.ts +1 -0
  206. package/dist/nodes/notebook.d.ts.map +1 -0
  207. package/dist/nodes/notebook.js +1 -0
  208. package/dist/nodes/notebook.js.map +1 -0
  209. package/dist/nodes/overlay-child.d.ts +1 -0
  210. package/dist/nodes/overlay-child.d.ts.map +1 -0
  211. package/dist/nodes/overlay-child.js +1 -0
  212. package/dist/nodes/overlay-child.js.map +1 -0
  213. package/dist/nodes/popover-menu.d.ts +1 -0
  214. package/dist/nodes/popover-menu.d.ts.map +1 -0
  215. package/dist/nodes/popover-menu.js +1 -0
  216. package/dist/nodes/popover-menu.js.map +1 -0
  217. package/dist/nodes/scale.d.ts +1 -0
  218. package/dist/nodes/scale.d.ts.map +1 -0
  219. package/dist/nodes/scale.js +1 -0
  220. package/dist/nodes/scale.js.map +1 -0
  221. package/dist/nodes/scrolled-window.d.ts +1 -0
  222. package/dist/nodes/scrolled-window.d.ts.map +1 -0
  223. package/dist/nodes/scrolled-window.js +1 -0
  224. package/dist/nodes/scrolled-window.js.map +1 -0
  225. package/dist/nodes/search-bar.d.ts +1 -0
  226. package/dist/nodes/search-bar.d.ts.map +1 -0
  227. package/dist/nodes/search-bar.js +1 -0
  228. package/dist/nodes/search-bar.js.map +1 -0
  229. package/dist/nodes/shortcut-controller.d.ts +1 -0
  230. package/dist/nodes/shortcut-controller.d.ts.map +1 -0
  231. package/dist/nodes/shortcut-controller.js +1 -0
  232. package/dist/nodes/shortcut-controller.js.map +1 -0
  233. package/dist/nodes/shortcut.d.ts +1 -0
  234. package/dist/nodes/shortcut.d.ts.map +1 -0
  235. package/dist/nodes/shortcut.js +1 -0
  236. package/dist/nodes/shortcut.js.map +1 -0
  237. package/dist/nodes/slot.d.ts +1 -0
  238. package/dist/nodes/slot.d.ts.map +1 -0
  239. package/dist/nodes/slot.js +1 -0
  240. package/dist/nodes/slot.js.map +1 -0
  241. package/dist/nodes/source-view.d.ts +1 -0
  242. package/dist/nodes/source-view.d.ts.map +1 -0
  243. package/dist/nodes/source-view.js +1 -0
  244. package/dist/nodes/source-view.js.map +1 -0
  245. package/dist/nodes/stack-page.d.ts +1 -0
  246. package/dist/nodes/stack-page.d.ts.map +1 -0
  247. package/dist/nodes/stack-page.js +1 -0
  248. package/dist/nodes/stack-page.js.map +1 -0
  249. package/dist/nodes/stack.d.ts +1 -0
  250. package/dist/nodes/stack.d.ts.map +1 -0
  251. package/dist/nodes/stack.js +1 -0
  252. package/dist/nodes/stack.js.map +1 -0
  253. package/dist/nodes/text-anchor.d.ts +1 -0
  254. package/dist/nodes/text-anchor.d.ts.map +1 -0
  255. package/dist/nodes/text-anchor.js +1 -0
  256. package/dist/nodes/text-anchor.js.map +1 -0
  257. package/dist/nodes/text-content.d.ts +1 -0
  258. package/dist/nodes/text-content.d.ts.map +1 -0
  259. package/dist/nodes/text-content.js +1 -0
  260. package/dist/nodes/text-content.js.map +1 -0
  261. package/dist/nodes/text-paintable.d.ts +1 -0
  262. package/dist/nodes/text-paintable.d.ts.map +1 -0
  263. package/dist/nodes/text-paintable.js +1 -0
  264. package/dist/nodes/text-paintable.js.map +1 -0
  265. package/dist/nodes/text-segment.d.ts +1 -0
  266. package/dist/nodes/text-segment.d.ts.map +1 -0
  267. package/dist/nodes/text-segment.js +1 -0
  268. package/dist/nodes/text-segment.js.map +1 -0
  269. package/dist/nodes/text-tag.d.ts +1 -0
  270. package/dist/nodes/text-tag.d.ts.map +1 -0
  271. package/dist/nodes/text-tag.js +1 -0
  272. package/dist/nodes/text-tag.js.map +1 -0
  273. package/dist/nodes/text-view.d.ts +1 -0
  274. package/dist/nodes/text-view.d.ts.map +1 -0
  275. package/dist/nodes/text-view.js +1 -0
  276. package/dist/nodes/text-view.js.map +1 -0
  277. package/dist/nodes/toggle-group.d.ts +1 -0
  278. package/dist/nodes/toggle-group.d.ts.map +1 -0
  279. package/dist/nodes/toggle-group.js +1 -0
  280. package/dist/nodes/toggle-group.js.map +1 -0
  281. package/dist/nodes/toggle.d.ts +1 -0
  282. package/dist/nodes/toggle.d.ts.map +1 -0
  283. package/dist/nodes/toggle.js +1 -0
  284. package/dist/nodes/toggle.js.map +1 -0
  285. package/dist/nodes/virtual.d.ts +1 -0
  286. package/dist/nodes/virtual.d.ts.map +1 -0
  287. package/dist/nodes/virtual.js +1 -0
  288. package/dist/nodes/virtual.js.map +1 -0
  289. package/dist/nodes/web-view.d.ts +1 -0
  290. package/dist/nodes/web-view.d.ts.map +1 -0
  291. package/dist/nodes/web-view.js +1 -0
  292. package/dist/nodes/web-view.js.map +1 -0
  293. package/dist/nodes/widget.d.ts +1 -0
  294. package/dist/nodes/widget.d.ts.map +1 -0
  295. package/dist/nodes/widget.js +1 -0
  296. package/dist/nodes/widget.js.map +1 -0
  297. package/dist/nodes/window.d.ts +1 -0
  298. package/dist/nodes/window.d.ts.map +1 -0
  299. package/dist/nodes/window.js +1 -0
  300. package/dist/nodes/window.js.map +1 -0
  301. package/dist/portal.d.ts +1 -0
  302. package/dist/portal.d.ts.map +1 -0
  303. package/dist/portal.js +1 -0
  304. package/dist/portal.js.map +1 -0
  305. package/dist/reconciler.d.ts +1 -0
  306. package/dist/reconciler.d.ts.map +1 -0
  307. package/dist/reconciler.js +1 -0
  308. package/dist/reconciler.js.map +1 -0
  309. package/dist/registry.d.ts +1 -0
  310. package/dist/registry.d.ts.map +1 -0
  311. package/dist/registry.js +1 -0
  312. package/dist/registry.js.map +1 -0
  313. package/dist/render.d.ts +1 -0
  314. package/dist/render.d.ts.map +1 -0
  315. package/dist/render.js +1 -0
  316. package/dist/render.js.map +1 -0
  317. package/dist/types.d.ts +1 -0
  318. package/dist/types.d.ts.map +1 -0
  319. package/dist/types.js +1 -0
  320. package/dist/types.js.map +1 -0
  321. package/package.json +6 -4
  322. package/src/errors.ts +52 -0
  323. package/src/factory.ts +62 -0
  324. package/src/fiber-root.ts +20 -0
  325. package/src/generated/internal.ts +2134 -0
  326. package/src/generated/jsx.ts +20068 -0
  327. package/src/generated/registry.ts +16 -0
  328. package/src/host-config.ts +186 -0
  329. package/src/index.ts +11 -0
  330. package/src/jsx.ts +1294 -0
  331. package/src/metadata.ts +36 -0
  332. package/src/node.ts +109 -0
  333. package/src/nodes/adjustable.ts +68 -0
  334. package/src/nodes/alert-dialog-response.ts +78 -0
  335. package/src/nodes/animation.ts +402 -0
  336. package/src/nodes/application.ts +56 -0
  337. package/src/nodes/calendar.ts +38 -0
  338. package/src/nodes/color-dialog-button.ts +69 -0
  339. package/src/nodes/column-view-column.ts +84 -0
  340. package/src/nodes/column-view.ts +192 -0
  341. package/src/nodes/container-slot.ts +87 -0
  342. package/src/nodes/dialog.ts +25 -0
  343. package/src/nodes/drawing-area.ts +51 -0
  344. package/src/nodes/drop-down.ts +92 -0
  345. package/src/nodes/event-controller.ts +100 -0
  346. package/src/nodes/fixed-child.ts +108 -0
  347. package/src/nodes/font-dialog-button.ts +97 -0
  348. package/src/nodes/grid-child.ts +103 -0
  349. package/src/nodes/grid-view.ts +96 -0
  350. package/src/nodes/internal/base-item-renderer.ts +108 -0
  351. package/src/nodes/internal/grid-item-renderer.ts +71 -0
  352. package/src/nodes/internal/list-item-renderer.ts +155 -0
  353. package/src/nodes/internal/list-store.ts +105 -0
  354. package/src/nodes/internal/predicates.ts +80 -0
  355. package/src/nodes/internal/props.ts +51 -0
  356. package/src/nodes/internal/selection-model-controller.ts +115 -0
  357. package/src/nodes/internal/signal-store.ts +141 -0
  358. package/src/nodes/internal/simple-list-store.ts +99 -0
  359. package/src/nodes/internal/text-buffer-controller.ts +374 -0
  360. package/src/nodes/internal/tree-store.ts +237 -0
  361. package/src/nodes/internal/widget.ts +78 -0
  362. package/src/nodes/level-bar.ts +36 -0
  363. package/src/nodes/list-item.ts +107 -0
  364. package/src/nodes/list-view.ts +97 -0
  365. package/src/nodes/menu.ts +27 -0
  366. package/src/nodes/models/grid.ts +105 -0
  367. package/src/nodes/models/list.ts +140 -0
  368. package/src/nodes/models/menu.ts +310 -0
  369. package/src/nodes/navigation-page.ts +154 -0
  370. package/src/nodes/navigation-view.ts +58 -0
  371. package/src/nodes/notebook-page-tab.ts +55 -0
  372. package/src/nodes/notebook-page.ts +185 -0
  373. package/src/nodes/notebook.ts +28 -0
  374. package/src/nodes/overlay-child.ts +109 -0
  375. package/src/nodes/popover-menu.ts +59 -0
  376. package/src/nodes/scale.ts +28 -0
  377. package/src/nodes/scrolled-window.ts +23 -0
  378. package/src/nodes/search-bar.ts +27 -0
  379. package/src/nodes/shortcut-controller.ts +27 -0
  380. package/src/nodes/shortcut.ts +69 -0
  381. package/src/nodes/slot.ts +138 -0
  382. package/src/nodes/source-view.ts +130 -0
  383. package/src/nodes/stack-page.ts +170 -0
  384. package/src/nodes/stack.ts +35 -0
  385. package/src/nodes/text-anchor.ts +74 -0
  386. package/src/nodes/text-content.ts +14 -0
  387. package/src/nodes/text-paintable.ts +51 -0
  388. package/src/nodes/text-segment.ts +55 -0
  389. package/src/nodes/text-tag.ts +287 -0
  390. package/src/nodes/text-view.ts +93 -0
  391. package/src/nodes/toggle-group.ts +27 -0
  392. package/src/nodes/toggle.ts +72 -0
  393. package/src/nodes/virtual.ts +16 -0
  394. package/src/nodes/web-view.ts +22 -0
  395. package/src/nodes/widget.ts +398 -0
  396. package/src/nodes/window.ts +159 -0
  397. package/src/portal.ts +37 -0
  398. package/src/reconciler.ts +52 -0
  399. package/src/registry.ts +123 -0
  400. package/src/render.tsx +192 -0
  401. package/src/types.ts +7 -0
@@ -0,0 +1,237 @@
1
+ import * as Gtk from "@gtkx/ffi/gtk";
2
+
3
+ export type TreeItemUpdatedCallback = (id: string) => void;
4
+
5
+ export type TreeItemData<T = unknown> = {
6
+ value: T;
7
+ indentForDepth?: boolean;
8
+ indentForIcon?: boolean;
9
+ hideExpander?: boolean;
10
+ };
11
+
12
+ export class TreeStore {
13
+ private rootIds: string[] = [];
14
+ private rootIdToIndex = new Map<string, number>();
15
+ private children = new Map<string, string[]>();
16
+ private childIdToIndex = new Map<string, Map<string, number>>();
17
+ private rootModel = new Gtk.StringList();
18
+ private childModels = new Map<string, Gtk.StringList>();
19
+ private items = new Map<string, TreeItemData>();
20
+ private onItemUpdated: TreeItemUpdatedCallback | null = null;
21
+ private pendingBatch: string[] | null = null;
22
+
23
+ public setOnItemUpdated(callback: TreeItemUpdatedCallback | null): void {
24
+ this.onItemUpdated = callback;
25
+ }
26
+
27
+ public beginBatch(): void {
28
+ this.pendingBatch = [];
29
+ }
30
+
31
+ public flushBatch(): void {
32
+ const batch = this.pendingBatch;
33
+ this.pendingBatch = null;
34
+ if (batch && batch.length > 0) {
35
+ this.rootModel.splice(0, 0, batch);
36
+ }
37
+ }
38
+
39
+ public updateItem(id: string, item: TreeItemData): void {
40
+ if (this.items.has(id)) {
41
+ this.items.set(id, item);
42
+ this.onItemUpdated?.(id);
43
+ } else {
44
+ this.addItem(id, item);
45
+ }
46
+ }
47
+
48
+ public addItem(id: string, data: TreeItemData, parentId?: string): void {
49
+ this.items.set(id, data);
50
+
51
+ if (parentId === undefined) {
52
+ const existingIndex = this.rootIdToIndex.get(id);
53
+ if (existingIndex !== undefined) {
54
+ this.rootModel.remove(existingIndex);
55
+ this.rootIds.splice(existingIndex, 1);
56
+ this.rebuildRootIndices(existingIndex);
57
+ }
58
+
59
+ this.rootIdToIndex.set(id, this.rootIds.length);
60
+ this.rootIds.push(id);
61
+
62
+ if (this.pendingBatch) {
63
+ this.pendingBatch.push(id);
64
+ } else {
65
+ this.rootModel.append(id);
66
+ }
67
+ } else {
68
+ let siblings = this.children.get(parentId);
69
+ let indexMap = this.childIdToIndex.get(parentId);
70
+ if (!siblings) {
71
+ siblings = [];
72
+ this.children.set(parentId, siblings);
73
+ }
74
+ if (!indexMap) {
75
+ indexMap = new Map();
76
+ this.childIdToIndex.set(parentId, indexMap);
77
+ }
78
+
79
+ const existingIndex = indexMap.get(id);
80
+ if (existingIndex !== undefined) {
81
+ const model = this.childModels.get(parentId);
82
+ if (model) {
83
+ model.remove(existingIndex);
84
+ }
85
+ siblings.splice(existingIndex, 1);
86
+ this.rebuildChildIndices(siblings, indexMap, existingIndex);
87
+ }
88
+
89
+ indexMap.set(id, siblings.length);
90
+ siblings.push(id);
91
+
92
+ let model = this.childModels.get(parentId);
93
+ if (!model) {
94
+ model = new Gtk.StringList();
95
+ this.childModels.set(parentId, model);
96
+ }
97
+ model.append(id);
98
+ }
99
+ }
100
+
101
+ public removeItem(id: string, parentId?: string): void {
102
+ this.items.delete(id);
103
+ this.children.delete(id);
104
+ this.childIdToIndex.delete(id);
105
+ this.childModels.delete(id);
106
+
107
+ if (parentId === undefined) {
108
+ const index = this.rootIdToIndex.get(id);
109
+ if (index !== undefined) {
110
+ this.rootIds.splice(index, 1);
111
+ this.rootIdToIndex.delete(id);
112
+ this.rebuildRootIndices(index);
113
+ this.rootModel.remove(index);
114
+ }
115
+ } else {
116
+ const siblings = this.children.get(parentId);
117
+ const indexMap = this.childIdToIndex.get(parentId);
118
+ if (siblings && indexMap) {
119
+ const index = indexMap.get(id);
120
+ if (index !== undefined) {
121
+ siblings.splice(index, 1);
122
+ indexMap.delete(id);
123
+ this.rebuildChildIndices(siblings, indexMap, index);
124
+ const model = this.childModels.get(parentId);
125
+ if (model) {
126
+ model.remove(index);
127
+ }
128
+ }
129
+ if (siblings.length === 0) {
130
+ this.children.delete(parentId);
131
+ this.childIdToIndex.delete(parentId);
132
+ }
133
+ }
134
+ }
135
+ }
136
+
137
+ public insertItemBefore(id: string, beforeId: string, data: TreeItemData, parentId?: string): void {
138
+ this.items.set(id, data);
139
+
140
+ if (parentId === undefined) {
141
+ const existingIndex = this.rootIdToIndex.get(id);
142
+ if (existingIndex !== undefined) {
143
+ this.rootModel.remove(existingIndex);
144
+ this.rootIds.splice(existingIndex, 1);
145
+ this.rootIdToIndex.delete(id);
146
+ this.rebuildRootIndices(existingIndex);
147
+ }
148
+
149
+ const beforeIndex = this.rootIdToIndex.get(beforeId);
150
+ if (beforeIndex === undefined) {
151
+ this.rootIdToIndex.set(id, this.rootIds.length);
152
+ this.rootIds.push(id);
153
+ this.rootModel.append(id);
154
+ } else {
155
+ this.rootIds.splice(beforeIndex, 0, id);
156
+ this.rebuildRootIndices(beforeIndex);
157
+ this.rootModel.splice(beforeIndex, 0, [id]);
158
+ }
159
+ } else {
160
+ let siblings = this.children.get(parentId);
161
+ let indexMap = this.childIdToIndex.get(parentId);
162
+ if (!siblings) {
163
+ siblings = [];
164
+ this.children.set(parentId, siblings);
165
+ }
166
+ if (!indexMap) {
167
+ indexMap = new Map();
168
+ this.childIdToIndex.set(parentId, indexMap);
169
+ }
170
+
171
+ let model = this.childModels.get(parentId);
172
+ if (!model) {
173
+ model = new Gtk.StringList();
174
+ this.childModels.set(parentId, model);
175
+ }
176
+
177
+ const existingIndex = indexMap.get(id);
178
+ if (existingIndex !== undefined) {
179
+ model.remove(existingIndex);
180
+ siblings.splice(existingIndex, 1);
181
+ indexMap.delete(id);
182
+ this.rebuildChildIndices(siblings, indexMap, existingIndex);
183
+ }
184
+
185
+ const beforeIndex = indexMap.get(beforeId);
186
+ if (beforeIndex === undefined) {
187
+ indexMap.set(id, siblings.length);
188
+ siblings.push(id);
189
+ model.append(id);
190
+ } else {
191
+ siblings.splice(beforeIndex, 0, id);
192
+ this.rebuildChildIndices(siblings, indexMap, beforeIndex);
193
+ model.splice(beforeIndex, 0, [id]);
194
+ }
195
+ }
196
+ }
197
+
198
+ public getItem(id: string): TreeItemData | undefined {
199
+ return this.items.get(id);
200
+ }
201
+
202
+ public getRootModel(): Gtk.StringList {
203
+ return this.rootModel;
204
+ }
205
+
206
+ public getChildrenModel(parentId: string): Gtk.StringList | null {
207
+ const childIds = this.children.get(parentId);
208
+ if (!childIds || childIds.length === 0) {
209
+ return null;
210
+ }
211
+
212
+ let model = this.childModels.get(parentId);
213
+ if (!model) {
214
+ model = new Gtk.StringList(childIds);
215
+ this.childModels.set(parentId, model);
216
+ }
217
+
218
+ return model;
219
+ }
220
+
221
+ public hasChildren(parentId: string): boolean {
222
+ const childIds = this.children.get(parentId);
223
+ return childIds !== undefined && childIds.length > 0;
224
+ }
225
+
226
+ private rebuildRootIndices(fromIndex: number): void {
227
+ for (let i = fromIndex; i < this.rootIds.length; i++) {
228
+ this.rootIdToIndex.set(this.rootIds[i] as string, i);
229
+ }
230
+ }
231
+
232
+ private rebuildChildIndices(siblings: string[], indexMap: Map<string, number>, fromIndex: number): void {
233
+ for (let i = fromIndex; i < siblings.length; i++) {
234
+ indexMap.set(siblings[i] as string, i);
235
+ }
236
+ }
237
+ }
@@ -0,0 +1,78 @@
1
+ import type * as Gtk from "@gtkx/ffi/gtk";
2
+ import { resolvePropMeta } from "../../metadata.js";
3
+ import type { ContainerClass } from "../../types.js";
4
+ import { isAddable, isAppendable, isContentWidget, isRemovable, isSingleChild } from "./predicates.js";
5
+
6
+ export function detachChild(child: Gtk.Widget, container: Gtk.Widget): void {
7
+ if (isAppendable(container) || isAddable(container)) {
8
+ if (isRemovable(container)) {
9
+ container.remove(child);
10
+ }
11
+ } else if (isContentWidget(container)) {
12
+ container.setContent(null);
13
+ } else if (isSingleChild(container)) {
14
+ container.setChild(null);
15
+ } else if (isRemovable(container)) {
16
+ container.remove(child);
17
+ }
18
+ }
19
+
20
+ export function attachChild(child: Gtk.Widget, container: Gtk.Widget): void {
21
+ if (isAppendable(container)) {
22
+ container.append(child);
23
+ } else if (isAddable(container)) {
24
+ container.add(child);
25
+ } else if (isContentWidget(container)) {
26
+ container.setContent(child);
27
+ } else if (isSingleChild(container)) {
28
+ container.setChild(child);
29
+ } else {
30
+ throw new Error(`Cannot attach child to '${container.constructor.name}': container does not support children`);
31
+ }
32
+ }
33
+
34
+ export function isAttachedTo(child: Gtk.Widget | null, parent: Gtk.Widget | null): boolean {
35
+ if (!child || !parent) return false;
36
+ const childParent = child.getParent();
37
+ return childParent !== null && childParent === parent;
38
+ }
39
+
40
+ export function getFocusWidget(widget: Gtk.Widget): Gtk.Widget | null {
41
+ const root = widget.getRoot();
42
+ return root?.getFocus?.() ?? null;
43
+ }
44
+
45
+ export function isDescendantOf(widget: Gtk.Widget, ancestor: Gtk.Widget): boolean {
46
+ let current: Gtk.Widget | null = widget;
47
+
48
+ while (current) {
49
+ if (current === ancestor) {
50
+ return true;
51
+ }
52
+
53
+ current = current.getParent();
54
+ }
55
+
56
+ return false;
57
+ }
58
+
59
+ export function resolvePropertySetter(
60
+ parentWidget: Gtk.Widget,
61
+ propId: string,
62
+ ): ((child: Gtk.Widget | null) => void) | null {
63
+ const propMeta = resolvePropMeta(parentWidget, propId);
64
+
65
+ if (!propMeta) {
66
+ return null;
67
+ }
68
+
69
+ const [, setterName] = propMeta;
70
+ const setter = parentWidget[setterName as keyof Gtk.Widget];
71
+
72
+ if (typeof setter !== "function") {
73
+ const parentType = (parentWidget.constructor as ContainerClass).glibTypeName;
74
+ throw new Error(`Expected setter function for property '${propId}' on type '${parentType}'`);
75
+ }
76
+
77
+ return setter.bind(parentWidget) as (child: Gtk.Widget | null) => void;
78
+ }
@@ -0,0 +1,36 @@
1
+ import type * as Gtk from "@gtkx/ffi/gtk";
2
+ import type { GtkLevelBarProps } from "../jsx.js";
3
+ import { filterProps, shallowArrayEqual } from "./internal/props.js";
4
+ import { WidgetNode } from "./widget.js";
5
+
6
+ const OWN_PROPS = ["offsets"] as const;
7
+
8
+ type LevelBarProps = Pick<GtkLevelBarProps, (typeof OWN_PROPS)[number]>;
9
+ type Offset = { id: string; value: number };
10
+
11
+ export class LevelBarNode extends WidgetNode<Gtk.LevelBar, LevelBarProps> {
12
+ private appliedOffsets: Offset[] = [];
13
+
14
+ public override commitUpdate(oldProps: LevelBarProps | null, newProps: LevelBarProps): void {
15
+ super.commitUpdate(oldProps ? filterProps(oldProps, OWN_PROPS) : null, filterProps(newProps, OWN_PROPS));
16
+ this.applyOwnProps(newProps);
17
+ }
18
+
19
+ private applyOwnProps(newProps: LevelBarProps): void {
20
+ const newOffsets = newProps.offsets ?? [];
21
+
22
+ if (shallowArrayEqual(this.appliedOffsets, newOffsets)) {
23
+ return;
24
+ }
25
+
26
+ for (const offset of this.appliedOffsets) {
27
+ this.container.removeOffsetValue(offset.id);
28
+ }
29
+
30
+ for (const offset of newOffsets) {
31
+ this.container.addOffsetValue(offset.id, offset.value);
32
+ }
33
+
34
+ this.appliedOffsets = [...newOffsets];
35
+ }
36
+ }
@@ -0,0 +1,107 @@
1
+ import type { ListItemProps } from "../jsx.js";
2
+ import type { Node } from "../node.js";
3
+ import { hasChanged } from "./internal/props.js";
4
+ import { type TreeItemData, TreeStore } from "./internal/tree-store.js";
5
+ import { VirtualNode } from "./virtual.js";
6
+
7
+ type ItemStore = { updateItem(id: string, value: unknown): void };
8
+
9
+ export class ListItemNode extends VirtualNode<ListItemProps, Node, ListItemNode> {
10
+ private store: ItemStore | null = null;
11
+ private parentItemId: string | null = null;
12
+
13
+ public static createItemData(props: ListItemProps): TreeItemData {
14
+ return {
15
+ value: props.value,
16
+ indentForDepth: props.indentForDepth,
17
+ indentForIcon: props.indentForIcon,
18
+ hideExpander: props.hideExpander,
19
+ };
20
+ }
21
+
22
+ public override isValidChild(child: Node): boolean {
23
+ return child instanceof ListItemNode;
24
+ }
25
+
26
+ public override appendChild(child: ListItemNode): void {
27
+ super.appendChild(child);
28
+ child.setParentItemId(this.props.id);
29
+
30
+ if (this.store instanceof TreeStore) {
31
+ this.store.addItem(child.props.id, ListItemNode.createItemData(child.props), this.props.id);
32
+ child.setStore(this.store);
33
+ }
34
+ }
35
+
36
+ public override insertBefore(child: ListItemNode, before: ListItemNode): void {
37
+ super.insertBefore(child, before);
38
+ child.setParentItemId(this.props.id);
39
+
40
+ if (this.store instanceof TreeStore) {
41
+ this.store.insertItemBefore(
42
+ child.props.id,
43
+ before.props.id,
44
+ ListItemNode.createItemData(child.props),
45
+ this.props.id,
46
+ );
47
+ child.setStore(this.store);
48
+ }
49
+ }
50
+
51
+ public override removeChild(child: ListItemNode): void {
52
+ if (this.store instanceof TreeStore) {
53
+ this.store.removeItem(child.props.id, this.props.id);
54
+ }
55
+
56
+ child.setStore(null);
57
+ child.setParentItemId(null);
58
+ super.removeChild(child);
59
+ }
60
+
61
+ public override commitUpdate(oldProps: ListItemProps | null, newProps: ListItemProps): void {
62
+ super.commitUpdate(oldProps, newProps);
63
+ this.applyOwnProps(oldProps, newProps);
64
+ }
65
+
66
+ private applyOwnProps(oldProps: ListItemProps | null, newProps: ListItemProps): void {
67
+ if (!this.store) return;
68
+
69
+ if (this.store instanceof TreeStore) {
70
+ const propsChanged =
71
+ hasChanged(oldProps, newProps, "id") ||
72
+ hasChanged(oldProps, newProps, "value") ||
73
+ hasChanged(oldProps, newProps, "indentForDepth") ||
74
+ hasChanged(oldProps, newProps, "indentForIcon") ||
75
+ hasChanged(oldProps, newProps, "hideExpander");
76
+
77
+ if (propsChanged) {
78
+ this.store.updateItem(newProps.id, ListItemNode.createItemData(newProps));
79
+ }
80
+ } else {
81
+ if (hasChanged(oldProps, newProps, "id") || hasChanged(oldProps, newProps, "value")) {
82
+ this.store.updateItem(newProps.id, newProps.value);
83
+ }
84
+ }
85
+ }
86
+
87
+ public setStore(store: ItemStore | null): void {
88
+ this.store = store;
89
+ if (store === null || store instanceof TreeStore) {
90
+ for (const child of this.children) {
91
+ child.setStore(store);
92
+ }
93
+ }
94
+ }
95
+
96
+ public getChildNodes(): readonly ListItemNode[] {
97
+ return this.children;
98
+ }
99
+
100
+ public setParentItemId(parentId: string | null): void {
101
+ this.parentItemId = parentId;
102
+ }
103
+
104
+ public getParentItemId(): string | null {
105
+ return this.parentItemId;
106
+ }
107
+ }
@@ -0,0 +1,97 @@
1
+ import type * as Gtk from "@gtkx/ffi/gtk";
2
+ import type { GtkListViewProps } 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 { 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 RENDERER_PROPS = ["renderItem", "estimatedItemHeight"] as const;
12
+ const OWN_PROPS = [...RENDERER_PROPS, "autoexpand", "selectionMode", "selected", "onSelectionChanged"] as const;
13
+
14
+ type ListViewProps = Pick<GtkListViewProps, (typeof RENDERER_PROPS)[number]> & ListModelProps;
15
+
16
+ export class ListViewNode extends WidgetNode<Gtk.ListView, ListViewProps, ListItemNode> {
17
+ private itemRenderer: ListItemRenderer;
18
+ private list: ListModel;
19
+
20
+ public override isValidChild(child: Node): boolean {
21
+ return child instanceof ListItemNode;
22
+ }
23
+
24
+ constructor(typeName: string, props: ListViewProps, container: Gtk.ListView, rootContainer: Container) {
25
+ super(typeName, props, container, rootContainer);
26
+ this.list = new ListModel(
27
+ { owner: this, signalStore: this.signalStore },
28
+ {
29
+ autoexpand: props.autoexpand,
30
+ selectionMode: props.selectionMode,
31
+ selected: props.selected,
32
+ onSelectionChanged: props.onSelectionChanged,
33
+ },
34
+ );
35
+ this.itemRenderer = new ListItemRenderer(this.signalStore);
36
+ this.itemRenderer.setStore(this.list.getStore());
37
+ this.list.getStore().setOnItemUpdated((id) => this.itemRenderer.rebindItem(id));
38
+ this.container.setFactory(this.itemRenderer.getFactory());
39
+ }
40
+
41
+ public override appendChild(child: ListItemNode): void {
42
+ super.appendChild(child);
43
+ this.list.appendChild(child);
44
+ }
45
+
46
+ public override insertBefore(child: ListItemNode, before: ListItemNode): void {
47
+ super.insertBefore(child, before);
48
+ this.list.insertBefore(child, before);
49
+ }
50
+
51
+ public override removeChild(child: ListItemNode): void {
52
+ this.list.removeChild(child);
53
+ super.removeChild(child);
54
+ }
55
+
56
+ public override finalizeInitialChildren(props: ListViewProps): boolean {
57
+ super.finalizeInitialChildren(props);
58
+ return true;
59
+ }
60
+
61
+ public override commitUpdate(oldProps: ListViewProps | null, newProps: ListViewProps): void {
62
+ super.commitUpdate(oldProps ? filterProps(oldProps, OWN_PROPS) : null, filterProps(newProps, OWN_PROPS));
63
+ this.applyOwnProps(oldProps, newProps);
64
+ }
65
+
66
+ public override commitMount(): void {
67
+ super.commitMount();
68
+ this.list.flushBatch();
69
+ this.container.setModel(this.list.getSelectionModel());
70
+ }
71
+
72
+ public override detachDeletedInstance(): void {
73
+ this.itemRenderer.dispose();
74
+ super.detachDeletedInstance();
75
+ }
76
+
77
+ private applyOwnProps(oldProps: ListViewProps | null, newProps: ListViewProps): void {
78
+ if (hasChanged(oldProps, newProps, "renderItem")) {
79
+ this.itemRenderer.setRenderFn(newProps.renderItem ?? null);
80
+ }
81
+
82
+ if (hasChanged(oldProps, newProps, "estimatedItemHeight")) {
83
+ this.itemRenderer.setEstimatedItemHeight(newProps.estimatedItemHeight ?? null);
84
+ }
85
+
86
+ const previousModel = this.list.getSelectionModel();
87
+ this.list.updateProps(
88
+ oldProps ? filterProps(oldProps, RENDERER_PROPS) : null,
89
+ filterProps(newProps, RENDERER_PROPS),
90
+ );
91
+ const currentModel = this.list.getSelectionModel();
92
+
93
+ if (previousModel !== currentModel) {
94
+ this.container.setModel(currentModel);
95
+ }
96
+ }
97
+ }
@@ -0,0 +1,27 @@
1
+ import * as Gtk from "@gtkx/ffi/gtk";
2
+ import type { Container } from "../types.js";
3
+ import { MenuModel, type MenuModelProps, type MenuType } from "./models/menu.js";
4
+
5
+ export class MenuNode extends MenuModel {
6
+ private static getType(typeName: string): MenuType {
7
+ if (typeName === "MenuItem") {
8
+ return "item";
9
+ } else if (typeName === "MenuSection") {
10
+ return "section";
11
+ } else if (typeName === "MenuSubmenu") {
12
+ return "submenu";
13
+ }
14
+
15
+ throw new Error(`Unable to find menu type '${typeName}'`);
16
+ }
17
+
18
+ constructor(typeName: string, props: MenuModelProps, _container: undefined, rootContainer: Container) {
19
+ super(
20
+ MenuNode.getType(typeName),
21
+ props,
22
+ rootContainer,
23
+ undefined,
24
+ rootContainer instanceof Gtk.Application ? rootContainer : undefined,
25
+ );
26
+ }
27
+ }
@@ -0,0 +1,105 @@
1
+ import * as Gtk from "@gtkx/ffi/gtk";
2
+ import type { GtkGridViewProps } from "../../jsx.js";
3
+ import { ListStore } from "../internal/list-store.js";
4
+ import { SelectionModelController } from "../internal/selection-model-controller.js";
5
+ import type { SignalStore } from "../internal/signal-store.js";
6
+ import type { ListItemNode } from "../list-item.js";
7
+
8
+ export type GridModelProps = Pick<GtkGridViewProps, "selectionMode" | "selected" | "onSelectionChanged">;
9
+
10
+ type GridModelConfig = {
11
+ owner: object;
12
+ signalStore: SignalStore;
13
+ };
14
+
15
+ export class GridModel {
16
+ private config: GridModelConfig;
17
+ private store: ListStore;
18
+ private selectionManager: SelectionModelController;
19
+
20
+ private initialSelected: string[] | null | undefined;
21
+
22
+ constructor(config: GridModelConfig, props: GridModelProps = {}) {
23
+ this.config = config;
24
+ this.store = new ListStore();
25
+ this.store.beginBatch();
26
+ this.initialSelected = props.selected;
27
+ this.selectionManager = new SelectionModelController(
28
+ { ...config, ...props },
29
+ this.store.getModel(),
30
+ () => this.getSelection(),
31
+ (ids) => this.resolveSelectionIndices(ids),
32
+ () => this.store.getModel().getNItems(),
33
+ );
34
+ }
35
+
36
+ public flushBatch(): void {
37
+ this.store.flushBatch();
38
+ this.selectionManager.reapplySelection(this.initialSelected);
39
+ this.initialSelected = undefined;
40
+ }
41
+
42
+ public getStore(): ListStore {
43
+ return this.store;
44
+ }
45
+
46
+ public getSelectionModel(): Gtk.NoSelection | Gtk.SingleSelection | Gtk.MultiSelection {
47
+ return this.selectionManager.getSelectionModel();
48
+ }
49
+
50
+ public appendChild(child: ListItemNode): void {
51
+ child.setStore(this.store);
52
+ this.store.addItem(child.props.id, child.props.value);
53
+ }
54
+
55
+ public insertBefore(child: ListItemNode, before: ListItemNode): void {
56
+ child.setStore(this.store);
57
+ this.store.insertItemBefore(child.props.id, before.props.id, child.props.value);
58
+ }
59
+
60
+ public removeChild(child: ListItemNode): void {
61
+ this.store.removeItem(child.props.id);
62
+ child.setStore(null);
63
+ }
64
+
65
+ public updateProps(oldProps: GridModelProps | null, newProps: GridModelProps): void {
66
+ this.selectionManager.update(
67
+ oldProps ? { ...this.config, ...oldProps } : null,
68
+ { ...this.config, ...newProps },
69
+ this.store.getModel(),
70
+ );
71
+ }
72
+
73
+ private getSelection(): string[] {
74
+ const model = this.store.getModel();
75
+ const selection = this.selectionManager.getSelectionModel().getSelection();
76
+ const size = selection.getSize();
77
+ const ids: string[] = [];
78
+
79
+ for (let i = 0; i < size; i++) {
80
+ const index = selection.getNth(i);
81
+ const id = model.getString(index);
82
+
83
+ if (id !== null) {
84
+ ids.push(id);
85
+ }
86
+ }
87
+
88
+ return ids;
89
+ }
90
+
91
+ private resolveSelectionIndices(ids: string[]): Gtk.Bitset {
92
+ const model = this.store.getModel();
93
+ const nItems = model.getNItems();
94
+ const selected = new Gtk.Bitset();
95
+
96
+ for (const id of ids) {
97
+ const index = model.find(id);
98
+ if (index < nItems) {
99
+ selected.add(index);
100
+ }
101
+ }
102
+
103
+ return selected;
104
+ }
105
+ }