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,10 @@
1
+ import QtQuick
2
+ import QtQml.Models
3
+
4
+ Item {
5
+ id:modelRoot;property var renderer:null;property alias model:nativeDelegateModel
6
+ function rebuild(){sourceModel.clear();var items=renderer?renderer.prop("items",[]):[];for(var i=0;i<items.length;i++){var item=items[i];sourceModel.append(item!==null&&typeof item==="object"&&!Array.isArray(item)?item:{value:item})}if(renderer)renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,"count_change",{value:nativeDelegateModel.count})}
7
+ ListModel{id:sourceModel}
8
+ DelegateModel{id:nativeDelegateModel;model:sourceModel;filterOnGroup:String(renderer?renderer.prop("filter_group","items"):"items");delegate:Item{required property int index;property var sourceIndex:index}}
9
+ Component.onCompleted:rebuild();Connections{target:renderer;function onNodeChanged(){modelRoot.rebuild()}}
10
+ }
@@ -0,0 +1,10 @@
1
+ import QtQuick
2
+ import QtQml.Models
3
+
4
+ Item {
5
+ id:groupRoot;property var renderer:null;property alias model:nativeDelegateModel;property alias group:nativeGroup
6
+ function rebuild(){sourceModel.clear();var items=renderer?renderer.prop("items",[]):[];for(var i=0;i<items.length;i++){var item=items[i];sourceModel.append(item!==null&&typeof item==="object"&&!Array.isArray(item)?item:{value:item})}if(renderer)renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,"count_change",{value:nativeGroup.count})}
7
+ ListModel{id:sourceModel}
8
+ DelegateModel{id:nativeDelegateModel;model:sourceModel;delegate:Item{required property int index} groups:[DelegateModelGroup{id:nativeGroup;name:String(renderer?renderer.prop("name","group"):"group");includeByDefault:renderer&&renderer.prop("include_by_default",false)===true;onCountChanged:if(renderer)renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,"change",{value:count})}]}
9
+ Component.onCompleted:rebuild();Connections{target:renderer;function onNodeChanged(){groupRoot.rebuild()}}
10
+ }
@@ -0,0 +1,42 @@
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.Dial {
10
+ required property var renderer
11
+ id: nativeDial
12
+ from: Number(renderer.prop("minimum", 0))
13
+ to: Number(renderer.prop("maximum", 1))
14
+ value: Number(renderer.prop("value", from))
15
+ stepSize: Number(renderer.prop("step", 0))
16
+ startAngle: Number(renderer.prop("start_angle", -140))
17
+ endAngle: Number(renderer.prop("end_angle", 140))
18
+ snapMode: {
19
+ var mode = String(renderer.prop("snap", "none"))
20
+ if (mode === "always") return QQC.Dial.SnapAlways
21
+ if (mode === "release") return QQC.Dial.SnapOnRelease
22
+ return QQC.Dial.NoSnap
23
+ }
24
+ wrap: renderer.prop("wrap", false) === true
25
+ live: renderer.prop("live", true) !== false
26
+ inputMode: {
27
+ var mode = String(renderer.prop("input_mode", "circular"))
28
+ if (mode === "horizontal") return QQC.Dial.Horizontal
29
+ if (mode === "vertical") return QQC.Dial.Vertical
30
+ return QQC.Dial.Circular
31
+ }
32
+ implicitWidth: Number(renderer.prop("size", 100))
33
+ implicitHeight: implicitWidth
34
+ palette.windowText: renderer.prop("foreground", renderer.foreground)
35
+ palette.button: renderer.prop("background", Color.popups.background)
36
+ palette.highlight: renderer.prop("accent", Color.accent)
37
+ onMoved: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "input", { value: value, angle: angle })
38
+ onPressedChanged: {
39
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, pressed ? "press" : "release", { value: value })
40
+ if (!pressed) renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "change", { value: value })
41
+ }
42
+ }
@@ -0,0 +1,128 @@
1
+ import QtQuick
2
+ import QtQuick.Controls as QQC
3
+ import "../../Theme"
4
+
5
+ QQC.Dialog {
6
+ id: dialogRoot
7
+
8
+ required property var renderer
9
+ readonly property bool requestedOpen: renderer.prop("opened", false) === true
10
+ && renderer.prop("visible", true) !== false
11
+ readonly property string contentLayout: String(renderer.prop("layout", "column"))
12
+ readonly property bool centered: renderer.prop("centered", true) !== false
13
+ readonly property bool hasExplicitX: renderer.node && renderer.node.props
14
+ && renderer.node.props.x !== undefined
15
+ readonly property bool hasExplicitY: renderer.node && renderer.node.props
16
+ && renderer.node.props.y !== undefined
17
+
18
+ function standardButtonsValue(value) {
19
+ var names = Array.isArray(value) ? value : (value === null || value === undefined ? [] : [value])
20
+ var result = QQC.Dialog.NoButton
21
+ for (var index = 0; index < names.length; index++) {
22
+ var name = String(names[index])
23
+ if (name === "ok") result |= QQC.Dialog.Ok
24
+ else if (name === "save") result |= QQC.Dialog.Save
25
+ else if (name === "save_all") result |= QQC.Dialog.SaveAll
26
+ else if (name === "open") result |= QQC.Dialog.Open
27
+ else if (name === "yes") result |= QQC.Dialog.Yes
28
+ else if (name === "yes_to_all") result |= QQC.Dialog.YesToAll
29
+ else if (name === "no") result |= QQC.Dialog.No
30
+ else if (name === "no_to_all") result |= QQC.Dialog.NoToAll
31
+ else if (name === "abort") result |= QQC.Dialog.Abort
32
+ else if (name === "retry") result |= QQC.Dialog.Retry
33
+ else if (name === "ignore") result |= QQC.Dialog.Ignore
34
+ else if (name === "close") result |= QQC.Dialog.Close
35
+ else if (name === "cancel") result |= QQC.Dialog.Cancel
36
+ else if (name === "discard") result |= QQC.Dialog.Discard
37
+ else if (name === "help") result |= QQC.Dialog.Help
38
+ else if (name === "apply") result |= QQC.Dialog.Apply
39
+ else if (name === "reset") result |= QQC.Dialog.Reset
40
+ else if (name === "restore_defaults") result |= QQC.Dialog.RestoreDefaults
41
+ }
42
+ return result
43
+ }
44
+
45
+ function closePolicyValue(value) {
46
+ var names = Array.isArray(value) ? value : [value || "escape_and_outside"]
47
+ var result = 0
48
+ for (var index = 0; index < names.length; index++) {
49
+ var name = String(names[index])
50
+ if (name === "escape" || name === "escape_and_outside") result |= QQC.Popup.CloseOnEscape
51
+ if (name === "outside" || name === "escape_and_outside") result |= QQC.Popup.CloseOnPressOutside
52
+ if (name === "outside_parent") result |= QQC.Popup.CloseOnPressOutsideParent
53
+ }
54
+ return result
55
+ }
56
+
57
+ function syncOpenState() {
58
+ if (requestedOpen === opened) return
59
+ if (requestedOpen) open()
60
+ else close()
61
+ }
62
+
63
+ title: String(renderer.prop("title", ""))
64
+ standardButtons: standardButtonsValue(renderer.prop("standard_buttons", ["ok", "cancel"]))
65
+ parent: QQC.Overlay.overlay
66
+ x: hasExplicitX ? Number(renderer.prop("x", 0))
67
+ : (centered && parent ? Math.round((parent.width - width) / 2) : 0)
68
+ y: hasExplicitY ? Number(renderer.prop("y", 0))
69
+ : (centered && parent ? Math.round((parent.height - height) / 2) : 0)
70
+ width: Number(renderer.prop("width", 480))
71
+ height: Number(renderer.prop("height", 320))
72
+ modal: renderer.prop("modal", true) !== false
73
+ dim: renderer.prop("dim", modal) !== false
74
+ focus: renderer.prop("focus", true) !== false
75
+ closePolicy: closePolicyValue(renderer.prop("close_policy", "escape_and_outside"))
76
+ enabled: renderer.prop("enabled", true) !== false
77
+ padding: Number(renderer.prop("padding", Style.spacing.lg))
78
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
79
+ font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
80
+
81
+ background: Rectangle {
82
+ color: renderer.prop("background", Color.background)
83
+ radius: Number(renderer.prop("radius", Style.cornerRadius))
84
+ border.width: String(renderer.prop("border_color", "")).length > 0 ? Style.normalBorderWidth : 0
85
+ border.color: renderer.prop("border_color", "transparent")
86
+ }
87
+
88
+ contentItem: Loader {
89
+ sourceComponent: dialogRoot.contentLayout === "row" ? rowContent
90
+ : (dialogRoot.contentLayout === "stack" ? stackContent : columnContent)
91
+ }
92
+
93
+ Component {
94
+ id: columnContent
95
+ Column {
96
+ spacing: Number(renderer.prop("spacing", Style.spacing.md))
97
+ Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent }
98
+ }
99
+ }
100
+ Component {
101
+ id: rowContent
102
+ Row {
103
+ spacing: Number(renderer.prop("spacing", Style.spacing.md))
104
+ Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent }
105
+ }
106
+ }
107
+ Component {
108
+ id: stackContent
109
+ Item { Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent } }
110
+ }
111
+
112
+ Component.onCompleted: syncOpenState()
113
+ onRequestedOpenChanged: syncOpenState()
114
+ onAccepted: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "accept", {})
115
+ onRejected: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "reject", {})
116
+ onApplied: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "apply", {})
117
+ onReset: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "reset", {})
118
+ onDiscarded: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "discard", {})
119
+ onHelpRequested: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "help", {})
120
+ onOpened: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "open", {})
121
+ onClosed: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "close", {})
122
+ onAboutToShow: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "about_to_show", {})
123
+ onAboutToHide: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "about_to_hide", {})
124
+ onVisibleChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
125
+ visible ? "show" : "hide", {})
126
+ onActiveFocusChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
127
+ activeFocus ? "focus" : "blur", {})
128
+ }
@@ -0,0 +1,137 @@
1
+ import QtQuick
2
+ import QtQuick.Controls as QQC
3
+ import "../../Theme"
4
+
5
+ QQC.DialogButtonBox {
6
+ id: box
7
+
8
+ required property var renderer
9
+
10
+ function standardButtonValue(name) {
11
+ var key = String(name || "").toLowerCase()
12
+ if (key === "ok") return QQC.DialogButtonBox.Ok
13
+ if (key === "save") return QQC.DialogButtonBox.Save
14
+ if (key === "save_all") return QQC.DialogButtonBox.SaveAll
15
+ if (key === "open") return QQC.DialogButtonBox.Open
16
+ if (key === "yes") return QQC.DialogButtonBox.Yes
17
+ if (key === "yes_to_all") return QQC.DialogButtonBox.YesToAll
18
+ if (key === "no") return QQC.DialogButtonBox.No
19
+ if (key === "no_to_all") return QQC.DialogButtonBox.NoToAll
20
+ if (key === "abort") return QQC.DialogButtonBox.Abort
21
+ if (key === "retry") return QQC.DialogButtonBox.Retry
22
+ if (key === "ignore") return QQC.DialogButtonBox.Ignore
23
+ if (key === "close") return QQC.DialogButtonBox.Close
24
+ if (key === "cancel") return QQC.DialogButtonBox.Cancel
25
+ if (key === "discard") return QQC.DialogButtonBox.Discard
26
+ if (key === "help") return QQC.DialogButtonBox.Help
27
+ if (key === "apply") return QQC.DialogButtonBox.Apply
28
+ if (key === "reset") return QQC.DialogButtonBox.Reset
29
+ if (key === "restore_defaults") return QQC.DialogButtonBox.RestoreDefaults
30
+ return QQC.DialogButtonBox.NoButton
31
+ }
32
+
33
+ function standardButtonsValue(values) {
34
+ var result = QQC.DialogButtonBox.NoButton
35
+ var buttons = Array.isArray(values) ? values : [values]
36
+ for (var index = 0; index < buttons.length; index++) result |= standardButtonValue(buttons[index])
37
+ return result
38
+ }
39
+
40
+ function roleValue(value) {
41
+ var key = String(value || "action").toLowerCase()
42
+ if (key === "accept") return QQC.DialogButtonBox.AcceptRole
43
+ if (key === "reject") return QQC.DialogButtonBox.RejectRole
44
+ if (key === "destructive") return QQC.DialogButtonBox.DestructiveRole
45
+ if (key === "help") return QQC.DialogButtonBox.HelpRole
46
+ if (key === "yes") return QQC.DialogButtonBox.YesRole
47
+ if (key === "no") return QQC.DialogButtonBox.NoRole
48
+ if (key === "reset") return QQC.DialogButtonBox.ResetRole
49
+ if (key === "apply") return QQC.DialogButtonBox.ApplyRole
50
+ return QQC.DialogButtonBox.ActionRole
51
+ }
52
+
53
+ function alignmentValue(value) {
54
+ var key = String(value || "right")
55
+ if (key === "left" || key === "start") return Qt.AlignLeft
56
+ if (key === "center") return Qt.AlignHCenter
57
+ if (key === "justify") return Qt.AlignJustify
58
+ return Qt.AlignRight
59
+ }
60
+
61
+ function buttonPayload(button) {
62
+ return {
63
+ text: button ? button.text : "",
64
+ role: button ? buttonRole(button) : QQC.DialogButtonBox.InvalidRole,
65
+ standard_button: button ? standardButton(button) : QQC.DialogButtonBox.NoButton
66
+ }
67
+ }
68
+
69
+ standardButtons: standardButtonsValue(renderer.prop("buttons", []))
70
+ alignment: renderer.prop("centered", false) === true
71
+ ? Qt.AlignHCenter : alignmentValue(renderer.prop("alignment", "right"))
72
+ position: String(renderer.prop("position", "footer")) === "header"
73
+ ? QQC.DialogButtonBox.Header : QQC.DialogButtonBox.Footer
74
+ spacing: Number(renderer.prop("spacing", Style.spacing.sm))
75
+ implicitWidth: Number(renderer.prop("width", contentItem ? contentItem.implicitWidth : 240))
76
+ implicitHeight: Number(renderer.prop("height", contentItem ? contentItem.implicitHeight : 44))
77
+ enabled: renderer.prop("enabled", true) !== false
78
+
79
+ background: Rectangle {
80
+ color: renderer.prop("background", "transparent")
81
+ }
82
+
83
+ contentItem: ListView {
84
+ implicitWidth: orientation === ListView.Horizontal ? contentWidth : widestItem
85
+ implicitHeight: orientation === ListView.Vertical ? contentHeight : tallestItem
86
+ model: box.contentModel
87
+ spacing: box.spacing
88
+ orientation: String(renderer.prop("orientation", "horizontal")) === "vertical"
89
+ ? ListView.Vertical : ListView.Horizontal
90
+ boundsBehavior: Flickable.StopAtBounds
91
+ snapMode: ListView.SnapToItem
92
+ readonly property real widestItem: {
93
+ var result = 0
94
+ for (var index = 0; index < count; index++) {
95
+ var child = itemAtIndex(index)
96
+ if (child) result = Math.max(result, child.implicitWidth)
97
+ }
98
+ return result
99
+ }
100
+ readonly property real tallestItem: {
101
+ var result = 0
102
+ for (var index = 0; index < count; index++) {
103
+ var child = itemAtIndex(index)
104
+ if (child) result = Math.max(result, child.implicitHeight)
105
+ }
106
+ return result
107
+ }
108
+ }
109
+
110
+ delegate: QQC.Button {
111
+ id: standardDelegate
112
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
113
+ font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
114
+ palette.buttonText: renderer.prop("foreground", renderer.foreground)
115
+ palette.highlight: renderer.prop("accent", Color.accent)
116
+ }
117
+
118
+ Repeater {
119
+ model: renderer.prop("custom_buttons", [])
120
+ delegate: QQC.Button {
121
+ required property var modelData
122
+ text: String(modelData && modelData.text !== undefined ? modelData.text : modelData)
123
+ QQC.DialogButtonBox.buttonRole: box.roleValue(modelData && modelData.role !== undefined ? modelData.role : "action")
124
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
125
+ font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
126
+ palette.buttonText: renderer.prop("foreground", renderer.foreground)
127
+ palette.highlight: renderer.prop("accent", Color.accent)
128
+ }
129
+ }
130
+
131
+ onClicked: function(button) {
132
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "click", box.buttonPayload(button))
133
+ }
134
+ onAccepted: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "accept", {})
135
+ onRejected: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "reject", {})
136
+ onHelpRequested: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "help", {})
137
+ }
@@ -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
+ Item {
10
+ required property var renderer
11
+ readonly property bool vertical: String(renderer.prop("orientation", "horizontal")) === "vertical"
12
+ readonly property real lineLength: Number(renderer.prop("length", 240))
13
+ readonly property real lineThickness: Number(renderer.prop("thickness", Style.normalBorderWidth))
14
+ readonly property real leadingIndent: Number(renderer.prop("indent", 0))
15
+ readonly property real trailingIndent: Number(renderer.prop("end_indent", 0))
16
+ implicitWidth: vertical ? lineThickness : lineLength
17
+ implicitHeight: vertical ? lineLength : lineThickness
18
+ Rectangle {
19
+ x: parent.vertical ? 0 : parent.leadingIndent
20
+ y: parent.vertical ? parent.leadingIndent : 0
21
+ width: parent.vertical ? parent.lineThickness : Math.max(0, parent.width - parent.leadingIndent - parent.trailingIndent)
22
+ height: parent.vertical ? Math.max(0, parent.height - parent.leadingIndent - parent.trailingIndent) : parent.lineThickness
23
+ color: renderer.prop("color", renderer.foreground)
24
+ opacity: Number(renderer.prop("opacity", 0.2))
25
+ }
26
+ }
@@ -0,0 +1,3 @@
1
+ import QtQuick
2
+ import "Support" as Support
3
+ Support.ChartCanvas { renderer: null; chartType: "donut" }
@@ -0,0 +1,58 @@
1
+ import QtQuick
2
+ import QtQuick.Controls as QQC
3
+ import "../../Theme"
4
+
5
+ QQC.SpinBox {
6
+ id: nativeDoubleSpinBox
7
+ required property var renderer
8
+
9
+ readonly property int decimalPlaces: Math.max(0, Math.min(9,
10
+ Number(renderer.prop("decimals", 2))))
11
+ readonly property real scaleFactor: Math.pow(10, decimalPlaces)
12
+ readonly property real realValue: value / scaleFactor
13
+
14
+ from: Math.round(Number(renderer.prop("minimum", 0)) * scaleFactor)
15
+ to: Math.round(Number(renderer.prop("maximum", 100)) * scaleFactor)
16
+ value: Math.round(Number(renderer.prop("value", from / scaleFactor)) * scaleFactor)
17
+ stepSize: Math.max(1, Math.round(Number(renderer.prop("step", 0.1)) * scaleFactor))
18
+ editable: renderer.prop("editable", true) !== false
19
+ wrap: renderer.prop("wrap", false) === true
20
+ enabled: renderer.prop("enabled", true) !== false
21
+ implicitWidth: Number(renderer.prop("width", 160))
22
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
23
+ font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
24
+ palette.text: renderer.prop("foreground", renderer.foreground)
25
+ palette.buttonText: renderer.prop("foreground", renderer.foreground)
26
+ palette.button: renderer.prop("background", Color.popups.background)
27
+ palette.highlight: renderer.prop("accent", Color.accent)
28
+
29
+ textFromValue: function(scaledValue, locale) {
30
+ return String(renderer.prop("prefix", ""))
31
+ + Number(scaledValue / scaleFactor).toLocaleString(locale, "f", decimalPlaces)
32
+ + String(renderer.prop("suffix", ""))
33
+ }
34
+
35
+ valueFromText: function(text, locale) {
36
+ var prefix = String(renderer.prop("prefix", ""))
37
+ var suffix = String(renderer.prop("suffix", ""))
38
+ var numeric = String(text)
39
+ if (prefix.length > 0 && numeric.indexOf(prefix) === 0)
40
+ numeric = numeric.slice(prefix.length)
41
+ if (suffix.length > 0 && numeric.lastIndexOf(suffix) === numeric.length - suffix.length)
42
+ numeric = numeric.slice(0, -suffix.length)
43
+ return Math.round(Number.fromLocaleString(locale, numeric) * scaleFactor)
44
+ }
45
+
46
+ onValueModified: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
47
+ "change", { value: realValue })
48
+ up.onPressedChanged: {
49
+ if (up.pressed)
50
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
51
+ "increase", { value: realValue })
52
+ }
53
+ down.onPressedChanged: {
54
+ if (down.pressed)
55
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
56
+ "decrease", { value: realValue })
57
+ }
58
+ }
@@ -0,0 +1,43 @@
1
+ import QtQuick
2
+
3
+ Item {
4
+ id: dragRoot
5
+ property var renderer: null
6
+ function cursorShape(name) { var value=String(name||"size_all");if(value==="arrow")return Qt.ArrowCursor;if(value==="pointing_hand")return Qt.PointingHandCursor;if(value==="open_hand")return Qt.OpenHandCursor;if(value==="closed_hand")return Qt.ClosedHandCursor;if(value==="horizontal")return Qt.SizeHorCursor;if(value==="vertical")return Qt.SizeVerCursor;return Qt.SizeAllCursor }
7
+ implicitWidth: Number(renderer ? renderer.prop("width", contentHost.childrenRect.width) : 120)
8
+ implicitHeight: Number(renderer ? renderer.prop("height", contentHost.childrenRect.height) : 80)
9
+ property int resetRevision: Number(renderer ? renderer.prop("reset_revision", 0) : 0)
10
+ onResetRevisionChanged: {
11
+ var item = nativeDrag.target
12
+ if (item) { item.x = 0; item.y = 0 }
13
+ }
14
+ Item { id: contentHost; anchors.fill: parent; Repeater { model: renderer ? (renderer.node.children || []) : []; delegate: renderer.childDelegateComponent } }
15
+ TapHandler {
16
+ id: nativeTap
17
+ enabled: renderer && renderer.prop("enabled", true) !== false
18
+ onTapped: function(point, button) {
19
+ if (renderer.subscribed("click")) renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "click", { x: point.position.x, y: point.position.y, button: button })
20
+ }
21
+ onDoubleTapped: function(point, button) {
22
+ if (renderer.subscribed("double_click")) renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "double_click", { x: point.position.x, y: point.position.y, button: button })
23
+ }
24
+ }
25
+ DragHandler {
26
+ id: nativeDrag
27
+ enabled: renderer && renderer.prop("enabled", true) !== false
28
+ target: { var id = renderer ? String(renderer.prop("target", "")) : ""; return id === "" ? contentHost : renderer.findRenderedItem(id) }
29
+ xAxis.enabled: !renderer || ["both", "horizontal", "x"].indexOf(String(renderer.prop("axis", "both"))) >= 0
30
+ yAxis.enabled: !renderer || ["both", "vertical", "y"].indexOf(String(renderer.prop("axis", "both"))) >= 0
31
+ xAxis.minimum: Number(renderer ? renderer.prop("minimum_x", -Infinity) : -Infinity); xAxis.maximum: Number(renderer ? renderer.prop("maximum_x", Infinity) : Infinity)
32
+ yAxis.minimum: Number(renderer ? renderer.prop("minimum_y", -Infinity) : -Infinity); yAxis.maximum: Number(renderer ? renderer.prop("maximum_y", Infinity) : Infinity)
33
+ dragThreshold: Number(renderer ? renderer.prop("threshold", 8) : 8)
34
+ cursorShape: dragRoot.cursorShape(renderer ? renderer.prop("cursor", "size_all") : "size_all")
35
+ onActiveChanged: {
36
+ var payload = { x: translation.x, y: translation.y, centroid_x: centroid.position.x, centroid_y: centroid.position.y }
37
+ if (!active && target) { var snapX=Number(renderer.prop("snap_x",0));var snapY=Number(renderer.prop("snap_y",0));if(snapX>0)target.x=Math.round(target.x/snapX)*snapX;if(snapY>0)target.y=Math.round(target.y/snapY)*snapY;payload.target_x=target.x;payload.target_y=target.y }
38
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, active ? "drag_start" : "drag_end", payload)
39
+ }
40
+ onTranslationChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "drag", { x: translation.x, y: translation.y, centroid_x: centroid.position.x, centroid_y: centroid.position.y })
41
+ onCanceled: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "cancel", {})
42
+ }
43
+ }
@@ -0,0 +1,107 @@
1
+ import QtQuick
2
+ import QtQuick.Controls as QQC
3
+ import "../../Theme"
4
+
5
+ QQC.Drawer {
6
+ id: drawerRoot
7
+
8
+ required property var renderer
9
+ readonly property bool requestedOpen: renderer.prop("opened", false) === true
10
+ && renderer.prop("visible", true) !== false
11
+ readonly property string contentLayout: String(renderer.prop("layout", "column"))
12
+ property bool synchronizing: false
13
+
14
+ function edgeValue(value) {
15
+ var name = String(value || "left")
16
+ if (name === "right") return Qt.RightEdge
17
+ if (name === "top") return Qt.TopEdge
18
+ if (name === "bottom") return Qt.BottomEdge
19
+ return Qt.LeftEdge
20
+ }
21
+
22
+ function closePolicyValue(value) {
23
+ var names = Array.isArray(value) ? value : [value || "escape_and_outside"]
24
+ var result = 0
25
+ for (var index = 0; index < names.length; index++) {
26
+ var name = String(names[index])
27
+ if (name === "none") continue
28
+ if (name === "escape" || name === "escape_and_outside") result |= QQC.Popup.CloseOnEscape
29
+ if (name === "outside" || name === "escape_and_outside") result |= QQC.Popup.CloseOnPressOutside
30
+ if (name === "outside_parent") result |= QQC.Popup.CloseOnPressOutsideParent
31
+ if (name === "release_outside") result |= QQC.Popup.CloseOnReleaseOutside
32
+ if (name === "release_outside_parent") result |= QQC.Popup.CloseOnReleaseOutsideParent
33
+ }
34
+ return result
35
+ }
36
+
37
+ function syncOpenState() {
38
+ if (requestedOpen === opened) return
39
+ synchronizing = true
40
+ if (requestedOpen) open()
41
+ else close()
42
+ synchronizing = false
43
+ }
44
+
45
+ edge: edgeValue(renderer.prop("edge", "left"))
46
+ modal: renderer.prop("modal", true) !== false
47
+ dim: renderer.prop("dim", modal) !== false
48
+ interactive: renderer.prop("interactive", true) !== false
49
+ dragMargin: Number(renderer.prop("drag_margin", Qt.styleHints.startDragDistance))
50
+ closePolicy: closePolicyValue(renderer.prop("close_policy", "escape_and_outside"))
51
+ width: Number(renderer.prop("width", edge === Qt.LeftEdge || edge === Qt.RightEdge ? 360 : 640))
52
+ height: Number(renderer.prop("height", edge === Qt.TopEdge || edge === Qt.BottomEdge ? 280 : 640))
53
+ enabled: renderer.prop("enabled", true) !== false
54
+ padding: Number(renderer.prop("padding", Style.spacing.lg))
55
+
56
+ background: Rectangle {
57
+ color: renderer.prop("background", Color.background)
58
+ radius: Number(renderer.prop("radius", Style.cornerRadius))
59
+ border.width: String(renderer.prop("border_color", "")).length > 0 ? Style.normalBorderWidth : 0
60
+ border.color: renderer.prop("border_color", "transparent")
61
+ }
62
+
63
+ contentItem: Loader {
64
+ sourceComponent: drawerRoot.contentLayout === "row" ? rowContent
65
+ : (drawerRoot.contentLayout === "stack" ? stackContent : columnContent)
66
+ }
67
+
68
+ Component {
69
+ id: columnContent
70
+ Column {
71
+ spacing: Number(renderer.prop("spacing", Style.spacing.md))
72
+ Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent }
73
+ }
74
+ }
75
+
76
+ Component {
77
+ id: rowContent
78
+ Row {
79
+ spacing: Number(renderer.prop("spacing", Style.spacing.md))
80
+ Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent }
81
+ }
82
+ }
83
+
84
+ Component {
85
+ id: stackContent
86
+ Item {
87
+ Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent }
88
+ }
89
+ }
90
+
91
+ Component.onCompleted: syncOpenState()
92
+ onRequestedOpenChanged: syncOpenState()
93
+ onOpened: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "open",
94
+ { value: true, position: position })
95
+ onClosed: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "close",
96
+ { value: false, position: position })
97
+ onAboutToShow: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "about_to_show", {})
98
+ onAboutToHide: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "about_to_hide", {})
99
+ onPositionChanged: {
100
+ if (renderer.subscribed("position_change"))
101
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "position_change", { value: position })
102
+ }
103
+ onVisibleChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
104
+ visible ? "show" : "hide", {})
105
+ onActiveFocusChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
106
+ activeFocus ? "focus" : "blur", {})
107
+ }
@@ -0,0 +1,19 @@
1
+ import QtQuick
2
+
3
+ Item {
4
+ id: dropRoot
5
+ property var renderer: null
6
+ implicitWidth: Number(renderer ? renderer.prop("width", contentHost.childrenRect.width) : 160)
7
+ implicitHeight: Number(renderer ? renderer.prop("height", contentHost.childrenRect.height) : 100)
8
+ Item { id: contentHost; anchors.fill: parent; Repeater { model: renderer ? (renderer.node.children || []) : []; delegate: renderer.childDelegateComponent } }
9
+ DropArea {
10
+ anchors.fill: parent
11
+ enabled: renderer && renderer.prop("enabled", true) !== false
12
+ keys: renderer ? renderer.prop("keys", []) : []
13
+ function payload(drag) { return { x: drag.x, y: drag.y, keys: drag.keys, formats: drag.formats, text: drag.hasText ? drag.text : null, urls: drag.hasUrls ? drag.urls.map(String) : [] } }
14
+ onEntered: function(drag) { renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "enter", payload(drag)) }
15
+ onPositionChanged: function(drag) { renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "move", payload(drag)) }
16
+ onExited: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "exit", {})
17
+ onDropped: function(drop) { renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "drop", payload(drop)); drop.acceptProposedAction() }
18
+ }
19
+ }
@@ -0,0 +1,16 @@
1
+ import QtQuick
2
+ import QtQuick.Effects
3
+
4
+ Item {
5
+ required property var renderer
6
+ implicitWidth: Number(renderer.prop("width", 240)); implicitHeight: Number(renderer.prop("height", 160))
7
+ Item { id: sourceHost; anchors.fill: parent; Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent } }
8
+ ShaderEffectSource { id: sourceTexture; anchors.fill: parent; sourceItem: sourceHost; hideSource: true; visible: false }
9
+ MultiEffect {
10
+ anchors.fill: parent; source: sourceTexture; shadowEnabled: true
11
+ shadowBlur: Number(renderer.prop("blur", 1)); blurMax: Number(renderer.prop("maximum", 32)); blurMultiplier: Number(renderer.prop("multiplier", 1))
12
+ shadowHorizontalOffset: Number(renderer.prop("horizontal_offset", 0)); shadowVerticalOffset: Number(renderer.prop("vertical_offset", 4))
13
+ shadowColor: renderer.prop("color", "black"); shadowOpacity: Number(renderer.prop("opacity", 0.6)); shadowScale: Number(renderer.prop("scale", 1))
14
+ autoPaddingEnabled: renderer.prop("auto_padding", true) !== false
15
+ }
16
+ }
@@ -0,0 +1,19 @@
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.Dropdown {
10
+ required property var renderer
11
+ label: renderer.escapeAutoText(renderer.prop("label", "")); value: String(renderer.prop("value", "")); options: renderer.prop("options", [])
12
+ width: Number(renderer.prop("width", 240)); foreground: renderer.prop("foreground", renderer.foreground)
13
+ background: renderer.prop("background", Color.popups.background); popupBorder: renderer.prop("popup_border", Color.popups.border)
14
+ accent: renderer.prop("accent", Color.accent); fontFamily: String(renderer.prop("font_family", renderer.fontFamily))
15
+ rowHeight: Number(renderer.prop("row_height", Style.spacing.controlHeight)); popupRowHeight: Number(renderer.prop("popup_row_height", Style.spacing.popupRowHeight))
16
+ showLabel: renderer.prop("show_label", true) !== false; hasCursor: renderer.prop("cursor", false) === true
17
+ onChanged: function(value) { renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "change", { value: value }) }
18
+ onOptionHovered: function(value) { renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "hover", { value: value }) }
19
+ }