zui 0.0.1

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 (325) hide show
  1. checksums.yaml +7 -0
  2. data/Components/Builtins/Accordion.qml +208 -0
  3. data/Components/Builtins/Action.qml +43 -0
  4. data/Components/Builtins/ActionButton.qml +19 -0
  5. data/Components/Builtins/ActionGroup.qml +81 -0
  6. data/Components/Builtins/AlertDialog.qml +398 -0
  7. data/Components/Builtins/AnchorAnimation.qml +3 -0
  8. data/Components/Builtins/AnchorChanges.qml +11 -0
  9. data/Components/Builtins/AnimatedImage.qml +39 -0
  10. data/Components/Builtins/Animation.qml +3 -0
  11. data/Components/Builtins/AnimationController.qml +11 -0
  12. data/Components/Builtins/ApplicationWindow.qml +103 -0
  13. data/Components/Builtins/AreaChart.qml +70 -0
  14. data/Components/Builtins/AspectRatio.qml +30 -0
  15. data/Components/Builtins/Audio.qml +85 -0
  16. data/Components/Builtins/AudioInput.qml +10 -0
  17. data/Components/Builtins/AudioOutput.qml +10 -0
  18. data/Components/Builtins/Avatar.qml +46 -0
  19. data/Components/Builtins/Badge.qml +38 -0
  20. data/Components/Builtins/Banner.qml +133 -0
  21. data/Components/Builtins/BarChart.qml +67 -0
  22. data/Components/Builtins/BarIconButton.qml +30 -0
  23. data/Components/Builtins/BarIndicator.qml +26 -0
  24. data/Components/Builtins/Behavior.qml +13 -0
  25. data/Components/Builtins/Blur.qml +14 -0
  26. data/Components/Builtins/BorderImage.qml +38 -0
  27. data/Components/Builtins/BorderOverlay.qml +25 -0
  28. data/Components/Builtins/BottomSheet.qml +211 -0
  29. data/Components/Builtins/Breadcrumb.qml +169 -0
  30. data/Components/Builtins/BubbleChart.qml +3 -0
  31. data/Components/Builtins/BusyIndicator.qml +24 -0
  32. data/Components/Builtins/Button.qml +55 -0
  33. data/Components/Builtins/ButtonGroup.qml +18 -0
  34. data/Components/Builtins/Calendar.qml +55 -0
  35. data/Components/Builtins/Camera.qml +18 -0
  36. data/Components/Builtins/CandlestickChart.qml +3 -0
  37. data/Components/Builtins/Canvas.qml +159 -0
  38. data/Components/Builtins/CaptureSession.qml +19 -0
  39. data/Components/Builtins/Card.qml +23 -0
  40. data/Components/Builtins/Carousel.qml +72 -0
  41. data/Components/Builtins/Center.qml +20 -0
  42. data/Components/Builtins/CheckDelegate.qml +132 -0
  43. data/Components/Builtins/Checkbox.qml +62 -0
  44. data/Components/Builtins/Chip.qml +65 -0
  45. data/Components/Builtins/Circle.qml +35 -0
  46. data/Components/Builtins/Clipboard.qml +29 -0
  47. data/Components/Builtins/ColorAnimation.qml +3 -0
  48. data/Components/Builtins/ColorPicker.qml +70 -0
  49. data/Components/Builtins/Colorize.qml +14 -0
  50. data/Components/Builtins/Column.qml +17 -0
  51. data/Components/Builtins/ColumnLayout.qml +13 -0
  52. data/Components/Builtins/ConfirmDialog.qml +20 -0
  53. data/Components/Builtins/ConstrainedBox.qml +28 -0
  54. data/Components/Builtins/Container.qml +30 -0
  55. data/Components/Builtins/ContextMenu.qml +140 -0
  56. data/Components/Builtins/CursorSurface.qml +18 -0
  57. data/Components/Builtins/DataTable.qml +69 -0
  58. data/Components/Builtins/DatePicker.qml +180 -0
  59. data/Components/Builtins/DayOfWeekRow.qml +11 -0
  60. data/Components/Builtins/DelayButton.qml +47 -0
  61. data/Components/Builtins/DelegateModel.qml +10 -0
  62. data/Components/Builtins/DelegateModelGroup.qml +10 -0
  63. data/Components/Builtins/Dial.qml +42 -0
  64. data/Components/Builtins/Dialog.qml +128 -0
  65. data/Components/Builtins/DialogButtonBox.qml +137 -0
  66. data/Components/Builtins/Divider.qml +26 -0
  67. data/Components/Builtins/DonutChart.qml +3 -0
  68. data/Components/Builtins/DoubleSpinBox.qml +58 -0
  69. data/Components/Builtins/DragArea.qml +43 -0
  70. data/Components/Builtins/Drawer.qml +107 -0
  71. data/Components/Builtins/DropArea.qml +19 -0
  72. data/Components/Builtins/DropShadow.qml +16 -0
  73. data/Components/Builtins/Dropdown.qml +19 -0
  74. data/Components/Builtins/ExpansionPanel.qml +157 -0
  75. data/Components/Builtins/FilePicker.qml +140 -0
  76. data/Components/Builtins/FittedBox.qml +40 -0
  77. data/Components/Builtins/Flickable.qml +40 -0
  78. data/Components/Builtins/Flipable.qml +45 -0
  79. data/Components/Builtins/Flow.qml +16 -0
  80. data/Components/Builtins/FocusScope.qml +29 -0
  81. data/Components/Builtins/FolderListModel.qml +9 -0
  82. data/Components/Builtins/FolderPicker.qml +93 -0
  83. data/Components/Builtins/FontLoader.qml +21 -0
  84. data/Components/Builtins/FontPicker.qml +91 -0
  85. data/Components/Builtins/Frame.qml +71 -0
  86. data/Components/Builtins/FrameAnimation.qml +13 -0
  87. data/Components/Builtins/Gauge.qml +3 -0
  88. data/Components/Builtins/Glow.qml +15 -0
  89. data/Components/Builtins/Gradient.qml +93 -0
  90. data/Components/Builtins/Grid.qml +16 -0
  91. data/Components/Builtins/GridLayout.qml +16 -0
  92. data/Components/Builtins/GridView.qml +226 -0
  93. data/Components/Builtins/GroupBox.qml +95 -0
  94. data/Components/Builtins/Heatmap.qml +3 -0
  95. data/Components/Builtins/Histogram.qml +3 -0
  96. data/Components/Builtins/HorizontalHeader.qml +23 -0
  97. data/Components/Builtins/HorizontalHeaderDelegate.qml +39 -0
  98. data/Components/Builtins/HoverArea.qml +19 -0
  99. data/Components/Builtins/Icon.qml +16 -0
  100. data/Components/Builtins/Image.qml +110 -0
  101. data/Components/Builtins/ImageCapture.qml +14 -0
  102. data/Components/Builtins/ItemDelegate.qml +152 -0
  103. data/Components/Builtins/KeyCatcher.qml +25 -0
  104. data/Components/Builtins/Label.qml +43 -0
  105. data/Components/Builtins/LayoutItemProxy.qml +51 -0
  106. data/Components/Builtins/Legend.qml +86 -0
  107. data/Components/Builtins/Line.qml +28 -0
  108. data/Components/Builtins/LineChart.qml +87 -0
  109. data/Components/Builtins/ListModel.qml +8 -0
  110. data/Components/Builtins/ListView.qml +65 -0
  111. data/Components/Builtins/Loader.qml +33 -0
  112. data/Components/Builtins/Markdown.qml +23 -0
  113. data/Components/Builtins/MediaDevices.qml +10 -0
  114. data/Components/Builtins/MediaPlayer.qml +27 -0
  115. data/Components/Builtins/MediaRecorder.qml +16 -0
  116. data/Components/Builtins/Menu.qml +119 -0
  117. data/Components/Builtins/MenuBar.qml +128 -0
  118. data/Components/Builtins/MenuItem.qml +77 -0
  119. data/Components/Builtins/MenuSeparator.qml +30 -0
  120. data/Components/Builtins/MessageDialog.qml +104 -0
  121. data/Components/Builtins/ModalSheet.qml +222 -0
  122. data/Components/Builtins/ModelView3d.qml +50 -0
  123. data/Components/Builtins/MonthGrid.qml +23 -0
  124. data/Components/Builtins/MultiEffect.qml +48 -0
  125. data/Components/Builtins/MultiSelect.qml +23 -0
  126. data/Components/Builtins/NavigationRail.qml +154 -0
  127. data/Components/Builtins/NumberAnimation.qml +3 -0
  128. data/Components/Builtins/NumberField.qml +18 -0
  129. data/Components/Builtins/OpacityAnimator.qml +3 -0
  130. data/Components/Builtins/OpacityMask.qml +21 -0
  131. data/Components/Builtins/OpticalGlyph.qml +16 -0
  132. data/Components/Builtins/Page.qml +111 -0
  133. data/Components/Builtins/PageIndicator.qml +63 -0
  134. data/Components/Builtins/Pagination.qml +158 -0
  135. data/Components/Builtins/Pane.qml +72 -0
  136. data/Components/Builtins/PanelHero.qml +15 -0
  137. data/Components/Builtins/ParallelAnimation.qml +3 -0
  138. data/Components/Builtins/ParentAnimation.qml +3 -0
  139. data/Components/Builtins/ParentChange.qml +10 -0
  140. data/Components/Builtins/ParticleSystem.qml +81 -0
  141. data/Components/Builtins/PasswordField.qml +58 -0
  142. data/Components/Builtins/Path.qml +35 -0
  143. data/Components/Builtins/PathAnimation.qml +3 -0
  144. data/Components/Builtins/PauseAnimation.qml +3 -0
  145. data/Components/Builtins/PieChart.qml +3 -0
  146. data/Components/Builtins/PinchArea.qml +23 -0
  147. data/Components/Builtins/Popup.qml +130 -0
  148. data/Components/Builtins/Progress.qml +15 -0
  149. data/Components/Builtins/ProgressRing.qml +120 -0
  150. data/Components/Builtins/PropertyAction.qml +11 -0
  151. data/Components/Builtins/PropertyAnimation.qml +3 -0
  152. data/Components/Builtins/PropertyChanges.qml +10 -0
  153. data/Components/Builtins/RadarChart.qml +3 -0
  154. data/Components/Builtins/RadialGauge.qml +3 -0
  155. data/Components/Builtins/RadioButton.qml +46 -0
  156. data/Components/Builtins/RadioDelegate.qml +115 -0
  157. data/Components/Builtins/RadioGroup.qml +58 -0
  158. data/Components/Builtins/RangeSlider.qml +39 -0
  159. data/Components/Builtins/Rectangle.qml +23 -0
  160. data/Components/Builtins/RectangularShadow.qml +23 -0
  161. data/Components/Builtins/ReorderableList.qml +204 -0
  162. data/Components/Builtins/RichText.qml +23 -0
  163. data/Components/Builtins/RotationAnimation.qml +3 -0
  164. data/Components/Builtins/RotationAnimator.qml +3 -0
  165. data/Components/Builtins/RoundButton.qml +42 -0
  166. data/Components/Builtins/Row.qml +17 -0
  167. data/Components/Builtins/RowLayout.qml +13 -0
  168. data/Components/Builtins/ScaleAnimator.qml +3 -0
  169. data/Components/Builtins/ScatterChart.qml +3 -0
  170. data/Components/Builtins/ScreenCapture.qml +78 -0
  171. data/Components/Builtins/ScriptAction.qml +15 -0
  172. data/Components/Builtins/Scroll.qml +18 -0
  173. data/Components/Builtins/ScrollBar.qml +18 -0
  174. data/Components/Builtins/ScrollIndicator.qml +15 -0
  175. data/Components/Builtins/SearchField.qml +178 -0
  176. data/Components/Builtins/SearchableDropdown.qml +21 -0
  177. data/Components/Builtins/SectionHeader.qml +14 -0
  178. data/Components/Builtins/SelectableText.qml +33 -0
  179. data/Components/Builtins/SelectionRectangle.qml +17 -0
  180. data/Components/Builtins/Separator.qml +13 -0
  181. data/Components/Builtins/SequentialAnimation.qml +3 -0
  182. data/Components/Builtins/Settings.qml +10 -0
  183. data/Components/Builtins/ShaderEffect.qml +115 -0
  184. data/Components/Builtins/ShaderEffectSource.qml +61 -0
  185. data/Components/Builtins/Shaders/grayscale.frag +14 -0
  186. data/Components/Builtins/Shaders/grayscale.frag.qsb +0 -0
  187. data/Components/Builtins/Shaders/passthrough.frag +11 -0
  188. data/Components/Builtins/Shaders/passthrough.frag.qsb +0 -0
  189. data/Components/Builtins/Shaders/pixelate.frag +16 -0
  190. data/Components/Builtins/Shaders/pixelate.frag.qsb +0 -0
  191. data/Components/Builtins/Shaders/vignette.frag +18 -0
  192. data/Components/Builtins/Shaders/vignette.frag.qsb +0 -0
  193. data/Components/Builtins/Shaders/wave.frag +18 -0
  194. data/Components/Builtins/Shaders/wave.frag.qsb +0 -0
  195. data/Components/Builtins/Shape.qml +53 -0
  196. data/Components/Builtins/Skeleton.qml +78 -0
  197. data/Components/Builtins/Slider.qml +21 -0
  198. data/Components/Builtins/SmoothedAnimation.qml +3 -0
  199. data/Components/Builtins/Snackbar.qml +181 -0
  200. data/Components/Builtins/SortFilterProxyModel.qml +16 -0
  201. data/Components/Builtins/SoundEffect.qml +10 -0
  202. data/Components/Builtins/Spacer.qml +13 -0
  203. data/Components/Builtins/Sparkline.qml +3 -0
  204. data/Components/Builtins/SpinBox.qml +44 -0
  205. data/Components/Builtins/SplitView.qml +31 -0
  206. data/Components/Builtins/SpringAnimation.qml +3 -0
  207. data/Components/Builtins/Stack.qml +14 -0
  208. data/Components/Builtins/StackLayout.qml +19 -0
  209. data/Components/Builtins/StackView.qml +122 -0
  210. data/Components/Builtins/StackedBarChart.qml +3 -0
  211. data/Components/Builtins/StandardPaths.qml +9 -0
  212. data/Components/Builtins/State.qml +13 -0
  213. data/Components/Builtins/StateGroup.qml +11 -0
  214. data/Components/Builtins/Support/AnimationDriver.qml +79 -0
  215. data/Components/Builtins/Support/AnimationGroupDriver.qml +32 -0
  216. data/Components/Builtins/Support/ChartCanvas.qml +629 -0
  217. data/Components/Builtins/Support/ModelView3dScene.qml +292 -0
  218. data/Components/Builtins/Support/OptionalModuleState.js +5 -0
  219. data/Components/Builtins/SwipeDelegate.qml +231 -0
  220. data/Components/Builtins/SwipeView.qml +69 -0
  221. data/Components/Builtins/SwitchDelegate.qml +140 -0
  222. data/Components/Builtins/TabBar.qml +117 -0
  223. data/Components/Builtins/TabButton.qml +105 -0
  224. data/Components/Builtins/TableView.qml +388 -0
  225. data/Components/Builtins/TableViewDelegate.qml +17 -0
  226. data/Components/Builtins/Tabs.qml +138 -0
  227. data/Components/Builtins/Text.qml +24 -0
  228. data/Components/Builtins/TextArea.qml +59 -0
  229. data/Components/Builtins/TextField.qml +21 -0
  230. data/Components/Builtins/TextMetrics.qml +39 -0
  231. data/Components/Builtins/TimePicker.qml +213 -0
  232. data/Components/Builtins/Timer.qml +13 -0
  233. data/Components/Builtins/Toast.qml +213 -0
  234. data/Components/Builtins/Toggle.qml +19 -0
  235. data/Components/Builtins/ToggleSwitch.qml +22 -0
  236. data/Components/Builtins/ToolBar.qml +61 -0
  237. data/Components/Builtins/ToolButton.qml +41 -0
  238. data/Components/Builtins/ToolSeparator.qml +36 -0
  239. data/Components/Builtins/Tooltip.qml +20 -0
  240. data/Components/Builtins/Transition.qml +3 -0
  241. data/Components/Builtins/TreeView.qml +423 -0
  242. data/Components/Builtins/TreeViewDelegate.qml +46 -0
  243. data/Components/Builtins/Tumbler.qml +18 -0
  244. data/Components/Builtins/UniformAnimator.qml +3 -0
  245. data/Components/Builtins/VectorAnimation.qml +3 -0
  246. data/Components/Builtins/VectorImage.qml +62 -0
  247. data/Components/Builtins/VerticalHeader.qml +21 -0
  248. data/Components/Builtins/VerticalHeaderDelegate.qml +35 -0
  249. data/Components/Builtins/Video.qml +54 -0
  250. data/Components/Builtins/VideoOutput.qml +54 -0
  251. data/Components/Builtins/WebView.qml +57 -0
  252. data/Components/Builtins/WeekNumberColumn.qml +13 -0
  253. data/Components/Builtins/WidgetButton.qml +26 -0
  254. data/Components/Builtins/Window.qml +90 -0
  255. data/Components/Builtins/WindowCapture.qml +11 -0
  256. data/Components/Builtins/Wrap.qml +18 -0
  257. data/Components/Builtins/XAnimator.qml +3 -0
  258. data/Components/Builtins/YAnimator.qml +3 -0
  259. data/Components/README.md +45 -0
  260. data/ControlNode.qml +1369 -0
  261. data/Controls/BarIconButton.qml +27 -0
  262. data/Controls/BarIndicator.qml +22 -0
  263. data/Controls/BorderOverlay.qml +10 -0
  264. data/Controls/BorderSurface.qml +10 -0
  265. data/Controls/Button.qml +78 -0
  266. data/Controls/ButtonGroup.qml +19 -0
  267. data/Controls/ConfirmDialog.qml +37 -0
  268. data/Controls/CursorSurface.qml +29 -0
  269. data/Controls/Dropdown.qml +59 -0
  270. data/Controls/MultiSelect.qml +32 -0
  271. data/Controls/NumberField.qml +24 -0
  272. data/Controls/OpticalGlyph.qml +14 -0
  273. data/Controls/PanelActionButton.qml +10 -0
  274. data/Controls/PanelHero.qml +18 -0
  275. data/Controls/PanelKeyCatcher.qml +25 -0
  276. data/Controls/PanelSectionHeader.qml +11 -0
  277. data/Controls/PanelSeparator.qml +10 -0
  278. data/Controls/PanelSlider.qml +36 -0
  279. data/Controls/PanelToolTip.qml +13 -0
  280. data/Controls/SearchableDropdown.qml +11 -0
  281. data/Controls/TextField.qml +25 -0
  282. data/Controls/Toggle.qml +22 -0
  283. data/Controls/ToggleSwitch.qml +26 -0
  284. data/Controls/WidgetButton.qml +35 -0
  285. data/Controls/qmldir +25 -0
  286. data/Desktop.qml +76 -0
  287. data/LICENSE +22 -0
  288. data/README.md +112 -0
  289. data/Service.qml +430 -0
  290. data/Theme/Border.qml +22 -0
  291. data/Theme/Color.qml +22 -0
  292. data/Theme/Style.qml +47 -0
  293. data/Theme/Util.qml +6 -0
  294. data/Theme/qmldir +5 -0
  295. data/bin/zui +7 -0
  296. data/lib/zui/animation.rb +24 -0
  297. data/lib/zui/application.rb +327 -0
  298. data/lib/zui/builder.rb +725 -0
  299. data/lib/zui/cli.rb +91 -0
  300. data/lib/zui/command.rb +101 -0
  301. data/lib/zui/component_registry.rb +91 -0
  302. data/lib/zui/components.rb +262 -0
  303. data/lib/zui/distribution.rb +200 -0
  304. data/lib/zui/generator.rb +84 -0
  305. data/lib/zui/host.rb +123 -0
  306. data/lib/zui/node.rb +30 -0
  307. data/lib/zui/platform.rb +40 -0
  308. data/lib/zui/protocol.rb +29 -0
  309. data/lib/zui/runner.rb +37 -0
  310. data/lib/zui/runtime.rb +23 -0
  311. data/lib/zui/scheduler.rb +136 -0
  312. data/lib/zui/source_bundle.rb +63 -0
  313. data/lib/zui/state_store.rb +100 -0
  314. data/lib/zui/value.rb +44 -0
  315. data/lib/zui.rb +33 -0
  316. data/native/CMakeLists.txt +45 -0
  317. data/native/ZuiClipboard.cpp +16 -0
  318. data/native/ZuiClipboard.h +16 -0
  319. data/native/ZuiProcess.cpp +84 -0
  320. data/native/ZuiProcess.h +34 -0
  321. data/native/main.cpp +64 -0
  322. data/vendor/host/linux-x86_64/PROVENANCE.md +15 -0
  323. data/vendor/host/linux-x86_64/zui-host +0 -0
  324. data/vendor/host/linux-x86_64/zui-host.sha256 +1 -0
  325. metadata +365 -0
