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.
- checksums.yaml +7 -0
- data/Components/Builtins/Accordion.qml +208 -0
- data/Components/Builtins/Action.qml +43 -0
- data/Components/Builtins/ActionButton.qml +19 -0
- data/Components/Builtins/ActionGroup.qml +81 -0
- data/Components/Builtins/AlertDialog.qml +398 -0
- data/Components/Builtins/AnchorAnimation.qml +3 -0
- data/Components/Builtins/AnchorChanges.qml +11 -0
- data/Components/Builtins/AnimatedImage.qml +39 -0
- data/Components/Builtins/Animation.qml +3 -0
- data/Components/Builtins/AnimationController.qml +11 -0
- data/Components/Builtins/ApplicationWindow.qml +103 -0
- data/Components/Builtins/AreaChart.qml +70 -0
- data/Components/Builtins/AspectRatio.qml +30 -0
- data/Components/Builtins/Audio.qml +85 -0
- data/Components/Builtins/AudioInput.qml +10 -0
- data/Components/Builtins/AudioOutput.qml +10 -0
- data/Components/Builtins/Avatar.qml +46 -0
- data/Components/Builtins/Badge.qml +38 -0
- data/Components/Builtins/Banner.qml +133 -0
- data/Components/Builtins/BarChart.qml +67 -0
- data/Components/Builtins/BarIconButton.qml +30 -0
- data/Components/Builtins/BarIndicator.qml +26 -0
- data/Components/Builtins/Behavior.qml +13 -0
- data/Components/Builtins/Blur.qml +14 -0
- data/Components/Builtins/BorderImage.qml +38 -0
- data/Components/Builtins/BorderOverlay.qml +25 -0
- data/Components/Builtins/BottomSheet.qml +211 -0
- data/Components/Builtins/Breadcrumb.qml +169 -0
- data/Components/Builtins/BubbleChart.qml +3 -0
- data/Components/Builtins/BusyIndicator.qml +24 -0
- data/Components/Builtins/Button.qml +55 -0
- data/Components/Builtins/ButtonGroup.qml +18 -0
- data/Components/Builtins/Calendar.qml +55 -0
- data/Components/Builtins/Camera.qml +18 -0
- data/Components/Builtins/CandlestickChart.qml +3 -0
- data/Components/Builtins/Canvas.qml +159 -0
- data/Components/Builtins/CaptureSession.qml +19 -0
- data/Components/Builtins/Card.qml +23 -0
- data/Components/Builtins/Carousel.qml +72 -0
- data/Components/Builtins/Center.qml +20 -0
- data/Components/Builtins/CheckDelegate.qml +132 -0
- data/Components/Builtins/Checkbox.qml +62 -0
- data/Components/Builtins/Chip.qml +65 -0
- data/Components/Builtins/Circle.qml +35 -0
- data/Components/Builtins/Clipboard.qml +29 -0
- data/Components/Builtins/ColorAnimation.qml +3 -0
- data/Components/Builtins/ColorPicker.qml +70 -0
- data/Components/Builtins/Colorize.qml +14 -0
- data/Components/Builtins/Column.qml +17 -0
- data/Components/Builtins/ColumnLayout.qml +13 -0
- data/Components/Builtins/ConfirmDialog.qml +20 -0
- data/Components/Builtins/ConstrainedBox.qml +28 -0
- data/Components/Builtins/Container.qml +30 -0
- data/Components/Builtins/ContextMenu.qml +140 -0
- data/Components/Builtins/CursorSurface.qml +18 -0
- data/Components/Builtins/DataTable.qml +69 -0
- data/Components/Builtins/DatePicker.qml +180 -0
- data/Components/Builtins/DayOfWeekRow.qml +11 -0
- data/Components/Builtins/DelayButton.qml +47 -0
- data/Components/Builtins/DelegateModel.qml +10 -0
- data/Components/Builtins/DelegateModelGroup.qml +10 -0
- data/Components/Builtins/Dial.qml +42 -0
- data/Components/Builtins/Dialog.qml +128 -0
- data/Components/Builtins/DialogButtonBox.qml +137 -0
- data/Components/Builtins/Divider.qml +26 -0
- data/Components/Builtins/DonutChart.qml +3 -0
- data/Components/Builtins/DoubleSpinBox.qml +58 -0
- data/Components/Builtins/DragArea.qml +43 -0
- data/Components/Builtins/Drawer.qml +107 -0
- data/Components/Builtins/DropArea.qml +19 -0
- data/Components/Builtins/DropShadow.qml +16 -0
- data/Components/Builtins/Dropdown.qml +19 -0
- data/Components/Builtins/ExpansionPanel.qml +157 -0
- data/Components/Builtins/FilePicker.qml +140 -0
- data/Components/Builtins/FittedBox.qml +40 -0
- data/Components/Builtins/Flickable.qml +40 -0
- data/Components/Builtins/Flipable.qml +45 -0
- data/Components/Builtins/Flow.qml +16 -0
- data/Components/Builtins/FocusScope.qml +29 -0
- data/Components/Builtins/FolderListModel.qml +9 -0
- data/Components/Builtins/FolderPicker.qml +93 -0
- data/Components/Builtins/FontLoader.qml +21 -0
- data/Components/Builtins/FontPicker.qml +91 -0
- data/Components/Builtins/Frame.qml +71 -0
- data/Components/Builtins/FrameAnimation.qml +13 -0
- data/Components/Builtins/Gauge.qml +3 -0
- data/Components/Builtins/Glow.qml +15 -0
- data/Components/Builtins/Gradient.qml +93 -0
- data/Components/Builtins/Grid.qml +16 -0
- data/Components/Builtins/GridLayout.qml +16 -0
- data/Components/Builtins/GridView.qml +226 -0
- data/Components/Builtins/GroupBox.qml +95 -0
- data/Components/Builtins/Heatmap.qml +3 -0
- data/Components/Builtins/Histogram.qml +3 -0
- data/Components/Builtins/HorizontalHeader.qml +23 -0
- data/Components/Builtins/HorizontalHeaderDelegate.qml +39 -0
- data/Components/Builtins/HoverArea.qml +19 -0
- data/Components/Builtins/Icon.qml +16 -0
- data/Components/Builtins/Image.qml +110 -0
- data/Components/Builtins/ImageCapture.qml +14 -0
- data/Components/Builtins/ItemDelegate.qml +152 -0
- data/Components/Builtins/KeyCatcher.qml +25 -0
- data/Components/Builtins/Label.qml +43 -0
- data/Components/Builtins/LayoutItemProxy.qml +51 -0
- data/Components/Builtins/Legend.qml +86 -0
- data/Components/Builtins/Line.qml +28 -0
- data/Components/Builtins/LineChart.qml +87 -0
- data/Components/Builtins/ListModel.qml +8 -0
- data/Components/Builtins/ListView.qml +65 -0
- data/Components/Builtins/Loader.qml +33 -0
- data/Components/Builtins/Markdown.qml +23 -0
- data/Components/Builtins/MediaDevices.qml +10 -0
- data/Components/Builtins/MediaPlayer.qml +27 -0
- data/Components/Builtins/MediaRecorder.qml +16 -0
- data/Components/Builtins/Menu.qml +119 -0
- data/Components/Builtins/MenuBar.qml +128 -0
- data/Components/Builtins/MenuItem.qml +77 -0
- data/Components/Builtins/MenuSeparator.qml +30 -0
- data/Components/Builtins/MessageDialog.qml +104 -0
- data/Components/Builtins/ModalSheet.qml +222 -0
- data/Components/Builtins/ModelView3d.qml +50 -0
- data/Components/Builtins/MonthGrid.qml +23 -0
- data/Components/Builtins/MultiEffect.qml +48 -0
- data/Components/Builtins/MultiSelect.qml +23 -0
- data/Components/Builtins/NavigationRail.qml +154 -0
- data/Components/Builtins/NumberAnimation.qml +3 -0
- data/Components/Builtins/NumberField.qml +18 -0
- data/Components/Builtins/OpacityAnimator.qml +3 -0
- data/Components/Builtins/OpacityMask.qml +21 -0
- data/Components/Builtins/OpticalGlyph.qml +16 -0
- data/Components/Builtins/Page.qml +111 -0
- data/Components/Builtins/PageIndicator.qml +63 -0
- data/Components/Builtins/Pagination.qml +158 -0
- data/Components/Builtins/Pane.qml +72 -0
- data/Components/Builtins/PanelHero.qml +15 -0
- data/Components/Builtins/ParallelAnimation.qml +3 -0
- data/Components/Builtins/ParentAnimation.qml +3 -0
- data/Components/Builtins/ParentChange.qml +10 -0
- data/Components/Builtins/ParticleSystem.qml +81 -0
- data/Components/Builtins/PasswordField.qml +58 -0
- data/Components/Builtins/Path.qml +35 -0
- data/Components/Builtins/PathAnimation.qml +3 -0
- data/Components/Builtins/PauseAnimation.qml +3 -0
- data/Components/Builtins/PieChart.qml +3 -0
- data/Components/Builtins/PinchArea.qml +23 -0
- data/Components/Builtins/Popup.qml +130 -0
- data/Components/Builtins/Progress.qml +15 -0
- data/Components/Builtins/ProgressRing.qml +120 -0
- data/Components/Builtins/PropertyAction.qml +11 -0
- data/Components/Builtins/PropertyAnimation.qml +3 -0
- data/Components/Builtins/PropertyChanges.qml +10 -0
- data/Components/Builtins/RadarChart.qml +3 -0
- data/Components/Builtins/RadialGauge.qml +3 -0
- data/Components/Builtins/RadioButton.qml +46 -0
- data/Components/Builtins/RadioDelegate.qml +115 -0
- data/Components/Builtins/RadioGroup.qml +58 -0
- data/Components/Builtins/RangeSlider.qml +39 -0
- data/Components/Builtins/Rectangle.qml +23 -0
- data/Components/Builtins/RectangularShadow.qml +23 -0
- data/Components/Builtins/ReorderableList.qml +204 -0
- data/Components/Builtins/RichText.qml +23 -0
- data/Components/Builtins/RotationAnimation.qml +3 -0
- data/Components/Builtins/RotationAnimator.qml +3 -0
- data/Components/Builtins/RoundButton.qml +42 -0
- data/Components/Builtins/Row.qml +17 -0
- data/Components/Builtins/RowLayout.qml +13 -0
- data/Components/Builtins/ScaleAnimator.qml +3 -0
- data/Components/Builtins/ScatterChart.qml +3 -0
- data/Components/Builtins/ScreenCapture.qml +78 -0
- data/Components/Builtins/ScriptAction.qml +15 -0
- data/Components/Builtins/Scroll.qml +18 -0
- data/Components/Builtins/ScrollBar.qml +18 -0
- data/Components/Builtins/ScrollIndicator.qml +15 -0
- data/Components/Builtins/SearchField.qml +178 -0
- data/Components/Builtins/SearchableDropdown.qml +21 -0
- data/Components/Builtins/SectionHeader.qml +14 -0
- data/Components/Builtins/SelectableText.qml +33 -0
- data/Components/Builtins/SelectionRectangle.qml +17 -0
- data/Components/Builtins/Separator.qml +13 -0
- data/Components/Builtins/SequentialAnimation.qml +3 -0
- data/Components/Builtins/Settings.qml +10 -0
- data/Components/Builtins/ShaderEffect.qml +115 -0
- data/Components/Builtins/ShaderEffectSource.qml +61 -0
- data/Components/Builtins/Shaders/grayscale.frag +14 -0
- data/Components/Builtins/Shaders/grayscale.frag.qsb +0 -0
- data/Components/Builtins/Shaders/passthrough.frag +11 -0
- data/Components/Builtins/Shaders/passthrough.frag.qsb +0 -0
- data/Components/Builtins/Shaders/pixelate.frag +16 -0
- data/Components/Builtins/Shaders/pixelate.frag.qsb +0 -0
- data/Components/Builtins/Shaders/vignette.frag +18 -0
- data/Components/Builtins/Shaders/vignette.frag.qsb +0 -0
- data/Components/Builtins/Shaders/wave.frag +18 -0
- data/Components/Builtins/Shaders/wave.frag.qsb +0 -0
- data/Components/Builtins/Shape.qml +53 -0
- data/Components/Builtins/Skeleton.qml +78 -0
- data/Components/Builtins/Slider.qml +21 -0
- data/Components/Builtins/SmoothedAnimation.qml +3 -0
- data/Components/Builtins/Snackbar.qml +181 -0
- data/Components/Builtins/SortFilterProxyModel.qml +16 -0
- data/Components/Builtins/SoundEffect.qml +10 -0
- data/Components/Builtins/Spacer.qml +13 -0
- data/Components/Builtins/Sparkline.qml +3 -0
- data/Components/Builtins/SpinBox.qml +44 -0
- data/Components/Builtins/SplitView.qml +31 -0
- data/Components/Builtins/SpringAnimation.qml +3 -0
- data/Components/Builtins/Stack.qml +14 -0
- data/Components/Builtins/StackLayout.qml +19 -0
- data/Components/Builtins/StackView.qml +122 -0
- data/Components/Builtins/StackedBarChart.qml +3 -0
- data/Components/Builtins/StandardPaths.qml +9 -0
- data/Components/Builtins/State.qml +13 -0
- data/Components/Builtins/StateGroup.qml +11 -0
- data/Components/Builtins/Support/AnimationDriver.qml +79 -0
- data/Components/Builtins/Support/AnimationGroupDriver.qml +32 -0
- data/Components/Builtins/Support/ChartCanvas.qml +629 -0
- data/Components/Builtins/Support/ModelView3dScene.qml +292 -0
- data/Components/Builtins/Support/OptionalModuleState.js +5 -0
- data/Components/Builtins/SwipeDelegate.qml +231 -0
- data/Components/Builtins/SwipeView.qml +69 -0
- data/Components/Builtins/SwitchDelegate.qml +140 -0
- data/Components/Builtins/TabBar.qml +117 -0
- data/Components/Builtins/TabButton.qml +105 -0
- data/Components/Builtins/TableView.qml +388 -0
- data/Components/Builtins/TableViewDelegate.qml +17 -0
- data/Components/Builtins/Tabs.qml +138 -0
- data/Components/Builtins/Text.qml +24 -0
- data/Components/Builtins/TextArea.qml +59 -0
- data/Components/Builtins/TextField.qml +21 -0
- data/Components/Builtins/TextMetrics.qml +39 -0
- data/Components/Builtins/TimePicker.qml +213 -0
- data/Components/Builtins/Timer.qml +13 -0
- data/Components/Builtins/Toast.qml +213 -0
- data/Components/Builtins/Toggle.qml +19 -0
- data/Components/Builtins/ToggleSwitch.qml +22 -0
- data/Components/Builtins/ToolBar.qml +61 -0
- data/Components/Builtins/ToolButton.qml +41 -0
- data/Components/Builtins/ToolSeparator.qml +36 -0
- data/Components/Builtins/Tooltip.qml +20 -0
- data/Components/Builtins/Transition.qml +3 -0
- data/Components/Builtins/TreeView.qml +423 -0
- data/Components/Builtins/TreeViewDelegate.qml +46 -0
- data/Components/Builtins/Tumbler.qml +18 -0
- data/Components/Builtins/UniformAnimator.qml +3 -0
- data/Components/Builtins/VectorAnimation.qml +3 -0
- data/Components/Builtins/VectorImage.qml +62 -0
- data/Components/Builtins/VerticalHeader.qml +21 -0
- data/Components/Builtins/VerticalHeaderDelegate.qml +35 -0
- data/Components/Builtins/Video.qml +54 -0
- data/Components/Builtins/VideoOutput.qml +54 -0
- data/Components/Builtins/WebView.qml +57 -0
- data/Components/Builtins/WeekNumberColumn.qml +13 -0
- data/Components/Builtins/WidgetButton.qml +26 -0
- data/Components/Builtins/Window.qml +90 -0
- data/Components/Builtins/WindowCapture.qml +11 -0
- data/Components/Builtins/Wrap.qml +18 -0
- data/Components/Builtins/XAnimator.qml +3 -0
- data/Components/Builtins/YAnimator.qml +3 -0
- data/Components/README.md +45 -0
- data/ControlNode.qml +1369 -0
- data/Controls/BarIconButton.qml +27 -0
- data/Controls/BarIndicator.qml +22 -0
- data/Controls/BorderOverlay.qml +10 -0
- data/Controls/BorderSurface.qml +10 -0
- data/Controls/Button.qml +78 -0
- data/Controls/ButtonGroup.qml +19 -0
- data/Controls/ConfirmDialog.qml +37 -0
- data/Controls/CursorSurface.qml +29 -0
- data/Controls/Dropdown.qml +59 -0
- data/Controls/MultiSelect.qml +32 -0
- data/Controls/NumberField.qml +24 -0
- data/Controls/OpticalGlyph.qml +14 -0
- data/Controls/PanelActionButton.qml +10 -0
- data/Controls/PanelHero.qml +18 -0
- data/Controls/PanelKeyCatcher.qml +25 -0
- data/Controls/PanelSectionHeader.qml +11 -0
- data/Controls/PanelSeparator.qml +10 -0
- data/Controls/PanelSlider.qml +36 -0
- data/Controls/PanelToolTip.qml +13 -0
- data/Controls/SearchableDropdown.qml +11 -0
- data/Controls/TextField.qml +25 -0
- data/Controls/Toggle.qml +22 -0
- data/Controls/ToggleSwitch.qml +26 -0
- data/Controls/WidgetButton.qml +35 -0
- data/Controls/qmldir +25 -0
- data/Desktop.qml +76 -0
- data/LICENSE +22 -0
- data/README.md +112 -0
- data/Service.qml +430 -0
- data/Theme/Border.qml +22 -0
- data/Theme/Color.qml +22 -0
- data/Theme/Style.qml +47 -0
- data/Theme/Util.qml +6 -0
- data/Theme/qmldir +5 -0
- data/bin/zui +7 -0
- data/lib/zui/animation.rb +24 -0
- data/lib/zui/application.rb +327 -0
- data/lib/zui/builder.rb +725 -0
- data/lib/zui/cli.rb +91 -0
- data/lib/zui/command.rb +101 -0
- data/lib/zui/component_registry.rb +91 -0
- data/lib/zui/components.rb +262 -0
- data/lib/zui/distribution.rb +200 -0
- data/lib/zui/generator.rb +84 -0
- data/lib/zui/host.rb +123 -0
- data/lib/zui/node.rb +30 -0
- data/lib/zui/platform.rb +40 -0
- data/lib/zui/protocol.rb +29 -0
- data/lib/zui/runner.rb +37 -0
- data/lib/zui/runtime.rb +23 -0
- data/lib/zui/scheduler.rb +136 -0
- data/lib/zui/source_bundle.rb +63 -0
- data/lib/zui/state_store.rb +100 -0
- data/lib/zui/value.rb +44 -0
- data/lib/zui.rb +33 -0
- data/native/CMakeLists.txt +45 -0
- data/native/ZuiClipboard.cpp +16 -0
- data/native/ZuiClipboard.h +16 -0
- data/native/ZuiProcess.cpp +84 -0
- data/native/ZuiProcess.h +34 -0
- data/native/main.cpp +64 -0
- data/vendor/host/linux-x86_64/PROVENANCE.md +15 -0
- data/vendor/host/linux-x86_64/zui-host +0 -0
- data/vendor/host/linux-x86_64/zui-host.sha256 +1 -0
- metadata +365 -0
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import "Support" as Support
|
|
3
|
+
Support.AnimationGroupDriver { renderer: null; sequential: false; onRendererChanged: if(renderer){renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,"start",{from:renderer.prop("from_state",""),to:renderer.prop("to_state","")})} }
|
|
@@ -0,0 +1,423 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import QtQuick.Controls as QQC
|
|
3
|
+
import QtQml.Models
|
|
4
|
+
import "../../Theme"
|
|
5
|
+
|
|
6
|
+
Rectangle {
|
|
7
|
+
id: treeRoot
|
|
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 string childrenField: String(renderer.prop("children_field", "children"))
|
|
13
|
+
readonly property var effectiveColumns: inferColumns()
|
|
14
|
+
readonly property real treePadding: Number(renderer.prop("padding", 0))
|
|
15
|
+
property var treeModel: null
|
|
16
|
+
|
|
17
|
+
function inferColumns() {
|
|
18
|
+
if (requestedColumns && requestedColumns.length > 0) return requestedColumns
|
|
19
|
+
if (!sourceRows || sourceRows.length === 0) return []
|
|
20
|
+
var first = sourceRows[0]
|
|
21
|
+
if (Array.isArray(first)) {
|
|
22
|
+
var columns = []
|
|
23
|
+
for (var index = 0; index < first.length; index++) columns.push(String(index + 1))
|
|
24
|
+
return columns
|
|
25
|
+
}
|
|
26
|
+
if (first !== null && typeof first === "object")
|
|
27
|
+
return Object.keys(first).filter(function(key) { return key !== childrenField })
|
|
28
|
+
return ["Value"]
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function columnProperty(column, name, fallback) {
|
|
32
|
+
if (column !== null && typeof column === "object" && !Array.isArray(column)) {
|
|
33
|
+
var value = column[name]
|
|
34
|
+
return value === undefined || value === null ? fallback : value
|
|
35
|
+
}
|
|
36
|
+
return fallback
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function columnKey(index) {
|
|
40
|
+
var column = effectiveColumns[index]
|
|
41
|
+
if (column !== null && typeof column === "object" && !Array.isArray(column))
|
|
42
|
+
return String(column.key === undefined ? (column.field === undefined ? index : column.field) : column.key)
|
|
43
|
+
if (sourceRows.length > 0 && Array.isArray(sourceRows[0])) return index
|
|
44
|
+
return String(column)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function columnLabel(index) {
|
|
48
|
+
var column = effectiveColumns[index]
|
|
49
|
+
if (column !== null && typeof column === "object" && !Array.isArray(column))
|
|
50
|
+
return String(column.label === undefined ? columnKey(index) : column.label)
|
|
51
|
+
return String(column)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function columnWidth(index) {
|
|
55
|
+
return Number(columnProperty(effectiveColumns[index], "width",
|
|
56
|
+
renderer.prop("column_width", index === 0 ? 240 : 160)))
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function columnAlignment(index) {
|
|
60
|
+
var name = String(columnProperty(effectiveColumns[index], "alignment", "left"))
|
|
61
|
+
if (name === "center") return Text.AlignHCenter
|
|
62
|
+
if (name === "right" || name === "end") return Text.AlignRight
|
|
63
|
+
return Text.AlignLeft
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function columnEditable(index) {
|
|
67
|
+
return renderer.prop("editable", false) === true
|
|
68
|
+
&& columnProperty(effectiveColumns[index], "editable", true) !== false
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function nodeChildren(node) {
|
|
72
|
+
if (node === null || typeof node !== "object" || Array.isArray(node)) return []
|
|
73
|
+
var children = node[childrenField]
|
|
74
|
+
return Array.isArray(children) ? children : []
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function nodeCell(node, column) {
|
|
78
|
+
if (Array.isArray(node)) return node[column]
|
|
79
|
+
if (node !== null && typeof node === "object") return node[columnKey(column)]
|
|
80
|
+
return column === 0 ? node : null
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function normalizeNode(node) {
|
|
84
|
+
var normalized = {}
|
|
85
|
+
for (var column = 0; column < effectiveColumns.length; column++)
|
|
86
|
+
normalized["_c" + column] = nodeCell(node, column)
|
|
87
|
+
var children = nodeChildren(node)
|
|
88
|
+
if (children.length > 0) {
|
|
89
|
+
normalized.rows = []
|
|
90
|
+
for (var index = 0; index < children.length; index++)
|
|
91
|
+
normalized.rows.push(normalizeNode(children[index]))
|
|
92
|
+
}
|
|
93
|
+
return normalized
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function normalizedRows() {
|
|
97
|
+
var rows = []
|
|
98
|
+
for (var index = 0; index < sourceRows.length; index++) rows.push(normalizeNode(sourceRows[index]))
|
|
99
|
+
return rows
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function modelSource() {
|
|
103
|
+
var source = "import Qt.labs.qmlmodels 6.10\nTreeModel {\n"
|
|
104
|
+
for (var column = 0; column < effectiveColumns.length; column++)
|
|
105
|
+
source += " TableModelColumn { display: \"_c" + column + "\"; edit: \"_c" + column + "\" }\n"
|
|
106
|
+
return source + "}"
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function rebuildModel() {
|
|
110
|
+
var previous = treeModel
|
|
111
|
+
treeModel = null
|
|
112
|
+
if (previous) previous.destroy()
|
|
113
|
+
if (effectiveColumns.length === 0) return
|
|
114
|
+
var created = Qt.createQmlObject(modelSource(), treeRoot, "ZuiDynamicTreeModel")
|
|
115
|
+
created.rows = normalizedRows()
|
|
116
|
+
treeModel = created
|
|
117
|
+
Qt.callLater(syncTreeState)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function syncRows() {
|
|
121
|
+
if (!treeModel) return rebuildModel()
|
|
122
|
+
treeModel.rows = normalizedRows()
|
|
123
|
+
Qt.callLater(syncTreeState)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function cleanPath(value) {
|
|
127
|
+
if (!Array.isArray(value)) return []
|
|
128
|
+
var path = []
|
|
129
|
+
for (var index = 0; index < value.length; index++) path.push(Number(value[index]))
|
|
130
|
+
return path
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function sourceNode(path) {
|
|
134
|
+
var rows = sourceRows
|
|
135
|
+
var node = null
|
|
136
|
+
for (var depth = 0; depth < path.length; depth++) {
|
|
137
|
+
var row = Number(path[depth])
|
|
138
|
+
if (!rows || row < 0 || row >= rows.length) return null
|
|
139
|
+
node = rows[row]
|
|
140
|
+
rows = nodeChildren(node)
|
|
141
|
+
}
|
|
142
|
+
return node
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function indexPath(modelIndex) {
|
|
146
|
+
var path = []
|
|
147
|
+
var current = modelIndex
|
|
148
|
+
while (current && current.valid) {
|
|
149
|
+
path.unshift(current.row)
|
|
150
|
+
current = current.parent
|
|
151
|
+
}
|
|
152
|
+
return path
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function cellPayload(row, column, value) {
|
|
156
|
+
var modelIndex = treeControl.index(row, column)
|
|
157
|
+
var path = modelIndex && modelIndex.valid ? indexPath(modelIndex) : []
|
|
158
|
+
return { row: row, column: column, path: path,
|
|
159
|
+
depth: row >= 0 ? treeControl.depth(row) : -1,
|
|
160
|
+
key: column >= 0 && column < effectiveColumns.length ? columnKey(column) : null,
|
|
161
|
+
value: value, node: sourceNode(path),
|
|
162
|
+
expanded: row >= 0 ? treeControl.isExpanded(row) : false }
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function syncTreeState() {
|
|
166
|
+
if (!treeModel || effectiveColumns.length === 0) return
|
|
167
|
+
var depth = Number(renderer.prop("expand_depth", 0))
|
|
168
|
+
if (depth > 0) {
|
|
169
|
+
for (var rootRow = 0; rootRow < sourceRows.length; rootRow++) {
|
|
170
|
+
var rootIndex = treeModel.index([rootRow], 0)
|
|
171
|
+
var rootCell = treeControl.cellAtIndex(rootIndex)
|
|
172
|
+
if (rootCell.y >= 0) treeControl.expandRecursively(rootCell.y, depth - 1)
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
var expandedPaths = renderer.prop("expanded_paths", [])
|
|
176
|
+
if (Array.isArray(expandedPaths)) {
|
|
177
|
+
for (var index = 0; index < expandedPaths.length; index++) {
|
|
178
|
+
var expandedIndex = treeModel.index(cleanPath(expandedPaths[index]), 0)
|
|
179
|
+
if (!expandedIndex.valid) continue
|
|
180
|
+
treeControl.expandToIndex(expandedIndex)
|
|
181
|
+
var expandedCell = treeControl.cellAtIndex(expandedIndex)
|
|
182
|
+
if (expandedCell.y >= 0) treeControl.expand(expandedCell.y)
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
var path = cleanPath(renderer.prop("selected_path", []))
|
|
186
|
+
if (path.length === 0) return
|
|
187
|
+
var column = Math.max(0, Math.min(effectiveColumns.length - 1,
|
|
188
|
+
Number(renderer.prop("selected_column", 0))))
|
|
189
|
+
var selectedIndex = treeModel.index(path, column)
|
|
190
|
+
if (!selectedIndex.valid) return
|
|
191
|
+
treeControl.expandToIndex(selectedIndex)
|
|
192
|
+
treeSelection.setCurrentIndex(selectedIndex, ItemSelectionModel.ClearAndSelect)
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function selectionBehaviorValue(value) {
|
|
196
|
+
var name = String(value || "rows")
|
|
197
|
+
if (name === "none" || name === "disabled") return TreeView.SelectionDisabled
|
|
198
|
+
if (name === "cells") return TreeView.SelectCells
|
|
199
|
+
if (name === "columns") return TreeView.SelectColumns
|
|
200
|
+
return TreeView.SelectRows
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function selectionModeValue(value) {
|
|
204
|
+
var name = String(value || "single")
|
|
205
|
+
if (name === "contiguous") return TreeView.ContiguousSelection
|
|
206
|
+
if (name === "extended" || name === "multiple") return TreeView.ExtendedSelection
|
|
207
|
+
return TreeView.SingleSelection
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function editTriggersValue(value) {
|
|
211
|
+
if (renderer.prop("editable", false) !== true) return TreeView.NoEditTriggers
|
|
212
|
+
var names = Array.isArray(value) ? value : [value || "edit_key"]
|
|
213
|
+
var result = TreeView.NoEditTriggers
|
|
214
|
+
for (var index = 0; index < names.length; index++) {
|
|
215
|
+
var name = String(names[index])
|
|
216
|
+
if (name === "single_tap") result |= TreeView.SingleTapped
|
|
217
|
+
if (name === "double_tap") result |= TreeView.DoubleTapped
|
|
218
|
+
if (name === "selected_tap") result |= TreeView.SelectedTapped
|
|
219
|
+
if (name === "edit_key") result |= TreeView.EditKeyPressed
|
|
220
|
+
if (name === "any_key") result |= TreeView.AnyKeyPressed
|
|
221
|
+
}
|
|
222
|
+
return result
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
implicitWidth: Number(renderer.prop("width", 720))
|
|
226
|
+
implicitHeight: Number(renderer.prop("height", 440))
|
|
227
|
+
color: renderer.prop("background", Color.background)
|
|
228
|
+
radius: Number(renderer.prop("radius", Style.cornerRadius))
|
|
229
|
+
border.width: String(renderer.prop("border_color", "")).length > 0 ? Style.normalBorderWidth : 0
|
|
230
|
+
border.color: renderer.prop("border_color", "transparent")
|
|
231
|
+
enabled: renderer.prop("enabled", true) !== false
|
|
232
|
+
clip: renderer.prop("clip", true) !== false
|
|
233
|
+
Accessible.name: String(renderer.prop("accessible_name", "Tree"))
|
|
234
|
+
Accessible.role: Accessible.Tree
|
|
235
|
+
|
|
236
|
+
ItemSelectionModel { id: treeSelection; model: treeRoot.treeModel }
|
|
237
|
+
|
|
238
|
+
Rectangle {
|
|
239
|
+
id: headerClip
|
|
240
|
+
x: treeRoot.treePadding
|
|
241
|
+
y: treeRoot.treePadding
|
|
242
|
+
width: Math.max(0, parent.width - treeRoot.treePadding * 2)
|
|
243
|
+
height: renderer.prop("show_header", true) !== false ? Number(renderer.prop("header_height", 42)) : 0
|
|
244
|
+
visible: height > 0
|
|
245
|
+
color: renderer.prop("header_background", Color.popups.background)
|
|
246
|
+
clip: true
|
|
247
|
+
|
|
248
|
+
Row {
|
|
249
|
+
x: -treeControl.contentX
|
|
250
|
+
height: parent.height
|
|
251
|
+
Repeater {
|
|
252
|
+
model: treeRoot.effectiveColumns
|
|
253
|
+
Rectangle {
|
|
254
|
+
required property int index
|
|
255
|
+
width: treeRoot.columnWidth(index)
|
|
256
|
+
height: headerClip.height
|
|
257
|
+
color: "transparent"
|
|
258
|
+
border.width: Style.normalBorderWidth
|
|
259
|
+
border.color: renderer.prop("grid_color", Qt.rgba(renderer.foreground.r,
|
|
260
|
+
renderer.foreground.g, renderer.foreground.b, 0.18))
|
|
261
|
+
Text {
|
|
262
|
+
anchors.fill: parent
|
|
263
|
+
anchors.leftMargin: Style.spacing.md
|
|
264
|
+
anchors.rightMargin: Style.spacing.md
|
|
265
|
+
text: treeRoot.columnLabel(index)
|
|
266
|
+
color: renderer.prop("header_foreground", renderer.prop("foreground", renderer.foreground))
|
|
267
|
+
font.family: String(renderer.prop("font_family", renderer.fontFamily))
|
|
268
|
+
font.pixelSize: Number(renderer.prop("header_size", Style.font.body))
|
|
269
|
+
font.bold: true
|
|
270
|
+
horizontalAlignment: treeRoot.columnAlignment(index)
|
|
271
|
+
verticalAlignment: Text.AlignVCenter
|
|
272
|
+
elide: Text.ElideRight
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
TreeView {
|
|
280
|
+
id: treeControl
|
|
281
|
+
x: treeRoot.treePadding
|
|
282
|
+
y: treeRoot.treePadding + headerClip.height
|
|
283
|
+
width: Math.max(0, parent.width - treeRoot.treePadding * 2)
|
|
284
|
+
height: Math.max(0, parent.height - treeRoot.treePadding * 2 - headerClip.height)
|
|
285
|
+
model: treeRoot.treeModel
|
|
286
|
+
selectionModel: treeSelection
|
|
287
|
+
selectionBehavior: treeRoot.selectionBehaviorValue(renderer.prop("selection_behavior", "rows"))
|
|
288
|
+
selectionMode: treeRoot.selectionModeValue(renderer.prop("selection_mode", "single"))
|
|
289
|
+
editTriggers: treeRoot.editTriggersValue(renderer.prop("edit_triggers", "edit_key"))
|
|
290
|
+
alternatingRows: renderer.prop("alternating_rows", true) !== false
|
|
291
|
+
animate: renderer.prop("animate", true) !== false
|
|
292
|
+
reuseItems: renderer.prop("reuse_items", true) !== false
|
|
293
|
+
keyNavigationEnabled: renderer.prop("key_navigation_enabled", true) !== false
|
|
294
|
+
pointerNavigationEnabled: renderer.prop("pointer_navigation_enabled", true) !== false
|
|
295
|
+
interactive: renderer.prop("interactive", true) !== false
|
|
296
|
+
clip: true
|
|
297
|
+
focus: true
|
|
298
|
+
rowSpacing: Number(renderer.prop("row_spacing", 1))
|
|
299
|
+
columnSpacing: Number(renderer.prop("column_spacing", 1))
|
|
300
|
+
rowHeightProvider: function(row) { return Number(renderer.prop("row_height", 42)) }
|
|
301
|
+
columnWidthProvider: function(column) { return treeRoot.columnWidth(column) }
|
|
302
|
+
|
|
303
|
+
delegate: QQC.TreeViewDelegate {
|
|
304
|
+
id: treeDelegate
|
|
305
|
+
required property int column
|
|
306
|
+
indentation: Number(renderer.prop("indentation", 22))
|
|
307
|
+
leftMargin: Number(renderer.prop("left_margin", Style.spacing.sm))
|
|
308
|
+
rightMargin: Number(renderer.prop("right_margin", Style.spacing.sm))
|
|
309
|
+
text: String(model.display === undefined || model.display === null ? "" : model.display)
|
|
310
|
+
font.family: String(renderer.prop("font_family", renderer.fontFamily))
|
|
311
|
+
font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
|
|
312
|
+
|
|
313
|
+
background: Rectangle {
|
|
314
|
+
color: treeDelegate.selected
|
|
315
|
+
? renderer.prop("selected_background", Color.popups.background)
|
|
316
|
+
: (treeControl.alternatingRows && treeDelegate.row % 2 === 1
|
|
317
|
+
? renderer.prop("alternate_background", renderer.prop("cell_background", "transparent"))
|
|
318
|
+
: renderer.prop("cell_background", "transparent"))
|
|
319
|
+
border.width: treeDelegate.current ? Style.normalBorderWidth : 0
|
|
320
|
+
border.color: renderer.prop("accent", Color.accent)
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
contentItem: Text {
|
|
324
|
+
text: treeDelegate.text
|
|
325
|
+
color: treeDelegate.selected
|
|
326
|
+
? renderer.prop("selected_foreground", renderer.prop("foreground", renderer.foreground))
|
|
327
|
+
: renderer.prop("foreground", renderer.foreground)
|
|
328
|
+
font: treeDelegate.font
|
|
329
|
+
horizontalAlignment: treeRoot.columnAlignment(treeDelegate.column)
|
|
330
|
+
verticalAlignment: Text.AlignVCenter
|
|
331
|
+
elide: Text.ElideRight
|
|
332
|
+
visible: !treeDelegate.editing
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
TableView.editDelegate: FocusScope {
|
|
336
|
+
width: parent.width
|
|
337
|
+
height: parent.height
|
|
338
|
+
TableView.onCommit: {
|
|
339
|
+
if (!treeRoot.columnEditable(treeDelegate.column)) return
|
|
340
|
+
var sourceIndex = treeControl.index(treeDelegate.row, treeDelegate.column)
|
|
341
|
+
if (treeRoot.treeModel.setData(sourceIndex, editor.text, Qt.EditRole))
|
|
342
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "edit",
|
|
343
|
+
treeRoot.cellPayload(treeDelegate.row, treeDelegate.column, editor.text))
|
|
344
|
+
}
|
|
345
|
+
QQC.TextField {
|
|
346
|
+
id: editor
|
|
347
|
+
anchors.fill: parent
|
|
348
|
+
text: String(treeDelegate.model.edit === undefined ? treeDelegate.model.display : treeDelegate.model.edit)
|
|
349
|
+
enabled: treeRoot.columnEditable(treeDelegate.column)
|
|
350
|
+
focus: true
|
|
351
|
+
Component.onCompleted: selectAll()
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
onClicked: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
|
|
356
|
+
"cell_click", treeRoot.cellPayload(row, column, model.display))
|
|
357
|
+
onDoubleClicked: {
|
|
358
|
+
var payload = treeRoot.cellPayload(row, column, model.display)
|
|
359
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "cell_double_click", payload)
|
|
360
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "activate", payload)
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
onExpanded: function(row, depth) {
|
|
365
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "expand",
|
|
366
|
+
treeRoot.cellPayload(row, 0, treeRoot.treeModel.data(treeControl.index(row, 0), Qt.DisplayRole)))
|
|
367
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "expanded_change",
|
|
368
|
+
{ row: row, depth: depth, expanded: true })
|
|
369
|
+
}
|
|
370
|
+
onCollapsed: function(row, recursively) {
|
|
371
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "collapse",
|
|
372
|
+
treeRoot.cellPayload(row, 0, treeRoot.treeModel.data(treeControl.index(row, 0), Qt.DisplayRole)))
|
|
373
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "expanded_change",
|
|
374
|
+
{ row: row, recursively: recursively, expanded: false })
|
|
375
|
+
}
|
|
376
|
+
onRowsChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
|
|
377
|
+
"row_count_change", { value: rows })
|
|
378
|
+
onColumnsChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
|
|
379
|
+
"column_count_change", { value: columns })
|
|
380
|
+
onContentXChanged: { if (moving) renderer.bridge.sendEvent(renderer.surfaceName,
|
|
381
|
+
renderer.controlId, "scroll", { x: contentX, y: contentY }) }
|
|
382
|
+
onContentYChanged: { if (moving) renderer.bridge.sendEvent(renderer.surfaceName,
|
|
383
|
+
renderer.controlId, "scroll", { x: contentX, y: contentY }) }
|
|
384
|
+
onMovementStarted: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
|
|
385
|
+
"movement_start", { x: contentX, y: contentY })
|
|
386
|
+
onMovementEnded: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
|
|
387
|
+
"movement_end", { x: contentX, y: contentY })
|
|
388
|
+
onActiveFocusChanged: {
|
|
389
|
+
if (renderer && renderer.bridge)
|
|
390
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
|
|
391
|
+
activeFocus ? "focus" : "blur", {})
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
Connections {
|
|
396
|
+
target: treeSelection
|
|
397
|
+
function onCurrentChanged(current, previous) {
|
|
398
|
+
if (!current.valid) return
|
|
399
|
+
var cell = treeControl.cellAtIndex(current)
|
|
400
|
+
if (cell.y < 0) return
|
|
401
|
+
var payload = treeRoot.cellPayload(cell.y, current.column,
|
|
402
|
+
treeRoot.treeModel.data(current, Qt.DisplayRole))
|
|
403
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "current_change", payload)
|
|
404
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "selection_change", payload)
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
Text {
|
|
409
|
+
anchors.centerIn: treeControl
|
|
410
|
+
visible: treeRoot.sourceRows.length === 0
|
|
411
|
+
text: String(renderer.prop("empty_text", "No nodes"))
|
|
412
|
+
color: renderer.prop("muted", Color.muted)
|
|
413
|
+
font.family: String(renderer.prop("font_family", renderer.fontFamily))
|
|
414
|
+
font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
Component.onCompleted: rebuildModel()
|
|
418
|
+
onEffectiveColumnsChanged: rebuildModel()
|
|
419
|
+
onSourceRowsChanged: syncRows()
|
|
420
|
+
onChildrenFieldChanged: rebuildModel()
|
|
421
|
+
onVisibleChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
|
|
422
|
+
visible ? "show" : "hide", {})
|
|
423
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import QtQuick.Controls as QQC
|
|
3
|
+
import "../../Theme"
|
|
4
|
+
|
|
5
|
+
QQC.ItemDelegate {
|
|
6
|
+
id: delegateRoot
|
|
7
|
+
|
|
8
|
+
property var renderer: null
|
|
9
|
+
readonly property bool expanded: renderer && renderer.prop("expanded", false) === true
|
|
10
|
+
|
|
11
|
+
text: (renderer && renderer.prop("has_children", false) === true ? (expanded ? "▾ " : "▸ ") : "") + (renderer ? String(renderer.prop("text", "")) : "")
|
|
12
|
+
enabled: !renderer || renderer.prop("enabled", true) !== false
|
|
13
|
+
leftPadding: Number(renderer ? renderer.prop("depth", 0) * renderer.prop("indentation", 18) : 0) + 8
|
|
14
|
+
implicitWidth: Number(renderer ? renderer.prop("width", 220) : 220)
|
|
15
|
+
implicitHeight: Number(renderer ? renderer.prop("height", 42) : 42)
|
|
16
|
+
highlighted: renderer && (renderer.prop("selected", false) === true || renderer.prop("current", false) === true)
|
|
17
|
+
onClicked: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, renderer.prop("has_children", false) === true ? (expanded ? "collapse" : "expand") : "click", {
|
|
18
|
+
"row": renderer.prop("row", -1),
|
|
19
|
+
"column": renderer.prop("column", -1),
|
|
20
|
+
"value": renderer.prop("value", null)
|
|
21
|
+
})
|
|
22
|
+
onDoubleClicked: {
|
|
23
|
+
var payload = {
|
|
24
|
+
"row": renderer.prop("row", -1),
|
|
25
|
+
"column": renderer.prop("column", -1),
|
|
26
|
+
"value": renderer.prop("value", null)
|
|
27
|
+
};
|
|
28
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "double_click", payload);
|
|
29
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "activate", payload);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
background: Rectangle {
|
|
33
|
+
color: delegateRoot.highlighted ? renderer.prop("selected_background", Color.popups.background) : renderer.prop("background", "transparent")
|
|
34
|
+
border.color: renderer.prop("border_color", "transparent")
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
contentItem: Text {
|
|
38
|
+
text: delegateRoot.text
|
|
39
|
+
color: delegateRoot.highlighted ? renderer.prop("selected_foreground", renderer.foreground) : renderer.prop("foreground", renderer.foreground)
|
|
40
|
+
font.family: renderer.prop("font_family", renderer.fontFamily)
|
|
41
|
+
font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
|
|
42
|
+
verticalAlignment: Text.AlignVCenter
|
|
43
|
+
elide: Text.ElideRight
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import QtQuick.Controls as QQC
|
|
3
|
+
import "../../Theme"
|
|
4
|
+
|
|
5
|
+
QQC.Tumbler {
|
|
6
|
+
id: tumblerRoot
|
|
7
|
+
property var renderer: null
|
|
8
|
+
implicitWidth: Number(renderer ? renderer.prop("width", 120) : 120); implicitHeight: Number(renderer ? renderer.prop("height", 220) : 220)
|
|
9
|
+
model: renderer ? renderer.prop("items", []) : []
|
|
10
|
+
currentIndex: Number(renderer ? renderer.prop("current_index", 0) : 0)
|
|
11
|
+
visibleItemCount: Number(renderer ? renderer.prop("visible_item_count", 5) : 5)
|
|
12
|
+
wrap: !renderer || renderer.prop("wrap", true) !== false
|
|
13
|
+
enabled: !renderer || (renderer.prop("enabled", true) !== false && renderer.prop("interactive", true) !== false)
|
|
14
|
+
font.family: renderer ? renderer.prop("font_family", renderer.fontFamily) : ""; font.pixelSize: Number(renderer ? renderer.prop("font_size", Style.font.body) : Style.font.body)
|
|
15
|
+
background: Rectangle { color: renderer ? renderer.prop("background", "transparent") : "transparent" }
|
|
16
|
+
delegate: Text { required property var modelData; required property int index; text: String(modelData); color: index === tumblerRoot.currentIndex ? renderer.prop("accent", renderer.prop("foreground", renderer.foreground)) : renderer.prop("muted", renderer.prop("foreground", renderer.foreground)); font: tumblerRoot.font; horizontalAlignment: Text.AlignHCenter; verticalAlignment: Text.AlignVCenter; opacity: 1.0 - Math.min(0.7, Math.abs(QQC.Tumbler.displacement) / Math.max(1, tumblerRoot.visibleItemCount)) }
|
|
17
|
+
onMovingChanged: if (!moving) { var payload = { value: currentIndex, item: model[currentIndex] }; renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "input", payload); renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "change", payload) }
|
|
18
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
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
|
+
VectorImage {
|
|
10
|
+
id: vectorRoot
|
|
11
|
+
required property var renderer
|
|
12
|
+
|
|
13
|
+
function synchronizeCapabilities() {
|
|
14
|
+
var trusted = renderer.prop("trusted", false) === true
|
|
15
|
+
if (vectorRoot["assumeTrustedSource"] !== undefined)
|
|
16
|
+
vectorRoot["assumeTrustedSource"] = trusted
|
|
17
|
+
else if (trusted)
|
|
18
|
+
renderer.componentError("trusted_vector_unsupported",
|
|
19
|
+
"The installed Qt version does not support trusted vector sources", {})
|
|
20
|
+
|
|
21
|
+
var asynchronous = renderer.prop("asynchronous_shapes", false) === true
|
|
22
|
+
if (vectorRoot["asynchronousShapes"] !== undefined)
|
|
23
|
+
vectorRoot["asynchronousShapes"] = asynchronous
|
|
24
|
+
else if (asynchronous)
|
|
25
|
+
renderer.componentError("asynchronous_vector_unsupported",
|
|
26
|
+
"The installed Qt version does not support asynchronous vector shapes", {})
|
|
27
|
+
|
|
28
|
+
var controller = vectorRoot["animations"]
|
|
29
|
+
var loops = Number(renderer.prop("animation_loops", 1))
|
|
30
|
+
var paused = renderer.prop("animation_paused", false) === true
|
|
31
|
+
if (controller === undefined || controller === null) {
|
|
32
|
+
if (loops !== 1 || paused)
|
|
33
|
+
renderer.componentError("vector_animation_unsupported",
|
|
34
|
+
"The installed Qt version does not support animated vector images", {})
|
|
35
|
+
return
|
|
36
|
+
}
|
|
37
|
+
controller.loops = loops
|
|
38
|
+
controller.paused = paused
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
source: renderer.assetUrl(renderer.prop("source", ""))
|
|
42
|
+
width: Number(renderer.prop("width", 120))
|
|
43
|
+
height: Number(renderer.prop("height", 120))
|
|
44
|
+
fillMode: {
|
|
45
|
+
var mode = String(renderer.prop("fill_mode", "contain"))
|
|
46
|
+
if (mode === "cover") return VectorImage.PreserveAspectCrop
|
|
47
|
+
if (mode === "stretch") return VectorImage.Stretch
|
|
48
|
+
if (mode === "none") return VectorImage.NoResize
|
|
49
|
+
return VectorImage.PreserveAspectFit
|
|
50
|
+
}
|
|
51
|
+
preferredRendererType: String(renderer.prop("renderer", "geometry")) === "curve"
|
|
52
|
+
? VectorImage.CurveRenderer : VectorImage.GeometryRenderer
|
|
53
|
+
onSourceChanged: {
|
|
54
|
+
if (renderer.subscribed("source_change"))
|
|
55
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "source_change", { value: source })
|
|
56
|
+
}
|
|
57
|
+
Component.onCompleted: synchronizeCapabilities()
|
|
58
|
+
Connections {
|
|
59
|
+
target: vectorRoot.renderer
|
|
60
|
+
function onNodeChanged() { vectorRoot.synchronizeCapabilities() }
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import QtQuick.Controls as QQC
|
|
3
|
+
import "../../Theme"
|
|
4
|
+
|
|
5
|
+
ListView {
|
|
6
|
+
id: headerRoot
|
|
7
|
+
property var renderer: null
|
|
8
|
+
implicitWidth: Number(renderer ? renderer.prop("width", 80) : 80)
|
|
9
|
+
implicitHeight: renderer ? renderer.prop("sections", []).length * Number(renderer.prop("section_height", 42)) : 0
|
|
10
|
+
model: renderer ? renderer.prop("sections", []) : []
|
|
11
|
+
spacing: Number(renderer ? renderer.prop("spacing", 1) : 1)
|
|
12
|
+
delegate: Rectangle {
|
|
13
|
+
required property int index; required property var modelData
|
|
14
|
+
width: headerRoot.width; height: Number(renderer.prop("section_height", 42))
|
|
15
|
+
readonly property bool selected: index === Number(renderer.prop("current_index", -1))
|
|
16
|
+
color: selected ? renderer.prop("selected_background", Color.popups.background) : renderer.prop("background", Color.background)
|
|
17
|
+
border.color: renderer.prop("border_color", Color.muted)
|
|
18
|
+
Text { anchors.fill: parent; anchors.margins: 8; text: String(modelData && modelData.label !== undefined ? modelData.label : modelData); color: parent.selected ? renderer.prop("selected_foreground", renderer.prop("foreground", renderer.foreground)) : renderer.prop("foreground", renderer.foreground); font.family: renderer.prop("font_family", renderer.fontFamily); font.pixelSize: Number(renderer.prop("font_size", Style.font.body)); verticalAlignment: Text.AlignVCenter; horizontalAlignment: Text.AlignHCenter }
|
|
19
|
+
TapHandler { enabled: renderer.prop("clickable", true) !== false; onTapped: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "click", { index: index, value: modelData }) }
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import QtQuick.Controls as QQC
|
|
3
|
+
import "../../Theme"
|
|
4
|
+
|
|
5
|
+
QQC.ItemDelegate {
|
|
6
|
+
id: headerDelegate
|
|
7
|
+
|
|
8
|
+
property var renderer: null
|
|
9
|
+
|
|
10
|
+
text: renderer ? String(renderer.prop("text", "")) : ""
|
|
11
|
+
enabled: !renderer || renderer.prop("enabled", true) !== false
|
|
12
|
+
implicitWidth: Number(renderer ? renderer.prop("width", 80) : 80)
|
|
13
|
+
implicitHeight: Number(renderer ? renderer.prop("height", 42) : 42)
|
|
14
|
+
highlighted: renderer && renderer.prop("selected", false) === true
|
|
15
|
+
font.family: renderer ? renderer.prop("font_family", renderer.fontFamily) : ""
|
|
16
|
+
font.pixelSize: Number(renderer ? renderer.prop("font_size", Style.font.body) : Style.font.body)
|
|
17
|
+
onClicked: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "click", {
|
|
18
|
+
"index": renderer.prop("index", -1),
|
|
19
|
+
"value": renderer.prop("value", null)
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
background: Rectangle {
|
|
23
|
+
color: headerDelegate.highlighted ? renderer.prop("selected_background", Color.popups.background) : renderer.prop("background", Color.background)
|
|
24
|
+
border.color: renderer.prop("border_color", Color.muted)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
contentItem: Text {
|
|
28
|
+
text: headerDelegate.text
|
|
29
|
+
color: headerDelegate.highlighted ? renderer.prop("selected_foreground", renderer.prop("foreground", renderer.foreground)) : renderer.prop("foreground", renderer.foreground)
|
|
30
|
+
font: headerDelegate.font
|
|
31
|
+
verticalAlignment: Text.AlignVCenter
|
|
32
|
+
horizontalAlignment: Text.AlignHCenter
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
}
|