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,388 @@
1
+ import QtQuick
2
+ import QtQuick.Controls as QQC
3
+ import QtQml.Models
4
+ import "../../Theme"
5
+
6
+ Rectangle {
7
+ id: tableRoot
8
+
9
+ required property var renderer
10
+ readonly property var sourceRows: renderer.prop("rows", [])
11
+ readonly property var requestedColumns: renderer.prop("columns", [])
12
+ readonly property var effectiveColumns: inferColumns()
13
+ readonly property real tablePadding: Number(renderer.prop("padding", 0))
14
+ property var tableModel: null
15
+
16
+ function inferColumns() {
17
+ if (requestedColumns && requestedColumns.length > 0) return requestedColumns
18
+ if (!sourceRows || sourceRows.length === 0) return []
19
+ var first = sourceRows[0]
20
+ if (Array.isArray(first)) {
21
+ var arrayColumns = []
22
+ for (var index = 0; index < first.length; index++) arrayColumns.push(String(index + 1))
23
+ return arrayColumns
24
+ }
25
+ if (first !== null && typeof first === "object") return Object.keys(first)
26
+ return ["Value"]
27
+ }
28
+
29
+ function columnProperty(column, name, fallback) {
30
+ if (column !== null && typeof column === "object" && !Array.isArray(column)) {
31
+ var value = column[name]
32
+ return value === undefined || value === null ? fallback : value
33
+ }
34
+ return fallback
35
+ }
36
+
37
+ function columnKey(index) {
38
+ var column = effectiveColumns[index]
39
+ if (column !== null && typeof column === "object" && !Array.isArray(column))
40
+ return String(column.key === undefined ? (column.field === undefined ? index : column.field) : column.key)
41
+ if (Array.isArray(sourceRows[0])) return index
42
+ return String(column)
43
+ }
44
+
45
+ function columnLabel(index) {
46
+ var column = effectiveColumns[index]
47
+ if (column !== null && typeof column === "object" && !Array.isArray(column))
48
+ return String(column.label === undefined ? columnKey(index) : column.label)
49
+ return String(column)
50
+ }
51
+
52
+ function columnWidth(index) {
53
+ return Number(columnProperty(effectiveColumns[index], "width",
54
+ renderer.prop("column_width", 160)))
55
+ }
56
+
57
+ function columnAlignment(index) {
58
+ var name = String(columnProperty(effectiveColumns[index], "alignment", "left"))
59
+ if (name === "center") return Text.AlignHCenter
60
+ if (name === "right" || name === "end") return Text.AlignRight
61
+ return Text.AlignLeft
62
+ }
63
+
64
+ function columnEditable(index) {
65
+ return renderer.prop("editable", false) === true
66
+ && columnProperty(effectiveColumns[index], "editable", true) !== false
67
+ }
68
+
69
+ function cellValue(row, column) {
70
+ if (row < 0 || row >= sourceRows.length) return null
71
+ var rowData = sourceRows[row]
72
+ if (Array.isArray(rowData)) return rowData[column]
73
+ if (rowData !== null && typeof rowData === "object") return rowData[columnKey(column)]
74
+ return column === 0 ? rowData : null
75
+ }
76
+
77
+ function normalizedRows() {
78
+ var normalized = []
79
+ for (var row = 0; row < sourceRows.length; row++) {
80
+ var item = {}
81
+ for (var column = 0; column < effectiveColumns.length; column++)
82
+ item["_c" + column] = cellValue(row, column)
83
+ normalized.push(item)
84
+ }
85
+ return normalized
86
+ }
87
+
88
+ function modelSource() {
89
+ var source = "import Qt.labs.qmlmodels 1.0\nTableModel {\n"
90
+ for (var column = 0; column < effectiveColumns.length; column++) {
91
+ source += " TableModelColumn { display: \"_c" + column
92
+ + "\"; edit: \"_c" + column + "\" }\n"
93
+ }
94
+ return source + "}"
95
+ }
96
+
97
+ function rebuildModel() {
98
+ var previous = tableModel
99
+ tableModel = null
100
+ if (previous) previous.destroy()
101
+ if (effectiveColumns.length === 0) return
102
+ var created = Qt.createQmlObject(modelSource(), tableRoot, "ZuiDynamicTableModel")
103
+ created.rows = normalizedRows()
104
+ tableModel = created
105
+ Qt.callLater(syncSelection)
106
+ }
107
+
108
+ function syncRows() {
109
+ if (!tableModel) {
110
+ rebuildModel()
111
+ return
112
+ }
113
+ tableModel.rows = normalizedRows()
114
+ Qt.callLater(syncSelection)
115
+ }
116
+
117
+ function syncSelection() {
118
+ if (!tableModel || sourceRows.length === 0 || effectiveColumns.length === 0) return
119
+ var row = Math.max(0, Math.min(sourceRows.length - 1,
120
+ Number(renderer.prop("selected_row", 0))))
121
+ var column = Math.max(0, Math.min(effectiveColumns.length - 1,
122
+ Number(renderer.prop("selected_column", 0))))
123
+ tableSelection.setCurrentIndex(tableModel.index(row, column), ItemSelectionModel.ClearAndSelect)
124
+ }
125
+
126
+ function selectionBehaviorValue(value) {
127
+ var name = String(value || "cells")
128
+ if (name === "none" || name === "disabled") return TableView.SelectionDisabled
129
+ if (name === "rows") return TableView.SelectRows
130
+ if (name === "columns") return TableView.SelectColumns
131
+ return TableView.SelectCells
132
+ }
133
+
134
+ function selectionModeValue(value) {
135
+ var name = String(value || "single")
136
+ if (name === "contiguous") return TableView.ContiguousSelection
137
+ if (name === "extended" || name === "multiple") return TableView.ExtendedSelection
138
+ return TableView.SingleSelection
139
+ }
140
+
141
+ function editTriggersValue(value) {
142
+ if (renderer.prop("editable", false) !== true) return TableView.NoEditTriggers
143
+ var names = Array.isArray(value) ? value : [value || "double_tap_and_key"]
144
+ var result = TableView.NoEditTriggers
145
+ for (var index = 0; index < names.length; index++) {
146
+ var name = String(names[index])
147
+ if (name === "single_tap") result |= TableView.SingleTapped
148
+ if (name === "double_tap" || name === "double_tap_and_key") result |= TableView.DoubleTapped
149
+ if (name === "selected_tap") result |= TableView.SelectedTapped
150
+ if (name === "edit_key" || name === "double_tap_and_key") result |= TableView.EditKeyPressed
151
+ if (name === "any_key") result |= TableView.AnyKeyPressed
152
+ }
153
+ return result
154
+ }
155
+
156
+ function cellPayload(row, column, value) {
157
+ return {
158
+ row: row,
159
+ column: column,
160
+ key: column >= 0 && column < effectiveColumns.length ? columnKey(column) : null,
161
+ value: value,
162
+ row_data: row >= 0 && row < sourceRows.length ? sourceRows[row] : null
163
+ }
164
+ }
165
+
166
+ implicitWidth: Number(renderer.prop("width", 720))
167
+ implicitHeight: Number(renderer.prop("height", 440))
168
+ color: renderer.prop("background", Color.background)
169
+ radius: Number(renderer.prop("radius", Style.cornerRadius))
170
+ border.width: String(renderer.prop("border_color", "")).length > 0 ? Style.normalBorderWidth : 0
171
+ border.color: renderer.prop("border_color", "transparent")
172
+ enabled: renderer.prop("enabled", true) !== false
173
+ clip: renderer.prop("clip", true) !== false
174
+ Accessible.name: String(renderer.prop("accessible_name", "Table"))
175
+ Accessible.role: Accessible.Table
176
+
177
+ ItemSelectionModel {
178
+ id: tableSelection
179
+ model: tableRoot.tableModel
180
+ }
181
+
182
+ Rectangle {
183
+ id: headerClip
184
+ x: tableRoot.tablePadding
185
+ y: tableRoot.tablePadding
186
+ width: Math.max(0, parent.width - tableRoot.tablePadding * 2)
187
+ height: renderer.prop("show_header", true) !== false
188
+ ? Number(renderer.prop("header_height", 42)) : 0
189
+ visible: height > 0
190
+ color: renderer.prop("header_background", Color.popups.background)
191
+ clip: true
192
+
193
+ Row {
194
+ x: -tableControl.contentX
195
+ height: parent.height
196
+ Repeater {
197
+ model: tableRoot.effectiveColumns
198
+ Rectangle {
199
+ required property int index
200
+ width: tableRoot.columnWidth(index)
201
+ height: headerClip.height
202
+ color: "transparent"
203
+ border.width: Style.normalBorderWidth
204
+ border.color: renderer.prop("grid_color", Qt.rgba(renderer.foreground.r,
205
+ renderer.foreground.g, renderer.foreground.b, 0.18))
206
+ Text {
207
+ anchors.fill: parent
208
+ anchors.leftMargin: Style.spacing.md
209
+ anchors.rightMargin: Style.spacing.md
210
+ text: tableRoot.columnLabel(index)
211
+ color: renderer.prop("header_foreground", renderer.prop("foreground", renderer.foreground))
212
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
213
+ font.pixelSize: Number(renderer.prop("header_size", Style.font.body))
214
+ font.bold: true
215
+ horizontalAlignment: tableRoot.columnAlignment(index)
216
+ verticalAlignment: Text.AlignVCenter
217
+ elide: Text.ElideRight
218
+ }
219
+ }
220
+ }
221
+ }
222
+ }
223
+
224
+ TableView {
225
+ id: tableControl
226
+ x: tableRoot.tablePadding
227
+ y: tableRoot.tablePadding + headerClip.height
228
+ width: Math.max(0, parent.width - tableRoot.tablePadding * 2)
229
+ height: Math.max(0, parent.height - tableRoot.tablePadding * 2 - headerClip.height)
230
+ model: tableRoot.tableModel
231
+ selectionModel: tableSelection
232
+ selectionBehavior: tableRoot.selectionBehaviorValue(renderer.prop("selection_behavior", "cells"))
233
+ selectionMode: tableRoot.selectionModeValue(renderer.prop("selection_mode", "single"))
234
+ editTriggers: tableRoot.editTriggersValue(renderer.prop("edit_triggers", "double_tap_and_key"))
235
+ alternatingRows: renderer.prop("alternating_rows", true) !== false
236
+ animate: renderer.prop("animate", true) !== false
237
+ reuseItems: renderer.prop("reuse_items", true) !== false
238
+ keyNavigationEnabled: renderer.prop("key_navigation_enabled", true) !== false
239
+ pointerNavigationEnabled: renderer.prop("pointer_navigation_enabled", true) !== false
240
+ interactive: renderer.prop("interactive", true) !== false
241
+ clip: true
242
+ focus: true
243
+ rowSpacing: Number(renderer.prop("row_spacing", 1))
244
+ columnSpacing: Number(renderer.prop("column_spacing", 1))
245
+ rowHeightProvider: function(row) { return Number(renderer.prop("row_height", 42)) }
246
+ columnWidthProvider: function(column) { return tableRoot.columnWidth(column) }
247
+
248
+ delegate: QQC.ItemDelegate {
249
+ id: cellDelegate
250
+ required property int row
251
+ required property int column
252
+ required property var model
253
+ property bool selected: false
254
+ property bool current: false
255
+
256
+ function refreshSelection() {
257
+ if (!tableRoot.tableModel) {
258
+ selected = false
259
+ current = false
260
+ return
261
+ }
262
+ var modelIndex = tableRoot.tableModel.index(row, column)
263
+ selected = tableSelection.isSelected(modelIndex)
264
+ current = tableSelection.currentIndex.valid
265
+ && tableSelection.currentIndex.row === row
266
+ && tableSelection.currentIndex.column === column
267
+ }
268
+
269
+ text: String(model.display === undefined || model.display === null ? "" : model.display)
270
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
271
+ font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
272
+ padding: Style.spacing.md
273
+
274
+ background: Rectangle {
275
+ color: cellDelegate.selected
276
+ ? renderer.prop("selected_background", Color.popups.background)
277
+ : (tableControl.alternatingRows && cellDelegate.row % 2 === 1
278
+ ? renderer.prop("alternate_background", renderer.prop("cell_background", "transparent"))
279
+ : renderer.prop("cell_background", "transparent"))
280
+ border.width: cellDelegate.current ? Style.normalBorderWidth : 0
281
+ border.color: renderer.prop("accent", Color.accent)
282
+ }
283
+
284
+ contentItem: Text {
285
+ text: cellDelegate.text
286
+ color: cellDelegate.selected
287
+ ? renderer.prop("selected_foreground", renderer.prop("foreground", renderer.foreground))
288
+ : renderer.prop("foreground", renderer.foreground)
289
+ font: cellDelegate.font
290
+ horizontalAlignment: tableRoot.columnAlignment(cellDelegate.column)
291
+ verticalAlignment: Text.AlignVCenter
292
+ elide: Text.ElideRight
293
+ }
294
+
295
+ TableView.editDelegate: FocusScope {
296
+ width: parent.width
297
+ height: parent.height
298
+
299
+ TableView.onCommit: {
300
+ if (!tableRoot.columnEditable(cellDelegate.column)) return
301
+ var index = tableRoot.tableModel.index(cellDelegate.row, cellDelegate.column)
302
+ if (tableRoot.tableModel.setData(index, editor.text, Qt.EditRole)) {
303
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "edit",
304
+ tableRoot.cellPayload(cellDelegate.row, cellDelegate.column, editor.text))
305
+ }
306
+ }
307
+
308
+ QQC.TextField {
309
+ id: editor
310
+ anchors.fill: parent
311
+ text: String(cellDelegate.model.edit === undefined
312
+ ? cellDelegate.model.display : cellDelegate.model.edit)
313
+ enabled: tableRoot.columnEditable(cellDelegate.column)
314
+ focus: true
315
+ Component.onCompleted: selectAll()
316
+ }
317
+ }
318
+
319
+ onClicked: {
320
+ var modelIndex = tableRoot.tableModel.index(row, column)
321
+ tableSelection.setCurrentIndex(modelIndex, ItemSelectionModel.ClearAndSelect)
322
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
323
+ "cell_click", tableRoot.cellPayload(row, column, model.display))
324
+ }
325
+ onDoubleClicked: {
326
+ var payload = tableRoot.cellPayload(row, column, model.display)
327
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "cell_double_click", payload)
328
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "activate", payload)
329
+ }
330
+ Component.onCompleted: refreshSelection()
331
+ onRowChanged: refreshSelection()
332
+ onColumnChanged: refreshSelection()
333
+ Connections {
334
+ target: tableSelection
335
+ function onSelectionChanged(selected, deselected) { cellDelegate.refreshSelection() }
336
+ function onCurrentChanged(current, previous) { cellDelegate.refreshSelection() }
337
+ }
338
+ }
339
+
340
+ onRowsChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
341
+ "row_count_change", { value: rows })
342
+ onColumnsChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
343
+ "column_count_change", { value: columns })
344
+ onContentXChanged: {
345
+ if (moving) renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
346
+ "scroll", { x: contentX, y: contentY })
347
+ }
348
+ onContentYChanged: {
349
+ if (moving) renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
350
+ "scroll", { x: contentX, y: contentY })
351
+ }
352
+ onMovementStarted: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
353
+ "movement_start", { x: contentX, y: contentY })
354
+ onMovementEnded: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
355
+ "movement_end", { x: contentX, y: contentY })
356
+ onActiveFocusChanged: {
357
+ if (renderer && renderer.bridge)
358
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
359
+ activeFocus ? "focus" : "blur", {})
360
+ }
361
+ }
362
+
363
+ Connections {
364
+ target: tableSelection
365
+ function onCurrentChanged(current, previous) {
366
+ if (!current.valid) return
367
+ var payload = tableRoot.cellPayload(current.row, current.column,
368
+ tableRoot.cellValue(current.row, current.column))
369
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "current_change", payload)
370
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "selection_change", payload)
371
+ }
372
+ }
373
+
374
+ Text {
375
+ anchors.centerIn: tableControl
376
+ visible: tableRoot.sourceRows.length === 0
377
+ text: String(renderer.prop("empty_text", "No rows"))
378
+ color: renderer.prop("muted", Color.muted)
379
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
380
+ font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
381
+ }
382
+
383
+ Component.onCompleted: rebuildModel()
384
+ onEffectiveColumnsChanged: rebuildModel()
385
+ onSourceRowsChanged: syncRows()
386
+ onVisibleChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
387
+ visible ? "show" : "hide", {})
388
+ }
@@ -0,0 +1,17 @@
1
+ import QtQuick
2
+ import QtQuick.Controls as QQC
3
+ import "../../Theme"
4
+
5
+ QQC.ItemDelegate {
6
+ id: delegateRoot
7
+ property var renderer: null
8
+ text: renderer ? String(renderer.prop("text", "")) : ""
9
+ implicitWidth: Number(renderer ? renderer.prop("width", 160) : 160); implicitHeight: Number(renderer ? renderer.prop("height", 42) : 42)
10
+ highlighted: renderer && (renderer.prop("selected", false) === true || renderer.prop("current", false) === true)
11
+ enabled: !renderer || renderer.prop("enabled", true) !== false
12
+ font.family: renderer ? renderer.prop("font_family", renderer.fontFamily) : ""; font.pixelSize: Number(renderer ? renderer.prop("font_size", Style.font.body) : Style.font.body)
13
+ background: Rectangle { color: delegateRoot.highlighted ? renderer.prop("selected_background", Color.popups.background) : renderer.prop("background", "transparent"); border.color: renderer.prop("border_color", "transparent") }
14
+ contentItem: Text { text: delegateRoot.text; opacity: renderer.prop("editing", false) === true ? 0.45 : 1; color: delegateRoot.highlighted ? renderer.prop("selected_foreground", renderer.foreground) : renderer.prop("foreground", renderer.foreground); font: delegateRoot.font; verticalAlignment: Text.AlignVCenter; elide: Text.ElideRight }
15
+ onClicked: { var payload={row:renderer.prop("row",-1),column:renderer.prop("column",-1),value:renderer.prop("value",null)};renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,"click",payload);if(renderer.prop("editing",false)===true)renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,"edit",payload) }
16
+ onDoubleClicked: { var payload={row:renderer.prop("row",-1),column:renderer.prop("column",-1),value:renderer.prop("value",null)};renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,"double_click",payload);renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,"activate",payload) }
17
+ }
@@ -0,0 +1,138 @@
1
+ import QtQuick
2
+ import QtQuick.Controls as QQC
3
+ import QtQuick.Layouts
4
+ import "../../Theme"
5
+
6
+ QQC.Control {
7
+ id: tabsRoot
8
+
9
+ required property var renderer
10
+ readonly property int pageCount: renderer.node && Array.isArray(renderer.node.children)
11
+ ? renderer.node.children.length : 0
12
+ readonly property int requestedIndex: Number(renderer.prop("current_index", 0))
13
+ readonly property bool barAtBottom: String(renderer.prop("position", "top")) === "bottom"
14
+ property int currentIndex: 0
15
+ property bool synchronizing: false
16
+
17
+ function boundedIndex(value) {
18
+ return pageCount === 0 ? -1 : Math.max(0, Math.min(pageCount - 1, Number(value)))
19
+ }
20
+
21
+ function labelAt(index) {
22
+ var labels = renderer.prop("labels", [])
23
+ if (Array.isArray(labels) && index < labels.length) {
24
+ var label = labels[index]
25
+ return label !== null && typeof label === "object" && label.label !== undefined
26
+ ? String(label.label) : String(label)
27
+ }
28
+ var child = renderer.node.children[index]
29
+ return child && child.props && child.props.title !== undefined
30
+ ? String(child.props.title) : "Tab " + String(index + 1)
31
+ }
32
+
33
+ function syncSelection() {
34
+ var next = boundedIndex(requestedIndex)
35
+ if (currentIndex === next) return
36
+ synchronizing = true
37
+ currentIndex = next
38
+ synchronizing = false
39
+ }
40
+
41
+ implicitWidth: Number(renderer.prop("width", 640))
42
+ implicitHeight: Number(renderer.prop("height", 420))
43
+ enabled: renderer.prop("enabled", true) !== false
44
+ visible: renderer.prop("visible", true) !== false
45
+ LayoutMirroring.enabled: String(renderer.prop("layout_direction", "left_to_right")) === "right_to_left"
46
+ LayoutMirroring.childrenInherit: true
47
+
48
+ background: Rectangle {
49
+ color: renderer.prop("content_background", renderer.prop("background", Color.background))
50
+ radius: Number(renderer.prop("radius", Style.cornerRadius))
51
+ border.width: String(renderer.prop("border_color", "")).length > 0 ? Style.normalBorderWidth : 0
52
+ border.color: renderer.prop("border_color", "transparent")
53
+ }
54
+
55
+ contentItem: Item {
56
+ QQC.TabBar {
57
+ id: nativeBar
58
+ anchors.left: parent.left
59
+ anchors.right: parent.right
60
+ anchors.top: tabsRoot.barAtBottom ? undefined : parent.top
61
+ anchors.bottom: tabsRoot.barAtBottom ? parent.bottom : undefined
62
+ implicitWidth: 0
63
+ height: Number(renderer.prop("tab_height", 44))
64
+ currentIndex: tabsRoot.currentIndex
65
+
66
+ background: Rectangle {
67
+ color: renderer.prop("background", Color.background)
68
+ }
69
+
70
+ Repeater {
71
+ model: tabsRoot.pageCount
72
+ QQC.TabButton {
73
+ required property int index
74
+ width: Number(renderer.prop("tab_width", 0)) > 0
75
+ ? Number(renderer.prop("tab_width", 0))
76
+ : Math.max(1, nativeBar.width / Math.max(1, tabsRoot.pageCount))
77
+ height: nativeBar.height
78
+ text: tabsRoot.labelAt(index)
79
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
80
+ font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
81
+ contentItem: Text {
82
+ text: parent.text
83
+ color: parent.checked ? renderer.prop("accent", Color.accent)
84
+ : renderer.prop("foreground", renderer.foreground)
85
+ font: parent.font
86
+ horizontalAlignment: Text.AlignHCenter
87
+ verticalAlignment: Text.AlignVCenter
88
+ elide: Text.ElideRight
89
+ }
90
+ background: Rectangle {
91
+ property bool selected: parent.checked
92
+ color: "transparent"
93
+ Rectangle {
94
+ anchors.left: parent.left
95
+ anchors.right: parent.right
96
+ anchors.bottom: parent.bottom
97
+ height: parent.selected ? 2 : 0
98
+ color: renderer.prop("accent", Color.accent)
99
+ }
100
+ }
101
+ onClicked: {
102
+ tabsRoot.currentIndex = index
103
+ if (renderer.subscribed("tab_click"))
104
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
105
+ "tab_click", { value: index, label: text })
106
+ }
107
+ }
108
+ }
109
+ }
110
+
111
+ StackLayout {
112
+ anchors.left: parent.left
113
+ anchors.right: parent.right
114
+ anchors.top: tabsRoot.barAtBottom ? parent.top : nativeBar.bottom
115
+ anchors.bottom: tabsRoot.barAtBottom ? nativeBar.top : parent.bottom
116
+ currentIndex: tabsRoot.currentIndex
117
+ Repeater {
118
+ model: renderer.node.children || []
119
+ delegate: renderer.layoutChildDelegateComponent
120
+ }
121
+ }
122
+ }
123
+
124
+ onRequestedIndexChanged: syncSelection()
125
+ onPageCountChanged: syncSelection()
126
+ Component.onCompleted: syncSelection()
127
+ onCurrentIndexChanged: {
128
+ if (synchronizing || currentIndex < 0) return
129
+ if (renderer.subscribed("input"))
130
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "input", { value: currentIndex })
131
+ if (renderer.subscribed("change"))
132
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "change", { value: currentIndex })
133
+ }
134
+ onVisibleChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
135
+ visible ? "show" : "hide", {})
136
+ onActiveFocusChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
137
+ activeFocus ? "focus" : "blur", {})
138
+ }
@@ -0,0 +1,24 @@
1
+ import QtQuick
2
+ import QtQuick.Controls as QQC
3
+ import QtQuick.Layouts
4
+ import QtMultimedia
5
+ import QtQuick.VectorImage
6
+ import "../../Theme"
7
+ import "../../Controls" as ZuiControls
8
+
9
+ Text {
10
+ required property var renderer
11
+ text: String(renderer.prop("text", ""))
12
+ textFormat: Text.PlainText
13
+ color: renderer.prop("color", renderer.foreground)
14
+ font.family: renderer.fontFamily
15
+ font.pixelSize: {
16
+ var style = String(renderer.prop("style", "body"))
17
+ if (style === "heading") return Style.font.heading
18
+ if (style === "caption") return Style.font.caption
19
+ return Number(renderer.prop("size", Style.font.body))
20
+ }
21
+ font.bold: renderer.prop("bold", false) || String(renderer.prop("style", "body")) === "heading"
22
+ wrapMode: renderer.prop("wrap", true) ? Text.Wrap : Text.NoWrap
23
+ width: Number(renderer.prop("width", implicitWidth))
24
+ }
@@ -0,0 +1,59 @@
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.ScrollView {
10
+ required property var renderer
11
+ implicitWidth: Number(renderer.prop("width", 320))
12
+ implicitHeight: Number(renderer.prop("height", 140))
13
+ clip: true
14
+ QQC.TextArea {
15
+ id: nativeTextArea
16
+ readonly property bool supportsTextEditedSignal: nativeTextArea["textEdited"] !== undefined
17
+ function sendInputEvent() {
18
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "input", { value: text })
19
+ }
20
+ text: String(renderer.prop("text", ""))
21
+ placeholderText: String(renderer.prop("placeholder", ""))
22
+ readOnly: renderer.prop("read_only", false) === true
23
+ readonly property int maximumLengthValue: Number(renderer.prop("maximum_length", 32767))
24
+ wrapMode: String(renderer.prop("wrap", "word")) === "none" ? TextEdit.NoWrap
25
+ : (String(renderer.prop("wrap", "word")) === "anywhere" ? TextEdit.WrapAnywhere : TextEdit.Wrap)
26
+ color: renderer.prop("foreground", renderer.foreground)
27
+ selectionColor: renderer.prop("selection_tint", renderer.prop("accent", Color.accent))
28
+ selectedTextColor: Color.background
29
+ placeholderTextColor: Color.muted
30
+ font.family: String(renderer.prop("font_family", renderer.fontFamily))
31
+ font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
32
+ padding: Number(renderer.prop("padding", Style.spacing.inputPaddingY))
33
+ background: Rectangle {
34
+ color: renderer.prop("background", Color.popups.background)
35
+ radius: Style.cornerRadius
36
+ border.width: Style.normalBorderWidth
37
+ border.color: nativeTextArea.activeFocus ? renderer.prop("accent", Color.accent) : renderer.prop("foreground", renderer.foreground)
38
+ }
39
+ onTextChanged: {
40
+ if (text.length > maximumLengthValue) {
41
+ remove(maximumLengthValue, text.length)
42
+ return
43
+ }
44
+ if (!supportsTextEditedSignal && activeFocus) sendInputEvent()
45
+ }
46
+ onActiveFocusChanged: {
47
+ renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, activeFocus ? "focus" : "blur", { value: text })
48
+ if (!activeFocus && renderer.subscribed("change")) renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "change", { value: text })
49
+ }
50
+ onSelectedTextChanged: {
51
+ if (renderer.subscribed("selection")) renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "selection", { start: selectionStart, end: selectionEnd, text: selectedText })
52
+ }
53
+ Connections {
54
+ target: nativeTextArea
55
+ ignoreUnknownSignals: true
56
+ function onTextEdited() { nativeTextArea.sendInputEvent() }
57
+ }
58
+ }
59
+ }
@@ -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
+ ZuiControls.TextField {
10
+ required property var renderer
11
+ text: String(renderer.prop("text", "")); placeholderText: String(renderer.prop("placeholder", ""))
12
+ password: renderer.prop("password", false) === true
13
+ implicitWidth: Number(renderer.prop("width", 240)); foreground: renderer.prop("foreground", renderer.foreground)
14
+ accent: renderer.prop("accent", Color.accent); selectionTint: renderer.prop("selection_tint", Style.selectionFillFor(foreground, accent))
15
+ horizontalPadding: Number(renderer.prop("horizontal_padding", Style.spacing.controlPaddingX))
16
+ verticalPadding: Number(renderer.prop("vertical_padding", Style.spacing.inputPaddingY)); hasCursor: renderer.prop("cursor", false) === true
17
+ onTextEdited: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "input", { value: text })
18
+ onEditingFinished: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "change", { value: text })
19
+ onAccepted: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "submit", { value: text })
20
+ onActiveFocusChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, activeFocus ? "focus" : "blur", { value: text })
21
+ }