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,30 @@
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
+ Item {
10
+ required property var renderer
11
+ readonly property real aspect: Math.max(0.000001, Number(renderer.prop("ratio", 1)))
12
+ readonly property var requestedWidth: renderer.prop("width", null)
13
+ readonly property var requestedHeight: renderer.prop("height", null)
14
+ readonly property real naturalWidth: aspectContent.implicitWidth
15
+ readonly property real naturalHeight: aspectContent.implicitHeight
16
+ implicitWidth: requestedWidth !== null
17
+ ? Number(requestedWidth)
18
+ : (requestedHeight !== null ? Number(requestedHeight) * aspect : Math.max(naturalWidth, naturalHeight * aspect))
19
+ implicitHeight: requestedHeight !== null
20
+ ? Number(requestedHeight)
21
+ : (requestedWidth !== null ? Number(requestedWidth) / aspect : implicitWidth / aspect)
22
+ clip: renderer.prop("clip", false) === true
23
+ Item {
24
+ id: aspectContent
25
+ anchors.centerIn: parent
26
+ implicitWidth: childrenRect.width
27
+ implicitHeight: childrenRect.height
28
+ Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent }
29
+ }
30
+ }
@@ -0,0 +1,85 @@
1
+ import QtQuick
2
+ import QtMultimedia
3
+
4
+ Item {
5
+ id: audioRoot
6
+
7
+ required property var renderer
8
+ property real appliedSeekRevision: -1
9
+ property real lastReportedPosition: -1000
10
+
11
+ implicitWidth: 0
12
+ implicitHeight: 0
13
+
14
+ function send(name, payload) {
15
+ if (renderer.subscribed(name))
16
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, name, payload || {})
17
+ }
18
+
19
+ function applySeek(force) {
20
+ var revision = Number(renderer.prop("seek_revision", 0))
21
+ if (!force && revision === appliedSeekRevision) return
22
+ appliedSeekRevision = revision
23
+ audioPlayer.setPosition(Math.max(0, Number(renderer.prop("position", 0))))
24
+ }
25
+
26
+ function syncPlayback() {
27
+ applySeek(false)
28
+ var requested = String(renderer.prop("playback", ""))
29
+ if (requested === "play") audioPlayer.play()
30
+ else if (requested === "pause") audioPlayer.pause()
31
+ else if (requested === "stop") audioPlayer.stop()
32
+ }
33
+
34
+ MediaPlayer {
35
+ id: audioPlayer
36
+ source: renderer.assetUrl(renderer.prop("source", ""))
37
+ autoPlay: renderer.prop("auto_play", false) === true
38
+ loops: Number(renderer.prop("loops", 1))
39
+ playbackRate: Number(renderer.prop("playback_rate", 1))
40
+
41
+ audioOutput: AudioOutput {
42
+ volume: Math.max(0, Math.min(1, Number(renderer.prop("volume", 1))))
43
+ muted: renderer.prop("muted", false) === true
44
+ }
45
+
46
+ onSourceChanged: Qt.callLater(audioRoot.syncPlayback)
47
+
48
+ onPlaybackStateChanged: function(playbackState) {
49
+ var eventName = playbackState === MediaPlayer.PlayingState ? "play"
50
+ : (playbackState === MediaPlayer.PausedState ? "pause" : "stop")
51
+ audioRoot.send(eventName, { position: audioPlayer.position, duration: audioPlayer.duration })
52
+ }
53
+
54
+ onMediaStatusChanged: function(mediaStatus) {
55
+ audioRoot.send("status", { value: mediaStatus, position: audioPlayer.position, duration: audioPlayer.duration })
56
+ if (mediaStatus === MediaPlayer.LoadedMedia) {
57
+ audioRoot.applySeek(true)
58
+ audioRoot.syncPlayback()
59
+ audioRoot.send("loaded", { duration: audioPlayer.duration, source: audioPlayer.source })
60
+ } else if (mediaStatus === MediaPlayer.EndOfMedia) {
61
+ audioRoot.send("end", { position: audioPlayer.position, duration: audioPlayer.duration })
62
+ }
63
+ }
64
+
65
+ onErrorOccurred: function(error, message) {
66
+ renderer.componentError("audio_playback_failed", message, { native_code: error, source: String(audioPlayer.source) })
67
+ }
68
+
69
+ onPositionChanged: {
70
+ if (Math.abs(audioPlayer.position - audioRoot.lastReportedPosition) < 180
71
+ && audioPlayer.position !== audioPlayer.duration) return
72
+ audioRoot.lastReportedPosition = audioPlayer.position
73
+ audioRoot.send("position", { value: audioPlayer.position, duration: audioPlayer.duration })
74
+ }
75
+
76
+ onDurationChanged: audioRoot.send("duration", { value: audioPlayer.duration })
77
+ }
78
+
79
+ Component.onCompleted: syncPlayback()
80
+
81
+ Connections {
82
+ target: renderer
83
+ function onNodeChanged() { audioRoot.syncPlayback() }
84
+ }
85
+ }
@@ -0,0 +1,10 @@
1
+ import QtQuick
2
+ import QtMultimedia
3
+
4
+ Item {
5
+ id:inputRoot;property var renderer:null;property alias audioInput:nativeInput
6
+ function deviceValid(){var requested=String(renderer?renderer.prop("device",""):"");if(requested==="")return true;var list=nativeDevices.audioInputs;for(var index=0;index<list.length;index++)if(String(list[index].id)===requested||list[index].description===requested)return true;if(renderer)renderer.componentError("audio_input_device_not_found","The declared audio input device does not exist",{device:requested});return false}
7
+ function device(){var requested=String(renderer?renderer.prop("device",""):"");var list=nativeDevices.audioInputs;if(requested==="")return nativeDevices.defaultAudioInput;for(var index=0;index<list.length;index++)if(String(list[index].id)===requested||list[index].description===requested)return list[index];return null}
8
+ MediaDevices{id:nativeDevices}
9
+ AudioInput{id:nativeInput;device:inputRoot.device();muted:!inputRoot.deviceValid()||(renderer&&renderer.prop("muted",false)===true);volume:inputRoot.deviceValid()?Math.max(0,Math.min(1,Number(renderer?renderer.prop("volume",1):1))):0;onMutedChanged:if(renderer)renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,"muted_change",{value:muted});onVolumeChanged:if(renderer)renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,"volume_change",{value:volume});onDeviceChanged:if(renderer)renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,"device_change",{description:device.description,id:String(device.id)})}
10
+ }
@@ -0,0 +1,10 @@
1
+ import QtQuick
2
+ import QtMultimedia
3
+
4
+ Item {
5
+ id:outputRoot;property var renderer:null;property alias audioOutput:nativeOutput
6
+ function deviceValid(){var requested=String(renderer?renderer.prop("device",""):"");if(requested==="")return true;var list=nativeDevices.audioOutputs;for(var index=0;index<list.length;index++)if(String(list[index].id)===requested||list[index].description===requested)return true;if(renderer)renderer.componentError("audio_output_device_not_found","The declared audio output device does not exist",{device:requested});return false}
7
+ function device(){var requested=String(renderer?renderer.prop("device",""):"");var list=nativeDevices.audioOutputs;if(requested==="")return nativeDevices.defaultAudioOutput;for(var index=0;index<list.length;index++)if(String(list[index].id)===requested||list[index].description===requested)return list[index];return null}
8
+ MediaDevices{id:nativeDevices}
9
+ AudioOutput{id:nativeOutput;device:outputRoot.device();muted:!outputRoot.deviceValid()||(renderer&&renderer.prop("muted",false)===true);volume:outputRoot.deviceValid()?Math.max(0,Math.min(1,Number(renderer?renderer.prop("volume",1):1))):0;onMutedChanged:if(renderer)renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,"muted_change",{value:muted});onVolumeChanged:if(renderer)renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,"volume_change",{value:volume});onDeviceChanged:if(renderer)renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,"device_change",{description:device.description,id:String(device.id)})}
10
+ }
@@ -0,0 +1,46 @@
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
+ Rectangle {
10
+ required property var renderer
11
+ id: avatarRoot
12
+ implicitWidth: Number(renderer.prop("size", 48))
13
+ implicitHeight: implicitWidth
14
+ radius: Number(renderer.prop("radius", width / 2))
15
+ color: renderer.prop("background", Color.accent)
16
+ clip: true
17
+ readonly property string avatarSource: String(renderer.prop("source", ""))
18
+ readonly property string displayName: String(renderer.prop("name", ""))
19
+ Text {
20
+ anchors.centerIn: parent
21
+ visible: avatarRoot.avatarSource === ""
22
+ text: {
23
+ var words = avatarRoot.displayName.trim().split(/\s+/)
24
+ if (words.length === 0 || words[0].length === 0) return "?"
25
+ return (words[0].charAt(0) + (words.length > 1 ? words[words.length - 1].charAt(0) : "")).toUpperCase()
26
+ }
27
+ color: renderer.prop("foreground", Color.background)
28
+ font.family: renderer.fontFamily
29
+ font.bold: true
30
+ font.pixelSize: Number(renderer.prop("font_size", avatarRoot.width * 0.38))
31
+ }
32
+ Image {
33
+ id: avatarImage
34
+ anchors.fill: parent
35
+ source: renderer.assetUrl(avatarRoot.avatarSource)
36
+ fillMode: Image.PreserveAspectCrop
37
+ asynchronous: renderer.prop("asynchronous", true) !== false
38
+ cache: renderer.prop("cache", true) !== false
39
+ visible: avatarRoot.avatarSource !== ""
40
+ onStatusChanged: {
41
+ if (status === Image.Ready && renderer.subscribed("loaded")) renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "loaded", { width: sourceSize.width, height: sourceSize.height })
42
+ if (status === Image.Error) renderer.componentError("avatar_image_failed", "Unable to load the declared avatar image", { source: String(source) })
43
+ }
44
+ }
45
+ TapHandler { onTapped: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "click", {}) }
46
+ }
@@ -0,0 +1,38 @@
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
+ Rectangle {
10
+ required property var renderer
11
+ id: badgeRoot
12
+ readonly property bool dotMode: renderer.prop("dot", false) === true
13
+ readonly property real badgeSize: Number(renderer.prop("size", dotMode ? 8 : 20))
14
+ readonly property real horizontalPad: Number(renderer.prop("padding", 6))
15
+ readonly property var rawValue: renderer.prop("value", "")
16
+ readonly property real maximum: Number(renderer.prop("maximum", 99))
17
+ readonly property string displayValue: {
18
+ if (dotMode) return ""
19
+ var number = Number(rawValue)
20
+ return rawValue !== "" && !isNaN(number) && number > maximum ? String(maximum) + "+" : String(rawValue)
21
+ }
22
+ implicitWidth: dotMode ? badgeSize : Math.max(Number(renderer.prop("minimum_width", badgeSize)), badgeText.implicitWidth + horizontalPad * 2)
23
+ implicitHeight: badgeSize
24
+ radius: height / 2
25
+ color: renderer.prop("background", Color.accent)
26
+ Text {
27
+ id: badgeText
28
+ anchors.centerIn: parent
29
+ visible: !badgeRoot.dotMode
30
+ text: badgeRoot.displayValue
31
+ textFormat: Text.PlainText
32
+ color: renderer.prop("foreground", Color.background)
33
+ font.family: renderer.fontFamily
34
+ font.bold: true
35
+ font.pixelSize: Number(renderer.prop("font_size", Math.max(9, badgeRoot.height * 0.58)))
36
+ }
37
+ TapHandler { onTapped: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "click", { value: badgeRoot.rawValue }) }
38
+ }
@@ -0,0 +1,133 @@
1
+ import QtQuick
2
+ import QtQuick.Controls as QQC
3
+ import QtQuick.Layouts
4
+ import "../../Theme"
5
+
6
+ QQC.Pane {
7
+ id: bannerRoot
8
+
9
+ required property var renderer
10
+ readonly property string severity: String(renderer.prop("severity", "info"))
11
+ readonly property bool requestedVisible: renderer.prop("visible", true) !== false
12
+ property bool locallyDismissed: false
13
+
14
+ function severityIcon() {
15
+ var explicitIcon = String(renderer.prop("icon", ""))
16
+ if (explicitIcon.length > 0) return explicitIcon
17
+ if (severity === "success") return "circle_check"
18
+ if (severity === "warning") return "warning"
19
+ if (severity === "error" || severity === "critical") return "circle_xmark"
20
+ return "circle_info"
21
+ }
22
+
23
+ function severityColor() {
24
+ if (severity === "success") return renderer.prop("success_color", renderer.prop("accent", Color.accent))
25
+ if (severity === "warning") return renderer.prop("warning_color", "#d8a657")
26
+ if (severity === "error" || severity === "critical") return renderer.prop("error_color", Color.urgent)
27
+ return renderer.prop("accent", Color.accent)
28
+ }
29
+
30
+ visible: requestedVisible && !locallyDismissed
31
+ implicitWidth: Number(renderer.prop("width", 640))
32
+ implicitHeight: renderer.prop("height", null) === null
33
+ ? contentRow.implicitHeight + topPadding + bottomPadding
34
+ : Number(renderer.prop("height", 88))
35
+ enabled: renderer.prop("enabled", true) !== false
36
+ padding: Number(renderer.prop("padding", Style.spacing.md))
37
+
38
+ background: Rectangle {
39
+ color: renderer.prop("background", Color.popups.background)
40
+ radius: Number(renderer.prop("radius", Style.cornerRadius))
41
+ border.width: Style.normalBorderWidth
42
+ border.color: renderer.prop("border_color", bannerRoot.severityColor())
43
+ }
44
+
45
+ contentItem: RowLayout {
46
+ id: contentRow
47
+ spacing: Number(renderer.prop("spacing", Style.spacing.md))
48
+
49
+ Text {
50
+ Layout.alignment: Qt.AlignTop
51
+ text: renderer.iconGlyph(bannerRoot.severityIcon())
52
+ textFormat: Text.PlainText
53
+ color: bannerRoot.severityColor()
54
+ font.family: renderer.fontFamily
55
+ font.pixelSize: Number(renderer.prop("icon_size", 24))
56
+ }
57
+
58
+ ColumnLayout {
59
+ Layout.fillWidth: true
60
+ spacing: Style.spacing.xs
61
+
62
+ Text {
63
+ Layout.fillWidth: true
64
+ visible: text.length > 0
65
+ text: String(renderer.prop("title", ""))
66
+ textFormat: Text.PlainText
67
+ color: renderer.prop("foreground", renderer.foreground)
68
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
69
+ font.pixelSize: Number(renderer.prop("title_size", Style.font.heading))
70
+ font.bold: true
71
+ wrapMode: Text.Wrap
72
+ }
73
+
74
+ Text {
75
+ Layout.fillWidth: true
76
+ text: String(renderer.prop("message", ""))
77
+ textFormat: Text.PlainText
78
+ color: renderer.prop("muted", renderer.prop("foreground", renderer.foreground))
79
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
80
+ font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
81
+ wrapMode: Text.Wrap
82
+ }
83
+ }
84
+
85
+ QQC.Button {
86
+ id: actionButton
87
+ Layout.alignment: Qt.AlignVCenter
88
+ visible: text.length > 0
89
+ text: String(renderer.prop("action_text", ""))
90
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
91
+ font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
92
+ contentItem: Text {
93
+ text: actionButton.text
94
+ color: renderer.prop("action_color", bannerRoot.severityColor())
95
+ font: actionButton.font
96
+ horizontalAlignment: Text.AlignHCenter
97
+ verticalAlignment: Text.AlignVCenter
98
+ }
99
+ background: Rectangle { color: "transparent" }
100
+ onClicked: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "action", {})
101
+ }
102
+
103
+ QQC.ToolButton {
104
+ Layout.alignment: Qt.AlignTop
105
+ visible: renderer.prop("dismissible", true) !== false
106
+ text: renderer.iconGlyph("xmark")
107
+ font.family: renderer.fontFamily
108
+ font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
109
+ onClicked: {
110
+ bannerRoot.locallyDismissed = true
111
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "dismiss", {})
112
+ }
113
+ }
114
+ }
115
+
116
+ TapHandler {
117
+ enabled: renderer.subscribed("click")
118
+ onTapped: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "click", {})
119
+ }
120
+
121
+ HoverHandler {
122
+ onHoveredChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
123
+ "hover", { value: hovered })
124
+ }
125
+
126
+ onRequestedVisibleChanged: {
127
+ if (!requestedVisible) locallyDismissed = false
128
+ }
129
+ onVisibleChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
130
+ visible ? "show" : "hide", {})
131
+ onActiveFocusChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
132
+ activeFocus ? "focus" : "blur", {})
133
+ }
@@ -0,0 +1,67 @@
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
+ Item {
10
+ required property var renderer
11
+ implicitWidth: Number(renderer.prop("width", 420))
12
+ implicitHeight: Number(renderer.prop("height", 220))
13
+ Canvas {
14
+ id: barCanvas
15
+ anchors.fill: parent
16
+ antialiasing: true
17
+ onPaint: {
18
+ var ctx = getContext("2d")
19
+ ctx.clearRect(0, 0, width, height)
20
+ var raw = renderer.prop("values", [])
21
+ if (!Array.isArray(raw) || raw.length === 0) return
22
+ var values = raw.map(function(value) { return Number(value) })
23
+ var low = renderer.prop("minimum", null)
24
+ var high = renderer.prop("maximum", null)
25
+ if (low === null) low = Math.min(0, Math.min.apply(Math, values))
26
+ if (high === null) high = Math.max(0, Math.max.apply(Math, values))
27
+ low = Number(low); high = Number(high)
28
+ if (high === low) high = low + 1
29
+ var pad = 10
30
+ var chartWidth = Math.max(1, width - pad * 2)
31
+ var chartHeight = Math.max(1, height - pad * 2)
32
+ if (renderer.prop("show_grid", true) !== false) {
33
+ ctx.strokeStyle = renderer.prop("grid_color", Color.muted); ctx.lineWidth = 1
34
+ for (var grid = 0; grid <= 4; grid++) {
35
+ var gy = pad + chartHeight * grid / 4
36
+ ctx.beginPath(); ctx.moveTo(pad, gy); ctx.lineTo(width - pad, gy); ctx.stroke()
37
+ }
38
+ }
39
+ var slot = chartWidth / values.length
40
+ var gap = Math.max(0, Number(renderer.prop("bar_spacing", 6)))
41
+ var colors = renderer.prop("colors", [Color.accent])
42
+ var zeroY = pad + chartHeight * (1 - (0 - low) / (high - low))
43
+ for (var index = 0; index < values.length; index++) {
44
+ var valueY = pad + chartHeight * (1 - (values[index] - low) / (high - low))
45
+ var left = pad + slot * index + gap / 2
46
+ var top = Math.min(zeroY, valueY)
47
+ var barHeight = Math.max(1, Math.abs(valueY - zeroY))
48
+ ctx.fillStyle = Array.isArray(colors) && colors.length > 0 ? colors[index % colors.length] : Color.accent
49
+ ctx.fillRect(left, top, Math.max(1, slot - gap), barHeight)
50
+ }
51
+ }
52
+ }
53
+ Connections { target: root; function onNodeChanged() { barCanvas.requestPaint() } }
54
+ MouseArea {
55
+ anchors.fill: parent
56
+ hoverEnabled: renderer.subscribed("hover")
57
+ function payload(mouse) {
58
+ var values = renderer.prop("values", [])
59
+ if (!Array.isArray(values) || values.length === 0) return ({ index: -1 })
60
+ var index = Math.max(0, Math.min(values.length - 1, Math.floor(mouse.x / Math.max(1, width) * values.length)))
61
+ var labels = renderer.prop("labels", [])
62
+ return { index: index, value: values[index], label: Array.isArray(labels) ? labels[index] : null }
63
+ }
64
+ onClicked: function(mouse) { renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "select", payload(mouse)) }
65
+ onPositionChanged: function(mouse) { renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "hover", payload(mouse)) }
66
+ }
67
+ }
@@ -0,0 +1,30 @@
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.BarIconButton {
10
+ required property var renderer
11
+ text: renderer.iconGlyph(renderer.prop("icon", ""))
12
+ tooltipText: renderer.escapeAutoText(renderer.prop("tooltip", ""))
13
+ active: renderer.prop("active", false) === true
14
+ foreground: renderer.prop("foreground", renderer.foreground)
15
+ activeColor: renderer.prop("active_color", Color.accent)
16
+ slotSize: Number(renderer.prop("slot_size", Style.bar.iconSlot))
17
+ opticalSize: Number(renderer.prop("optical_size", Style.bar.iconCanvas))
18
+ fontFamily: String(renderer.prop("font_family", renderer.fontFamily))
19
+ fontSize: Number(renderer.prop("font_size", Style.bar.iconFont))
20
+ textRotation: Number(renderer.prop("text_rotation", 0))
21
+ keepSpace: renderer.prop("keep_space", false) === true
22
+ dimmed: renderer.prop("dimmed", false) === true
23
+ concealed: renderer.prop("concealed", false) === true
24
+ interactive: renderer.prop("interactive", true) !== false
25
+ onPressed: function(button) {
26
+ var eventName = button === Qt.RightButton ? "right_click" : (button === Qt.MiddleButton ? "middle_click" : "click")
27
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, eventName, { button: button })
28
+ }
29
+ onWheelMoved: function(delta) { renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "wheel", { delta: delta }) }
30
+ }
@@ -0,0 +1,26 @@
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.BarIndicator {
10
+ required property var renderer
11
+ active: renderer.prop("active", false) === true
12
+ activeText: renderer.iconGlyph(renderer.prop("active_icon", ""))
13
+ inactiveText: renderer.iconGlyph(renderer.prop("inactive_icon", renderer.prop("active_icon", "")))
14
+ activeTooltipText: renderer.escapeAutoText(renderer.prop("active_tooltip", ""))
15
+ inactiveTooltipText: renderer.escapeAutoText(renderer.prop("inactive_tooltip", renderer.prop("active_tooltip", "")))
16
+ indicatorBlock: String(renderer.prop("indicator_block", "single"))
17
+ foreground: renderer.prop("foreground", renderer.foreground)
18
+ activeColor: renderer.prop("active_color", Color.accent)
19
+ fontFamily: String(renderer.prop("font_family", renderer.fontFamily))
20
+ fontSize: Number(renderer.prop("font_size", Style.font.caption))
21
+ onPressed: function(button) {
22
+ var eventName = button === Qt.RightButton ? "right_click" : (button === Qt.MiddleButton ? "middle_click" : "click")
23
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, eventName, { button: button })
24
+ }
25
+ onWheelMoved: function(delta) { renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "wheel", { delta: delta }) }
26
+ }
@@ -0,0 +1,13 @@
1
+ import QtQuick
2
+
3
+ Item {
4
+ id: behaviorRoot
5
+ property var renderer: null
6
+ property var lastValue: undefined
7
+ function option(name,fallback){var specification=renderer?renderer.prop("animation",{}):{};return specification&&specification[name]!==undefined?specification[name]:(renderer?renderer.prop(name,fallback):fallback)}
8
+ readonly property var targetItem: renderer ? renderer.findRenderedItem(renderer.prop("target", "")) : null
9
+ function synchronize(){if(!renderer||!targetItem||renderer.prop("enabled",true)===false)return;var property=String(renderer.prop("property","opacity"));var value=renderer.prop("value",targetItem[property]);if(lastValue===undefined){lastValue=targetItem[property]}nativeAnimation.target=targetItem;nativeAnimation.property=property;nativeAnimation.from=lastValue;nativeAnimation.to=value;lastValue=value;nativeAnimation.restart();renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,"change",{property:property,value:value})}
10
+ PropertyAnimation{id:nativeAnimation;duration:Number(behaviorRoot.option("duration",250));easing.type:renderer?renderer.easingType(behaviorRoot.option("easing","in_out_quad")):Easing.InOutQuad;onFinished:renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,"finish",{})}
11
+ Connections{target:renderer;function onNodeChanged(){behaviorRoot.synchronize()}}
12
+ Component.onCompleted:synchronize()
13
+ }
@@ -0,0 +1,14 @@
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; blurEnabled: true
11
+ blur: Number(renderer.prop("amount", 0.5)); blurMax: Number(renderer.prop("maximum", 32)); blurMultiplier: Number(renderer.prop("multiplier", 1))
12
+ autoPaddingEnabled: renderer.prop("auto_padding", true) !== false
13
+ }
14
+ }
@@ -0,0 +1,38 @@
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
+ BorderImage {
10
+ required property var renderer
11
+ id: nativeBorderImage
12
+ source: String(renderer.prop("source", ""))
13
+ width: Number(renderer.prop("width", sourceSize.width > 0 ? sourceSize.width : 160))
14
+ height: Number(renderer.prop("height", sourceSize.height > 0 ? sourceSize.height : 100))
15
+ border.left: Number(renderer.prop("border_left", 0))
16
+ border.top: Number(renderer.prop("border_top", 0))
17
+ border.right: Number(renderer.prop("border_right", 0))
18
+ border.bottom: Number(renderer.prop("border_bottom", 0))
19
+ horizontalTileMode: renderer.borderImageTileMode(renderer.prop("horizontal_tile", "stretch"))
20
+ verticalTileMode: renderer.borderImageTileMode(renderer.prop("vertical_tile", "stretch"))
21
+ asynchronous: renderer.prop("asynchronous", true) !== false
22
+ cache: renderer.prop("cache", true) !== false
23
+ mirror: renderer.prop("mirror", false) === true
24
+ smooth: renderer.prop("smooth", true) !== false
25
+ onStatusChanged: {
26
+ if (renderer.subscribed("status")) renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "status", { value: status })
27
+ if (status === BorderImage.Ready && renderer.subscribed("loaded")) renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "loaded", { width: sourceSize.width, height: sourceSize.height })
28
+ if (status === BorderImage.Error) renderer.componentError("border_image_load_failed", "Unable to load the declared border image", { source: String(source) })
29
+ }
30
+ Item {
31
+ anchors.fill: parent
32
+ anchors.leftMargin: nativeBorderImage.border.left
33
+ anchors.topMargin: nativeBorderImage.border.top
34
+ anchors.rightMargin: nativeBorderImage.border.right
35
+ anchors.bottomMargin: nativeBorderImage.border.bottom
36
+ Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent }
37
+ }
38
+ }
@@ -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.BorderOverlay {
10
+ required property var renderer
11
+ width: Number(renderer.prop("width", 120))
12
+ height: Number(renderer.prop("height", 80))
13
+ radius: Number(renderer.prop("radius", Style.cornerRadius))
14
+ borderSpec: {
15
+ var colors = renderer.prop("gradient_colors", [])
16
+ if (Array.isArray(colors) && colors.length > 1) {
17
+ return {
18
+ color: colors[0],
19
+ widths: Border.flat(colors[0], renderer.prop("width_spec", Style.normalBorderWidth)).widths,
20
+ gradient: { colors: colors, angle: Number(renderer.prop("gradient_angle", 0)), enabled: true }
21
+ }
22
+ }
23
+ return Border.flat(renderer.prop("color", renderer.foreground), renderer.prop("width_spec", Style.normalBorderWidth))
24
+ }
25
+ }