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,21 @@
1
+ import QtQuick
2
+ import QtQuick.Effects
3
+
4
+ Item {
5
+ required property var renderer
6
+ implicitWidth: Number(renderer.prop("width", 240))
7
+ implicitHeight: Number(renderer.prop("height", 160))
8
+ Item { id: sourceHost; anchors.fill: parent; Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent } }
9
+ ShaderEffectSource { id: sourceTexture; anchors.fill: parent; sourceItem: sourceHost; hideSource: true; visible: false }
10
+ MultiEffect {
11
+ anchors.fill: parent
12
+ source: sourceTexture
13
+ maskEnabled: true
14
+ maskSource: renderer.findRenderedItem(renderer.prop("mask_source", ""))
15
+ maskThresholdMin: Number(renderer.prop("threshold_min", 0))
16
+ maskSpreadAtMin: Number(renderer.prop("spread_min", 0))
17
+ maskThresholdMax: Number(renderer.prop("threshold_max", 1))
18
+ maskSpreadAtMax: Number(renderer.prop("spread_max", 0))
19
+ maskInverted: renderer.prop("inverted", false) === true
20
+ }
21
+ }
@@ -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
+ ZuiControls.OpticalGlyph {
10
+ required property var renderer
11
+ text: renderer.iconGlyph(renderer.prop("text", ""))
12
+ fontSize: Number(renderer.prop("size", Style.font.body))
13
+ color: renderer.prop("color", renderer.foreground)
14
+ debugBounds: renderer.prop("debug_bounds", false) === true
15
+ fontFamily: renderer.fontFamily
16
+ }
@@ -0,0 +1,111 @@
1
+ import QtQuick
2
+ import QtQuick.Controls as QQC
3
+ import "../../Theme"
4
+
5
+ QQC.Page {
6
+ id: pageRoot
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", 640))
13
+ implicitHeight: Number(renderer.prop("height", 480))
14
+ enabled: renderer.prop("enabled", true) !== false
15
+ padding: Number(renderer.prop("padding", Style.spacing.lg))
16
+ leftPadding: padding
17
+ rightPadding: padding
18
+ topPadding: padding
19
+ bottomPadding: padding
20
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
21
+ font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
22
+
23
+ background: Rectangle {
24
+ color: renderer.prop("background", Color.background)
25
+ radius: Number(renderer.prop("radius", 0))
26
+ border.width: String(renderer.prop("border_color", "")).length > 0 ? Style.normalBorderWidth : 0
27
+ border.color: renderer.prop("border_color", "transparent")
28
+ }
29
+
30
+ header: Rectangle {
31
+ visible: renderer.prop("show_header", true) !== false
32
+ && String(renderer.prop("header_text", pageRoot.title)).length > 0
33
+ implicitHeight: visible ? Number(renderer.prop("header_height", 56)) : 0
34
+ color: renderer.prop("header_background", renderer.prop("background", Color.background))
35
+ Text {
36
+ anchors.fill: parent
37
+ anchors.leftMargin: pageRoot.padding
38
+ anchors.rightMargin: pageRoot.padding
39
+ text: String(renderer.prop("header_text", pageRoot.title))
40
+ color: renderer.prop("foreground", renderer.foreground)
41
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
42
+ font.pixelSize: Number(renderer.prop("title_size", Style.font.heading))
43
+ font.bold: true
44
+ verticalAlignment: Text.AlignVCenter
45
+ elide: Text.ElideRight
46
+ }
47
+ }
48
+
49
+ footer: Rectangle {
50
+ visible: renderer.prop("show_footer", true) !== false
51
+ && String(renderer.prop("footer_text", "")).length > 0
52
+ implicitHeight: visible ? Number(renderer.prop("footer_height", 40)) : 0
53
+ color: renderer.prop("footer_background", renderer.prop("background", Color.background))
54
+ Text {
55
+ anchors.fill: parent
56
+ anchors.leftMargin: pageRoot.padding
57
+ anchors.rightMargin: pageRoot.padding
58
+ text: String(renderer.prop("footer_text", ""))
59
+ color: renderer.prop("muted", Color.muted)
60
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
61
+ font.pixelSize: Number(renderer.prop("footer_size", Style.font.caption))
62
+ verticalAlignment: Text.AlignVCenter
63
+ elide: Text.ElideRight
64
+ }
65
+ }
66
+
67
+ contentItem: Item {
68
+ LayoutMirroring.enabled: String(renderer.prop("layout_direction", "left_to_right")) === "right_to_left"
69
+ LayoutMirroring.childrenInherit: true
70
+
71
+ Loader {
72
+ anchors.fill: parent
73
+ sourceComponent: pageRoot.contentLayout === "row" ? rowContent
74
+ : (pageRoot.contentLayout === "stack" ? stackContent : columnContent)
75
+ }
76
+ }
77
+
78
+ Component {
79
+ id: columnContent
80
+ Column {
81
+ spacing: Number(renderer.prop("spacing", Style.spacing.md))
82
+ Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent }
83
+ }
84
+ }
85
+
86
+ Component {
87
+ id: rowContent
88
+ Row {
89
+ spacing: Number(renderer.prop("spacing", Style.spacing.md))
90
+ Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent }
91
+ }
92
+ }
93
+
94
+ Component {
95
+ id: stackContent
96
+ Item {
97
+ Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent }
98
+ }
99
+ }
100
+
101
+ TapHandler {
102
+ enabled: renderer.subscribed("click")
103
+ onTapped: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "click", {})
104
+ }
105
+ onVisibleChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
106
+ visible ? "show" : "hide", {})
107
+ onActiveFocusChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
108
+ activeFocus ? "focus" : "blur", {})
109
+ onTitleChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
110
+ "title_change", { value: title })
111
+ }
@@ -0,0 +1,63 @@
1
+ import QtQuick
2
+ import QtQuick.Controls as QQC
3
+ import "../../Theme"
4
+
5
+ QQC.PageIndicator {
6
+ id: indicatorRoot
7
+
8
+ required property var renderer
9
+ readonly property int requestedIndex: Number(renderer.prop("current_index", 0))
10
+ property bool synchronizing: false
11
+
12
+ function boundedIndex(value) {
13
+ return count === 0 ? -1 : Math.max(0, Math.min(count - 1, Number(value)))
14
+ }
15
+
16
+ function syncSelection() {
17
+ var next = boundedIndex(requestedIndex)
18
+ if (currentIndex === next) return
19
+ synchronizing = true
20
+ currentIndex = next
21
+ synchronizing = false
22
+ }
23
+
24
+ count: Math.max(0, Number(renderer.prop("count", 0)))
25
+ interactive: renderer.prop("interactive", false) === true
26
+ enabled: renderer.prop("enabled", true) !== false
27
+ visible: renderer.prop("visible", true) !== false
28
+ spacing: Number(renderer.prop("spacing", Style.spacing.sm))
29
+ implicitWidth: Number(renderer.prop("width",
30
+ count * Number(renderer.prop("dot_size", 8)) + Math.max(0, count - 1) * spacing))
31
+ implicitHeight: Number(renderer.prop("height", Number(renderer.prop("dot_size", 8)) + 12))
32
+
33
+ background: Rectangle {
34
+ color: renderer.prop("background", "transparent")
35
+ radius: Number(renderer.prop("radius", 0))
36
+ }
37
+
38
+ delegate: Rectangle {
39
+ required property int index
40
+ implicitWidth: Number(renderer.prop("dot_size", 8))
41
+ implicitHeight: implicitWidth
42
+ radius: width / 2
43
+ color: index === indicatorRoot.currentIndex
44
+ ? renderer.prop("accent", Color.accent)
45
+ : renderer.prop("foreground", renderer.foreground)
46
+ opacity: index === indicatorRoot.currentIndex ? 1 : 0.45
47
+ }
48
+
49
+ onRequestedIndexChanged: syncSelection()
50
+ onCountChanged: syncSelection()
51
+ Component.onCompleted: syncSelection()
52
+ onCurrentIndexChanged: {
53
+ if (synchronizing || currentIndex < 0) return
54
+ if (renderer.subscribed("input"))
55
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "input", { value: currentIndex })
56
+ if (renderer.subscribed("change"))
57
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "change", { value: currentIndex })
58
+ }
59
+ onVisibleChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
60
+ visible ? "show" : "hide", {})
61
+ onActiveFocusChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
62
+ activeFocus ? "focus" : "blur", {})
63
+ }
@@ -0,0 +1,158 @@
1
+ import QtQuick
2
+ import QtQuick.Controls as QQC
3
+ import "../../Theme"
4
+
5
+ QQC.Pane {
6
+ id: paginationRoot
7
+
8
+ required property var renderer
9
+ readonly property int pageCount: Math.max(0, Number(renderer.prop("count", 0)))
10
+ readonly property int requestedPage: Number(renderer.prop("page", 1))
11
+ readonly property var pageWindow: visiblePages()
12
+ property int currentPage: 0
13
+ property bool synchronizing: false
14
+
15
+ function boundedPage(value) {
16
+ return pageCount === 0 ? 0 : Math.max(1, Math.min(pageCount, Number(value)))
17
+ }
18
+
19
+ function syncSelection() {
20
+ var next = boundedPage(requestedPage)
21
+ if (currentPage === next) return
22
+ synchronizing = true
23
+ currentPage = next
24
+ synchronizing = false
25
+ }
26
+
27
+ function visiblePages() {
28
+ var result = []
29
+ if (pageCount === 0) return result
30
+ var siblings = Math.max(0, Number(renderer.prop("sibling_count", 1)))
31
+ var threshold = siblings * 2 + 5
32
+ if (pageCount <= threshold) {
33
+ for (var all = 1; all <= pageCount; all++) result.push(all)
34
+ return result
35
+ }
36
+ var start = Math.max(2, currentPage - siblings)
37
+ var finish = Math.min(pageCount - 1, currentPage + siblings)
38
+ if (currentPage <= siblings + 3) finish = Math.min(pageCount - 1, threshold - 2)
39
+ if (currentPage >= pageCount - siblings - 2) start = Math.max(2, pageCount - threshold + 3)
40
+ result.push(1)
41
+ if (start > 2) result.push(0)
42
+ for (var page = start; page <= finish; page++) result.push(page)
43
+ if (finish < pageCount - 1) result.push(0)
44
+ result.push(pageCount)
45
+ return result
46
+ }
47
+
48
+ function choose(page, eventName) {
49
+ var next = boundedPage(page)
50
+ if (next === 0) return
51
+ currentPage = next
52
+ var payload = { value: next, page: next, count: pageCount }
53
+ if (eventName && renderer.subscribed(eventName))
54
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, eventName, payload)
55
+ if (renderer.subscribed("select"))
56
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "select", payload)
57
+ }
58
+
59
+ implicitWidth: Number(renderer.prop("width", 620))
60
+ implicitHeight: Number(renderer.prop("height", 52))
61
+ enabled: renderer.prop("enabled", true) !== false
62
+ visible: renderer.prop("visible", true) !== false
63
+ padding: Number(renderer.prop("padding", Style.spacing.xs))
64
+
65
+ background: Rectangle {
66
+ color: renderer.prop("background", "transparent")
67
+ radius: Number(renderer.prop("radius", 0))
68
+ border.width: String(renderer.prop("border_color", "")).length > 0 ? Style.normalBorderWidth : 0
69
+ border.color: renderer.prop("border_color", "transparent")
70
+ }
71
+
72
+ contentItem: Row {
73
+ spacing: Number(renderer.prop("spacing", Style.spacing.xs))
74
+
75
+ QQC.ToolButton {
76
+ visible: renderer.prop("show_first_last", false) === true
77
+ enabled: paginationRoot.enabled && paginationRoot.currentPage > 1
78
+ width: Number(renderer.prop("item_size", 40)); height: width
79
+ text: String(renderer.prop("first_text", "«"))
80
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
81
+ font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
82
+ onClicked: paginationRoot.choose(1, "first")
83
+ }
84
+
85
+ QQC.ToolButton {
86
+ visible: renderer.prop("show_previous_next", true) !== false
87
+ enabled: paginationRoot.enabled && paginationRoot.currentPage > 1
88
+ width: Number(renderer.prop("item_size", 40)); height: width
89
+ text: String(renderer.prop("previous_text", "‹"))
90
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
91
+ font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
92
+ onClicked: paginationRoot.choose(paginationRoot.currentPage - 1, "previous")
93
+ }
94
+
95
+ Repeater {
96
+ model: paginationRoot.pageWindow
97
+ QQC.ToolButton {
98
+ required property int modelData
99
+ readonly property bool selected: modelData === paginationRoot.currentPage
100
+ enabled: paginationRoot.enabled && modelData > 0
101
+ width: Number(renderer.prop("item_size", 40)); height: width
102
+ text: modelData === 0 ? "…" : String(modelData)
103
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
104
+ font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
105
+ contentItem: Text {
106
+ text: parent.text
107
+ color: !parent.enabled ? renderer.prop("muted", Color.muted)
108
+ : (parent.selected ? renderer.prop("accent", Color.accent)
109
+ : renderer.prop("foreground", renderer.foreground))
110
+ font: parent.font
111
+ horizontalAlignment: Text.AlignHCenter
112
+ verticalAlignment: Text.AlignVCenter
113
+ }
114
+ background: Rectangle {
115
+ color: parent.selected ? renderer.prop("selected_background", "transparent") : "transparent"
116
+ radius: Number(renderer.prop("radius", Style.cornerRadius))
117
+ }
118
+ onClicked: paginationRoot.choose(modelData, null)
119
+ }
120
+ }
121
+
122
+ QQC.ToolButton {
123
+ visible: renderer.prop("show_previous_next", true) !== false
124
+ enabled: paginationRoot.enabled && paginationRoot.currentPage < paginationRoot.pageCount
125
+ width: Number(renderer.prop("item_size", 40)); height: width
126
+ text: String(renderer.prop("next_text", "›"))
127
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
128
+ font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
129
+ onClicked: paginationRoot.choose(paginationRoot.currentPage + 1, "next")
130
+ }
131
+
132
+ QQC.ToolButton {
133
+ visible: renderer.prop("show_first_last", false) === true
134
+ enabled: paginationRoot.enabled && paginationRoot.currentPage < paginationRoot.pageCount
135
+ width: Number(renderer.prop("item_size", 40)); height: width
136
+ text: String(renderer.prop("last_text", "»"))
137
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
138
+ font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
139
+ onClicked: paginationRoot.choose(paginationRoot.pageCount, "last")
140
+ }
141
+ }
142
+
143
+ onRequestedPageChanged: syncSelection()
144
+ onPageCountChanged: syncSelection()
145
+ Component.onCompleted: syncSelection()
146
+ onCurrentPageChanged: {
147
+ if (synchronizing || currentPage <= 0) return
148
+ var payload = { value: currentPage, page: currentPage, count: pageCount }
149
+ if (renderer.subscribed("input"))
150
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "input", payload)
151
+ if (renderer.subscribed("change"))
152
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "change", payload)
153
+ }
154
+ onVisibleChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
155
+ visible ? "show" : "hide", {})
156
+ onActiveFocusChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
157
+ activeFocus ? "focus" : "blur", {})
158
+ }
@@ -0,0 +1,72 @@
1
+ import QtQuick
2
+ import QtQuick.Controls as QQC
3
+ import "../../Theme"
4
+
5
+ QQC.Pane {
6
+ id: paneRoot
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", Color.background)
24
+ radius: Number(renderer.prop("radius", Style.cornerRadius))
25
+ border.width: Number(renderer.prop("border_width",
26
+ String(renderer.prop("border_color", "")).length > 0 ? Style.normalBorderWidth : 0))
27
+ border.color: renderer.prop("border_color", "transparent")
28
+ }
29
+
30
+ contentItem: Item {
31
+ LayoutMirroring.enabled: String(renderer.prop("layout_direction", "left_to_right")) === "right_to_left"
32
+ LayoutMirroring.childrenInherit: true
33
+
34
+ Loader {
35
+ anchors.fill: parent
36
+ sourceComponent: paneRoot.contentLayout === "row" ? rowContent
37
+ : (paneRoot.contentLayout === "stack" ? stackContent : columnContent)
38
+ }
39
+ }
40
+
41
+ Component {
42
+ id: columnContent
43
+ Column {
44
+ spacing: Number(renderer.prop("spacing", Style.spacing.md))
45
+ Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent }
46
+ }
47
+ }
48
+
49
+ Component {
50
+ id: rowContent
51
+ Row {
52
+ spacing: Number(renderer.prop("spacing", Style.spacing.md))
53
+ Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent }
54
+ }
55
+ }
56
+
57
+ Component {
58
+ id: stackContent
59
+ Item {
60
+ Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent }
61
+ }
62
+ }
63
+
64
+ TapHandler {
65
+ enabled: renderer.subscribed("click")
66
+ onTapped: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "click", {})
67
+ }
68
+ onVisibleChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
69
+ visible ? "show" : "hide", {})
70
+ onActiveFocusChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
71
+ activeFocus ? "focus" : "blur", {})
72
+ }
@@ -0,0 +1,15 @@
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.PanelHero {
10
+ required property var renderer
11
+ title: renderer.escapeAutoText(renderer.prop("title", "")); meta: renderer.escapeAutoText(renderer.prop("meta", "")); detail: renderer.escapeAutoText(renderer.prop("detail", ""))
12
+ iconSize: Number(renderer.prop("icon_size", Style.font.display)); iconOpacity: Number(renderer.prop("icon_opacity", 1))
13
+ metaOpacity: Number(renderer.prop("meta_opacity", 1)); foreground: renderer.prop("foreground", renderer.foreground)
14
+ fontFamily: String(renderer.prop("font_family", renderer.fontFamily))
15
+ }
@@ -0,0 +1,3 @@
1
+ import QtQuick
2
+ import "Support" as Support
3
+ Support.AnimationGroupDriver { renderer: null; sequential: false }
@@ -0,0 +1,3 @@
1
+ import QtQuick
2
+ import "Support" as Support
3
+ Support.AnimationDriver { renderer: null; animationType: "parent" }
@@ -0,0 +1,10 @@
1
+ import QtQuick
2
+
3
+ Item {
4
+ id: changeRoot
5
+ property var renderer: null
6
+ property int handledRevision: -1
7
+ function apply(){if(!renderer)return;var revision=Number(renderer.prop("revision",0));if(revision===handledRevision)return;var target=renderer.findRenderedItem(renderer.prop("target",""));var parent=renderer.findRenderedItem(renderer.prop("parent",""));if(!target||!parent)return;handledRevision=revision;target.parent=parent;["x","y","width","height","scale","rotation"].forEach(function(key){var value=renderer.prop(key,null);if(value!==null)target[key]=value});renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,"apply",{revision:revision,parent:renderer.prop("parent","")})}
8
+ Connections{target:renderer;function onNodeChanged(){changeRoot.apply()}}
9
+ Component.onCompleted:apply()
10
+ }
@@ -0,0 +1,81 @@
1
+ import QtQuick
2
+ import QtQuick.Particles
3
+
4
+ Item {
5
+ id: particleRoot
6
+ required property var renderer
7
+ property int handledBurstRevision: -1
8
+ implicitWidth: Number(renderer.prop("width", 320))
9
+ implicitHeight: Number(renderer.prop("height", 200))
10
+
11
+ function send(name, payload) {
12
+ if (renderer.subscribed(name)) renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, name, payload || {})
13
+ }
14
+
15
+ function handleBurst() {
16
+ var revision = Number(renderer.prop("burst_revision", 0))
17
+ var count = Number(renderer.prop("burst_count", 0))
18
+ if (revision === handledBurstRevision || count <= 0) return
19
+ handledBurstRevision = revision
20
+ particleEmitter.burst(count, Number(renderer.prop("burst_x", particleEmitter.width / 2)), Number(renderer.prop("burst_y", particleEmitter.height / 2)))
21
+ send("burst", { count: count, revision: revision })
22
+ }
23
+
24
+ ParticleSystem {
25
+ id: nativeSystem
26
+ anchors.fill: parent
27
+ running: renderer.prop("running", true) !== false
28
+ paused: renderer.prop("paused", false) === true
29
+ onRunningChanged: particleRoot.send(running ? "start" : "stop", {})
30
+ onPausedChanged: particleRoot.send(paused ? "pause" : "resume", {})
31
+ onEmptyChanged: if (empty) particleRoot.send("empty", {})
32
+
33
+ Emitter {
34
+ id: particleEmitter
35
+ system: nativeSystem
36
+ x: Number(renderer.prop("emitter_x", 0)); y: Number(renderer.prop("emitter_y", 0))
37
+ width: Number(renderer.prop("emitter_width", particleRoot.width)); height: Number(renderer.prop("emitter_height", particleRoot.height))
38
+ emitRate: Number(renderer.prop("emit_rate", 40))
39
+ lifeSpan: Number(renderer.prop("life_span", 1500)); lifeSpanVariation: Number(renderer.prop("life_span_variation", 0))
40
+ maximumEmitted: Number(renderer.prop("maximum_emitted", -1))
41
+ size: Number(renderer.prop("size", 16)); endSize: Number(renderer.prop("end_size", size)); sizeVariation: Number(renderer.prop("size_variation", 0))
42
+ shape: String(renderer.prop("particle_shape", "rectangle")) === "ellipse" ? ellipseShape : rectangleShape
43
+ velocity: AngleDirection {
44
+ angle: Number(renderer.prop("velocity_angle", 270)); magnitude: Number(renderer.prop("velocity", 50))
45
+ angleVariation: Number(renderer.prop("velocity_angle_variation", 180)); magnitudeVariation: Number(renderer.prop("velocity_variation", 0))
46
+ }
47
+ acceleration: AngleDirection {
48
+ angle: Number(renderer.prop("acceleration_angle", 90)); magnitude: Number(renderer.prop("acceleration", 0))
49
+ angleVariation: Number(renderer.prop("acceleration_angle_variation", 0)); magnitudeVariation: Number(renderer.prop("acceleration_variation", 0))
50
+ }
51
+ }
52
+
53
+ EllipseShape { id: ellipseShape }
54
+ RectangleShape { id: rectangleShape; fill: true }
55
+
56
+ ImageParticle {
57
+ system: nativeSystem
58
+ source: renderer.assetUrl(renderer.prop("source", ""))
59
+ color: renderer.prop("color", "white"); colorVariation: Number(renderer.prop("color_variation", 0))
60
+ alpha: Number(renderer.prop("alpha", 1)); alphaVariation: Number(renderer.prop("alpha_variation", 0))
61
+ rotation: Number(renderer.prop("rotation", 0)); rotationVariation: Number(renderer.prop("rotation_variation", 0))
62
+ rotationVelocity: Number(renderer.prop("rotation_velocity", 0)); rotationVelocityVariation: Number(renderer.prop("rotation_velocity_variation", 0))
63
+ autoRotation: renderer.prop("auto_rotation", false) === true
64
+ }
65
+
66
+ Gravity {
67
+ system: nativeSystem
68
+ magnitude: Number(renderer.prop("gravity", 0)); angle: Number(renderer.prop("gravity_angle", 90))
69
+ }
70
+ Turbulence {
71
+ system: nativeSystem
72
+ enabled: Number(renderer.prop("turbulence", 0)) !== 0
73
+ strength: Number(renderer.prop("turbulence", 0))
74
+ x: Number(renderer.prop("turbulence_x", 0)); y: Number(renderer.prop("turbulence_y", 0))
75
+ width: Number(renderer.prop("turbulence_width", particleRoot.width)); height: Number(renderer.prop("turbulence_height", particleRoot.height))
76
+ }
77
+ }
78
+
79
+ Connections { target: renderer; function onNodeChanged() { particleRoot.handleBurst() } }
80
+ Component.onCompleted: handleBurst()
81
+ }
@@ -0,0 +1,58 @@
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
+ id: passwordRoot
12
+ property bool revealState: renderer.prop("revealed", false) === true
13
+ readonly property bool canReveal: renderer.prop("revealable", true) !== false
14
+ implicitWidth: Number(renderer.prop("width", 260))
15
+ implicitHeight: passwordInput.implicitHeight
16
+ ZuiControls.TextField {
17
+ id: passwordInput
18
+ width: passwordRoot.width - (passwordRoot.canReveal ? passwordRoot.height : 0)
19
+ anchors.left: parent.left
20
+ text: String(renderer.prop("text", ""))
21
+ placeholderText: String(renderer.prop("placeholder", ""))
22
+ password: !passwordRoot.revealState
23
+ foreground: renderer.prop("foreground", renderer.foreground)
24
+ accent: renderer.prop("accent", Color.accent)
25
+ selectionTint: renderer.prop("selection_tint", Style.selectionFillFor(foreground, accent))
26
+ horizontalPadding: Number(renderer.prop("horizontal_padding", Style.spacing.controlPaddingX))
27
+ verticalPadding: Number(renderer.prop("vertical_padding", Style.spacing.inputPaddingY))
28
+ onTextEdited: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "input", { value: text })
29
+ onEditingFinished: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "change", { value: text })
30
+ onAccepted: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "submit", { value: text })
31
+ onActiveFocusChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, activeFocus ? "focus" : "blur", { value: text })
32
+ }
33
+ Rectangle {
34
+ visible: passwordRoot.canReveal
35
+ anchors.right: parent.right
36
+ width: parent.height
37
+ height: parent.height
38
+ color: "transparent"
39
+ Text {
40
+ anchors.centerIn: parent
41
+ text: renderer.iconGlyph(passwordRoot.revealState ? "eye_slash" : "eye")
42
+ textFormat: Text.PlainText
43
+ color: renderer.foreground
44
+ font.family: renderer.fontFamily
45
+ font.pixelSize: Style.font.icon
46
+ }
47
+ TapHandler {
48
+ onTapped: {
49
+ passwordRoot.revealState = !passwordRoot.revealState
50
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "reveal", { value: passwordRoot.revealState })
51
+ }
52
+ }
53
+ }
54
+ Connections {
55
+ target: root
56
+ function onNodeChanged() { passwordRoot.revealState = renderer.prop("revealed", passwordRoot.revealState) === true }
57
+ }
58
+ }
@@ -0,0 +1,35 @@
1
+ import QtQuick
2
+ import QtQuick.Shapes
3
+
4
+ Shape {
5
+ id: pathRoot
6
+ required property var renderer
7
+ implicitWidth: Number(renderer.prop("width", 120))
8
+ implicitHeight: Number(renderer.prop("height", 120))
9
+ antialiasing: renderer.prop("antialiasing", true) !== false
10
+ asynchronous: renderer.prop("asynchronous", false) === true
11
+ preferredRendererType: String(renderer.prop("preferred_renderer", "geometry")) === "curve" ? Shape.CurveRenderer : Shape.GeometryRenderer
12
+ containsMode: String(renderer.prop("contains_mode", "bounding_rect")) === "fill" ? Shape.FillContains : Shape.BoundingRectContains
13
+ transform: Scale { xScale: Number(renderer.prop("scale", 1)); yScale: Number(renderer.prop("scale", 1)) }
14
+
15
+ ShapePath {
16
+ strokeColor: renderer.prop("stroke", renderer.foreground)
17
+ fillColor: renderer.prop("fill", "transparent")
18
+ strokeWidth: Number(renderer.prop("stroke_width", 1))
19
+ capStyle: String(renderer.prop("cap", "square")) === "round" ? ShapePath.RoundCap : (String(renderer.prop("cap", "square")) === "flat" ? ShapePath.FlatCap : ShapePath.SquareCap)
20
+ joinStyle: String(renderer.prop("join", "miter")) === "round" ? ShapePath.RoundJoin : (String(renderer.prop("join", "miter")) === "bevel" ? ShapePath.BevelJoin : ShapePath.MiterJoin)
21
+ fillRule: String(renderer.prop("fill_rule", "winding")) === "odd_even" ? ShapePath.OddEvenFill : ShapePath.WindingFill
22
+ strokeStyle: Array.isArray(renderer.prop("dash_pattern", [])) && renderer.prop("dash_pattern", []).length > 0 ? ShapePath.DashLine : ShapePath.SolidLine
23
+ dashPattern: renderer.prop("dash_pattern", [])
24
+ dashOffset: Number(renderer.prop("dash_offset", 0))
25
+ PathSvg { path: String(renderer.prop("data", "")) }
26
+ }
27
+
28
+ onStatusChanged: if (renderer.subscribed("status")) renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "status", { value: status, renderer: rendererType })
29
+ MouseArea {
30
+ anchors.fill: parent
31
+ hoverEnabled: renderer.subscribed("hover")
32
+ onClicked: function(mouse) { if (renderer.subscribed("click")) renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "click", { x: mouse.x, y: mouse.y, contains: pathRoot.contains(Qt.point(mouse.x, mouse.y)) }) }
33
+ onPositionChanged: function(mouse) { if (renderer.subscribed("hover")) renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "hover", { x: mouse.x, y: mouse.y, contains: pathRoot.contains(Qt.point(mouse.x, mouse.y)) }) }
34
+ }
35
+ }
@@ -0,0 +1,3 @@
1
+ import QtQuick
2
+ import "Support" as Support
3
+ Support.AnimationDriver { renderer: null; animationType: "path" }