@gtkx/components 1.0.0-rc.1 → 1.0.0-rc.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 (210) hide show
  1. package/dist/adw/index.d.ts +3 -0
  2. package/dist/adw/index.d.ts.map +1 -0
  3. package/dist/adw/index.js +2 -0
  4. package/dist/adw/index.js.map +1 -0
  5. package/dist/adw/toast.d.ts +10 -0
  6. package/dist/adw/toast.d.ts.map +1 -0
  7. package/dist/adw/toast.js +51 -0
  8. package/dist/adw/toast.js.map +1 -0
  9. package/dist/adw/types.d.ts +28 -0
  10. package/dist/adw/types.d.ts.map +1 -0
  11. package/dist/adw/types.js +2 -0
  12. package/dist/adw/types.js.map +1 -0
  13. package/dist/column-view.d.ts +7 -29
  14. package/dist/column-view.d.ts.map +1 -1
  15. package/dist/column-view.js +98 -70
  16. package/dist/column-view.js.map +1 -1
  17. package/dist/drop-down.d.ts +8 -27
  18. package/dist/drop-down.d.ts.map +1 -1
  19. package/dist/drop-down.js +112 -81
  20. package/dist/drop-down.js.map +1 -1
  21. package/dist/grid-view.d.ts +6 -16
  22. package/dist/grid-view.d.ts.map +1 -1
  23. package/dist/grid-view.js +25 -33
  24. package/dist/grid-view.js.map +1 -1
  25. package/dist/index.d.ts +6 -12
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +1 -6
  28. package/dist/index.js.map +1 -1
  29. package/dist/internal/cells.d.ts +50 -0
  30. package/dist/internal/cells.d.ts.map +1 -0
  31. package/dist/internal/cells.js +185 -0
  32. package/dist/internal/cells.js.map +1 -0
  33. package/dist/internal/collection-index.d.ts +21 -0
  34. package/dist/internal/collection-index.d.ts.map +1 -0
  35. package/dist/internal/collection-index.js +106 -0
  36. package/dist/internal/collection-index.js.map +1 -0
  37. package/dist/internal/collection-model.d.ts +12 -0
  38. package/dist/internal/collection-model.d.ts.map +1 -0
  39. package/dist/internal/collection-model.js +164 -0
  40. package/dist/internal/collection-model.js.map +1 -0
  41. package/dist/internal/collection.d.ts +18 -0
  42. package/dist/internal/collection.d.ts.map +1 -0
  43. package/dist/internal/collection.js +64 -0
  44. package/dist/internal/collection.js.map +1 -0
  45. package/dist/internal/expansion.d.ts +9 -0
  46. package/dist/internal/expansion.d.ts.map +1 -0
  47. package/dist/internal/expansion.js +75 -0
  48. package/dist/internal/expansion.js.map +1 -0
  49. package/dist/internal/selection.d.ts +12 -0
  50. package/dist/internal/selection.d.ts.map +1 -0
  51. package/dist/internal/selection.js +99 -0
  52. package/dist/internal/selection.js.map +1 -0
  53. package/dist/internal/use-collection.d.ts +18 -0
  54. package/dist/internal/use-collection.d.ts.map +1 -0
  55. package/dist/internal/use-collection.js +42 -0
  56. package/dist/internal/use-collection.js.map +1 -0
  57. package/dist/internal/use-widget-ref.d.ts +4 -0
  58. package/dist/internal/use-widget-ref.d.ts.map +1 -0
  59. package/dist/internal/use-widget-ref.js +8 -0
  60. package/dist/internal/use-widget-ref.js.map +1 -0
  61. package/dist/list-view.d.ts +5 -20
  62. package/dist/list-view.d.ts.map +1 -1
  63. package/dist/list-view.js +32 -53
  64. package/dist/list-view.js.map +1 -1
  65. package/dist/size-group.d.ts +8 -16
  66. package/dist/size-group.d.ts.map +1 -1
  67. package/dist/size-group.js +35 -51
  68. package/dist/size-group.js.map +1 -1
  69. package/dist/types.d.ts +97 -24
  70. package/dist/types.d.ts.map +1 -1
  71. package/dist/types.js.map +1 -1
  72. package/package.json +17 -6
  73. package/src/adw/index.ts +2 -0
  74. package/src/adw/toast.tsx +74 -0
  75. package/src/adw/types.ts +32 -0
  76. package/src/column-view.tsx +176 -160
  77. package/src/drop-down.tsx +180 -167
  78. package/src/grid-view.tsx +29 -73
  79. package/src/index.ts +18 -25
  80. package/src/internal/cells.tsx +345 -0
  81. package/src/internal/collection-index.ts +168 -0
  82. package/src/internal/collection-model.ts +246 -0
  83. package/src/internal/collection.ts +104 -0
  84. package/src/internal/expansion.ts +123 -0
  85. package/src/internal/selection.tsx +159 -0
  86. package/src/internal/use-collection.tsx +70 -0
  87. package/src/internal/use-widget-ref.ts +11 -0
  88. package/src/list-view.tsx +43 -139
  89. package/src/size-group.tsx +63 -82
  90. package/src/types.ts +155 -24
  91. package/dist/cell.d.ts +0 -30
  92. package/dist/cell.d.ts.map +0 -1
  93. package/dist/cell.js +0 -45
  94. package/dist/cell.js.map +0 -1
  95. package/dist/column-view-column.d.ts +0 -27
  96. package/dist/column-view-column.d.ts.map +0 -1
  97. package/dist/column-view-column.js +0 -30
  98. package/dist/column-view-column.js.map +0 -1
  99. package/dist/constraint-layout-apply.d.ts +0 -55
  100. package/dist/constraint-layout-apply.d.ts.map +0 -1
  101. package/dist/constraint-layout-apply.js +0 -107
  102. package/dist/constraint-layout-apply.js.map +0 -1
  103. package/dist/constraint-layout.d.ts +0 -20
  104. package/dist/constraint-layout.d.ts.map +0 -1
  105. package/dist/constraint-layout.js +0 -88
  106. package/dist/constraint-layout.js.map +0 -1
  107. package/dist/fixed.d.ts +0 -26
  108. package/dist/fixed.d.ts.map +0 -1
  109. package/dist/fixed.js +0 -40
  110. package/dist/fixed.js.map +0 -1
  111. package/dist/grid.d.ts +0 -27
  112. package/dist/grid.d.ts.map +0 -1
  113. package/dist/grid.js +0 -48
  114. package/dist/grid.js.map +0 -1
  115. package/dist/hooks/use-cell-containers.d.ts +0 -18
  116. package/dist/hooks/use-cell-containers.d.ts.map +0 -1
  117. package/dist/hooks/use-cell-containers.js +0 -67
  118. package/dist/hooks/use-cell-containers.js.map +0 -1
  119. package/dist/hooks/use-collection-model.d.ts +0 -26
  120. package/dist/hooks/use-collection-model.d.ts.map +0 -1
  121. package/dist/hooks/use-collection-model.js +0 -35
  122. package/dist/hooks/use-collection-model.js.map +0 -1
  123. package/dist/hooks/use-collection-widget.d.ts +0 -28
  124. package/dist/hooks/use-collection-widget.d.ts.map +0 -1
  125. package/dist/hooks/use-collection-widget.js +0 -21
  126. package/dist/hooks/use-collection-widget.js.map +0 -1
  127. package/dist/hooks/use-drop-down-selection.d.ts +0 -16
  128. package/dist/hooks/use-drop-down-selection.d.ts.map +0 -1
  129. package/dist/hooks/use-drop-down-selection.js +0 -35
  130. package/dist/hooks/use-drop-down-selection.js.map +0 -1
  131. package/dist/hooks/use-expansion-model.d.ts +0 -12
  132. package/dist/hooks/use-expansion-model.d.ts.map +0 -1
  133. package/dist/hooks/use-expansion-model.js +0 -71
  134. package/dist/hooks/use-expansion-model.js.map +0 -1
  135. package/dist/hooks/use-header-menu.d.ts +0 -4
  136. package/dist/hooks/use-header-menu.d.ts.map +0 -1
  137. package/dist/hooks/use-header-menu.js +0 -20
  138. package/dist/hooks/use-header-menu.js.map +0 -1
  139. package/dist/hooks/use-installed-model.d.ts +0 -4
  140. package/dist/hooks/use-installed-model.d.ts.map +0 -1
  141. package/dist/hooks/use-installed-model.js +0 -15
  142. package/dist/hooks/use-installed-model.js.map +0 -1
  143. package/dist/hooks/use-list-model.d.ts +0 -19
  144. package/dist/hooks/use-list-model.d.ts.map +0 -1
  145. package/dist/hooks/use-list-model.js +0 -97
  146. package/dist/hooks/use-list-model.js.map +0 -1
  147. package/dist/hooks/use-placed-child.d.ts +0 -18
  148. package/dist/hooks/use-placed-child.d.ts.map +0 -1
  149. package/dist/hooks/use-placed-child.js +0 -47
  150. package/dist/hooks/use-placed-child.js.map +0 -1
  151. package/dist/hooks/use-selection-model.d.ts +0 -13
  152. package/dist/hooks/use-selection-model.d.ts.map +0 -1
  153. package/dist/hooks/use-selection-model.js +0 -103
  154. package/dist/hooks/use-selection-model.js.map +0 -1
  155. package/dist/hooks/use-sort-handler.d.ts +0 -17
  156. package/dist/hooks/use-sort-handler.d.ts.map +0 -1
  157. package/dist/hooks/use-sort-handler.js +0 -87
  158. package/dist/hooks/use-sort-handler.js.map +0 -1
  159. package/dist/menu-items.d.ts +0 -5
  160. package/dist/menu-items.d.ts.map +0 -1
  161. package/dist/menu-items.js +0 -48
  162. package/dist/menu-items.js.map +0 -1
  163. package/dist/menu.d.ts +0 -14
  164. package/dist/menu.d.ts.map +0 -1
  165. package/dist/menu.js +0 -24
  166. package/dist/menu.js.map +0 -1
  167. package/dist/overlay.d.ts +0 -24
  168. package/dist/overlay.d.ts.map +0 -1
  169. package/dist/overlay.js +0 -49
  170. package/dist/overlay.js.map +0 -1
  171. package/dist/utils/cell-container-store.d.ts +0 -28
  172. package/dist/utils/cell-container-store.d.ts.map +0 -1
  173. package/dist/utils/cell-container-store.js +0 -98
  174. package/dist/utils/cell-container-store.js.map +0 -1
  175. package/dist/utils/item-models.d.ts +0 -10
  176. package/dist/utils/item-models.d.ts.map +0 -1
  177. package/dist/utils/item-models.js +0 -82
  178. package/dist/utils/item-models.js.map +0 -1
  179. package/dist/utils/item-resolver.d.ts +0 -25
  180. package/dist/utils/item-resolver.d.ts.map +0 -1
  181. package/dist/utils/item-resolver.js +0 -102
  182. package/dist/utils/item-resolver.js.map +0 -1
  183. package/dist/utils/list-item-flatten.d.ts +0 -24
  184. package/dist/utils/list-item-flatten.d.ts.map +0 -1
  185. package/dist/utils/list-item-flatten.js +0 -68
  186. package/dist/utils/list-item-flatten.js.map +0 -1
  187. package/src/cell.tsx +0 -144
  188. package/src/column-view-column.tsx +0 -82
  189. package/src/constraint-layout-apply.ts +0 -173
  190. package/src/constraint-layout.tsx +0 -135
  191. package/src/fixed.tsx +0 -86
  192. package/src/grid.tsx +0 -88
  193. package/src/hooks/use-cell-containers.ts +0 -93
  194. package/src/hooks/use-collection-model.ts +0 -60
  195. package/src/hooks/use-collection-widget.ts +0 -47
  196. package/src/hooks/use-drop-down-selection.ts +0 -52
  197. package/src/hooks/use-expansion-model.ts +0 -82
  198. package/src/hooks/use-header-menu.ts +0 -34
  199. package/src/hooks/use-installed-model.ts +0 -20
  200. package/src/hooks/use-list-model.ts +0 -161
  201. package/src/hooks/use-placed-child.ts +0 -79
  202. package/src/hooks/use-selection-model.ts +0 -114
  203. package/src/hooks/use-sort-handler.ts +0 -107
  204. package/src/menu-items.ts +0 -48
  205. package/src/menu.tsx +0 -32
  206. package/src/overlay.tsx +0 -88
  207. package/src/utils/cell-container-store.ts +0 -114
  208. package/src/utils/item-models.ts +0 -113
  209. package/src/utils/item-resolver.ts +0 -138
  210. package/src/utils/list-item-flatten.ts +0 -90