@@ -0,0 +1,3 @@
1
+ import QtQuick
2
+ import "Support" as Support
3
+ Support.AnimationGroupDriver { renderer: null; sequential: false; onRendererChanged: if(renderer){renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,"start",{from:renderer.prop("from_state",""),to:renderer.prop("to_state","")})} }
@@ -0,0 +1,423 @@
1
+ import QtQuick
2
+ import QtQuick.Controls as QQC
3
+ import QtQml.Models
4
+ import "../../Theme"
5
+
6
+ Rectangle {
7
+ id: treeRoot
8
+
9
+ required property var renderer
10
+ readonly property var sourceRows: renderer.prop("rows", [])
11
+ readonly property var requestedColumns: renderer.prop("columns", [])
12
+ readonly property string childrenField: String(renderer.prop("children_field", "children"))
13
+ readonly property var effectiveColumns: inferColumns()
14
+ readonly property real treePadding: Number(renderer.prop("padding", 0))
15
+ property var treeModel: null
16
+
17
+ function inferColumns() {
18
+ if (requestedColumns && requestedColumns.length > 0) return requestedColumns
19
+ if (!sourceRows || sourceRows.length === 0) return []
20
+ var first = sourceRows[0]
21
+ if (Array.isArray(first)) {
22
+ var columns = []
23
+ for (var index = 0; index < first.length; index++) columns.push(String(index + 1))
24
+ return columns
25
+ }
26
+ if (first !== null && typeof first === "object")
27
+ return Object.keys(first).filter(function(key) { return key !== childrenField })
28
+ return ["Value"]
29
+ }
30
+
31
+ function columnProperty(column, name, fallback) {
32
+ if (column !== null && typeof column === "object" && !Array.isArray(column)) {
33
+ var value = column[name]
34
+ return value === undefined || value === null ? fallback : value
35
+ }
36
+ return fallback
37
+ }
38
+
39
+ function columnKey(index) {
40
+ var column = effectiveColumns[index]
41
+ if (column !== null && typeof column === "object" && !Array.isArray(column))
42
+ return String(column.key === undefined ? (column.field === undefined ? index : column.field) : column.key)
43
+ if (sourceRows.length > 0 && Array.isArray(sourceRows[0])) return index
44
+ return String(column)
45
+ }
46
+
47
+ function columnLabel(index) {
48
+ var column = effectiveColumns[index]
49
+ if (column !== null && typeof column === "object" && !Array.isArray(column))
50
+ return String(column.label === undefined ? columnKey(index) : column.label)
51
+ return String(column)
52
+ }
53
+
54
+ function columnWidth(index) {
55
+ return Number(columnProperty(effectiveColumns[index], "width",
56
+ renderer.prop("column_width", index === 0 ? 240 : 160)))
57
+ }
58
+
59
+ function columnAlignment(index) {
60
+ var name = String(columnProperty(effectiveColumns[index], "alignment", "left"))
61
+ if (name === "center") return Text.AlignHCenter
62
+ if (name === "right" || name === "end") return Text.AlignRight
63
+ return Text.AlignLeft
64
+ }
65
+
66
+ function columnEditable(index) {
67
+ return renderer.prop("editable", false) === true
68
+ && columnProperty(effectiveColumns[index], "editable", true) !== false
69
+ }
70
+
71
+ function nodeChildren(node) {
72
+ if (node === null || typeof node !== "object" || Array.isArray(node)) return []
73
+ var children = node[childrenField]
74
+ return Array.isArray(children) ? children : []
75
+ }
76
+
77
+ function nodeCell(node, column) {
78
+ if (Array.isArray(node)) return node[column]
79
+ if (node !== null && typeof node === "object") return node[columnKey(column)]
80
+ return column === 0 ? node : null
81
+ }
82
+
83
+ function normalizeNode(node) {
84
+ var normalized = {}
85
+ for (var column = 0; column < effectiveColumns.length; column++)
86
+ normalized["_c" + column] = nodeCell(node, column)
87
+ var children = nodeChildren(node)
88
+ if (children.length > 0) {
89
+ normalized.rows = []
90
+ for (var index = 0; index < children.length; index++)
91
+ normalized.rows.push(normalizeNode(children[index]))
92
+ }
93
+ return normalized
94
+ }
95
+
96
+ function normalizedRows() {
97
+ var rows = []
98
+ for (var index = 0; index < sourceRows.length; index++) rows.push(normalizeNode(sourceRows[index]))
99
+ return rows
100
+ }
101
+
102
+ function modelSource() {
103
+ var source = "import Qt.labs.qmlmodels 6.10\nTreeModel {\n"
104
+ for (var column = 0; column < effectiveColumns.length; column++)
105
+ source += " TableModelColumn { display: \"_c" + column + "\"; edit: \"_c" + column + "\" }\n"
106
+ return source + "}"
107
+ }
108
+
109
+ function rebuildModel() {
110
+ var previous = treeModel
111
+ treeModel = null
112
+ if (previous) previous.destroy()
113
+ if (effectiveColumns.length === 0) return
114
+ var created = Qt.createQmlObject(modelSource(), treeRoot, "ZuiDynamicTreeModel")
115
+ created.rows = normalizedRows()
116
+ treeModel = created
117
+ Qt.callLater(syncTreeState)
118
+ }
119
+
120
+ function syncRows() {
121
+ if (!treeModel) return rebuildModel()
122
+ treeModel.rows = normalizedRows()
123
+ Qt.callLater(syncTreeState)
124
+ }
125
+
126
+ function cleanPath(value) {
127
+ if (!Array.isArray(value)) return []
128
+ var path = []
129
+ for (var index = 0; index < value.length; index++) path.push(Number(value[index]))
130
+ return path
131
+ }
132
+
133
+ function sourceNode(path) {
134
+ var rows = sourceRows
135
+ var node = null
136
+ for (var depth = 0; depth < path.length; depth++) {
137
+ var row = Number(path[depth])
138
+ if (!rows || row < 0 || row >= rows.length) return null
139
+ node = rows[row]
140
+ rows = nodeChildren(node)
141
+ }
142
+ return node
143
+ }
144
+
145
+ function indexPath(modelIndex) {
146
+ var path = []
147
+ var current = modelIndex
148
+ while (current && current.valid) {
149
+ path.unshift(current.row)
150
+ current = current.parent
151
+ }
152
+ return path
153
+ }
154
+
155
+ function cellPayload(row, column, value) {
156
+ var modelIndex = treeControl.index(row, column)
157
+ var path = modelIndex && modelIndex.valid ? indexPath(modelIndex) : []
158
+ return { row: row, column: column, path: path,
159
+ depth: row >= 0 ? treeControl.depth(row) : -1,
160
+ key: column >= 0 && column < effectiveColumns.length ? columnKey(column) : null,
161
+ value: value, node: sourceNode(path),
162
+ expanded: row >= 0 ? treeControl.isExpanded(row) : false }
163
+ }
164
+
165
+ function syncTreeState() {
166
+ if (!treeModel || effectiveColumns.length === 0) return
167
+ var depth = Number(renderer.prop("expand_depth", 0))
168
+ if (depth > 0) {
169
+ for (var rootRow = 0; rootRow < sourceRows.length; rootRow++) {
170
+ var rootIndex = treeModel.index([rootRow], 0)
171
+ var rootCell = treeControl.cellAtIndex(rootIndex)
172
+ if (rootCell.y >= 0) treeControl.expandRecursively(rootCell.y, depth - 1)
173
+ }
174
+ }
175
+ var expandedPaths = renderer.prop("expanded_paths", [])
176
+ if (Array.isArray(expandedPaths)) {
177
+ for (var index = 0; index < expandedPaths.length; index++) {
178
+ var expandedIndex = treeModel.index(cleanPath(expandedPaths[index]), 0)
179
+ if (!expandedIndex.valid) continue
180
+ treeControl.expandToIndex(expandedIndex)
181
+ var expandedCell = treeControl.cellAtIndex(expandedIndex)
182
+ if (expandedCell.y >= 0) treeControl.expand(expandedCell.y)
183
+ }
184
+ }
185
+ var path = cleanPath(renderer.prop("selected_path", []))
186
+ if (path.length === 0) return
187
+ var column = Math.max(0, Math.min(effectiveColumns.length - 1,
188
+ Number(renderer.prop("selected_column", 0))))
189
+ var selectedIndex = treeModel.index(path, column)
190
+ if (!selectedIndex.valid) return
191
+ treeControl.expandToIndex(selectedIndex)
192
+ treeSelection.setCurrentIndex(selectedIndex, ItemSelectionModel.ClearAndSelect)
193
+ }
194
+
195
+ function selectionBehaviorValue(value) {
196
+ var name = String(value || "rows")
197
+ if (name === "none" || name === "disabled") return TreeView.SelectionDisabled
198
+ if (name === "cells") return TreeView.SelectCells
199
+ if (name === "columns") return TreeView.SelectColumns
200
+ return TreeView.SelectRows
201
+ }
202
+
203
+ function selectionModeValue(value) {
204
+ var name = String(value || "single")
205
+ if (name === "contiguous") return TreeView.ContiguousSelection
206
+ if (name === "extended" || name === "multiple") return TreeView.ExtendedSelection
207
+ return TreeView.SingleSelection
208
+ }
209
+
210
+ function editTriggersValue(value) {
211
+ if (renderer.prop("editable", false) !== true) return TreeView.NoEditTriggers
212
+ var names = Array.isArray(value) ? value : [value || "edit_key"]
213
+ var result = TreeView.NoEditTriggers
214
+ for (var index = 0; index < names.length; index++) {
215
+ var name = String(names[index])
216
+ if (name === "single_tap") result |= TreeView.SingleTapped
217
+ if (name === "double_tap") result |= TreeView.DoubleTapped
218
+ if (name === "selected_tap") result |= TreeView.SelectedTapped
219
+ if (name === "edit_key") result |= TreeView.EditKeyPressed
220
+ if (name === "any_key") result |= TreeView.AnyKeyPressed
221
+ }
222
+ return result
223
+ }
224
+
225
+ implicitWidth: Number(renderer.prop("width", 720))
226
+ implicitHeight: Number(renderer.prop("height", 440))
227
+ color: renderer.prop("background", Color.background)
228
+ radius: Number(renderer.prop("radius", Style.cornerRadius))
229
+ border.width: String(renderer.prop("border_color", "")).length > 0 ? Style.normalBorderWidth : 0
230
+ border.color: renderer.prop("border_color", "transparent")
231
+ enabled: renderer.prop("enabled", true) !== false
232
+ clip: renderer.prop("clip", true) !== false
233
+ Accessible.name: String(renderer.prop("accessible_name", "Tree"))
234
+ Accessible.role: Accessible.Tree
235
+
236
+ ItemSelectionModel { id: treeSelection; model: treeRoot.treeModel }
237
+
238
+ Rectangle {
239
+ id: headerClip
240
+ x: treeRoot.treePadding
241
+ y: treeRoot.treePadding
242
+ width: Math.max(0, parent.width - treeRoot.treePadding * 2)
243
+ height: renderer.prop("show_header", true) !== false ? Number(renderer.prop("header_height", 42)) : 0
244
+ visible: height > 0
245
+ color: renderer.prop("header_background", Color.popups.background)
246
+ clip: true
247
+
248
+ Row {
249
+ x: -treeControl.contentX
250
+ height: parent.height
251
+ Repeater {
252
+ model: treeRoot.effectiveColumns
253
+ Rectangle {
254
+ required property int index
255
+ width: treeRoot.columnWidth(index)
256
+ height: headerClip.height
257
+ color: "transparent"
258
+ border.width: Style.normalBorderWidth
259
+ border.color: renderer.prop("grid_color", Qt.rgba(renderer.foreground.r,
260
+ renderer.foreground.g, renderer.foreground.b, 0.18))
261
+ Text {
262
+ anchors.fill: parent
263
+ anchors.leftMargin: Style.spacing.md
264
+ anchors.rightMargin: Style.spacing.md
265
+ text: treeRoot.columnLabel(index)
266
+ color: renderer.prop("header_foreground", renderer.prop("foreground", renderer.foreground))
267
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
268
+ font.pixelSize: Number(renderer.prop("header_size", Style.font.body))
269
+ font.bold: true
270
+ horizontalAlignment: treeRoot.columnAlignment(index)
271
+ verticalAlignment: Text.AlignVCenter
272
+ elide: Text.ElideRight
273
+ }
274
+ }
275
+ }
276
+ }
277
+ }
278
+
279
+ TreeView {
280
+ id: treeControl
281
+ x: treeRoot.treePadding
282
+ y: treeRoot.treePadding + headerClip.height
283
+ width: Math.max(0, parent.width - treeRoot.treePadding * 2)
284
+ height: Math.max(0, parent.height - treeRoot.treePadding * 2 - headerClip.height)
285
+ model: treeRoot.treeModel
286
+ selectionModel: treeSelection
287
+ selectionBehavior: treeRoot.selectionBehaviorValue(renderer.prop("selection_behavior", "rows"))
288
+ selectionMode: treeRoot.selectionModeValue(renderer.prop("selection_mode", "single"))
289
+ editTriggers: treeRoot.editTriggersValue(renderer.prop("edit_triggers", "edit_key"))
290
+ alternatingRows: renderer.prop("alternating_rows", true) !== false
291
+ animate: renderer.prop("animate", true) !== false
292
+ reuseItems: renderer.prop("reuse_items", true) !== false
293
+ keyNavigationEnabled: renderer.prop("key_navigation_enabled", true) !== false
294
+ pointerNavigationEnabled: renderer.prop("pointer_navigation_enabled", true) !== false
295
+ interactive: renderer.prop("interactive", true) !== false
296
+ clip: true
297
+ focus: true
298
+ rowSpacing: Number(renderer.prop("row_spacing", 1))
299
+ columnSpacing: Number(renderer.prop("column_spacing", 1))
300
+ rowHeightProvider: function(row) { return Number(renderer.prop("row_height", 42)) }
301
+ columnWidthProvider: function(column) { return treeRoot.columnWidth(column) }
302
+
303
+ delegate: QQC.TreeViewDelegate {
304
+ id: treeDelegate
305
+ required property int column
306
+ indentation: Number(renderer.prop("indentation", 22))
307
+ leftMargin: Number(renderer.prop("left_margin", Style.spacing.sm))
308
+ rightMargin: Number(renderer.prop("right_margin", Style.spacing.sm))
309
+ text: String(model.display === undefined || model.display === null ? "" : model.display)
310
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
311
+ font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
312
+
313
+ background: Rectangle {
314
+ color: treeDelegate.selected
315
+ ? renderer.prop("selected_background", Color.popups.background)
316
+ : (treeControl.alternatingRows && treeDelegate.row % 2 === 1
317
+ ? renderer.prop("alternate_background", renderer.prop("cell_background", "transparent"))
318
+ : renderer.prop("cell_background", "transparent"))
319
+ border.width: treeDelegate.current ? Style.normalBorderWidth : 0
320
+ border.color: renderer.prop("accent", Color.accent)
321
+ }
322
+
323
+ contentItem: Text {
324
+ text: treeDelegate.text
325
+ color: treeDelegate.selected
326
+ ? renderer.prop("selected_foreground", renderer.prop("foreground", renderer.foreground))
327
+ : renderer.prop("foreground", renderer.foreground)
328
+ font: treeDelegate.font
329
+ horizontalAlignment: treeRoot.columnAlignment(treeDelegate.column)
330
+ verticalAlignment: Text.AlignVCenter
331
+ elide: Text.ElideRight
332
+ visible: !treeDelegate.editing
333
+ }
334
+
335
+ TableView.editDelegate: FocusScope {
336
+ width: parent.width
337
+ height: parent.height
338
+ TableView.onCommit: {
339
+ if (!treeRoot.columnEditable(treeDelegate.column)) return
340
+ var sourceIndex = treeControl.index(treeDelegate.row, treeDelegate.column)
341
+ if (treeRoot.treeModel.setData(sourceIndex, editor.text, Qt.EditRole))
342
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "edit",
343
+ treeRoot.cellPayload(treeDelegate.row, treeDelegate.column, editor.text))
344
+ }
345
+ QQC.TextField {
346
+ id: editor
347
+ anchors.fill: parent
348
+ text: String(treeDelegate.model.edit === undefined ? treeDelegate.model.display : treeDelegate.model.edit)
349
+ enabled: treeRoot.columnEditable(treeDelegate.column)
350
+ focus: true
351
+ Component.onCompleted: selectAll()
352
+ }
353
+ }
354
+
355
+ onClicked: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
356
+ "cell_click", treeRoot.cellPayload(row, column, model.display))
357
+ onDoubleClicked: {
358
+ var payload = treeRoot.cellPayload(row, column, model.display)
359
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "cell_double_click", payload)
360
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "activate", payload)
361
+ }
362
+ }
363
+
364
+ onExpanded: function(row, depth) {
365
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "expand",
366
+ treeRoot.cellPayload(row, 0, treeRoot.treeModel.data(treeControl.index(row, 0), Qt.DisplayRole)))
367
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "expanded_change",
368
+ { row: row, depth: depth, expanded: true })
369
+ }
370
+ onCollapsed: function(row, recursively) {
371
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "collapse",
372
+ treeRoot.cellPayload(row, 0, treeRoot.treeModel.data(treeControl.index(row, 0), Qt.DisplayRole)))
373
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "expanded_change",
374
+ { row: row, recursively: recursively, expanded: false })
375
+ }
376
+ onRowsChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
377
+ "row_count_change", { value: rows })
378
+ onColumnsChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
379
+ "column_count_change", { value: columns })
380
+ onContentXChanged: { if (moving) renderer.bridge.sendEvent(renderer.surfaceName,
381
+ renderer.controlId, "scroll", { x: contentX, y: contentY }) }
382
+ onContentYChanged: { if (moving) renderer.bridge.sendEvent(renderer.surfaceName,
383
+ renderer.controlId, "scroll", { x: contentX, y: contentY }) }
384
+ onMovementStarted: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
385
+ "movement_start", { x: contentX, y: contentY })
386
+ onMovementEnded: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
387
+ "movement_end", { x: contentX, y: contentY })
388
+ onActiveFocusChanged: {
389
+ if (renderer && renderer.bridge)
390
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
391
+ activeFocus ? "focus" : "blur", {})
392
+ }
393
+ }
394
+
395
+ Connections {
396
+ target: treeSelection
397
+ function onCurrentChanged(current, previous) {
398
+ if (!current.valid) return
399
+ var cell = treeControl.cellAtIndex(current)
400
+ if (cell.y < 0) return
401
+ var payload = treeRoot.cellPayload(cell.y, current.column,
402
+ treeRoot.treeModel.data(current, Qt.DisplayRole))
403
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "current_change", payload)
404
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "selection_change", payload)
405
+ }
406
+ }
407
+
408
+ Text {
409
+ anchors.centerIn: treeControl
410
+ visible: treeRoot.sourceRows.length === 0
411
+ text: String(renderer.prop("empty_text", "No nodes"))
412
+ color: renderer.prop("muted", Color.muted)
413
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
414
+ font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
415
+ }
416
+
417
+ Component.onCompleted: rebuildModel()
418
+ onEffectiveColumnsChanged: rebuildModel()
419
+ onSourceRowsChanged: syncRows()
420
+ onChildrenFieldChanged: rebuildModel()
421
+ onVisibleChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
422
+ visible ? "show" : "hide", {})
423
+ }
@@ -0,0 +1,46 @@
1
+ import QtQuick
2
+ import QtQuick.Controls as QQC
3
+ import "../../Theme"
4
+
5
+ QQC.ItemDelegate {
6
+ id: delegateRoot
7
+
8
+ property var renderer: null
9
+ readonly property bool expanded: renderer && renderer.prop("expanded", false) === true
10
+
11
+ text: (renderer && renderer.prop("has_children", false) === true ? (expanded ? "▾ " : "▸ ") : "") + (renderer ? String(renderer.prop("text", "")) : "")
12
+ enabled: !renderer || renderer.prop("enabled", true) !== false
13
+ leftPadding: Number(renderer ? renderer.prop("depth", 0) * renderer.prop("indentation", 18) : 0) + 8
14
+ implicitWidth: Number(renderer ? renderer.prop("width", 220) : 220)
15
+ implicitHeight: Number(renderer ? renderer.prop("height", 42) : 42)
16
+ highlighted: renderer && (renderer.prop("selected", false) === true || renderer.prop("current", false) === true)
17
+ onClicked: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, renderer.prop("has_children", false) === true ? (expanded ? "collapse" : "expand") : "click", {
18
+ "row": renderer.prop("row", -1),
19
+ "column": renderer.prop("column", -1),
20
+ "value": renderer.prop("value", null)
21
+ })
22
+ onDoubleClicked: {
23
+ var payload = {
24
+ "row": renderer.prop("row", -1),
25
+ "column": renderer.prop("column", -1),
26
+ "value": renderer.prop("value", null)
27
+ };
28
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "double_click", payload);
29
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "activate", payload);
30
+ }
31
+
32
+ background: Rectangle {
33
+ color: delegateRoot.highlighted ? renderer.prop("selected_background", Color.popups.background) : renderer.prop("background", "transparent")
34
+ border.color: renderer.prop("border_color", "transparent")
35
+ }
36
+
37
+ contentItem: Text {
38
+ text: delegateRoot.text
39
+ color: delegateRoot.highlighted ? renderer.prop("selected_foreground", renderer.foreground) : renderer.prop("foreground", renderer.foreground)
40
+ font.family: renderer.prop("font_family", renderer.fontFamily)
41
+ font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
42
+ verticalAlignment: Text.AlignVCenter
43
+ elide: Text.ElideRight
44
+ }
45
+
46
+ }
@@ -0,0 +1,18 @@
1
+ import QtQuick
2
+ import QtQuick.Controls as QQC
3
+ import "../../Theme"
4
+
5
+ QQC.Tumbler {
6
+ id: tumblerRoot
7
+ property var renderer: null
8
+ implicitWidth: Number(renderer ? renderer.prop("width", 120) : 120); implicitHeight: Number(renderer ? renderer.prop("height", 220) : 220)
9
+ model: renderer ? renderer.prop("items", []) : []
10
+ currentIndex: Number(renderer ? renderer.prop("current_index", 0) : 0)
11
+ visibleItemCount: Number(renderer ? renderer.prop("visible_item_count", 5) : 5)
12
+ wrap: !renderer || renderer.prop("wrap", true) !== false
13
+ enabled: !renderer || (renderer.prop("enabled", true) !== false && renderer.prop("interactive", true) !== false)
14
+ font.family: renderer ? renderer.prop("font_family", renderer.fontFamily) : ""; font.pixelSize: Number(renderer ? renderer.prop("font_size", Style.font.body) : Style.font.body)
15
+ background: Rectangle { color: renderer ? renderer.prop("background", "transparent") : "transparent" }
16
+ delegate: Text { required property var modelData; required property int index; text: String(modelData); color: index === tumblerRoot.currentIndex ? renderer.prop("accent", renderer.prop("foreground", renderer.foreground)) : renderer.prop("muted", renderer.prop("foreground", renderer.foreground)); font: tumblerRoot.font; horizontalAlignment: Text.AlignHCenter; verticalAlignment: Text.AlignVCenter; opacity: 1.0 - Math.min(0.7, Math.abs(QQC.Tumbler.displacement) / Math.max(1, tumblerRoot.visibleItemCount)) }
17
+ onMovingChanged: if (!moving) { var payload = { value: currentIndex, item: model[currentIndex] }; renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "input", payload); renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "change", payload) }
18
+ }
@@ -0,0 +1,3 @@
1
+ import QtQuick
2
+ import "Support" as Support
3
+ Support.AnimationDriver { renderer: null; animationType: "uniform_animator" }
@@ -0,0 +1,3 @@
1
+ import QtQuick
2
+ import "Support" as Support
3
+ Support.AnimationDriver { renderer: null; animationType: "vector" }
@@ -0,0 +1,62 @@
1
+ import QtQuick
2
+ import QtQuick.Controls as QQC
3
+ import QtQuick.Layouts
4
+ import QtMultimedia
5
+ import QtQuick.VectorImage
6
+ import "../../Theme"
7
+ import "../../Controls" as ZuiControls
8
+
9
+ VectorImage {
10
+ id: vectorRoot
11
+ required property var renderer
12
+
13
+ function synchronizeCapabilities() {
14
+ var trusted = renderer.prop("trusted", false) === true
15
+ if (vectorRoot["assumeTrustedSource"] !== undefined)
16
+ vectorRoot["assumeTrustedSource"] = trusted
17
+ else if (trusted)
18
+ renderer.componentError("trusted_vector_unsupported",
19
+ "The installed Qt version does not support trusted vector sources", {})
20
+
21
+ var asynchronous = renderer.prop("asynchronous_shapes", false) === true
22
+ if (vectorRoot["asynchronousShapes"] !== undefined)
23
+ vectorRoot["asynchronousShapes"] = asynchronous
24
+ else if (asynchronous)
25
+ renderer.componentError("asynchronous_vector_unsupported",
26
+ "The installed Qt version does not support asynchronous vector shapes", {})
27
+
28
+ var controller = vectorRoot["animations"]
29
+ var loops = Number(renderer.prop("animation_loops", 1))
30
+ var paused = renderer.prop("animation_paused", false) === true
31
+ if (controller === undefined || controller === null) {
32
+ if (loops !== 1 || paused)
33
+ renderer.componentError("vector_animation_unsupported",
34
+ "The installed Qt version does not support animated vector images", {})
35
+ return
36
+ }
37
+ controller.loops = loops
38
+ controller.paused = paused
39
+ }
40
+
41
+ source: renderer.assetUrl(renderer.prop("source", ""))
42
+ width: Number(renderer.prop("width", 120))
43
+ height: Number(renderer.prop("height", 120))
44
+ fillMode: {
45
+ var mode = String(renderer.prop("fill_mode", "contain"))
46
+ if (mode === "cover") return VectorImage.PreserveAspectCrop
47
+ if (mode === "stretch") return VectorImage.Stretch
48
+ if (mode === "none") return VectorImage.NoResize
49
+ return VectorImage.PreserveAspectFit
50
+ }
51
+ preferredRendererType: String(renderer.prop("renderer", "geometry")) === "curve"
52
+ ? VectorImage.CurveRenderer : VectorImage.GeometryRenderer
53
+ onSourceChanged: {
54
+ if (renderer.subscribed("source_change"))
55
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "source_change", { value: source })
56
+ }
57
+ Component.onCompleted: synchronizeCapabilities()
58
+ Connections {
59
+ target: vectorRoot.renderer
60
+ function onNodeChanged() { vectorRoot.synchronizeCapabilities() }
61
+ }
62
+ }
@@ -0,0 +1,21 @@
1
+ import QtQuick
2
+ import QtQuick.Controls as QQC
3
+ import "../../Theme"
4
+
5
+ ListView {
6
+ id: headerRoot
7
+ property var renderer: null
8
+ implicitWidth: Number(renderer ? renderer.prop("width", 80) : 80)
9
+ implicitHeight: renderer ? renderer.prop("sections", []).length * Number(renderer.prop("section_height", 42)) : 0
10
+ model: renderer ? renderer.prop("sections", []) : []
11
+ spacing: Number(renderer ? renderer.prop("spacing", 1) : 1)
12
+ delegate: Rectangle {
13
+ required property int index; required property var modelData
14
+ width: headerRoot.width; height: Number(renderer.prop("section_height", 42))
15
+ readonly property bool selected: index === Number(renderer.prop("current_index", -1))
16
+ color: selected ? renderer.prop("selected_background", Color.popups.background) : renderer.prop("background", Color.background)
17
+ border.color: renderer.prop("border_color", Color.muted)
18
+ Text { anchors.fill: parent; anchors.margins: 8; text: String(modelData && modelData.label !== undefined ? modelData.label : modelData); color: parent.selected ? renderer.prop("selected_foreground", renderer.prop("foreground", renderer.foreground)) : renderer.prop("foreground", renderer.foreground); font.family: renderer.prop("font_family", renderer.fontFamily); font.pixelSize: Number(renderer.prop("font_size", Style.font.body)); verticalAlignment: Text.AlignVCenter; horizontalAlignment: Text.AlignHCenter }
19
+ TapHandler { enabled: renderer.prop("clickable", true) !== false; onTapped: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "click", { index: index, value: modelData }) }
20
+ }
21
+ }
@@ -0,0 +1,35 @@
1
+ import QtQuick
2
+ import QtQuick.Controls as QQC
3
+ import "../../Theme"
4
+
5
+ QQC.ItemDelegate {
6
+ id: headerDelegate
7
+
8
+ property var renderer: null
9
+
10
+ text: renderer ? String(renderer.prop("text", "")) : ""
11
+ enabled: !renderer || renderer.prop("enabled", true) !== false
12
+ implicitWidth: Number(renderer ? renderer.prop("width", 80) : 80)
13
+ implicitHeight: Number(renderer ? renderer.prop("height", 42) : 42)
14
+ highlighted: renderer && renderer.prop("selected", false) === true
15
+ font.family: renderer ? renderer.prop("font_family", renderer.fontFamily) : ""
16
+ font.pixelSize: Number(renderer ? renderer.prop("font_size", Style.font.body) : Style.font.body)
17
+ onClicked: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "click", {
18
+ "index": renderer.prop("index", -1),
19
+ "value": renderer.prop("value", null)
20
+ })
21
+
22
+ background: Rectangle {
23
+ color: headerDelegate.highlighted ? renderer.prop("selected_background", Color.popups.background) : renderer.prop("background", Color.background)
24
+ border.color: renderer.prop("border_color", Color.muted)
25
+ }
26
+
27
+ contentItem: Text {
28
+ text: headerDelegate.text
29
+ color: headerDelegate.highlighted ? renderer.prop("selected_foreground", renderer.prop("foreground", renderer.foreground)) : renderer.prop("foreground", renderer.foreground)
30
+ font: headerDelegate.font
31
+ verticalAlignment: Text.AlignVCenter
32
+ horizontalAlignment: Text.AlignHCenter
33
+ }
34
+
35
+ }