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,91 @@
1
+ import QtQuick
2
+ import QtQuick.Controls as QQC
3
+ import QtQuick.Dialogs
4
+ import "../../Theme"
5
+
6
+ QQC.Button {
7
+ id: picker
8
+
9
+ required property var renderer
10
+ readonly property font chosenFont: buildFont()
11
+
12
+ function buildFont() {
13
+ var specification = {
14
+ family: String(renderer.prop("family", renderer.fontFamily)),
15
+ weight: Number(renderer.prop("weight", Font.Normal)),
16
+ italic: renderer.prop("italic", false) === true,
17
+ underline: renderer.prop("underline", false) === true,
18
+ strikeout: renderer.prop("strikeout", false) === true
19
+ }
20
+ var pointSize = Number(renderer.prop("point_size", -1))
21
+ var pixelSize = Number(renderer.prop("pixel_size", -1))
22
+ if (pointSize > 0) specification.pointSize = pointSize
23
+ else if (pixelSize > 0) specification.pixelSize = pixelSize
24
+ return Qt.font(specification)
25
+ }
26
+
27
+ function fontPayload(value) {
28
+ return {
29
+ value: value.family,
30
+ family: value.family,
31
+ point_size: value.pointSize,
32
+ pixel_size: value.pixelSize,
33
+ weight: value.weight,
34
+ italic: value.italic,
35
+ underline: value.underline,
36
+ strikeout: value.strikeout
37
+ }
38
+ }
39
+
40
+ implicitWidth: Number(renderer.prop("width", 240))
41
+ implicitHeight: Number(renderer.prop("height", 44))
42
+ enabled: renderer.prop("enabled", true) !== false
43
+ onClicked: fontDialog.open()
44
+
45
+ background: Rectangle {
46
+ color: renderer.prop("background", Color.popups.background)
47
+ radius: Number(renderer.prop("radius", Style.cornerRadius))
48
+ border.width: Style.normalBorderWidth
49
+ border.color: picker.activeFocus
50
+ ? renderer.prop("accent", Color.accent)
51
+ : renderer.prop("border_color", renderer.foreground)
52
+ opacity: picker.down ? 0.72 : 1
53
+ }
54
+
55
+ contentItem: Column {
56
+ spacing: 2
57
+ Text {
58
+ text: String(renderer.prop("label", ""))
59
+ visible: text.length > 0
60
+ color: renderer.prop("muted", Color.muted)
61
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
62
+ font.pixelSize: Number(renderer.prop("font_size", Style.font.caption))
63
+ }
64
+ Text {
65
+ width: parent.width
66
+ text: String(renderer.prop("family", renderer.prop("placeholder", "Choose a font")))
67
+ elide: Text.ElideRight
68
+ color: renderer.prop("foreground", renderer.foreground)
69
+ font: picker.chosenFont
70
+ }
71
+ }
72
+
73
+ FontDialog {
74
+ id: fontDialog
75
+ title: String(renderer.prop("title", "Choose a font"))
76
+ selectedFont: picker.chosenFont
77
+ visible: renderer.prop("opened", false) === true
78
+ options: renderer.prop("native_dialog", true) === false ? FontDialog.DontUseNativeDialog : 0
79
+
80
+ onSelectedFontChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
81
+ "input", picker.fontPayload(selectedFont))
82
+ onAccepted: {
83
+ var payload = picker.fontPayload(selectedFont)
84
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "change", payload)
85
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "accept", payload)
86
+ }
87
+ onRejected: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "reject", {})
88
+ onVisibleChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
89
+ visible ? "open" : "close", {})
90
+ }
91
+ }
@@ -0,0 +1,71 @@
1
+ import QtQuick
2
+ import QtQuick.Controls as QQC
3
+ import "../../Theme"
4
+
5
+ QQC.Frame {
6
+ id: frameRoot
7
+
8
+ required property var renderer
9
+ readonly property string contentLayout: String(renderer.prop("layout", "column"))
10
+
11
+ implicitWidth: Number(renderer.prop("width", 420))
12
+ implicitHeight: Number(renderer.prop("height", 240))
13
+ enabled: renderer.prop("enabled", true) !== false
14
+ visible: renderer.prop("visible", true) !== false
15
+ clip: renderer.prop("clip", false) === true
16
+ padding: Number(renderer.prop("padding", Style.spacing.lg))
17
+ leftPadding: Number(renderer.prop("left_padding", padding))
18
+ rightPadding: Number(renderer.prop("right_padding", padding))
19
+ topPadding: Number(renderer.prop("top_padding", padding))
20
+ bottomPadding: Number(renderer.prop("bottom_padding", padding))
21
+
22
+ background: Rectangle {
23
+ color: renderer.prop("background", "transparent")
24
+ radius: Number(renderer.prop("radius", Style.cornerRadius))
25
+ border.width: Number(renderer.prop("border_width", Style.normalBorderWidth))
26
+ border.color: renderer.prop("border_color", Color.border)
27
+ }
28
+
29
+ contentItem: Item {
30
+ LayoutMirroring.enabled: String(renderer.prop("layout_direction", "left_to_right")) === "right_to_left"
31
+ LayoutMirroring.childrenInherit: true
32
+
33
+ Loader {
34
+ anchors.fill: parent
35
+ sourceComponent: frameRoot.contentLayout === "row" ? rowContent
36
+ : (frameRoot.contentLayout === "stack" ? stackContent : columnContent)
37
+ }
38
+ }
39
+
40
+ Component {
41
+ id: columnContent
42
+ Column {
43
+ spacing: Number(renderer.prop("spacing", Style.spacing.md))
44
+ Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent }
45
+ }
46
+ }
47
+
48
+ Component {
49
+ id: rowContent
50
+ Row {
51
+ spacing: Number(renderer.prop("spacing", Style.spacing.md))
52
+ Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent }
53
+ }
54
+ }
55
+
56
+ Component {
57
+ id: stackContent
58
+ Item {
59
+ Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent }
60
+ }
61
+ }
62
+
63
+ TapHandler {
64
+ enabled: renderer.subscribed("click")
65
+ onTapped: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "click", {})
66
+ }
67
+ onVisibleChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
68
+ visible ? "show" : "hide", {})
69
+ onActiveFocusChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
70
+ activeFocus ? "focus" : "blur", {})
71
+ }
@@ -0,0 +1,13 @@
1
+ import QtQuick
2
+
3
+ Item {
4
+ id: frameRoot
5
+ property var renderer: null
6
+ FrameAnimation {
7
+ id: nativeFrame
8
+ running: renderer && renderer.prop("running", true) !== false
9
+ paused: renderer && renderer.prop("paused", false) === true
10
+ onTriggered: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "frame", { frame: currentFrame, frame_time: frameTime, smooth_frame_time: smoothFrameTime, elapsed_time: elapsedTime })
11
+ onRunningChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, running ? "start" : "stop", {})
12
+ }
13
+ }
@@ -0,0 +1,3 @@
1
+ import QtQuick
2
+ import "Support" as Support
3
+ Support.ChartCanvas { renderer: null; chartType: "gauge" }
@@ -0,0 +1,15 @@
1
+ import QtQuick
2
+ import QtQuick.Effects
3
+
4
+ Item {
5
+ required property var renderer
6
+ implicitWidth: Number(renderer.prop("width", 240)); implicitHeight: Number(renderer.prop("height", 160))
7
+ Item { id: sourceHost; anchors.fill: parent; Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent } }
8
+ ShaderEffectSource { id: sourceTexture; anchors.fill: parent; sourceItem: sourceHost; hideSource: true; visible: false }
9
+ MultiEffect {
10
+ anchors.fill: parent; source: sourceTexture; shadowEnabled: true
11
+ shadowBlur: Number(renderer.prop("blur", 1)); blurMax: Number(renderer.prop("maximum", 32)); blurMultiplier: Number(renderer.prop("multiplier", 1))
12
+ shadowHorizontalOffset: 0; shadowVerticalOffset: 0; shadowColor: renderer.prop("color", renderer.foreground)
13
+ shadowOpacity: Number(renderer.prop("opacity", 1)); shadowScale: Number(renderer.prop("scale", 1)); autoPaddingEnabled: renderer.prop("auto_padding", true) !== false
14
+ }
15
+ }
@@ -0,0 +1,93 @@
1
+ import QtQuick
2
+ import QtQuick.Shapes
3
+
4
+ Item {
5
+ id: gradientRoot
6
+ required property var renderer
7
+ property var createdStops: []
8
+ implicitWidth: Number(renderer.prop("width", 200))
9
+ implicitHeight: Number(renderer.prop("height", 120))
10
+
11
+ function stopPosition(index, count) {
12
+ var stops = renderer.prop("stops", [])
13
+ return Array.isArray(stops) && index < stops.length ? Number(stops[index]) : (count <= 1 ? 0 : index / (count - 1))
14
+ }
15
+
16
+ function rebuildStops() {
17
+ for (var oldIndex = 0; oldIndex < createdStops.length; oldIndex++) createdStops[oldIndex].destroy()
18
+ var colors = renderer.prop("colors", [])
19
+ var replacements = []
20
+ if (Array.isArray(colors)) {
21
+ for (var index = 0; index < colors.length; index++) {
22
+ replacements.push(stopFactory.createObject(gradientRoot, {
23
+ position: stopPosition(index, colors.length), color: String(colors[index])
24
+ }))
25
+ }
26
+ }
27
+ createdStops = replacements
28
+ }
29
+
30
+ Component { id: stopFactory; GradientStop {} }
31
+ Connections { target: renderer; function onNodeChanged() { gradientRoot.rebuildStops() } }
32
+ Component.onCompleted: rebuildStops()
33
+
34
+ Shape {
35
+ anchors.fill: parent
36
+ visible: String(renderer.prop("type", "linear")) === "linear"
37
+ antialiasing: renderer.prop("antialiasing", true) !== false
38
+ ShapePath {
39
+ strokeColor: renderer.prop("stroke", "transparent")
40
+ strokeWidth: Number(renderer.prop("stroke_width", 0))
41
+ fillGradient: LinearGradient {
42
+ id: linearGradient
43
+ x1: Number(renderer.prop("start_x", 0)); y1: Number(renderer.prop("start_y", 0))
44
+ x2: Number(renderer.prop("end_x", gradientRoot.width)); y2: Number(renderer.prop("end_y", 0))
45
+ stops: String(renderer.prop("type", "linear")) === "linear" ? gradientRoot.createdStops : []
46
+ }
47
+ PathRectangle { width: gradientRoot.width; height: gradientRoot.height; radius: Number(renderer.prop("radius", 0)) }
48
+ }
49
+ }
50
+
51
+ Shape {
52
+ anchors.fill: parent
53
+ visible: String(renderer.prop("type", "linear")) === "radial"
54
+ antialiasing: renderer.prop("antialiasing", true) !== false
55
+ ShapePath {
56
+ strokeColor: renderer.prop("stroke", "transparent")
57
+ strokeWidth: Number(renderer.prop("stroke_width", 0))
58
+ fillGradient: RadialGradient {
59
+ id: radialGradient
60
+ centerX: Number(renderer.prop("center_x", gradientRoot.width / 2)); centerY: Number(renderer.prop("center_y", gradientRoot.height / 2))
61
+ centerRadius: Number(renderer.prop("center_radius", Math.max(gradientRoot.width, gradientRoot.height) / 2))
62
+ focalX: Number(renderer.prop("focal_x", centerX)); focalY: Number(renderer.prop("focal_y", centerY))
63
+ focalRadius: Number(renderer.prop("focal_radius", 0))
64
+ stops: String(renderer.prop("type", "linear")) === "radial" ? gradientRoot.createdStops : []
65
+ }
66
+ PathRectangle { width: gradientRoot.width; height: gradientRoot.height; radius: Number(renderer.prop("radius", 0)) }
67
+ }
68
+ }
69
+
70
+ Shape {
71
+ anchors.fill: parent
72
+ visible: String(renderer.prop("type", "linear")) === "conical"
73
+ antialiasing: renderer.prop("antialiasing", true) !== false
74
+ ShapePath {
75
+ strokeColor: renderer.prop("stroke", "transparent")
76
+ strokeWidth: Number(renderer.prop("stroke_width", 0))
77
+ fillGradient: ConicalGradient {
78
+ id: conicalGradient
79
+ centerX: Number(renderer.prop("center_x", gradientRoot.width / 2)); centerY: Number(renderer.prop("center_y", gradientRoot.height / 2))
80
+ angle: Number(renderer.prop("angle", 0))
81
+ stops: String(renderer.prop("type", "linear")) === "conical" ? gradientRoot.createdStops : []
82
+ }
83
+ PathRectangle { width: gradientRoot.width; height: gradientRoot.height; radius: Number(renderer.prop("radius", 0)) }
84
+ }
85
+ }
86
+
87
+ MouseArea {
88
+ anchors.fill: parent
89
+ hoverEnabled: renderer.subscribed("hover")
90
+ onClicked: function(mouse) { if (renderer.subscribed("click")) renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "click", { x: mouse.x, y: mouse.y }) }
91
+ onPositionChanged: function(mouse) { if (renderer.subscribed("hover")) renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "hover", { x: mouse.x, y: mouse.y }) }
92
+ }
93
+ }
@@ -0,0 +1,16 @@
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
+ Grid {
10
+ required property var renderer
11
+ columns: Number(renderer.prop("columns", 2))
12
+ rows: Number(renderer.prop("rows", -1))
13
+ rowSpacing: Number(renderer.prop("row_spacing", renderer.prop("spacing", Style.spacing.controlGap)))
14
+ columnSpacing: Number(renderer.prop("column_spacing", renderer.prop("spacing", Style.spacing.controlGap)))
15
+ Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent }
16
+ }
@@ -0,0 +1,16 @@
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
+ GridLayout {
10
+ required property var renderer
11
+ columns: Number(renderer.prop("columns", 2))
12
+ rows: Number(renderer.prop("rows", -1))
13
+ rowSpacing: Number(renderer.prop("row_spacing", renderer.prop("spacing", Style.spacing.controlGap)))
14
+ columnSpacing: Number(renderer.prop("column_spacing", renderer.prop("spacing", Style.spacing.controlGap)))
15
+ Repeater { model: renderer.node.children || []; delegate: renderer.layoutChildDelegateComponent }
16
+ }
@@ -0,0 +1,226 @@
1
+ import QtQuick
2
+ import "../../Theme"
3
+
4
+ Rectangle {
5
+ id: gridRoot
6
+
7
+ required property var renderer
8
+ readonly property var sourceItems: renderer.prop("items", [])
9
+ readonly property string keyField: String(renderer.prop("key_field", "id"))
10
+ readonly property string labelField: String(renderer.prop("label_field", "label"))
11
+ readonly property string descriptionField: String(renderer.prop("description_field", "description"))
12
+ readonly property string iconField: String(renderer.prop("icon_field", "icon"))
13
+ readonly property real gridSpacing: Number(renderer.prop("spacing", Style.spacing.md))
14
+ readonly property real gridPadding: Number(renderer.prop("padding", Style.spacing.md))
15
+
16
+ function itemValue(item) {
17
+ return item !== null && typeof item === "object" ? item[keyField] : item
18
+ }
19
+
20
+ function itemLabel(item) {
21
+ if (item !== null && typeof item === "object") {
22
+ var label = item[labelField]
23
+ return String(label === undefined || label === null ? itemValue(item) : label)
24
+ }
25
+ return String(item === undefined || item === null ? "" : item)
26
+ }
27
+
28
+ function itemDescription(item) {
29
+ if (item !== null && typeof item === "object") return String(item[descriptionField] || "")
30
+ return ""
31
+ }
32
+
33
+ function itemIcon(item) {
34
+ if (item !== null && typeof item === "object") return String(item[iconField] || "")
35
+ return ""
36
+ }
37
+
38
+ function selectedIndex() {
39
+ var explicitIndex = renderer.prop("current_index", null)
40
+ if (explicitIndex !== null) return Math.max(-1, Math.min(sourceItems.length - 1, Number(explicitIndex)))
41
+ var selectedValue = renderer.prop("selected", null)
42
+ if (selectedValue === null) return -1
43
+ for (var index = 0; index < sourceItems.length; index++) {
44
+ if (itemValue(sourceItems[index]) === selectedValue) return index
45
+ }
46
+ return -1
47
+ }
48
+
49
+ function snapModeValue(value) {
50
+ var name = String(value || "none")
51
+ if (name === "row" || name === "snap_to_row") return GridView.SnapToRow
52
+ if (name === "one_row" || name === "snap_one_row") return GridView.SnapOneRow
53
+ return GridView.NoSnap
54
+ }
55
+
56
+ function boundsBehaviorValue(value) {
57
+ var name = String(value || "drag_overshoot")
58
+ if (name === "stop") return Flickable.StopAtBounds
59
+ if (name === "drag") return Flickable.DragOverBounds
60
+ if (name === "overshoot") return Flickable.OvershootBounds
61
+ return Flickable.DragAndOvershootBounds
62
+ }
63
+
64
+ function itemPayload(index) {
65
+ if (index < 0 || index >= sourceItems.length) return { value: null, index: -1, item: null }
66
+ var item = sourceItems[index]
67
+ return { value: itemValue(item), index: index, item: item }
68
+ }
69
+
70
+ function activateIndex(index) {
71
+ if (index < 0 || index >= sourceItems.length) return
72
+ gridControl.currentIndex = index
73
+ var payload = itemPayload(index)
74
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "change", payload)
75
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "activate", payload)
76
+ }
77
+
78
+ implicitWidth: Number(renderer.prop("width", 640))
79
+ implicitHeight: Number(renderer.prop("height", 420))
80
+ color: renderer.prop("background", "transparent")
81
+ radius: Number(renderer.prop("radius", Style.cornerRadius))
82
+ border.width: String(renderer.prop("border_color", "")).length > 0 ? Style.normalBorderWidth : 0
83
+ border.color: renderer.prop("border_color", "transparent")
84
+ enabled: renderer.prop("enabled", true) !== false
85
+ Accessible.name: String(renderer.prop("accessible_name", "Grid"))
86
+ Accessible.role: Accessible.List
87
+
88
+ GridView {
89
+ id: gridControl
90
+ anchors.fill: parent
91
+ anchors.margins: gridRoot.gridPadding
92
+ model: gridRoot.sourceItems
93
+ cellWidth: Number(renderer.prop("cell_width", 160))
94
+ cellHeight: Number(renderer.prop("cell_height", 120))
95
+ flow: String(renderer.prop("flow", "left_to_right")) === "top_to_bottom"
96
+ ? GridView.FlowTopToBottom : GridView.FlowLeftToRight
97
+ layoutDirection: String(renderer.prop("layout_direction", "left_to_right")) === "right_to_left"
98
+ ? Qt.RightToLeft : Qt.LeftToRight
99
+ currentIndex: gridRoot.selectedIndex()
100
+ highlightMoveDuration: Number(renderer.prop("highlight_move_duration", 180))
101
+ snapMode: gridRoot.snapModeValue(renderer.prop("snap_mode", "none"))
102
+ boundsBehavior: gridRoot.boundsBehaviorValue(renderer.prop("bounds_behavior", "drag_overshoot"))
103
+ keyNavigationWraps: renderer.prop("key_navigation_wraps", false) === true
104
+ interactive: renderer.prop("interactive", true) !== false
105
+ clip: renderer.prop("clip", true) !== false
106
+ focus: true
107
+
108
+ delegate: Rectangle {
109
+ required property var modelData
110
+ required property int index
111
+ readonly property bool current: index === gridControl.currentIndex
112
+
113
+ width: Math.max(0, gridControl.cellWidth - gridRoot.gridSpacing)
114
+ height: Math.max(0, gridControl.cellHeight - gridRoot.gridSpacing)
115
+ radius: Number(renderer.prop("radius", Style.cornerRadius))
116
+ color: current
117
+ ? renderer.prop("selected_background", Color.popups.background)
118
+ : renderer.prop("cell_background", "transparent")
119
+ border.width: current ? Style.normalBorderWidth : 0
120
+ border.color: renderer.prop("accent", Color.accent)
121
+
122
+ Column {
123
+ anchors.fill: parent
124
+ anchors.margins: gridRoot.gridSpacing
125
+ spacing: Style.spacing.sm
126
+
127
+ Text {
128
+ anchors.horizontalCenter: parent.horizontalCenter
129
+ visible: text.length > 0
130
+ text: renderer.iconGlyph(gridRoot.itemIcon(modelData))
131
+ color: current
132
+ ? renderer.prop("selected_foreground", renderer.prop("accent", Color.accent))
133
+ : renderer.prop("foreground", renderer.foreground)
134
+ font.family: renderer.fontFamily
135
+ font.pixelSize: Number(renderer.prop("icon_size", 28))
136
+ }
137
+
138
+ Text {
139
+ width: parent.width
140
+ text: gridRoot.itemLabel(modelData)
141
+ color: current
142
+ ? renderer.prop("selected_foreground", renderer.prop("foreground", renderer.foreground))
143
+ : renderer.prop("foreground", renderer.foreground)
144
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
145
+ font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
146
+ horizontalAlignment: Text.AlignHCenter
147
+ elide: Text.ElideRight
148
+ }
149
+
150
+ Text {
151
+ width: parent.width
152
+ visible: text.length > 0
153
+ text: gridRoot.itemDescription(modelData)
154
+ color: renderer.prop("muted", Color.muted)
155
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
156
+ font.pixelSize: Number(renderer.prop("description_size", Style.font.caption))
157
+ horizontalAlignment: Text.AlignHCenter
158
+ elide: Text.ElideRight
159
+ }
160
+ }
161
+
162
+ MouseArea {
163
+ anchors.fill: parent
164
+ enabled: gridRoot.enabled
165
+ hoverEnabled: true
166
+ onClicked: gridRoot.activateIndex(index)
167
+ }
168
+ }
169
+
170
+ highlight: Rectangle {
171
+ width: Math.max(0, gridControl.cellWidth - gridRoot.gridSpacing)
172
+ height: Math.max(0, gridControl.cellHeight - gridRoot.gridSpacing)
173
+ radius: Number(renderer.prop("radius", Style.cornerRadius))
174
+ color: "transparent"
175
+ border.width: Style.normalBorderWidth
176
+ border.color: renderer.prop("accent", Color.accent)
177
+ }
178
+
179
+ Keys.onReturnPressed: function(event) {
180
+ gridRoot.activateIndex(currentIndex)
181
+ event.accepted = true
182
+ }
183
+ Keys.onEnterPressed: function(event) {
184
+ gridRoot.activateIndex(currentIndex)
185
+ event.accepted = true
186
+ }
187
+ Keys.onSpacePressed: function(event) {
188
+ gridRoot.activateIndex(currentIndex)
189
+ event.accepted = true
190
+ }
191
+
192
+ onCurrentIndexChanged: {
193
+ var payload = gridRoot.itemPayload(currentIndex)
194
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "current_change", payload)
195
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "highlight", payload)
196
+ }
197
+ onCountChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
198
+ "count_change", { value: count })
199
+ onContentXChanged: {
200
+ if (moving) renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
201
+ "scroll", { x: contentX, y: contentY })
202
+ }
203
+ onContentYChanged: {
204
+ if (moving) renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
205
+ "scroll", { x: contentX, y: contentY })
206
+ }
207
+ onMovementStarted: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
208
+ "movement_start", { x: contentX, y: contentY })
209
+ onMovementEnded: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
210
+ "movement_end", { x: contentX, y: contentY })
211
+ onActiveFocusChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
212
+ activeFocus ? "focus" : "blur", {})
213
+ }
214
+
215
+ Text {
216
+ anchors.centerIn: parent
217
+ visible: gridControl.count === 0
218
+ text: String(renderer.prop("empty_text", "No items"))
219
+ color: renderer.prop("muted", Color.muted)
220
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
221
+ font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
222
+ }
223
+
224
+ onVisibleChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
225
+ visible ? "show" : "hide", {})
226
+ }
@@ -0,0 +1,95 @@
1
+ import QtQuick
2
+ import QtQuick.Controls as QQC
3
+ import "../../Theme"
4
+
5
+ QQC.GroupBox {
6
+ id: groupRoot
7
+
8
+ required property var renderer
9
+ readonly property string contentLayout: String(renderer.prop("layout", "column"))
10
+
11
+ title: String(renderer.prop("title", ""))
12
+ implicitWidth: Number(renderer.prop("width", 420))
13
+ implicitHeight: Number(renderer.prop("height", 260))
14
+ enabled: renderer.prop("enabled", true) !== false
15
+ visible: renderer.prop("visible", true) !== false
16
+ clip: renderer.prop("clip", false) === true
17
+ padding: Number(renderer.prop("padding", Style.spacing.lg))
18
+ leftPadding: Number(renderer.prop("left_padding", padding))
19
+ rightPadding: Number(renderer.prop("right_padding", padding))
20
+ topPadding: Number(renderer.prop("top_padding", padding + titleLabel.implicitHeight + Style.spacing.sm))
21
+ bottomPadding: Number(renderer.prop("bottom_padding", padding))
22
+
23
+ label: Text {
24
+ id: titleLabel
25
+ x: groupRoot.leftPadding
26
+ width: Math.max(0, groupRoot.width - groupRoot.leftPadding - groupRoot.rightPadding)
27
+ text: groupRoot.title
28
+ color: renderer.prop("foreground", renderer.foreground)
29
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
30
+ font.pixelSize: Number(renderer.prop("title_size",
31
+ renderer.prop("font_size", Style.font.body)))
32
+ font.bold: true
33
+ horizontalAlignment: {
34
+ var alignment = String(renderer.prop("title_alignment", "left"))
35
+ if (alignment === "center") return Text.AlignHCenter
36
+ if (alignment === "right" || alignment === "end") return Text.AlignRight
37
+ return Text.AlignLeft
38
+ }
39
+ elide: Text.ElideRight
40
+ }
41
+
42
+ background: Rectangle {
43
+ y: titleLabel.implicitHeight / 2
44
+ height: groupRoot.height - y
45
+ color: renderer.prop("background", "transparent")
46
+ radius: Number(renderer.prop("radius", Style.cornerRadius))
47
+ border.width: Number(renderer.prop("border_width", Style.normalBorderWidth))
48
+ border.color: renderer.prop("border_color", Color.border)
49
+ }
50
+
51
+ contentItem: Item {
52
+ LayoutMirroring.enabled: String(renderer.prop("layout_direction", "left_to_right")) === "right_to_left"
53
+ LayoutMirroring.childrenInherit: true
54
+
55
+ Loader {
56
+ anchors.fill: parent
57
+ sourceComponent: groupRoot.contentLayout === "row" ? rowContent
58
+ : (groupRoot.contentLayout === "stack" ? stackContent : columnContent)
59
+ }
60
+ }
61
+
62
+ Component {
63
+ id: columnContent
64
+ Column {
65
+ spacing: Number(renderer.prop("spacing", Style.spacing.md))
66
+ Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent }
67
+ }
68
+ }
69
+
70
+ Component {
71
+ id: rowContent
72
+ Row {
73
+ spacing: Number(renderer.prop("spacing", Style.spacing.md))
74
+ Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent }
75
+ }
76
+ }
77
+
78
+ Component {
79
+ id: stackContent
80
+ Item {
81
+ Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent }
82
+ }
83
+ }
84
+
85
+ TapHandler {
86
+ enabled: renderer.subscribed("click")
87
+ onTapped: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "click", {})
88
+ }
89
+ onVisibleChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
90
+ visible ? "show" : "hide", {})
91
+ onActiveFocusChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
92
+ activeFocus ? "focus" : "blur", {})
93
+ onTitleChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
94
+ "title_change", { value: title })
95
+ }
@@ -0,0 +1,3 @@
1
+ import QtQuick
2
+ import "Support" as Support
3
+ Support.ChartCanvas { renderer: null; chartType: "heatmap" }
@@ -0,0 +1,3 @@
1
+ import QtQuick
2
+ import "Support" as Support
3
+ Support.ChartCanvas { renderer: null; chartType: "histogram" }