@@ -1 +0,0 @@
1
- {"version":3,"file":"cell-container-store.d.ts","sourceRoot":"","sources":["../../src/utils/cell-container-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,OAAO,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AAEzC,MAAM,MAAM,SAAS,GAAG;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC;CACnC,CAAC;AAIF,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,OAAO,CAAwC;IAEvD,OAAO,CAAC,SAAS,CAAwC;IAEzD,OAAO,CAAC,YAAY,CAAyB;IAE7C,OAAO,CAAC,iBAAiB,CAA8C;IAEvE,OAAO,CAAC,gBAAgB,CAAyC;IAEjE,OAAO,CAAC,IAAI,CAAyC;IAErD,OAAO,CAAC,QAAQ,CAAwB;IAExC,YAAY,aAAc,MAAM,IAAI,KAAG,CAAC,MAAM,IAAI,CAAC,CAKjD;IAEF,qBAAqB,QAAO,OAAO,CAAC,MAAM,EAAE,CAAkB;IAE9D,iBAAiB,cAAe,OAAO,CAAC,MAAM,YAAY,MAAM,IAAI,KAAG,CAAC,MAAM,IAAI,CAAC,CAajF;IAEF,WAAW,cAAe,OAAO,CAAC,MAAM,KAAG,SAAS,CAOlD;IAEF,MAAM,cAAe,OAAO,CAAC,MAAM,KAAG,MAAM,CAM1C;IAEF,YAAY,cAAe,OAAO,CAAC,MAAM,KAAG,IAAI,CAI9C;IAEF,IAAI,cAAe,OAAO,CAAC,MAAM,YAAY,MAAM,WAAW,GAAG,CAAC,WAAW,GAAG,IAAI,KAAG,IAAI,CAGzF;IAEF,MAAM,cAAe,OAAO,CAAC,MAAM,KAAG,IAAI,CAIxC;IAEF,eAAe,cAAe,OAAO,CAAC,MAAM,KAAG,IAAI,CAKjD;IAEF,OAAO,CAAC,QAAQ,CAGd;IAEF,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,cAAc;CAczB"}
@@ -1,98 +0,0 @@
1
- let nextKey = 0;
2
- export class CellContainerStore {
3
- entries = new Map();
4
- published = new Map();
5
- setListeners = new Set();
6
- positionListeners = new Map();
7
- positionFlushers = new Map();
8
- keys = new WeakMap();
9
- snapshot = [];
10
- subscribeSet = (onChange) => {
11
- this.setListeners.add(onChange);
12
- return () => {
13
- this.setListeners.delete(onChange);
14
- };
15
- };
16
- getContainersSnapshot = () => this.snapshot;
17
- subscribePosition = (container, onChange) => {
18
- let listeners = this.positionListeners.get(container);
19
- if (listeners === undefined) {
20
- listeners = new Set();
21
- this.positionListeners.set(container, listeners);
22
- }
23
- listeners.add(onChange);
24
- return () => {
25
- const current = this.positionListeners.get(container);
26
- if (current === undefined)
27
- return;
28
- current.delete(onChange);
29
- if (current.size === 0)
30
- this.positionListeners.delete(container);
31
- };
32
- };
33
- getPosition = (container) => {
34
- let entry = this.published.get(container);
35
- if (entry === undefined) {
36
- entry = { position: -1, treeRow: null };
37
- this.published.set(container, entry);
38
- }
39
- return entry;
40
- };
41
- keyFor = (container) => {
42
- const existing = this.keys.get(container);
43
- if (existing !== undefined)
44
- return existing;
45
- const key = `cell-${nextKey++}`;
46
- this.keys.set(container, key);
47
- return key;
48
- };
49
- addContainer = (container) => {
50
- if (this.entries.has(container))
51
- return;
52
- this.entries.set(container, { position: -1, treeRow: null });
53
- this.notifySet();
54
- };
55
- bind = (container, position, treeRow) => {
56
- this.entries.set(container, { position, treeRow });
57
- this.notifyPosition(container);
58
- };
59
- unbind = (container) => {
60
- if (!this.entries.has(container))
61
- return;
62
- this.entries.set(container, { position: -1, treeRow: null });
63
- this.notifyPosition(container);
64
- };
65
- removeContainer = (container) => {
66
- if (!this.entries.delete(container))
67
- return;
68
- this.published.delete(container);
69
- this.positionFlushers.delete(container);
70
- this.notifySet();
71
- };
72
- flushSet = () => {
73
- this.snapshot = [...this.entries.keys()];
74
- for (const listener of [...this.setListeners])
75
- listener();
76
- };
77
- notifySet() {
78
- this.flushSet();
79
- }
80
- notifyPosition(container) {
81
- let flush = this.positionFlushers.get(container);
82
- if (flush === undefined) {
83
- flush = () => {
84
- const live = this.entries.get(container);
85
- if (live !== undefined)
86
- this.published.set(container, live);
87
- const listeners = this.positionListeners.get(container);
88
- if (listeners === undefined)
89
- return;
90
- for (const listener of [...listeners])
91
- listener();
92
- };
93
- this.positionFlushers.set(container, flush);
94
- }
95
- flush();
96
- }
97
- }
98
- //# sourceMappingURL=cell-container-store.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cell-container-store.js","sourceRoot":"","sources":["../../src/utils/cell-container-store.ts"],"names":[],"mappings":"AAQA,IAAI,OAAO,GAAG,CAAC,CAAC;AAEhB,MAAM,OAAO,kBAAkB;IACnB,OAAO,GAAG,IAAI,GAAG,EAA6B,CAAC;IAE/C,SAAS,GAAG,IAAI,GAAG,EAA6B,CAAC;IAEjD,YAAY,GAAG,IAAI,GAAG,EAAc,CAAC;IAErC,iBAAiB,GAAG,IAAI,GAAG,EAAmC,CAAC;IAE/D,gBAAgB,GAAG,IAAI,GAAG,EAA8B,CAAC;IAEzD,IAAI,GAAG,IAAI,OAAO,EAA0B,CAAC;IAE7C,QAAQ,GAAqB,EAAE,CAAC;IAExC,YAAY,GAAG,CAAC,QAAoB,EAAgB,EAAE;QAClD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAChC,OAAO,GAAG,EAAE;YACR,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC,CAAC;IACN,CAAC,CAAC;IAEF,qBAAqB,GAAG,GAAqB,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;IAE9D,iBAAiB,GAAG,CAAC,SAAyB,EAAE,QAAoB,EAAgB,EAAE;QAClF,IAAI,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACtD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC1B,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACrD,CAAC;QACD,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxB,OAAO,GAAG,EAAE;YACR,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACtD,IAAI,OAAO,KAAK,SAAS;gBAAE,OAAO;YAClC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACzB,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;gBAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACrE,CAAC,CAAC;IACN,CAAC,CAAC;IAEF,WAAW,GAAG,CAAC,SAAyB,EAAa,EAAE;QACnD,IAAI,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtB,KAAK,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACxC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,GAAG,CAAC,SAAyB,EAAU,EAAE;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,QAAQ,CAAC;QAC5C,MAAM,GAAG,GAAG,QAAQ,OAAO,EAAE,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,GAAG,CAAC;IACf,CAAC,CAAC;IAEF,YAAY,GAAG,CAAC,SAAyB,EAAQ,EAAE;QAC/C,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAO;QACxC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,SAAS,EAAE,CAAC;IACrB,CAAC,CAAC;IAEF,IAAI,GAAG,CAAC,SAAyB,EAAE,QAAgB,EAAE,OAA+B,EAAQ,EAAE;QAC1F,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC,CAAC;IAEF,MAAM,GAAG,CAAC,SAAyB,EAAQ,EAAE;QACzC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAO;QACzC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC,CAAC;IAEF,eAAe,GAAG,CAAC,SAAyB,EAAQ,EAAE;QAClD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;YAAE,OAAO;QAC5C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACjC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,CAAC,SAAS,EAAE,CAAC;IACrB,CAAC,CAAC;IAEM,QAAQ,GAAG,GAAS,EAAE;QAC1B,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACzC,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC;YAAE,QAAQ,EAAE,CAAC;IAC9D,CAAC,CAAC;IAEM,SAAS;QACb,IAAI,CAAC,QAAQ,EAAE,CAAC;IACpB,CAAC;IAEO,cAAc,CAAC,SAAyB;QAC5C,IAAI,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtB,KAAK,GAAG,GAAS,EAAE;gBACf,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACzC,IAAI,IAAI,KAAK,SAAS;oBAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACxD,IAAI,SAAS,KAAK,SAAS;oBAAE,OAAO;gBACpC,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,SAAS,CAAC;oBAAE,QAAQ,EAAE,CAAC;YACtD,CAAC,CAAC;YACF,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC;QACD,KAAK,EAAE,CAAC;IACZ,CAAC;CACJ","sourcesContent":["import type * as GObject from \"@gtkx/gi/gobject\";\nimport type * as Gtk from \"@gtkx/gi/gtk\";\n\nexport type CellEntry = {\n position: number;\n treeRow: Gtk.TreeListRow | null;\n};\n\nlet nextKey = 0;\n\nexport class CellContainerStore {\n private entries = new Map<GObject.Object, CellEntry>();\n\n private published = new Map<GObject.Object, CellEntry>();\n\n private setListeners = new Set<() => void>();\n\n private positionListeners = new Map<GObject.Object, Set<() => void>>();\n\n private positionFlushers = new Map<GObject.Object, () => void>();\n\n private keys = new WeakMap<GObject.Object, string>();\n\n private snapshot: GObject.Object[] = [];\n\n subscribeSet = (onChange: () => void): (() => void) => {\n this.setListeners.add(onChange);\n return () => {\n this.setListeners.delete(onChange);\n };\n };\n\n getContainersSnapshot = (): GObject.Object[] => this.snapshot;\n\n subscribePosition = (container: GObject.Object, onChange: () => void): (() => void) => {\n let listeners = this.positionListeners.get(container);\n if (listeners === undefined) {\n listeners = new Set();\n this.positionListeners.set(container, listeners);\n }\n listeners.add(onChange);\n return () => {\n const current = this.positionListeners.get(container);\n if (current === undefined) return;\n current.delete(onChange);\n if (current.size === 0) this.positionListeners.delete(container);\n };\n };\n\n getPosition = (container: GObject.Object): CellEntry => {\n let entry = this.published.get(container);\n if (entry === undefined) {\n entry = { position: -1, treeRow: null };\n this.published.set(container, entry);\n }\n return entry;\n };\n\n keyFor = (container: GObject.Object): string => {\n const existing = this.keys.get(container);\n if (existing !== undefined) return existing;\n const key = `cell-${nextKey++}`;\n this.keys.set(container, key);\n return key;\n };\n\n addContainer = (container: GObject.Object): void => {\n if (this.entries.has(container)) return;\n this.entries.set(container, { position: -1, treeRow: null });\n this.notifySet();\n };\n\n bind = (container: GObject.Object, position: number, treeRow: Gtk.TreeListRow | null): void => {\n this.entries.set(container, { position, treeRow });\n this.notifyPosition(container);\n };\n\n unbind = (container: GObject.Object): void => {\n if (!this.entries.has(container)) return;\n this.entries.set(container, { position: -1, treeRow: null });\n this.notifyPosition(container);\n };\n\n removeContainer = (container: GObject.Object): void => {\n if (!this.entries.delete(container)) return;\n this.published.delete(container);\n this.positionFlushers.delete(container);\n this.notifySet();\n };\n\n private flushSet = (): void => {\n this.snapshot = [...this.entries.keys()];\n for (const listener of [...this.setListeners]) listener();\n };\n\n private notifySet(): void {\n this.flushSet();\n }\n\n private notifyPosition(container: GObject.Object): void {\n let flush = this.positionFlushers.get(container);\n if (flush === undefined) {\n flush = (): void => {\n const live = this.entries.get(container);\n if (live !== undefined) this.published.set(container, live);\n const listeners = this.positionListeners.get(container);\n if (listeners === undefined) return;\n for (const listener of [...listeners]) listener();\n };\n this.positionFlushers.set(container, flush);\n }\n flush();\n }\n}\n"]}
@@ -1,10 +0,0 @@
1
- import type * as GObject from "@gtkx/gi/gobject";
2
- import * as Gtk from "@gtkx/gi/gtk";
3
- import type { ItemNode, SectionNode } from "../types.js";
4
- import type { RowValue } from "./item-resolver.js";
5
- export declare const retagRows: <T>(items: ItemNode<T>[], rowValues: WeakMap<GObject.Object, RowValue<T>>, placeholdersById: Map<string, GObject.Object>) => void;
6
- export declare const createFlatModel: (count: number) => Gtk.StringList;
7
- export declare const resizeFlatModel: (model: Gtk.StringList, count: number) => void;
8
- export declare const createTreeModel: <T>(items: ItemNode<T>[], rowValues: WeakMap<GObject.Object, RowValue<T>>, placeholdersById: Map<string, GObject.Object>) => Gtk.TreeListModel;
9
- export declare const createSectionModel: <S, T>(sections: SectionNode<S, T>[]) => Gtk.FlattenListModel;
10
- //# sourceMappingURL=item-models.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"item-models.d.ts","sourceRoot":"","sources":["../../src/utils/item-models.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,OAAO,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AACpC,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAKnD,eAAO,MAAM,SAAS,GAAI,CAAC,SAChB,QAAQ,CAAC,CAAC,CAAC,EAAE,aACT,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,oBAC7B,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,KAC9C,IAeF,CAAC;AAEF,eAAO,MAAM,eAAe,UAAW,MAAM,KAAG,GAAG,CAAC,UAAqD,CAAC;AAE1G,eAAO,MAAM,eAAe,UAAW,GAAG,CAAC,UAAU,SAAS,MAAM,KAAG,IAStE,CAAC;AA+BF,eAAO,MAAM,eAAe,GAAI,CAAC,SACtB,QAAQ,CAAC,CAAC,CAAC,EAAE,aACT,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,oBAC7B,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,KAC9C,GAAG,CAAC,aA4BN,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,CAAC,EAAE,CAAC,YAAY,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAG,GAAG,CAAC,gBAM5E,CAAC"}
@@ -1,82 +0,0 @@
1
- import * as Gio from "@gtkx/gi/gio";
2
- import * as Gtk from "@gtkx/gi/gtk";
3
- import { countDescendants, treeItemMetadata } from "./list-item-flatten.js";
4
- const emptyStrings = (count) => new Array(Math.max(0, count)).fill("");
5
- export const retagRows = (items, rowValues, placeholdersById) => {
6
- const walk = (list) => {
7
- for (const item of list) {
8
- const placeholder = placeholdersById.get(item.id);
9
- if (placeholder !== undefined) {
10
- rowValues.set(placeholder, {
11
- id: item.id,
12
- value: item.value,
13
- metadata: treeItemMetadata(item),
14
- });
15
- }
16
- if (item.children !== undefined && item.children.length > 0)
17
- walk(item.children);
18
- }
19
- };
20
- walk(items);
21
- };
22
- export const createFlatModel = (count) => Gtk.StringList.new(emptyStrings(count));
23
- export const resizeFlatModel = (model, count) => {
24
- const target = Math.max(0, count);
25
- const current = model.getNItems();
26
- if (current === target)
27
- return;
28
- if (target > current) {
29
- model.splice(current, 0, emptyStrings(target - current));
30
- return;
31
- }
32
- model.splice(target, current - target, null);
33
- };
34
- const createTaggedRow = (row, rowValues, placeholdersById) => {
35
- const placeholder = Gtk.StringObject.new("");
36
- rowValues.set(placeholder, row);
37
- if (placeholdersById !== undefined)
38
- placeholdersById.set(row.id, placeholder);
39
- return placeholder;
40
- };
41
- const childModelOf = (children, rowValues, placeholdersById) => {
42
- const store = Gio.ListStore.new(Gtk.StringObject.prototype.__type__);
43
- for (const child of children) {
44
- store.append(createTaggedRow({ id: child.id, value: child.value, metadata: treeItemMetadata(child) }, rowValues, placeholdersById));
45
- }
46
- return store;
47
- };
48
- export const createTreeModel = (items, rowValues, placeholdersById) => {
49
- const childrenByRow = new WeakMap();
50
- const root = Gio.ListStore.new(Gtk.StringObject.prototype.__type__);
51
- for (const item of items) {
52
- const placeholder = createTaggedRow({ id: item.id, value: item.value, metadata: treeItemMetadata(item) }, rowValues, placeholdersById);
53
- if (item.children !== undefined && item.children.length > 0) {
54
- childrenByRow.set(placeholder, item.children);
55
- }
56
- root.append(placeholder);
57
- }
58
- const createFunc = (rowItem) => {
59
- const children = childrenByRow.get(rowItem);
60
- if (children === undefined)
61
- return null;
62
- const store = childModelOf(children, rowValues, placeholdersById);
63
- for (let index = 0; index < children.length; index++) {
64
- const child = children[index];
65
- if (child !== undefined && child.children !== undefined && child.children.length > 0) {
66
- const placeholder = store.getItem(index);
67
- if (placeholder !== null)
68
- childrenByRow.set(placeholder, child.children);
69
- }
70
- }
71
- return store;
72
- };
73
- return Gtk.TreeListModel.new(root, false, false, createFunc);
74
- };
75
- export const createSectionModel = (sections) => {
76
- const store = Gio.ListStore.new(Gtk.StringList.prototype.__type__);
77
- for (const section of sections) {
78
- store.append(Gtk.StringList.new(emptyStrings(countDescendants(section.data))));
79
- }
80
- return Gtk.FlattenListModel.new(store);
81
- };
82
- //# sourceMappingURL=item-models.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"item-models.js","sourceRoot":"","sources":["../../src/utils/item-models.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Gio from \"@gtkx/gi/gio\";\nimport type * as GObject from \"@gtkx/gi/gobject\";\nimport * as Gtk from \"@gtkx/gi/gtk\";\nimport type { ItemNode, SectionNode } from \"../types.js\";\nimport type { RowValue } from \"./item-resolver.js\";\nimport { countDescendants, treeItemMetadata } from \"./list-item-flatten.js\";\n\nconst emptyStrings = (count: number): string[] => new Array<string>(Math.max(0, count)).fill(\"\");\n\nexport const retagRows = <T>(\n items: ItemNode<T>[],\n rowValues: WeakMap<GObject.Object, RowValue<T>>,\n placeholdersById: Map<string, GObject.Object>,\n): void => {\n const walk = (list: ItemNode<T>[]): void => {\n for (const item of list) {\n const placeholder = placeholdersById.get(item.id);\n if (placeholder !== undefined) {\n rowValues.set(placeholder, {\n id: item.id,\n value: item.value,\n metadata: treeItemMetadata(item),\n });\n }\n if (item.children !== undefined && item.children.length > 0) walk(item.children);\n }\n };\n walk(items);\n};\n\nexport const createFlatModel = (count: number): Gtk.StringList => Gtk.StringList.new(emptyStrings(count));\n\nexport const resizeFlatModel = (model: Gtk.StringList, count: number): void => {\n const target = Math.max(0, count);\n const current = model.getNItems();\n if (current === target) return;\n if (target > current) {\n model.splice(current, 0, emptyStrings(target - current));\n return;\n }\n model.splice(target, current - target, null);\n};\n\nconst createTaggedRow = <T>(\n row: RowValue<T>,\n rowValues: WeakMap<GObject.Object, RowValue<T>>,\n placeholdersById?: Map<string, GObject.Object>,\n): GObject.Object => {\n const placeholder = Gtk.StringObject.new(\"\");\n rowValues.set(placeholder, row);\n if (placeholdersById !== undefined) placeholdersById.set(row.id, placeholder);\n return placeholder;\n};\n\nconst childModelOf = <T>(\n children: ItemNode<T>[],\n rowValues: WeakMap<GObject.Object, RowValue<T>>,\n placeholdersById: Map<string, GObject.Object>,\n): Gio.ListStore => {\n const store = Gio.ListStore.new(Gtk.StringObject.prototype.__type__);\n for (const child of children) {\n store.append(\n createTaggedRow(\n { id: child.id, value: child.value, metadata: treeItemMetadata(child) },\n rowValues,\n placeholdersById,\n ),\n );\n }\n return store;\n};\n\nexport const createTreeModel = <T>(\n items: ItemNode<T>[],\n rowValues: WeakMap<GObject.Object, RowValue<T>>,\n placeholdersById: Map<string, GObject.Object>,\n): Gtk.TreeListModel => {\n const childrenByRow = new WeakMap<GObject.Object, ItemNode<T>[]>();\n const root = Gio.ListStore.new(Gtk.StringObject.prototype.__type__);\n for (const item of items) {\n const placeholder = createTaggedRow(\n { id: item.id, value: item.value, metadata: treeItemMetadata(item) },\n rowValues,\n placeholdersById,\n );\n if (item.children !== undefined && item.children.length > 0) {\n childrenByRow.set(placeholder, item.children);\n }\n root.append(placeholder);\n }\n const createFunc = (rowItem: GObject.Object): Gio.ListModel | null => {\n const children = childrenByRow.get(rowItem);\n if (children === undefined) return null;\n const store = childModelOf(children, rowValues, placeholdersById);\n for (let index = 0; index < children.length; index++) {\n const child = children[index];\n if (child !== undefined && child.children !== undefined && child.children.length > 0) {\n const placeholder = store.getItem(index);\n if (placeholder !== null) childrenByRow.set(placeholder, child.children);\n }\n }\n return store;\n };\n return Gtk.TreeListModel.new(root, false, false, createFunc);\n};\n\nexport const createSectionModel = <S, T>(sections: SectionNode<S, T>[]): Gtk.FlattenListModel => {\n const store = Gio.ListStore.new(Gtk.StringList.prototype.__type__);\n for (const section of sections) {\n store.append(Gtk.StringList.new(emptyStrings(countDescendants(section.data))));\n }\n return Gtk.FlattenListModel.new(store);\n};\n"]}
@@ -1,25 +0,0 @@
1
- import type * as GObject from "@gtkx/gi/gobject";
2
- import type * as Gtk from "@gtkx/gi/gtk";
3
- import type { ItemNode, SectionNode } from "../types.js";
4
- import { type TreeItemMetadata } from "./list-item-flatten.js";
5
- export type Resolved<T = unknown, S = unknown> = {
6
- value: T | S | undefined;
7
- present: boolean;
8
- isHeader: boolean;
9
- metadata: TreeItemMetadata;
10
- };
11
- export type ItemResolver<T = unknown, S = unknown> = {
12
- resolve(position: number, treeRow: Gtk.TreeListRow | null): Resolved<T, S>;
13
- positionOfId(id: string): number;
14
- idOf(position: number): string | undefined;
15
- };
16
- export type RowValue<T = unknown> = {
17
- id: string;
18
- value: T;
19
- metadata: TreeItemMetadata;
20
- };
21
- export declare const rowIdOf: <T>(rowValues: WeakMap<GObject.Object, RowValue<T>>, row: Gtk.TreeListRow) => string | undefined;
22
- export declare const createItemResolver: <T, S>(items: ItemNode<T>[] | undefined, flattenTreeChildren: boolean, rowValues: WeakMap<GObject.Object, RowValue<T>>) => ItemResolver<T, S>;
23
- export declare const createSectionHeaderResolver: <T, S>(sections: SectionNode<S, T>[] | undefined) => ItemResolver<T, S>;
24
- export declare const createTreeResolver: <T, S>(items: ItemNode<T>[] | undefined, rowValues: WeakMap<GObject.Object, RowValue<T>>, model: Gtk.TreeListModel) => ItemResolver<T, S>;
25
- //# sourceMappingURL=item-resolver.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"item-resolver.d.ts","sourceRoot":"","sources":["../../src/utils/item-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,OAAO,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAsC,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAcnG,MAAM,MAAM,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,IAAI;IAC7C,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,gBAAgB,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,IAAI;IACjD,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,WAAW,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3E,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,QAAQ,CAAC,CAAC,GAAG,OAAO,IAAI;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,CAAC,CAAC;IACT,QAAQ,EAAE,gBAAgB,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,OAAO,GAAI,CAAC,aACV,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,OAC1C,GAAG,CAAC,WAAW,KACrB,MAAM,GAAG,SAGX,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,CAAC,EAAE,CAAC,SAC5B,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,uBACX,OAAO,aACjB,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,KAChD,YAAY,CAAC,CAAC,EAAE,CAAC,CA0CnB,CAAC;AAEF,eAAO,MAAM,2BAA2B,GAAI,CAAC,EAAE,CAAC,YAAY,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,SAAS,KAAG,YAAY,CAAC,CAAC,EAAE,CAAC,CAsB9G,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,CAAC,EAAE,CAAC,SAC5B,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,aACrB,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SACxC,GAAG,CAAC,aAAa,KACzB,YAAY,CAAC,CAAC,EAAE,CAAC,CAiBnB,CAAC"}
@@ -1,102 +0,0 @@
1
- import { countDescendants, flattenListItems } from "./list-item-flatten.js";
2
- const NO_TREE_METADATA = { hideExpander: false, indentForDepth: true, indentForIcon: true };
3
- const treeItemCache = new WeakMap();
4
- const treeRowItem = (treeRow) => {
5
- const cached = treeItemCache.get(treeRow);
6
- if (cached !== undefined)
7
- return cached;
8
- const item = treeRow.getItem();
9
- if (item !== null)
10
- treeItemCache.set(treeRow, item);
11
- return item;
12
- };
13
- export const rowIdOf = (rowValues, row) => {
14
- const item = row.getItem();
15
- return item === null ? undefined : rowValues.get(item)?.id;
16
- };
17
- export const createItemResolver = (items, flattenTreeChildren, rowValues) => {
18
- const flattened = flattenListItems(items, flattenTreeChildren);
19
- return {
20
- positionOfId(id) {
21
- const position = flattened.idToPosition.get(id);
22
- return position === undefined ? -1 : position;
23
- },
24
- idOf(position) {
25
- return flattened.positionToId.get(position);
26
- },
27
- resolve(position, treeRow) {
28
- if (treeRow !== null && !flattenTreeChildren) {
29
- const rowItem = treeRowItem(treeRow);
30
- if (rowItem !== null) {
31
- const tagged = rowValues.get(rowItem);
32
- if (tagged !== undefined) {
33
- return {
34
- value: tagged.value,
35
- present: true,
36
- isHeader: false,
37
- metadata: tagged.metadata,
38
- };
39
- }
40
- }
41
- }
42
- const record = flattened.records[position];
43
- if (record === undefined) {
44
- return {
45
- value: undefined,
46
- present: false,
47
- isHeader: false,
48
- metadata: NO_TREE_METADATA,
49
- };
50
- }
51
- return {
52
- value: record.value,
53
- present: true,
54
- isHeader: false,
55
- metadata: record.metadata,
56
- };
57
- },
58
- };
59
- };
60
- export const createSectionHeaderResolver = (sections) => {
61
- const valueByStart = new Map();
62
- let start = 0;
63
- for (const section of sections ?? []) {
64
- valueByStart.set(start, section.value);
65
- start += countDescendants(section.data);
66
- }
67
- return {
68
- positionOfId: () => -1,
69
- idOf: () => undefined,
70
- resolve(position) {
71
- if (!valueByStart.has(position)) {
72
- return { value: undefined, present: false, isHeader: true, metadata: NO_TREE_METADATA };
73
- }
74
- return {
75
- value: valueByStart.get(position),
76
- present: true,
77
- isHeader: true,
78
- metadata: NO_TREE_METADATA,
79
- };
80
- },
81
- };
82
- };
83
- export const createTreeResolver = (items, rowValues, model) => {
84
- const base = createItemResolver(items, false, rowValues);
85
- return {
86
- resolve: base.resolve,
87
- idOf: (position) => {
88
- const row = model.getRow(position);
89
- return row === null ? undefined : rowIdOf(rowValues, row);
90
- },
91
- positionOfId: (id) => {
92
- const count = model.getNItems();
93
- for (let position = 0; position < count; position++) {
94
- const row = model.getRow(position);
95
- if (row !== null && rowIdOf(rowValues, row) === id)
96
- return position;
97
- }
98
- return -1;
99
- },
100
- };
101
- };
102
- //# sourceMappingURL=item-resolver.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"item-resolver.js","sourceRoot":"","sources":["../../src/utils/item-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as GObject from \"@gtkx/gi/gobject\";\nimport type * as Gtk from \"@gtkx/gi/gtk\";\nimport type { ItemNode, SectionNode } from \"../types.js\";\nimport { countDescendants, flattenListItems, type TreeItemMetadata } from \"./list-item-flatten.js\";\n\nconst NO_TREE_METADATA: TreeItemMetadata = { hideExpander: false, indentForDepth: true, indentForIcon: true };\n\nconst treeItemCache = new WeakMap<Gtk.TreeListRow, GObject.Object>();\n\nconst treeRowItem = (treeRow: Gtk.TreeListRow): GObject.Object | null => {\n const cached = treeItemCache.get(treeRow);\n if (cached !== undefined) return cached;\n const item = treeRow.getItem();\n if (item !== null) treeItemCache.set(treeRow, item);\n return item;\n};\n\nexport type Resolved<T = unknown, S = unknown> = {\n value: T | S | undefined;\n present: boolean;\n isHeader: boolean;\n metadata: TreeItemMetadata;\n};\n\nexport type ItemResolver<T = unknown, S = unknown> = {\n resolve(position: number, treeRow: Gtk.TreeListRow | null): Resolved<T, S>;\n positionOfId(id: string): number;\n idOf(position: number): string | undefined;\n};\n\nexport type RowValue<T = unknown> = {\n id: string;\n value: T;\n metadata: TreeItemMetadata;\n};\n\nexport const rowIdOf = <T>(\n rowValues: WeakMap<GObject.Object, RowValue<T>>,\n row: Gtk.TreeListRow,\n): string | undefined => {\n const item = row.getItem();\n return item === null ? undefined : rowValues.get(item)?.id;\n};\n\nexport const createItemResolver = <T, S>(\n items: ItemNode<T>[] | undefined,\n flattenTreeChildren: boolean,\n rowValues: WeakMap<GObject.Object, RowValue<T>>,\n): ItemResolver<T, S> => {\n const flattened = flattenListItems(items, flattenTreeChildren);\n return {\n positionOfId(id: string): number {\n const position = flattened.idToPosition.get(id);\n return position === undefined ? -1 : position;\n },\n idOf(position: number): string | undefined {\n return flattened.positionToId.get(position);\n },\n resolve(position: number, treeRow: Gtk.TreeListRow | null): Resolved<T, S> {\n if (treeRow !== null && !flattenTreeChildren) {\n const rowItem = treeRowItem(treeRow);\n if (rowItem !== null) {\n const tagged = rowValues.get(rowItem);\n if (tagged !== undefined) {\n return {\n value: tagged.value,\n present: true,\n isHeader: false,\n metadata: tagged.metadata,\n };\n }\n }\n }\n const record = flattened.records[position];\n if (record === undefined) {\n return {\n value: undefined,\n present: false,\n isHeader: false,\n metadata: NO_TREE_METADATA,\n };\n }\n return {\n value: record.value,\n present: true,\n isHeader: false,\n metadata: record.metadata,\n };\n },\n };\n};\n\nexport const createSectionHeaderResolver = <T, S>(sections: SectionNode<S, T>[] | undefined): ItemResolver<T, S> => {\n const valueByStart = new Map<number, S>();\n let start = 0;\n for (const section of sections ?? []) {\n valueByStart.set(start, section.value);\n start += countDescendants(section.data);\n }\n return {\n positionOfId: () => -1,\n idOf: () => undefined,\n resolve(position: number): Resolved<T, S> {\n if (!valueByStart.has(position)) {\n return { value: undefined, present: false, isHeader: true, metadata: NO_TREE_METADATA };\n }\n return {\n value: valueByStart.get(position),\n present: true,\n isHeader: true,\n metadata: NO_TREE_METADATA,\n };\n },\n };\n};\n\nexport const createTreeResolver = <T, S>(\n items: ItemNode<T>[] | undefined,\n rowValues: WeakMap<GObject.Object, RowValue<T>>,\n model: Gtk.TreeListModel,\n): ItemResolver<T, S> => {\n const base = createItemResolver<T, S>(items, false, rowValues);\n return {\n resolve: base.resolve,\n idOf: (position: number): string | undefined => {\n const row = model.getRow(position);\n return row === null ? undefined : rowIdOf(rowValues, row);\n },\n positionOfId: (id: string): number => {\n const count = model.getNItems();\n for (let position = 0; position < count; position++) {\n const row = model.getRow(position);\n if (row !== null && rowIdOf(rowValues, row) === id) return position;\n }\n return -1;\n },\n };\n};\n"]}
@@ -1,24 +0,0 @@
1
- import type { ItemNode } from "../types.js";
2
- export type TreeItemMetadata = {
3
- hideExpander: boolean;
4
- indentForDepth: boolean;
5
- indentForIcon: boolean;
6
- };
7
- type FlattenedRecord<T = unknown> = {
8
- id: string;
9
- value: T;
10
- metadata: TreeItemMetadata;
11
- };
12
- type FlattenResult<T = unknown> = {
13
- records: FlattenedRecord<T>[];
14
- idToPosition: Map<string, number>;
15
- positionToId: Map<number, string>;
16
- };
17
- export type ListStructure = "flat" | "tree";
18
- export declare const detectStructure: <T>(items: ItemNode<T>[] | undefined) => ListStructure;
19
- export declare const structuralSignature: <T>(items: ItemNode<T>[] | undefined) => string;
20
- export declare const countDescendants: <T>(items: ItemNode<T>[]) => number;
21
- export declare const treeItemMetadata: <T>(item: ItemNode<T>) => TreeItemMetadata;
22
- export declare const flattenListItems: <T>(items: ItemNode<T>[] | undefined, flattenTreeChildren: boolean) => FlattenResult<T>;
23
- export {};
24
- //# sourceMappingURL=list-item-flatten.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list-item-flatten.d.ts","sourceRoot":"","sources":["../../src/utils/list-item-flatten.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,MAAM,gBAAgB,GAAG;IAC3B,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,KAAK,eAAe,CAAC,CAAC,GAAG,OAAO,IAAI;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,CAAC,CAAC;IACT,QAAQ,EAAE,gBAAgB,CAAC;CAC9B,CAAC;AAEF,KAAK,aAAa,CAAC,CAAC,GAAG,OAAO,IAAI;IAC9B,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9B,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;AAE5C,eAAO,MAAM,eAAe,GAAI,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,KAAG,aAMrE,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,KAAG,MAczE,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAG,MAO1D,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,CAAC,QAAQ,QAAQ,CAAC,CAAC,CAAC,KAAG,gBAItD,CAAC;AAgBH,eAAO,MAAM,gBAAgB,GAAI,CAAC,SACvB,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,uBACX,OAAO,KAC7B,aAAa,CAAC,CAAC,CAWjB,CAAC"}
@@ -1,68 +0,0 @@
1
- export const detectStructure = (items) => {
2
- if (items === undefined)
3
- return "flat";
4
- for (const item of items) {
5
- if (item.children !== undefined && item.children.length > 0)
6
- return "tree";
7
- }
8
- return "flat";
9
- };
10
- export const structuralSignature = (items) => {
11
- if (items === undefined)
12
- return "";
13
- const parts = [];
14
- const walk = (list) => {
15
- parts.push("[");
16
- for (const item of list) {
17
- const hidden = item.hideExpander === true;
18
- parts.push(`${item.id}|${hidden ? 1 : 0}`);
19
- if (item.children !== undefined && item.children.length > 0)
20
- walk(item.children);
21
- }
22
- parts.push("]");
23
- };
24
- walk(items);
25
- return parts.join(",");
26
- };
27
- export const countDescendants = (items) => {
28
- let total = 0;
29
- for (const item of items) {
30
- total += 1;
31
- if (item.children !== undefined && item.children.length > 0)
32
- total += countDescendants(item.children);
33
- }
34
- return total;
35
- };
36
- export const treeItemMetadata = (item) => ({
37
- hideExpander: item.hideExpander ?? false,
38
- indentForDepth: item.indentForDepth ?? true,
39
- indentForIcon: item.indentForIcon ?? true,
40
- });
41
- const appendRecord = (item, result, includeChildren) => {
42
- const position = result.records.length;
43
- result.idToPosition.set(item.id, position);
44
- result.positionToId.set(position, item.id);
45
- result.records.push({
46
- id: item.id,
47
- value: item.value,
48
- metadata: treeItemMetadata(item),
49
- });
50
- if (includeChildren && item.children !== undefined) {
51
- for (const child of item.children)
52
- appendRecord(child, result, includeChildren);
53
- }
54
- };
55
- export const flattenListItems = (items, flattenTreeChildren) => {
56
- const result = {
57
- records: [],
58
- idToPosition: new Map(),
59
- positionToId: new Map(),
60
- };
61
- if (items === undefined)
62
- return result;
63
- for (const item of items) {
64
- appendRecord(item, result, flattenTreeChildren);
65
- }
66
- return result;
67
- };
68
- //# sourceMappingURL=list-item-flatten.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list-item-flatten.js","sourceRoot":"","sources":["../../src/utils/list-item-flatten.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ItemNode } from \"../types.js\";\n\nexport type TreeItemMetadata = {\n hideExpander: boolean;\n indentForDepth: boolean;\n indentForIcon: boolean;\n};\n\ntype FlattenedRecord<T = unknown> = {\n id: string;\n value: T;\n metadata: TreeItemMetadata;\n};\n\ntype FlattenResult<T = unknown> = {\n records: FlattenedRecord<T>[];\n idToPosition: Map<string, number>;\n positionToId: Map<number, string>;\n};\n\nexport type ListStructure = \"flat\" | \"tree\";\n\nexport const detectStructure = <T>(items: ItemNode<T>[] | undefined): ListStructure => {\n if (items === undefined) return \"flat\";\n for (const item of items) {\n if (item.children !== undefined && item.children.length > 0) return \"tree\";\n }\n return \"flat\";\n};\n\nexport const structuralSignature = <T>(items: ItemNode<T>[] | undefined): string => {\n if (items === undefined) return \"\";\n const parts: string[] = [];\n const walk = (list: ItemNode<T>[]): void => {\n parts.push(\"[\");\n for (const item of list) {\n const hidden = item.hideExpander === true;\n parts.push(`${item.id}|${hidden ? 1 : 0}`);\n if (item.children !== undefined && item.children.length > 0) walk(item.children);\n }\n parts.push(\"]\");\n };\n walk(items);\n return parts.join(\",\");\n};\n\nexport const countDescendants = <T>(items: ItemNode<T>[]): number => {\n let total = 0;\n for (const item of items) {\n total += 1;\n if (item.children !== undefined && item.children.length > 0) total += countDescendants(item.children);\n }\n return total;\n};\n\nexport const treeItemMetadata = <T>(item: ItemNode<T>): TreeItemMetadata => ({\n hideExpander: item.hideExpander ?? false,\n indentForDepth: item.indentForDepth ?? true,\n indentForIcon: item.indentForIcon ?? true,\n});\n\nconst appendRecord = <T>(item: ItemNode<T>, result: FlattenResult<T>, includeChildren: boolean): void => {\n const position = result.records.length;\n result.idToPosition.set(item.id, position);\n result.positionToId.set(position, item.id);\n result.records.push({\n id: item.id,\n value: item.value,\n metadata: treeItemMetadata(item),\n });\n if (includeChildren && item.children !== undefined) {\n for (const child of item.children) appendRecord(child, result, includeChildren);\n }\n};\n\nexport const flattenListItems = <T>(\n items: ItemNode<T>[] | undefined,\n flattenTreeChildren: boolean,\n): FlattenResult<T> => {\n const result: FlattenResult<T> = {\n records: [],\n idToPosition: new Map(),\n positionToId: new Map(),\n };\n if (items === undefined) return result;\n for (const item of items) {\n appendRecord(item, result, flattenTreeChildren);\n }\n return result;\n};\n"]}
package/src/cell.tsx DELETED
@@ -1,144 +0,0 @@
1
- import type * as GObject from "@gtkx/gi/gobject";
2
- import type * as Gtk from "@gtkx/gi/gtk";
3
- import { GtkTreeExpander } from "@gtkx/jsx/gtk";
4
- import { createPortal } from "@gtkx/react";
5
- import { Fragment, memo, type ReactNode, useCallback, useSyncExternalStore } from "react";
6
- import type { RenderItemProps } from "./types.js";
7
- import type { CellContainerStore, CellEntry } from "./utils/cell-container-store.js";
8
- import type { ItemResolver } from "./utils/item-resolver.js";
9
- import type { TreeItemMetadata } from "./utils/list-item-flatten.js";
10
-
11
- export type CellRenderer<T, S> = (
12
- value: T | S | undefined,
13
- treeRow: Gtk.TreeListRow | null,
14
- position: number,
15
- ) => ReactNode;
16
-
17
- interface CellProps<T, S> {
18
- container: GObject.Object;
19
- store: CellContainerStore;
20
- resolver: ItemResolver<T, S>;
21
- render: CellRenderer<T, S>;
22
- }
23
-
24
- interface CellRenderHostProps<T, S> {
25
- store: CellContainerStore;
26
- resolver: ItemResolver<T, S>;
27
- render: CellRenderer<T, S>;
28
- }
29
-
30
- interface TreeExpanderCellProps {
31
- treeRow: Gtk.TreeListRow;
32
- metadata: TreeItemMetadata;
33
- children: ReactNode;
34
- }
35
-
36
- const TreeExpanderCell = ({ treeRow, metadata, children }: TreeExpanderCellProps): ReactNode => (
37
- <GtkTreeExpander
38
- ref={(expander: Gtk.TreeExpander | null) => {
39
- if (expander !== null) expander.setListRow(treeRow);
40
- }}
41
- hideExpander={metadata.hideExpander}
42
- indentForDepth={metadata.indentForDepth}
43
- indentForIcon={metadata.indentForIcon}
44
- >
45
- {children}
46
- </GtkTreeExpander>
47
- );
48
-
49
- const Cell = memo(<T, S>({ container, store, resolver, render }: CellProps<T, S>): ReactNode => {
50
- const subscribe = useCallback(
51
- (onChange: () => void) => store.subscribePosition(container, onChange),
52
- [store, container],
53
- );
54
- const getSnapshot = useCallback((): CellEntry => store.getPosition(container), [store, container]);
55
- const entry = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
56
-
57
- if (entry.position < 0) return null;
58
- const resolved = resolver.resolve(entry.position, entry.treeRow);
59
- if (!resolved.present) return null;
60
- const content = render(resolved.value, entry.treeRow, entry.position);
61
- const portalled =
62
- entry.treeRow !== null && !resolved.isHeader ? (
63
- <TreeExpanderCell treeRow={entry.treeRow} metadata={resolved.metadata}>
64
- {content}
65
- </TreeExpanderCell>
66
- ) : (
67
- content
68
- );
69
- return createPortal(portalled, container, store.keyFor(container));
70
- }) as <T, S>(props: CellProps<T, S>) => ReactNode;
71
-
72
- export const CellRenderHost = <T, S>({ store, resolver, render }: CellRenderHostProps<T, S>): ReactNode => {
73
- const containers = useSyncExternalStore(
74
- store.subscribeSet,
75
- store.getContainersSnapshot,
76
- store.getContainersSnapshot,
77
- );
78
- return (
79
- <Fragment>
80
- {containers.map((container) => (
81
- <Cell
82
- key={store.keyFor(container)}
83
- container={container}
84
- store={store}
85
- resolver={resolver}
86
- render={render}
87
- />
88
- ))}
89
- </Fragment>
90
- );
91
- };
92
-
93
- export type TreeRenderContext = {
94
- controlled: boolean;
95
- expandedIds: Set<string>;
96
- rowId: (row: Gtk.TreeListRow) => string | undefined;
97
- };
98
-
99
- export const createTreeRenderContext = (
100
- expandedIds: string[] | null | undefined,
101
- rowId: (row: Gtk.TreeListRow) => string | undefined,
102
- ): TreeRenderContext => ({
103
- controlled: expandedIds !== undefined && expandedIds !== null,
104
- expandedIds: new Set(expandedIds ?? []),
105
- rowId,
106
- });
107
-
108
- const treeFields = (
109
- treeRow: Gtk.TreeListRow | null,
110
- context: TreeRenderContext | undefined,
111
- ): { depth?: number; isExpanded?: boolean } => {
112
- if (treeRow === null) return {};
113
- const depth = treeRow.getDepth();
114
- if (context === undefined || !treeRow.isExpandable()) return { depth };
115
- const isExpanded = context.controlled
116
- ? context.expandedIds.has(context.rowId(treeRow) ?? "")
117
- : treeRow.getExpanded();
118
- return { depth, isExpanded };
119
- };
120
-
121
- export const itemRenderer =
122
- <T, S>(render: (props: RenderItemProps<T>) => ReactNode, context?: TreeRenderContext): CellRenderer<T, S> =>
123
- (value, treeRow, position) =>
124
- render({ item: value as T, index: position, ...treeFields(treeRow, context) });
125
-
126
- const headerRenderer =
127
- <T, S>(renderHeader: ((info: { section: S }) => ReactNode) | null | undefined): CellRenderer<T, S> =>
128
- (value) =>
129
- renderHeader ? renderHeader({ section: value as S }) : null;
130
-
131
- interface HeaderRenderHostProps<T, S> {
132
- useHeader: boolean;
133
- store: CellContainerStore;
134
- resolver: ItemResolver<T, S>;
135
- renderHeader: ((info: { section: S }) => ReactNode) | null | undefined;
136
- }
137
-
138
- export const HeaderRenderHost = <T, S>({
139
- useHeader,
140
- store,
141
- resolver,
142
- renderHeader,
143
- }: HeaderRenderHostProps<T, S>): ReactNode =>
144
- useHeader ? <CellRenderHost store={store} resolver={resolver} render={headerRenderer<T, S>(renderHeader)} /> : null;