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,157 @@
1
+ import QtQuick
2
+ import QtQuick.Controls as QQC
3
+ import "../../Theme"
4
+
5
+ QQC.Control {
6
+ id: panelRoot
7
+
8
+ required property var renderer
9
+ readonly property bool requestedExpanded: renderer.prop("expanded", false) === true
10
+ readonly property real headerHeight: Number(renderer.prop("header_height", 64))
11
+ readonly property real contentNaturalHeight: contentColumn.implicitHeight
12
+ + Number(renderer.prop("padding", Style.spacing.lg)) * 2
13
+ property bool expanded: false
14
+ property bool synchronizing: false
15
+
16
+ function syncExpanded() {
17
+ if (expanded === requestedExpanded) return
18
+ synchronizing = true
19
+ expanded = requestedExpanded
20
+ synchronizing = false
21
+ }
22
+
23
+ function activate() {
24
+ if (!enabled) return
25
+ expanded = !expanded
26
+ var payload = { value: expanded, expanded: expanded }
27
+ if (renderer.subscribed("toggle"))
28
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "toggle", payload)
29
+ if (renderer.subscribed("change"))
30
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "change", payload)
31
+ var direction = expanded ? "expand" : "collapse"
32
+ if (renderer.subscribed(direction))
33
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, direction, payload)
34
+ }
35
+
36
+ implicitWidth: Number(renderer.prop("width", 560))
37
+ implicitHeight: renderer.prop("height", null) === null
38
+ ? headerHeight + (expanded ? contentNaturalHeight : 0)
39
+ : Number(renderer.prop("height", headerHeight + contentNaturalHeight))
40
+ enabled: renderer.prop("enabled", true) !== false
41
+ visible: renderer.prop("visible", true) !== false
42
+
43
+ background: Rectangle {
44
+ color: panelRoot.expanded
45
+ ? renderer.prop("expanded_background", renderer.prop("background", Color.background))
46
+ : renderer.prop("background", Color.background)
47
+ radius: Number(renderer.prop("radius", Style.cornerRadius))
48
+ border.width: String(renderer.prop("border_color", "")).length > 0 ? Style.normalBorderWidth : 0
49
+ border.color: renderer.prop("border_color", "transparent")
50
+ }
51
+
52
+ contentItem: Item {
53
+ QQC.ToolButton {
54
+ id: headerButton
55
+ anchors.left: parent.left
56
+ anchors.right: parent.right
57
+ anchors.top: parent.top
58
+ height: panelRoot.headerHeight
59
+ enabled: panelRoot.enabled
60
+ hoverEnabled: true
61
+ onClicked: panelRoot.activate()
62
+
63
+ contentItem: Item {
64
+ Text {
65
+ id: titleText
66
+ anchors.left: parent.left
67
+ anchors.right: indicator.left
68
+ anchors.top: String(renderer.prop("subtitle", "")).length > 0
69
+ ? parent.top : undefined
70
+ anchors.verticalCenter: String(renderer.prop("subtitle", "")).length === 0
71
+ ? parent.verticalCenter : undefined
72
+ text: String(renderer.prop("title", ""))
73
+ color: renderer.prop("foreground", renderer.foreground)
74
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
75
+ font.pixelSize: Number(renderer.prop("title_size",
76
+ renderer.prop("font_size", Style.font.body)))
77
+ font.bold: true
78
+ elide: Text.ElideRight
79
+ }
80
+
81
+ Text {
82
+ anchors.left: parent.left
83
+ anchors.right: indicator.left
84
+ anchors.top: titleText.bottom
85
+ text: String(renderer.prop("subtitle", ""))
86
+ visible: text.length > 0
87
+ color: renderer.prop("muted", Color.muted)
88
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
89
+ font.pixelSize: Number(renderer.prop("subtitle_size", Style.font.caption))
90
+ elide: Text.ElideRight
91
+ }
92
+
93
+ Text {
94
+ id: indicator
95
+ anchors.right: parent.right
96
+ anchors.verticalCenter: parent.verticalCenter
97
+ text: renderer.iconGlyph("chevron_down")
98
+ color: renderer.prop("accent", Color.accent)
99
+ font.family: renderer.fontFamily
100
+ font.pixelSize: Number(renderer.prop("indicator_size", Style.font.icon))
101
+ rotation: panelRoot.expanded ? 180 : 0
102
+ Behavior on rotation {
103
+ enabled: renderer.prop("animated", true) !== false
104
+ NumberAnimation {
105
+ duration: Number(renderer.prop("duration", 200))
106
+ easing.type: renderer.easingType(renderer.prop("easing", "in_out_quad"))
107
+ }
108
+ }
109
+ }
110
+ }
111
+
112
+ background: Rectangle {
113
+ color: renderer.prop("header_background", "transparent")
114
+ radius: Number(renderer.prop("radius", Style.cornerRadius))
115
+ }
116
+ }
117
+
118
+ Item {
119
+ id: revealedContent
120
+ anchors.left: parent.left
121
+ anchors.right: parent.right
122
+ anchors.top: headerButton.bottom
123
+ height: panelRoot.expanded ? panelRoot.contentNaturalHeight : 0
124
+ clip: true
125
+ opacity: panelRoot.expanded ? 1 : 0
126
+
127
+ Behavior on height {
128
+ enabled: renderer.prop("animated", true) !== false
129
+ NumberAnimation {
130
+ duration: Number(renderer.prop("duration", 200))
131
+ easing.type: renderer.easingType(renderer.prop("easing", "in_out_quad"))
132
+ }
133
+ }
134
+ Behavior on opacity {
135
+ enabled: renderer.prop("animated", true) !== false
136
+ NumberAnimation { duration: Number(renderer.prop("duration", 120)) }
137
+ }
138
+
139
+ Column {
140
+ id: contentColumn
141
+ anchors.left: parent.left
142
+ anchors.right: parent.right
143
+ anchors.top: parent.top
144
+ anchors.margins: Number(renderer.prop("padding", Style.spacing.lg))
145
+ spacing: Number(renderer.prop("spacing", Style.spacing.md))
146
+ Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent }
147
+ }
148
+ }
149
+ }
150
+
151
+ onRequestedExpandedChanged: syncExpanded()
152
+ Component.onCompleted: syncExpanded()
153
+ onVisibleChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
154
+ visible ? "show" : "hide", {})
155
+ onActiveFocusChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
156
+ activeFocus ? "focus" : "blur", {})
157
+ }
@@ -0,0 +1,140 @@
1
+ import QtQuick
2
+ import QtQuick.Controls as QQC
3
+ import QtQuick.Dialogs
4
+ import "../../Theme"
5
+
6
+ QQC.Button {
7
+ id: picker
8
+
9
+ required property var renderer
10
+ readonly property string mode: String(renderer.prop("mode", "open"))
11
+ readonly property bool folderMode: mode === "folder" || mode === "directory"
12
+
13
+ function fileUrl(path) {
14
+ var value = String(path || "")
15
+ if (!value.length) return ""
16
+ if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(value)) return value
17
+ return "file://" + encodeURI(value.charAt(0) === "/" ? value : "/" + value)
18
+ }
19
+
20
+ function localPath(url) {
21
+ var value = String(url || "")
22
+ if (value.indexOf("file://") === 0) value = value.substring(7)
23
+ return decodeURIComponent(value)
24
+ }
25
+
26
+ function selectedPaths() {
27
+ var paths = renderer.prop("paths", [])
28
+ if (Array.isArray(paths) && paths.length) return paths
29
+ var path = String(renderer.prop("path", ""))
30
+ return path.length ? [path] : []
31
+ }
32
+
33
+ function displayText() {
34
+ var paths = selectedPaths()
35
+ if (!paths.length) return String(renderer.prop("placeholder", folderMode ? "Choose a folder" : "Choose a file"))
36
+ if (paths.length > 1) return paths.length + " files"
37
+ var parts = String(paths[0]).split("/")
38
+ return parts[parts.length - 1] || String(paths[0])
39
+ }
40
+
41
+ function emitSelection(paths) {
42
+ var multiple = renderer.prop("multiple", false) === true
43
+ var payload = multiple ? { values: paths, value: paths.length ? paths[0] : "" }
44
+ : { value: paths.length ? paths[0] : "" }
45
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "input", payload)
46
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "change", payload)
47
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "accept", payload)
48
+ }
49
+
50
+ implicitWidth: Number(renderer.prop("width", 240))
51
+ implicitHeight: Number(renderer.prop("height", 40))
52
+ enabled: renderer.prop("enabled", true) !== false
53
+ onClicked: folderMode ? folderDialog.open() : fileDialog.open()
54
+
55
+ background: Rectangle {
56
+ color: renderer.prop("background", Color.popups.background)
57
+ radius: Number(renderer.prop("radius", Style.cornerRadius))
58
+ border.width: Style.normalBorderWidth
59
+ border.color: picker.activeFocus
60
+ ? renderer.prop("accent", Color.accent)
61
+ : renderer.prop("border_color", renderer.foreground)
62
+ opacity: picker.down ? 0.72 : 1
63
+ }
64
+
65
+ contentItem: Row {
66
+ spacing: Style.spacing.controlGap
67
+ Text {
68
+ anchors.verticalCenter: parent.verticalCenter
69
+ text: String(renderer.prop("label", ""))
70
+ visible: text.length > 0
71
+ color: renderer.prop("muted", Color.muted)
72
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
73
+ font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
74
+ }
75
+ Text {
76
+ anchors.verticalCenter: parent.verticalCenter
77
+ width: Math.max(0, picker.availableWidth - x)
78
+ text: picker.displayText()
79
+ elide: Text.ElideMiddle
80
+ color: renderer.prop("foreground", renderer.foreground)
81
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
82
+ font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
83
+ }
84
+ }
85
+
86
+ FileDialog {
87
+ id: fileDialog
88
+ title: String(renderer.prop("title", mode === "save" ? "Save file" : "Choose file"))
89
+ fileMode: mode === "save" ? FileDialog.SaveFile
90
+ : (renderer.prop("multiple", false) === true ? FileDialog.OpenFiles : FileDialog.OpenFile)
91
+ currentFile: picker.fileUrl(renderer.prop("path", ""))
92
+ currentFiles: {
93
+ var result = []
94
+ var paths = renderer.prop("paths", [])
95
+ if (Array.isArray(paths)) for (var index = 0; index < paths.length; index++) result.push(picker.fileUrl(paths[index]))
96
+ return result
97
+ }
98
+ currentFolder: picker.fileUrl(renderer.prop("current_folder", ""))
99
+ nameFilters: renderer.prop("filters", [])
100
+ defaultSuffix: String(renderer.prop("default_suffix", ""))
101
+ acceptLabel: String(renderer.prop("accept_text", ""))
102
+ rejectLabel: String(renderer.prop("cancel_text", ""))
103
+ visible: !folderMode && renderer.prop("opened", false) === true
104
+ options: renderer.prop("native_dialog", true) === false ? FileDialog.DontUseNativeDialog : 0
105
+
106
+ onAccepted: {
107
+ var paths = []
108
+ for (var index = 0; index < selectedFiles.length; index++) paths.push(picker.localPath(selectedFiles[index]))
109
+ if (!paths.length && String(selectedFile).length) paths.push(picker.localPath(selectedFile))
110
+ picker.emitSelection(paths)
111
+ }
112
+ onRejected: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "reject", {})
113
+ onVisibleChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
114
+ visible ? "open" : "close", {})
115
+ onCurrentFolderChanged: {
116
+ var value = picker.localPath(currentFolder)
117
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "folder_change", { value: value })
118
+ }
119
+ }
120
+
121
+ FolderDialog {
122
+ id: folderDialog
123
+ title: String(renderer.prop("title", "Choose folder"))
124
+ currentFolder: picker.fileUrl(renderer.prop("current_folder", renderer.prop("path", "")))
125
+ selectedFolder: picker.fileUrl(renderer.prop("path", ""))
126
+ acceptLabel: String(renderer.prop("accept_text", ""))
127
+ rejectLabel: String(renderer.prop("cancel_text", ""))
128
+ visible: folderMode && renderer.prop("opened", false) === true
129
+ options: renderer.prop("native_dialog", true) === false ? FolderDialog.DontUseNativeDialog : 0
130
+
131
+ onAccepted: picker.emitSelection([picker.localPath(selectedFolder)])
132
+ onRejected: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "reject", {})
133
+ onVisibleChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
134
+ visible ? "open" : "close", {})
135
+ onCurrentFolderChanged: {
136
+ var value = picker.localPath(currentFolder)
137
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "folder_change", { value: value })
138
+ }
139
+ }
140
+ }
@@ -0,0 +1,40 @@
1
+ import QtQuick
2
+ import QtQuick.Controls as QQC
3
+ import QtQuick.Layouts
4
+ import QtMultimedia
5
+ import QtQuick.VectorImage
6
+ import "../../Theme"
7
+ import "../../Controls" as ZuiControls
8
+
9
+ Item {
10
+ required property var renderer
11
+ implicitWidth: Number(renderer.prop("width", fittedContent.implicitWidth))
12
+ implicitHeight: Number(renderer.prop("height", fittedContent.implicitHeight))
13
+ clip: renderer.prop("clip", true) !== false
14
+
15
+ readonly property real sourceWidth: Math.max(0.000001, fittedContent.implicitWidth)
16
+ readonly property real sourceHeight: Math.max(0.000001, fittedContent.implicitHeight)
17
+ readonly property real availableXScale: width / sourceWidth
18
+ readonly property real availableYScale: height / sourceHeight
19
+ readonly property string fitMode: String(renderer.prop("fit", "contain"))
20
+ readonly property real fittedXScale: fitMode === "fill" ? availableXScale
21
+ : (fitMode === "none" ? 1
22
+ : (fitMode === "cover" ? Math.max(availableXScale, availableYScale)
23
+ : (fitMode === "scale_down" ? Math.min(1, Math.min(availableXScale, availableYScale))
24
+ : Math.min(availableXScale, availableYScale))))
25
+ readonly property real fittedYScale: fitMode === "fill" ? availableYScale : fittedXScale
26
+ readonly property string contentAlignment: String(renderer.prop("alignment", "center"))
27
+
28
+ Item {
29
+ id: fittedContent
30
+ implicitWidth: childrenRect.width
31
+ implicitHeight: childrenRect.height
32
+ x: contentAlignment.indexOf("left") >= 0 || contentAlignment === "start" ? 0
33
+ : (contentAlignment.indexOf("right") >= 0 || contentAlignment === "end" ? parent.width - implicitWidth * fittedXScale : (parent.width - implicitWidth * fittedXScale) / 2)
34
+ y: contentAlignment.indexOf("top") >= 0 || contentAlignment === "start" ? 0
35
+ : (contentAlignment.indexOf("bottom") >= 0 || contentAlignment === "end" ? parent.height - implicitHeight * fittedYScale : (parent.height - implicitHeight * fittedYScale) / 2)
36
+ transformOrigin: Item.TopLeft
37
+ transform: Scale { xScale: fittedXScale; yScale: fittedYScale }
38
+ Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent }
39
+ }
40
+ }
@@ -0,0 +1,40 @@
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
+ Flickable {
10
+ required property var renderer
11
+ implicitWidth: Number(renderer.prop("width", 320))
12
+ implicitHeight: Number(renderer.prop("height", 240))
13
+ contentWidth: Number(renderer.prop("content_width", flickContent.implicitWidth))
14
+ contentHeight: Number(renderer.prop("content_height", flickContent.implicitHeight))
15
+ flickableDirection: {
16
+ var direction = String(renderer.prop("direction", "vertical"))
17
+ if (direction === "horizontal") return Flickable.HorizontalFlick
18
+ if (direction === "both") return Flickable.HorizontalAndVerticalFlick
19
+ if (direction === "auto") return Flickable.AutoFlickDirection
20
+ return Flickable.VerticalFlick
21
+ }
22
+ boundsBehavior: String(renderer.prop("bounds_behavior", "stop")) === "overshoot"
23
+ ? Flickable.DragAndOvershootBounds : Flickable.StopAtBounds
24
+ interactive: renderer.prop("interactive", true) !== false
25
+ clip: renderer.prop("clip", true) !== false
26
+ function positionPayload() { return { x: contentX, y: contentY } }
27
+ onContentXChanged: {
28
+ if (renderer.subscribed("scroll")) renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "scroll", positionPayload())
29
+ }
30
+ onContentYChanged: {
31
+ if (renderer.subscribed("scroll")) renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "scroll", positionPayload())
32
+ }
33
+ onMovementStarted: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "flick_start", positionPayload())
34
+ onMovementEnded: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "flick_end", positionPayload())
35
+ Column {
36
+ id: flickContent
37
+ spacing: Style.spacing.panelGap
38
+ Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent }
39
+ }
40
+ }
@@ -0,0 +1,45 @@
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
+ Flipable {
10
+ required property var renderer
11
+ id: nativeFlipable
12
+ implicitWidth: Number(renderer.prop("width", Math.max(frontFace.implicitWidth, backFace.implicitWidth)))
13
+ implicitHeight: Number(renderer.prop("height", Math.max(frontFace.implicitHeight, backFace.implicitHeight)))
14
+ readonly property bool flipped: renderer.prop("flipped", false) === true
15
+ readonly property bool verticalAxis: String(renderer.prop("axis", "vertical")) === "vertical"
16
+ front: Loader {
17
+ id: frontFace
18
+ source: renderer.node && renderer.node.children && renderer.node.children.length > 0 ? Qt.resolvedUrl("../../ControlNode.qml") : ""
19
+ onLoaded: renderer.configureFace(item, renderer.node.children[0])
20
+ }
21
+ back: Loader {
22
+ id: backFace
23
+ source: renderer.node && renderer.node.children && renderer.node.children.length > 1 ? Qt.resolvedUrl("../../ControlNode.qml") : ""
24
+ onLoaded: renderer.configureFace(item, renderer.node.children[1])
25
+ }
26
+ transform: Rotation {
27
+ id: flipRotation
28
+ origin.x: nativeFlipable.width / 2
29
+ origin.y: nativeFlipable.height / 2
30
+ axis.x: nativeFlipable.verticalAxis ? 0 : 1
31
+ axis.y: nativeFlipable.verticalAxis ? 1 : 0
32
+ axis.z: 0
33
+ angle: nativeFlipable.flipped ? 180 : 0
34
+ Behavior on angle {
35
+ NumberAnimation {
36
+ duration: Number(renderer.prop("duration", 300))
37
+ easing.type: renderer.easingType(renderer.prop("easing", "in_out_quad"))
38
+ }
39
+ }
40
+ }
41
+ TapHandler {
42
+ enabled: renderer.prop("interactive", false) === true
43
+ onTapped: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "change", { value: !nativeFlipable.flipped })
44
+ }
45
+ }
@@ -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
+ Flow {
10
+ required property var renderer
11
+ width: Number(renderer.prop("width", 420))
12
+ height: renderer.prop("height", null) === null ? childrenRect.height : Number(renderer.prop("height", childrenRect.height))
13
+ spacing: Number(renderer.prop("spacing", Style.spacing.controlGap))
14
+ flow: String(renderer.prop("orientation", "horizontal")) === "vertical" ? Flow.TopToBottom : Flow.LeftToRight
15
+ Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent }
16
+ }
@@ -0,0 +1,29 @@
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
+ FocusScope {
10
+ required property var renderer
11
+ id: nativeFocusScope
12
+ implicitWidth: Number(renderer.prop("width", focusContent.implicitWidth))
13
+ implicitHeight: Number(renderer.prop("height", focusContent.implicitHeight))
14
+ focus: renderer.prop("focus", false) === true
15
+ function syncRequestedFocus() {
16
+ if (renderer.prop("active_focus", false) === true) forceActiveFocus()
17
+ }
18
+ onActiveFocusChanged: {
19
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, activeFocus ? "focus" : "blur", { value: activeFocus })
20
+ }
21
+ Component.onCompleted: syncRequestedFocus()
22
+ Connections { target: root; function onNodeChanged() { nativeFocusScope.syncRequestedFocus() } }
23
+ Item {
24
+ id: focusContent
25
+ implicitWidth: childrenRect.width
26
+ implicitHeight: childrenRect.height
27
+ Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent }
28
+ }
29
+ }
@@ -0,0 +1,9 @@
1
+ import QtQuick
2
+ import Qt.labs.folderlistmodel
3
+
4
+ Item {
5
+ id:folderRoot;property var renderer:null;property alias model:nativeModel
6
+ function sortField(){var value=String(renderer?renderer.prop("sort_field","name"):"name");if(value==="time")return FolderListModel.Time;if(value==="size")return FolderListModel.Size;if(value==="type")return FolderListModel.Type;if(value==="unsorted")return FolderListModel.Unsorted;return FolderListModel.Name}
7
+ function entries(){var result=[];for(var i=0;i<nativeModel.count;i++)result.push({name:nativeModel.get(i,"fileName"),base_name:nativeModel.get(i,"fileBaseName"),url:String(nativeModel.get(i,"fileUrl")),path:nativeModel.get(i,"filePath"),size:nativeModel.get(i,"fileSize"),modified:String(nativeModel.get(i,"fileModified")),is_dir:nativeModel.get(i,"fileIsDir")});return result}
8
+ FolderListModel{id:nativeModel;folder:renderer?renderer.assetUrl(renderer.prop("folder","")):"";rootFolder:renderer?renderer.assetUrl(renderer.prop("root_folder","")):"";nameFilters:renderer?renderer.prop("name_filters",[]):[];showFiles:!renderer||renderer.prop("show_files",true)!==false;showDirs:!renderer||renderer.prop("show_dirs",true)!==false;showDirsFirst:!renderer||renderer.prop("show_dirs_first",true)!==false;showDotAndDotDot:renderer&&renderer.prop("show_dot_and_dot_dot",false)===true;showHidden:renderer&&renderer.prop("show_hidden",false)===true;showOnlyReadable:!renderer||renderer.prop("show_only_readable",true)!==false;sortField:folderRoot.sortField();sortReversed:renderer&&renderer.prop("sort_reversed",false)===true;caseSensitive:renderer&&renderer.prop("case_sensitive",false)===true;onCountChanged:if(renderer){renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,"count_change",{value:count});renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,"change",{values:folderRoot.entries()})} onFolderChanged:if(renderer)renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,"folder_change",{value:String(folder),parent:String(parentFolder)});onStatusChanged:if(renderer)renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,"status",{value:status})}
9
+ }
@@ -0,0 +1,93 @@
1
+ import QtQuick
2
+ import QtQuick.Controls as QQC
3
+ import QtQuick.Dialogs
4
+ import "../../Theme"
5
+
6
+ QQC.Button {
7
+ id: picker
8
+
9
+ required property var renderer
10
+
11
+ function folderUrl(path) {
12
+ var value = String(path || "")
13
+ if (!value.length) return ""
14
+ if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(value)) return value
15
+ return "file://" + encodeURI(value.charAt(0) === "/" ? value : "/" + value)
16
+ }
17
+
18
+ function localPath(url) {
19
+ var value = String(url || "")
20
+ if (value.indexOf("file://") === 0) value = value.substring(7)
21
+ return decodeURIComponent(value)
22
+ }
23
+
24
+ function displayText() {
25
+ var path = String(renderer.prop("path", ""))
26
+ if (!path.length) return String(renderer.prop("placeholder", "Choose a folder"))
27
+ var parts = path.split("/")
28
+ return parts[parts.length - 1] || path
29
+ }
30
+
31
+ function emitSelection(path) {
32
+ var payload = { value: path }
33
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "input", payload)
34
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "change", payload)
35
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "accept", payload)
36
+ }
37
+
38
+ implicitWidth: Number(renderer.prop("width", 240))
39
+ implicitHeight: Number(renderer.prop("height", 40))
40
+ enabled: renderer.prop("enabled", true) !== false
41
+ onClicked: folderDialog.open()
42
+
43
+ background: Rectangle {
44
+ color: renderer.prop("background", Color.popups.background)
45
+ radius: Number(renderer.prop("radius", Style.cornerRadius))
46
+ border.width: Style.normalBorderWidth
47
+ border.color: picker.activeFocus
48
+ ? renderer.prop("accent", Color.accent)
49
+ : renderer.prop("border_color", renderer.foreground)
50
+ opacity: picker.down ? 0.72 : 1
51
+ }
52
+
53
+ contentItem: Row {
54
+ spacing: Style.spacing.controlGap
55
+ Text {
56
+ anchors.verticalCenter: parent.verticalCenter
57
+ text: String(renderer.prop("label", ""))
58
+ visible: text.length > 0
59
+ color: renderer.prop("muted", Color.muted)
60
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
61
+ font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
62
+ }
63
+ Text {
64
+ anchors.verticalCenter: parent.verticalCenter
65
+ width: Math.max(0, picker.availableWidth - x)
66
+ text: picker.displayText()
67
+ elide: Text.ElideMiddle
68
+ color: renderer.prop("foreground", renderer.foreground)
69
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
70
+ font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
71
+ }
72
+ }
73
+
74
+ FolderDialog {
75
+ id: folderDialog
76
+ title: String(renderer.prop("title", "Choose folder"))
77
+ currentFolder: picker.folderUrl(renderer.prop("current_folder", renderer.prop("path", "")))
78
+ selectedFolder: picker.folderUrl(renderer.prop("path", ""))
79
+ acceptLabel: String(renderer.prop("accept_text", ""))
80
+ rejectLabel: String(renderer.prop("cancel_text", ""))
81
+ visible: renderer.prop("opened", false) === true
82
+ options: renderer.prop("native_dialog", true) === false ? FolderDialog.DontUseNativeDialog : 0
83
+
84
+ onAccepted: picker.emitSelection(picker.localPath(selectedFolder))
85
+ onRejected: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "reject", {})
86
+ onVisibleChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
87
+ visible ? "open" : "close", {})
88
+ onCurrentFolderChanged: {
89
+ var value = picker.localPath(currentFolder)
90
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "folder_change", { value: value })
91
+ }
92
+ }
93
+ }
@@ -0,0 +1,21 @@
1
+ import QtQuick
2
+ import QtQuick.Controls as QQC
3
+ import QtQuick.Layouts
4
+ import QtMultimedia
5
+ import QtQuick.VectorImage
6
+ import "../../Theme"
7
+ import "../../Controls" as ZuiControls
8
+
9
+ Item {
10
+ required property var renderer
11
+ implicitWidth: 0
12
+ implicitHeight: 0
13
+ FontLoader {
14
+ source: String(renderer.prop("source", ""))
15
+ onStatusChanged: {
16
+ if (renderer.subscribed("status")) renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "status", { value: status, name: name })
17
+ if (status === FontLoader.Ready && renderer.subscribed("loaded")) renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "loaded", { name: name })
18
+ if (status === FontLoader.Error) renderer.componentError("font_load_failed", "Unable to load the declared font", { source: String(source) })
19
+ }
20
+ }
21
+ }