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