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,23 @@
1
+ import QtQuick
2
+ import QtQuick.Controls as QQC
3
+ import "../../Theme"
4
+
5
+ QQC.HorizontalHeaderView {
6
+ id: headerRoot
7
+ property var renderer: null
8
+ implicitWidth: Number(renderer ? renderer.prop("width", 640) : 640)
9
+ implicitHeight: Number(renderer ? renderer.prop("height", 42) : 42)
10
+ model: renderer ? renderer.prop("sections", []) : []
11
+ interactive: renderer && renderer.prop("movable", false) === true
12
+ columnSpacing: Number(renderer ? renderer.prop("spacing", 1) : 1)
13
+ delegate: Rectangle {
14
+ required property int index
15
+ required property var modelData
16
+ implicitWidth: Number(renderer.prop("section_width", 160)); implicitHeight: headerRoot.height
17
+ readonly property bool selected: index === Number(renderer.prop("current_index", -1))
18
+ color: selected ? renderer.prop("selected_background", Color.popups.background) : renderer.prop("background", Color.background)
19
+ border.color: renderer.prop("border_color", Color.muted)
20
+ 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 }
21
+ TapHandler { enabled: renderer.prop("clickable", true) !== false; onTapped: { renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "click", { index: index, value: modelData }); var current = Number(renderer.prop("sort_index", -1)); var order = current === index && String(renderer.prop("sort_order", "ascending")) === "ascending" ? "descending" : "ascending"; renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "sort", { index: index, order: order, value: modelData }) } }
22
+ }
23
+ }
@@ -0,0 +1,39 @@
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", 160) : 160)
13
+ implicitHeight: Number(renderer ? renderer.prop("height", 42) : 42)
14
+ highlighted: renderer && renderer.prop("selected", false) === true
15
+ onClicked: {
16
+ var payload = {
17
+ "index": renderer.prop("index", -1),
18
+ "value": renderer.prop("value", null)
19
+ };
20
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "click", payload);
21
+ payload.order = String(renderer.prop("sort_order", "")) === "ascending" ? "descending" : "ascending";
22
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "sort", payload);
23
+ }
24
+
25
+ background: Rectangle {
26
+ color: headerDelegate.highlighted ? renderer.prop("selected_background", Color.popups.background) : renderer.prop("background", Color.background)
27
+ border.color: renderer.prop("border_color", Color.muted)
28
+ }
29
+
30
+ contentItem: Text {
31
+ text: headerDelegate.text + (renderer.prop("sort_order", "") === "ascending" ? " ▲" : (renderer.prop("sort_order", "") === "descending" ? " ▼" : ""))
32
+ color: headerDelegate.highlighted ? renderer.prop("selected_foreground", renderer.foreground) : renderer.prop("foreground", renderer.foreground)
33
+ font.family: renderer.prop("font_family", renderer.fontFamily)
34
+ font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
35
+ horizontalAlignment: Text.AlignHCenter
36
+ verticalAlignment: Text.AlignVCenter
37
+ }
38
+
39
+ }
@@ -0,0 +1,19 @@
1
+ import QtQuick
2
+
3
+ Item {
4
+ id: hoverRoot
5
+ property var renderer: null
6
+ function cursorShape(name) { var value=String(name||"pointing_hand");if(value==="arrow")return Qt.ArrowCursor;if(value==="cross")return Qt.CrossCursor;if(value==="text")return Qt.IBeamCursor;if(value==="open_hand")return Qt.OpenHandCursor;if(value==="closed_hand")return Qt.ClosedHandCursor;return Qt.PointingHandCursor }
7
+ implicitWidth: Number(renderer ? renderer.prop("width", contentHost.childrenRect.width) : 120)
8
+ implicitHeight: Number(renderer ? renderer.prop("height", contentHost.childrenRect.height) : 80)
9
+ Item { id: contentHost; anchors.fill: parent; Repeater { model: renderer ? (renderer.node.children || []) : []; delegate: renderer.childDelegateComponent } }
10
+ HoverHandler {
11
+ id: nativeHover
12
+ enabled: renderer && renderer.prop("enabled", true) !== false
13
+ blocking: renderer && renderer.prop("blocking", false) === true
14
+ margin: Number(renderer ? renderer.prop("margin", 0) : 0)
15
+ cursorShape: hoverRoot.cursorShape(renderer ? renderer.prop("cursor", "pointing_hand") : "pointing_hand")
16
+ onHoveredChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, hovered ? "enter" : "exit", { x: point.position.x, y: point.position.y })
17
+ onPointChanged: if (hovered) { var payload = { x: point.position.x, y: point.position.y }; renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "move", payload); renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "hover", payload) }
18
+ }
19
+ }
@@ -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
+ Text {
10
+ required property var renderer
11
+ text: renderer.iconGlyph(renderer.prop("name", renderer.prop("text", "")))
12
+ textFormat: Text.PlainText
13
+ color: renderer.prop("color", renderer.foreground)
14
+ font.family: renderer.fontFamily
15
+ font.pixelSize: Number(renderer.prop("size", Style.font.icon))
16
+ }
@@ -0,0 +1,110 @@
1
+ import QtMultimedia
2
+ import QtQuick
3
+ import QtQuick.Controls as QQC
4
+ import QtQuick.Layouts
5
+ import QtQuick.VectorImage
6
+ import "../../Theme"
7
+ import "../../Controls" as ZuiControls
8
+
9
+ Image {
10
+ id: imageRoot
11
+
12
+ required property var renderer
13
+
14
+ function fillModeValue(value) {
15
+ var mode = String(value || "preserve_aspect_fit");
16
+ if (mode === "stretch")
17
+ return Image.Stretch;
18
+
19
+ if (mode === "preserve_aspect_crop" || mode === "crop")
20
+ return Image.PreserveAspectCrop;
21
+
22
+ if (mode === "tile")
23
+ return Image.Tile;
24
+
25
+ if (mode === "tile_vertically" || mode === "tile_vertical")
26
+ return Image.TileVertically;
27
+
28
+ if (mode === "tile_horizontally" || mode === "tile_horizontal")
29
+ return Image.TileHorizontally;
30
+
31
+ if (mode === "pad")
32
+ return Image.Pad;
33
+
34
+ return Image.PreserveAspectFit;
35
+ }
36
+
37
+ function horizontalAlignmentValue(value) {
38
+ var alignment = String(value || "center");
39
+ if (alignment === "left" || alignment === "start")
40
+ return Image.AlignLeft;
41
+
42
+ if (alignment === "right" || alignment === "end")
43
+ return Image.AlignRight;
44
+
45
+ return Image.AlignHCenter;
46
+ }
47
+
48
+ function verticalAlignmentValue(value) {
49
+ var alignment = String(value || "center");
50
+ if (alignment === "top" || alignment === "start")
51
+ return Image.AlignTop;
52
+
53
+ if (alignment === "bottom" || alignment === "end")
54
+ return Image.AlignBottom;
55
+
56
+ return Image.AlignVCenter;
57
+ }
58
+
59
+ function statusName(value) {
60
+ if (value === Image.Ready)
61
+ return "ready";
62
+
63
+ if (value === Image.Loading)
64
+ return "loading";
65
+
66
+ if (value === Image.Error)
67
+ return "error";
68
+
69
+ return "null";
70
+ }
71
+
72
+ function send(name, payload) {
73
+ if (renderer.subscribed(name))
74
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, name, payload || {
75
+ });
76
+
77
+ }
78
+
79
+ source: renderer.assetUrl(renderer.prop("source", ""))
80
+ width: Number(renderer.prop("width", 120))
81
+ height: Number(renderer.prop("height", 120))
82
+ sourceSize.width: Number(renderer.prop("source_width", -1))
83
+ sourceSize.height: Number(renderer.prop("source_height", -1))
84
+ asynchronous: renderer.prop("asynchronous", true) !== false
85
+ cache: renderer.prop("cache", true) !== false
86
+ smooth: renderer.prop("smooth", true) !== false
87
+ mipmap: renderer.prop("mipmap", false) === true
88
+ mirror: renderer.prop("mirror", false) === true
89
+ autoTransform: renderer.prop("auto_transform", false) === true
90
+ retainWhileLoading: renderer.prop("retain_while_loading", true) !== false
91
+ fillMode: fillModeValue(renderer.prop("fill_mode", "preserve_aspect_fit"))
92
+ horizontalAlignment: horizontalAlignmentValue(renderer.prop("horizontal_alignment", "center"))
93
+ verticalAlignment: verticalAlignmentValue(renderer.prop("vertical_alignment", "center"))
94
+ onProgressChanged: send("progress", {
95
+ "value": imageRoot.progress
96
+ })
97
+ onStatusChanged: {
98
+ var payload = {
99
+ "value": statusName(status),
100
+ "source": String(source),
101
+ "width": implicitWidth,
102
+ "height": implicitHeight
103
+ };
104
+ send("status", payload);
105
+ if (status === Image.Ready)
106
+ send("loaded", payload);
107
+ else if (status === Image.Error)
108
+ renderer.componentError("image_load_failed", "Unable to load the declared image", payload);
109
+ }
110
+ }
@@ -0,0 +1,14 @@
1
+ import QtQuick
2
+ import QtMultimedia
3
+
4
+ Item {
5
+ id:captureRoot;property var renderer:null;property alias imageCapture:nativeCapture;property int handledCommandRevision:-1
6
+ function quality(){var value=String(renderer?renderer.prop("quality","normal"):"normal");if(value==="very_low")return ImageCapture.VeryLowQuality;if(value==="low")return ImageCapture.LowQuality;if(value==="high")return ImageCapture.HighQuality;if(value==="very_high")return ImageCapture.VeryHighQuality;return ImageCapture.NormalQuality}
7
+ function fileFormat(){var value=String(renderer?renderer.prop("format","unspecified"):"unspecified").toLowerCase();if(value==="jpeg"||value==="jpg")return ImageCapture.JPEG;if(value==="png")return ImageCapture.PNG;if(value==="webp")return ImageCapture.WebP;if(value==="tiff"||value==="tif")return ImageCapture.Tiff;return ImageCapture.UnspecifiedFormat}
8
+ readonly property var sessionItem:renderer?renderer.findRenderedItem(renderer.prop("session","")):null
9
+ function send(name,payload){if(renderer&&renderer.subscribed(name))renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,name,payload||{})}
10
+ function connectSession(){if(sessionItem&&sessionItem.captureSession!==undefined)sessionItem.captureSession.imageCapture=nativeCapture}
11
+ function command(){if(!renderer)return;var revision=Number(renderer.prop("command_revision",0));if(revision===handledCommandRevision)return;handledCommandRevision=revision;var value=String(renderer.prop("command",""));if(value==="capture")nativeCapture.capture();else if(value==="save")nativeCapture.captureToFile(renderer.assetUrl(renderer.prop("path","")))}
12
+ ImageCapture{id:nativeCapture;quality:captureRoot.quality();fileFormat:captureRoot.fileFormat();onImageCaptured:function(id,preview){captureRoot.send("captured",{id:id,preview:String(preview)})};onImageSaved:function(id,fileName){captureRoot.send("saved",{id:id,path:fileName})};onErrorOccurred:function(id,error,errorString){renderer.componentError("image_capture_failed",errorString,{capture_id:id,native_code:error})};onReadyForCaptureChanged:captureRoot.send("ready_change",{value:readyForCapture})}
13
+ Component.onCompleted:{connectSession();command()}onSessionItemChanged:connectSession();Connections{target:renderer;function onNodeChanged(){captureRoot.command()}}
14
+ }
@@ -0,0 +1,152 @@
1
+ import QtQuick
2
+ import QtQuick.Controls as QQC
3
+ import QtQuick.Layouts
4
+ import "../../Theme"
5
+
6
+ QQC.ItemDelegate {
7
+ id: delegateRoot
8
+
9
+ required property var renderer
10
+ readonly property bool selected: renderer.prop("selected", false) === true
11
+
12
+ function eventPayload() {
13
+ return {
14
+ text: text,
15
+ value: renderer.prop("value", text),
16
+ checked: checked,
17
+ selected: selected
18
+ }
19
+ }
20
+
21
+ text: String(renderer.prop("text", ""))
22
+ checkable: renderer.prop("checkable", false) === true
23
+ checked: renderer.prop("checked", false) === true
24
+ autoExclusive: renderer.prop("auto_exclusive", false) === true
25
+ highlighted: renderer.prop("highlighted", selected) === true
26
+ enabled: renderer.prop("enabled", true) !== false
27
+ visible: renderer.prop("visible", true) !== false
28
+ hoverEnabled: true
29
+ implicitWidth: Number(renderer.prop("width", 320))
30
+ implicitHeight: Number(renderer.prop("height", 56))
31
+ padding: Number(renderer.prop("padding", Style.spacing.md))
32
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
33
+ font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
34
+ Accessible.name: String(renderer.prop("accessible_name", text))
35
+ Accessible.role: Accessible.ListItem
36
+
37
+ background: Rectangle {
38
+ color: delegateRoot.highlighted
39
+ ? renderer.prop("highlighted_background", renderer.prop("selected_background", Color.popups.background))
40
+ : (delegateRoot.selected
41
+ ? renderer.prop("selected_background", Color.popups.background)
42
+ : renderer.prop("background", "transparent"))
43
+ radius: Number(renderer.prop("radius", Style.cornerRadius))
44
+ border.width: Number(renderer.prop("border_width",
45
+ String(renderer.prop("border_color", "")).length > 0 ? Style.normalBorderWidth : 0))
46
+ border.color: renderer.prop("border_color", "transparent")
47
+ }
48
+
49
+ contentItem: RowLayout {
50
+ spacing: Number(renderer.prop("spacing", Style.spacing.md))
51
+
52
+ Image {
53
+ Layout.preferredWidth: Number(renderer.prop("icon_size", 22))
54
+ Layout.preferredHeight: Number(renderer.prop("icon_size", 22))
55
+ Layout.alignment: Qt.AlignVCenter
56
+ visible: source.toString().length > 0
57
+ source: String(renderer.prop("icon_source", ""))
58
+ sourceSize.width: width
59
+ sourceSize.height: height
60
+ fillMode: Image.PreserveAspectFit
61
+ onStatusChanged: {
62
+ if (status === Image.Error)
63
+ renderer.componentError("item_delegate_icon_failed",
64
+ "Unable to load the declared item delegate icon image", { source: String(source) })
65
+ }
66
+ }
67
+
68
+ Text {
69
+ Layout.preferredWidth: Number(renderer.prop("icon_size", 22))
70
+ Layout.alignment: Qt.AlignVCenter
71
+ visible: text.length > 0 && String(renderer.prop("icon_source", "")).length === 0
72
+ text: String(renderer.prop("icon", "")).length > 0
73
+ ? renderer.iconGlyph(renderer.prop("icon", "")) : ""
74
+ textFormat: Text.PlainText
75
+ color: renderer.prop("icon_color", delegateRoot.selected
76
+ ? renderer.prop("selected_foreground", renderer.prop("accent", Color.accent))
77
+ : renderer.prop("foreground", renderer.foreground))
78
+ font.family: renderer.fontFamily
79
+ font.pixelSize: Number(renderer.prop("icon_size", 22))
80
+ horizontalAlignment: Text.AlignHCenter
81
+ }
82
+
83
+ ColumnLayout {
84
+ Layout.fillWidth: true
85
+ spacing: Style.spacing.xs
86
+
87
+ Text {
88
+ Layout.fillWidth: true
89
+ text: delegateRoot.text
90
+ textFormat: Text.PlainText
91
+ color: delegateRoot.selected
92
+ ? renderer.prop("selected_foreground", renderer.prop("foreground", renderer.foreground))
93
+ : renderer.prop("foreground", renderer.foreground)
94
+ font: delegateRoot.font
95
+ elide: Text.ElideRight
96
+ }
97
+
98
+ Text {
99
+ Layout.fillWidth: true
100
+ visible: text.length > 0
101
+ text: String(renderer.prop("description", ""))
102
+ textFormat: Text.PlainText
103
+ color: renderer.prop("muted", Color.muted)
104
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
105
+ font.pixelSize: Number(renderer.prop("description_size", Style.font.caption))
106
+ elide: Text.ElideRight
107
+ }
108
+ }
109
+
110
+ Text {
111
+ Layout.alignment: Qt.AlignVCenter
112
+ visible: text.length > 0
113
+ text: String(renderer.prop("trailing_text", ""))
114
+ textFormat: Text.PlainText
115
+ color: renderer.prop("muted", Color.muted)
116
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
117
+ font.pixelSize: Number(renderer.prop("description_size", Style.font.caption))
118
+ }
119
+
120
+ Text {
121
+ Layout.alignment: Qt.AlignVCenter
122
+ visible: renderer.prop("show_indicator", false) === true
123
+ && String(renderer.prop("trailing_text", "")).length === 0
124
+ text: renderer.iconGlyph("chevron_right")
125
+ textFormat: Text.PlainText
126
+ color: renderer.prop("muted", Color.muted)
127
+ font.family: renderer.fontFamily
128
+ font.pixelSize: Number(renderer.prop("icon_size", 22))
129
+ }
130
+ }
131
+
132
+ onClicked: {
133
+ var payload = eventPayload()
134
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "click", payload)
135
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "activate", payload)
136
+ }
137
+ onToggled: {
138
+ var payload = eventPayload()
139
+ if (renderer.subscribed("toggle"))
140
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "toggle", payload)
141
+ if (renderer.subscribed("change"))
142
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "change", payload)
143
+ }
144
+ onPressed: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "press", eventPayload())
145
+ onReleased: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "release", eventPayload())
146
+ onHoveredChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
147
+ "hover", { value: hovered })
148
+ onActiveFocusChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
149
+ activeFocus ? "focus" : "blur", {})
150
+ onVisibleChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
151
+ visible ? "show" : "hide", {})
152
+ }
@@ -0,0 +1,25 @@
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
+ ZuiControls.PanelKeyCatcher {
10
+ required property var renderer
11
+ blocked: renderer.prop("blocked", false) === true
12
+ implicitWidth: keyContent.implicitWidth
13
+ implicitHeight: keyContent.implicitHeight
14
+ onMoveRequested: function(dx, dy) { renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "move", { dx: dx, dy: dy }) }
15
+ onActivateRequested: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "activate", {})
16
+ onReturnRequested: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "return", {})
17
+ onCloseRequested: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "close", {})
18
+ onDeleteRequested: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "delete", {})
19
+ onTabRequested: function(direction) { renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "tab", { direction: direction }) }
20
+ onTextKey: function(text) { renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "text", { text: text }) }
21
+ Column {
22
+ id: keyContent
23
+ Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent }
24
+ }
25
+ }
@@ -0,0 +1,43 @@
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
+ QQC.Label {
10
+ required property var renderer
11
+ text: String(renderer.prop("text", ""))
12
+ color: renderer.prop("color", renderer.foreground)
13
+ font.family: renderer.fontFamily
14
+ font.pixelSize: Number(renderer.prop("size", Style.font.body))
15
+ font.bold: renderer.prop("bold", false) === true
16
+ width: Number(renderer.prop("width", implicitWidth))
17
+ wrapMode: renderer.prop("wrap", false) === true ? Text.Wrap : Text.NoWrap
18
+ elide: {
19
+ var mode = String(renderer.prop("elide", "none"))
20
+ if (mode === "left") return Text.ElideLeft
21
+ if (mode === "middle") return Text.ElideMiddle
22
+ if (mode === "right") return Text.ElideRight
23
+ return Text.ElideNone
24
+ }
25
+ horizontalAlignment: {
26
+ var alignment = String(renderer.prop("horizontal_alignment", "left"))
27
+ if (alignment === "center") return Text.AlignHCenter
28
+ if (alignment === "right") return Text.AlignRight
29
+ if (alignment === "justify") return Text.AlignJustify
30
+ return Text.AlignLeft
31
+ }
32
+ verticalAlignment: String(renderer.prop("vertical_alignment", "center")) === "top" ? Text.AlignTop
33
+ : (String(renderer.prop("vertical_alignment", "center")) === "bottom" ? Text.AlignBottom : Text.AlignVCenter)
34
+ maximumLineCount: Number(renderer.prop("maximum_lines", 2147483647))
35
+ textFormat: {
36
+ var format = String(renderer.prop("format", "plain"))
37
+ if (format === "rich") return Text.RichText
38
+ if (format === "markdown") return Text.MarkdownText
39
+ if (format === "styled") return Text.StyledText
40
+ return Text.PlainText
41
+ }
42
+ onLinkActivated: function(link) { renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "link", { value: link }) }
43
+ }
@@ -0,0 +1,51 @@
1
+ import QtQuick
2
+ import QtQuick.Layouts
3
+
4
+ LayoutItemProxy {
5
+ id: proxy
6
+
7
+ required property var renderer
8
+ readonly property string targetId: String(renderer.prop("target", ""))
9
+
10
+ width: renderer.prop("width", null) === null ? implicitWidth : Number(renderer.prop("width", implicitWidth))
11
+ height: renderer.prop("height", null) === null ? implicitHeight : Number(renderer.prop("height", implicitHeight))
12
+ Layout.fillWidth: renderer.prop("fill_width", false) === true
13
+ Layout.fillHeight: renderer.prop("fill_height", false) === true
14
+ Layout.preferredWidth: Number(renderer.prop("preferred_width", -1))
15
+ Layout.preferredHeight: Number(renderer.prop("preferred_height", -1))
16
+ Layout.minimumWidth: Number(renderer.prop("minimum_width", 0))
17
+ Layout.minimumHeight: Number(renderer.prop("minimum_height", 0))
18
+ Layout.maximumWidth: Number(renderer.prop("maximum_width", Infinity))
19
+ Layout.maximumHeight: Number(renderer.prop("maximum_height", Infinity))
20
+ Layout.alignment: renderer.layoutAlignment(renderer.prop("alignment", "center"), "center")
21
+ Layout.margins: Number(renderer.prop("margins", 0))
22
+ Layout.leftMargin: Number(renderer.prop("left_margin", Layout.margins))
23
+ Layout.topMargin: Number(renderer.prop("top_margin", Layout.margins))
24
+ Layout.rightMargin: Number(renderer.prop("right_margin", Layout.margins))
25
+ Layout.bottomMargin: Number(renderer.prop("bottom_margin", Layout.margins))
26
+
27
+ function resolveTarget() {
28
+ var resolved = renderer.findRenderedItem(targetId)
29
+ if (resolved && resolved !== proxy) target = resolved
30
+ }
31
+
32
+ onTargetIdChanged: {
33
+ target = null
34
+ Qt.callLater(resolveTarget)
35
+ }
36
+ onTargetChanged: {
37
+ if (renderer.subscribed("target_change"))
38
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "target_change", {
39
+ target: target ? targetId : null,
40
+ resolved: target !== null
41
+ })
42
+ }
43
+ Component.onCompleted: Qt.callLater(resolveTarget)
44
+
45
+ Timer {
46
+ interval: 16
47
+ repeat: true
48
+ running: proxy.targetId !== "" && proxy.target === null
49
+ onTriggered: proxy.resolveTarget()
50
+ }
51
+ }
@@ -0,0 +1,86 @@
1
+ import QtQuick
2
+ import "../../Theme"
3
+
4
+ Rectangle {
5
+ id: legendRoot
6
+
7
+ property var renderer: null
8
+ readonly property var items: renderer ? renderer.prop("items", []) : []
9
+ readonly property bool horizontal: !renderer || String(renderer.prop("orientation", "horizontal")) === "horizontal"
10
+
11
+ implicitWidth: Number(renderer ? renderer.prop("width", horizontal ? legendFlow.implicitWidth : 180) : 180)
12
+ implicitHeight: Number(renderer ? renderer.prop("height", horizontal ? 36 : legendFlow.implicitHeight) : 36)
13
+ color: renderer ? renderer.prop("background", "transparent") : "transparent"
14
+
15
+ Flow {
16
+ id: legendFlow
17
+
18
+ anchors.left: parent.left
19
+ anchors.right: parent.right
20
+ anchors.verticalCenter: parent.verticalCenter
21
+ height: implicitHeight
22
+ spacing: Number(renderer ? renderer.prop("spacing", 12) : 12)
23
+ flow: legendRoot.horizontal ? Flow.LeftToRight : Flow.TopToBottom
24
+
25
+ Repeater {
26
+ model: legendRoot.items
27
+
28
+ delegate: Row {
29
+ required property int index
30
+ required property var modelData
31
+ readonly property bool selected: {
32
+ var value = renderer.prop("selected", null);
33
+ return value === index || value === (modelData && modelData.value !== undefined ? modelData.value : modelData);
34
+ }
35
+
36
+ spacing: 6
37
+ height: Math.max(marker.height, label.implicitHeight)
38
+ opacity: renderer.prop("selected", null) === null || selected ? 1 : 0.55
39
+
40
+ Rectangle {
41
+ id: marker
42
+
43
+ anchors.verticalCenter: parent.verticalCenter
44
+ width: Number(renderer.prop("marker_size", 12))
45
+ height: width
46
+ radius: width / 4
47
+ color: String(modelData && modelData.color !== undefined ? modelData.color : Color.accent)
48
+ }
49
+
50
+ Text {
51
+ id: label
52
+
53
+ anchors.verticalCenter: parent.verticalCenter
54
+ text: String(modelData && modelData.label !== undefined ? modelData.label : modelData)
55
+ color: parent.selected ? renderer.prop("foreground", renderer.foreground) : renderer.prop("muted", renderer.prop("foreground", renderer.foreground))
56
+ font.family: renderer.prop("font_family", renderer.fontFamily)
57
+ font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
58
+ }
59
+
60
+ TapHandler {
61
+ enabled: renderer.prop("interactive", false) === true
62
+ onTapped: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "select", {
63
+ "index": index,
64
+ "item": modelData
65
+ })
66
+ }
67
+
68
+ HoverHandler {
69
+ enabled: renderer.subscribed("hover")
70
+ onHoveredChanged: {
71
+ if (hovered) {
72
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "hover", {
73
+ "index": index,
74
+ "item": modelData
75
+ });
76
+ }
77
+ }
78
+ }
79
+
80
+ }
81
+
82
+ }
83
+
84
+ }
85
+
86
+ }
@@ -0,0 +1,28 @@
1
+ import QtQuick
2
+ import QtQuick.Shapes
3
+
4
+ Shape {
5
+ id: lineRoot
6
+ required property var renderer
7
+ implicitWidth: Number(renderer.prop("width", Math.max(Number(renderer.prop("x1", 0)), Number(renderer.prop("x2", 100))) + Number(renderer.prop("stroke_width", 1))))
8
+ implicitHeight: Number(renderer.prop("height", Math.max(Number(renderer.prop("y1", 0)), Number(renderer.prop("y2", 0))) + Number(renderer.prop("stroke_width", 1))))
9
+ antialiasing: renderer.prop("antialiasing", true) !== false
10
+ ShapePath {
11
+ strokeColor: renderer.prop("stroke", renderer.foreground)
12
+ fillColor: "transparent"
13
+ strokeWidth: Number(renderer.prop("stroke_width", 1))
14
+ capStyle: String(renderer.prop("cap", "round")) === "flat" ? ShapePath.FlatCap : (String(renderer.prop("cap", "round")) === "square" ? ShapePath.SquareCap : ShapePath.RoundCap)
15
+ strokeStyle: Array.isArray(renderer.prop("dash_pattern", [])) && renderer.prop("dash_pattern", []).length > 0 ? ShapePath.DashLine : ShapePath.SolidLine
16
+ dashPattern: renderer.prop("dash_pattern", [])
17
+ dashOffset: Number(renderer.prop("dash_offset", 0))
18
+ startX: Number(renderer.prop("x1", 0))
19
+ startY: Number(renderer.prop("y1", 0))
20
+ PathLine { x: Number(renderer.prop("x2", 100)); y: Number(renderer.prop("y2", 0)) }
21
+ }
22
+ MouseArea {
23
+ anchors.fill: parent
24
+ hoverEnabled: renderer.subscribed("hover")
25
+ onClicked: function(mouse) { if (renderer.subscribed("click")) renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "click", { x: mouse.x, y: mouse.y }) }
26
+ onPositionChanged: function(mouse) { if (renderer.subscribed("hover")) renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "hover", { x: mouse.x, y: mouse.y }) }
27
+ }
28
+ }