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,87 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import QtQuick.Controls as QQC
|
|
3
|
+
import QtQuick.Layouts
|
|
4
|
+
import QtMultimedia
|
|
5
|
+
import QtQuick.VectorImage
|
|
6
|
+
import "../../Theme"
|
|
7
|
+
import "../../Controls" as ZuiControls
|
|
8
|
+
|
|
9
|
+
Item {
|
|
10
|
+
required property var renderer
|
|
11
|
+
implicitWidth: Number(renderer.prop("width", 420))
|
|
12
|
+
implicitHeight: Number(renderer.prop("height", 220))
|
|
13
|
+
|
|
14
|
+
Canvas {
|
|
15
|
+
id: lineCanvas
|
|
16
|
+
anchors.fill: parent
|
|
17
|
+
antialiasing: true
|
|
18
|
+
onPaint: {
|
|
19
|
+
var ctx = getContext("2d")
|
|
20
|
+
ctx.clearRect(0, 0, width, height)
|
|
21
|
+
var raw = renderer.prop("values", [])
|
|
22
|
+
if (!Array.isArray(raw) || raw.length === 0) return
|
|
23
|
+
var values = raw.map(function(value) { return Number(value) })
|
|
24
|
+
var pad = Math.max(8, Number(renderer.prop("point_size", 5)) + 3)
|
|
25
|
+
var chartWidth = Math.max(1, width - pad * 2)
|
|
26
|
+
var chartHeight = Math.max(1, height - pad * 2)
|
|
27
|
+
var low = renderer.prop("minimum", null)
|
|
28
|
+
var high = renderer.prop("maximum", null)
|
|
29
|
+
if (low === null) low = Math.min.apply(Math, values)
|
|
30
|
+
if (high === null) high = Math.max.apply(Math, values)
|
|
31
|
+
low = Number(low); high = Number(high)
|
|
32
|
+
if (high === low) { high += 1; low -= 1 }
|
|
33
|
+
|
|
34
|
+
if (renderer.prop("show_grid", true) !== false) {
|
|
35
|
+
ctx.strokeStyle = renderer.prop("grid_color", Color.muted)
|
|
36
|
+
ctx.lineWidth = 1
|
|
37
|
+
for (var grid = 0; grid <= 4; grid++) {
|
|
38
|
+
var gy = pad + chartHeight * grid / 4
|
|
39
|
+
ctx.beginPath(); ctx.moveTo(pad, gy); ctx.lineTo(width - pad, gy); ctx.stroke()
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
var points = []
|
|
44
|
+
for (var index = 0; index < values.length; index++) {
|
|
45
|
+
var x = pad + (values.length === 1 ? chartWidth / 2 : chartWidth * index / (values.length - 1))
|
|
46
|
+
var y = pad + chartHeight * (1 - (values[index] - low) / (high - low))
|
|
47
|
+
points.push({ x: x, y: y })
|
|
48
|
+
}
|
|
49
|
+
var fill = String(renderer.prop("fill_color", ""))
|
|
50
|
+
if (fill.length > 0 && points.length > 1) {
|
|
51
|
+
ctx.beginPath(); ctx.moveTo(points[0].x, height - pad)
|
|
52
|
+
for (var fillIndex = 0; fillIndex < points.length; fillIndex++) ctx.lineTo(points[fillIndex].x, points[fillIndex].y)
|
|
53
|
+
ctx.lineTo(points[points.length - 1].x, height - pad); ctx.closePath()
|
|
54
|
+
ctx.fillStyle = fill; ctx.fill()
|
|
55
|
+
}
|
|
56
|
+
ctx.beginPath(); ctx.moveTo(points[0].x, points[0].y)
|
|
57
|
+
for (var lineIndex = 1; lineIndex < points.length; lineIndex++) ctx.lineTo(points[lineIndex].x, points[lineIndex].y)
|
|
58
|
+
ctx.strokeStyle = renderer.prop("color", Color.accent)
|
|
59
|
+
ctx.lineWidth = Number(renderer.prop("line_width", 2)); ctx.stroke()
|
|
60
|
+
if (renderer.prop("show_points", true) !== false) {
|
|
61
|
+
ctx.fillStyle = renderer.prop("color", Color.accent)
|
|
62
|
+
var pointSize = Number(renderer.prop("point_size", 5))
|
|
63
|
+
for (var pointIndex = 0; pointIndex < points.length; pointIndex++) {
|
|
64
|
+
ctx.beginPath(); ctx.arc(points[pointIndex].x, points[pointIndex].y, pointSize, 0, Math.PI * 2); ctx.fill()
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
Connections {
|
|
71
|
+
target: root
|
|
72
|
+
function onNodeChanged() { lineCanvas.requestPaint() }
|
|
73
|
+
}
|
|
74
|
+
MouseArea {
|
|
75
|
+
anchors.fill: parent
|
|
76
|
+
hoverEnabled: renderer.subscribed("hover")
|
|
77
|
+
function payload(mouse) {
|
|
78
|
+
var values = renderer.prop("values", [])
|
|
79
|
+
if (!Array.isArray(values) || values.length === 0) return ({ index: -1 })
|
|
80
|
+
var index = Math.max(0, Math.min(values.length - 1, Math.round(mouse.x / Math.max(1, width) * (values.length - 1))))
|
|
81
|
+
var labels = renderer.prop("labels", [])
|
|
82
|
+
return { index: index, value: values[index], label: Array.isArray(labels) ? labels[index] : null }
|
|
83
|
+
}
|
|
84
|
+
onClicked: function(mouse) { renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "select", payload(mouse)) }
|
|
85
|
+
onPositionChanged: function(mouse) { renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "hover", payload(mouse)) }
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
|
|
3
|
+
Item {
|
|
4
|
+
id:modelRoot;property var renderer:null;property alias model:nativeModel
|
|
5
|
+
function rebuild(){nativeModel.clear();var items=renderer?renderer.prop("items",[]):[];for(var i=0;i<items.length;i++){var item=items[i];nativeModel.append(item!==null&&typeof item==="object"&&!Array.isArray(item)?item:{value:item})}if(renderer){renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,"count_change",{value:nativeModel.count});renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,"change",{count:nativeModel.count})}}
|
|
6
|
+
ListModel{id:nativeModel}
|
|
7
|
+
Component.onCompleted:rebuild();Connections{target:renderer;function onNodeChanged(){modelRoot.rebuild()}}
|
|
8
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
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
|
+
ListView {
|
|
10
|
+
required property var renderer
|
|
11
|
+
id: listControl
|
|
12
|
+
readonly property var sourceItems: renderer.prop("items", [])
|
|
13
|
+
readonly property string keyField: String(renderer.prop("key_field", "id"))
|
|
14
|
+
readonly property string labelField: String(renderer.prop("label_field", "label"))
|
|
15
|
+
readonly property string descriptionField: String(renderer.prop("description_field", "description"))
|
|
16
|
+
readonly property string iconField: String(renderer.prop("icon_field", "icon"))
|
|
17
|
+
implicitWidth: Number(renderer.prop("width", 280)); implicitHeight: Number(renderer.prop("height", 240))
|
|
18
|
+
orientation: String(renderer.prop("orientation", "vertical")) === "horizontal" ? ListView.Horizontal : ListView.Vertical
|
|
19
|
+
spacing: Number(renderer.prop("spacing", Style.spacing.labelGap)); clip: true; model: sourceItems
|
|
20
|
+
currentIndex: {
|
|
21
|
+
var selected = renderer.prop("selected", null)
|
|
22
|
+
for (var i = 0; i < sourceItems.length; i++) {
|
|
23
|
+
var item = sourceItems[i]
|
|
24
|
+
var key = typeof item === "object" ? item[keyField] : item
|
|
25
|
+
if (key === selected) return i
|
|
26
|
+
}
|
|
27
|
+
return -1
|
|
28
|
+
}
|
|
29
|
+
onContentXChanged: if (moving) renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "scroll", { x: contentX, y: contentY })
|
|
30
|
+
onContentYChanged: if (moving) renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "scroll", { x: contentX, y: contentY })
|
|
31
|
+
|
|
32
|
+
delegate: ZuiControls.CursorSurface {
|
|
33
|
+
required property var modelData
|
|
34
|
+
required property int index
|
|
35
|
+
readonly property var value: typeof modelData === "object" ? modelData[listControl.keyField] : modelData
|
|
36
|
+
width: listControl.orientation === ListView.Vertical ? listControl.width : implicitWidth
|
|
37
|
+
implicitWidth: rowContent.implicitWidth + Style.spacing.rowPaddingX * 2
|
|
38
|
+
implicitHeight: Math.max(Style.spacing.controlHeight, rowContent.implicitHeight + Style.spacing.controlPaddingY * 2)
|
|
39
|
+
current: index === listControl.currentIndex
|
|
40
|
+
foreground: renderer.foreground
|
|
41
|
+
Row {
|
|
42
|
+
id: rowContent
|
|
43
|
+
anchors.centerIn: parent
|
|
44
|
+
spacing: Style.spacing.controlGap
|
|
45
|
+
Text { visible: text !== ""; text: renderer.iconGlyph(typeof modelData === "object" ? modelData[listControl.iconField] : ""); textFormat: Text.PlainText; color: renderer.foreground; font.family: renderer.fontFamily }
|
|
46
|
+
Column {
|
|
47
|
+
Text { text: String(typeof modelData === "object" ? (modelData[listControl.labelField] ?? value) : modelData); textFormat: Text.PlainText; color: renderer.foreground; font.family: renderer.fontFamily }
|
|
48
|
+
Text { visible: text !== ""; text: String(typeof modelData === "object" ? (modelData[listControl.descriptionField] || "") : ""); textFormat: Text.PlainText; color: Qt.darker(renderer.foreground, 1.4); font.family: renderer.fontFamily; font.pixelSize: Style.font.caption }
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
MouseArea {
|
|
52
|
+
anchors.fill: parent
|
|
53
|
+
onClicked: {
|
|
54
|
+
listControl.currentIndex = index
|
|
55
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "change", { value: parent.value, index: index, item: modelData })
|
|
56
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "activate", { value: parent.value, index: index, item: modelData })
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
Text {
|
|
62
|
+
anchors.centerIn: parent; visible: listControl.count === 0
|
|
63
|
+
text: String(renderer.prop("empty_text", "No items")); textFormat: Text.PlainText; color: Qt.darker(renderer.foreground, 1.4); font.family: renderer.fontFamily
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
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
|
+
Loader {
|
|
10
|
+
required property var renderer
|
|
11
|
+
readonly property var childNode: renderer.node && Array.isArray(renderer.node.children) && renderer.node.children.length > 0
|
|
12
|
+
? renderer.node.children[0] : null
|
|
13
|
+
active: renderer.prop("active", true) !== false && childNode !== null
|
|
14
|
+
asynchronous: renderer.prop("asynchronous", false) === true
|
|
15
|
+
source: active ? Qt.resolvedUrl("../../ControlNode.qml") : ""
|
|
16
|
+
width: Number(renderer.prop("width", item ? item.implicitWidth : 0))
|
|
17
|
+
height: Number(renderer.prop("height", item ? item.implicitHeight : 0))
|
|
18
|
+
onLoaded: {
|
|
19
|
+
item.bridge = renderer.bridge
|
|
20
|
+
item.surfaceName = renderer.surfaceName
|
|
21
|
+
item.controlId = String(childNode.id)
|
|
22
|
+
item.foreground = renderer.foreground
|
|
23
|
+
item.fontFamily = renderer.fontFamily
|
|
24
|
+
if (renderer.subscribed("loaded")) renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "loaded", {})
|
|
25
|
+
}
|
|
26
|
+
onStatusChanged: {
|
|
27
|
+
if (renderer.subscribed("status"))
|
|
28
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "status", { value: status })
|
|
29
|
+
if (status === Loader.Error)
|
|
30
|
+
renderer.componentError("loader_child_failed",
|
|
31
|
+
"Unable to load the child of the declared loader component", {})
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import QtQuick.Controls as QQC
|
|
3
|
+
import QtQuick.Layouts
|
|
4
|
+
import QtMultimedia
|
|
5
|
+
import QtQuick.VectorImage
|
|
6
|
+
import "../../Theme"
|
|
7
|
+
import "../../Controls" as ZuiControls
|
|
8
|
+
|
|
9
|
+
Text {
|
|
10
|
+
required property var renderer
|
|
11
|
+
text: String(renderer.prop("text", ""))
|
|
12
|
+
textFormat: Text.MarkdownText
|
|
13
|
+
baseUrl: String(renderer.prop("base_url", ""))
|
|
14
|
+
color: renderer.prop("color", renderer.foreground)
|
|
15
|
+
linkColor: renderer.prop("link_color", Color.accent)
|
|
16
|
+
font.family: renderer.fontFamily
|
|
17
|
+
font.pixelSize: Number(renderer.prop("size", Style.font.body))
|
|
18
|
+
width: Number(renderer.prop("width", implicitWidth))
|
|
19
|
+
wrapMode: renderer.prop("wrap", true) !== false ? Text.Wrap : Text.NoWrap
|
|
20
|
+
maximumLineCount: Number(renderer.prop("maximum_lines", 2147483647))
|
|
21
|
+
onLinkActivated: function(link) { renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "link", { value: link }) }
|
|
22
|
+
HoverHandler { cursorShape: parent.hoveredLink.length > 0 ? Qt.PointingHandCursor : Qt.ArrowCursor }
|
|
23
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import QtMultimedia
|
|
3
|
+
|
|
4
|
+
Item {
|
|
5
|
+
id:devicesRoot;property var renderer:null
|
|
6
|
+
function payload(list){var values=[];for(var i=0;i<list.length;i++)values.push({id:String(list[i].id),description:list[i].description,default:list[i].isDefault});return values}
|
|
7
|
+
function emitAll(){if(!renderer)return;var kind=String(renderer.prop("kind","all"));if(kind==="all"||kind==="video_inputs")renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,"video_inputs",{values:payload(nativeDevices.videoInputs)});if(kind==="all"||kind==="audio_inputs")renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,"audio_inputs",{values:payload(nativeDevices.audioInputs)});if(kind==="all"||kind==="audio_outputs")renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,"audio_outputs",{values:payload(nativeDevices.audioOutputs)});renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,"change",{kind:kind,revision:Number(renderer.prop("refresh_revision",0))})}
|
|
8
|
+
MediaDevices{id:nativeDevices;onVideoInputsChanged:devicesRoot.emitAll();onAudioInputsChanged:devicesRoot.emitAll();onAudioOutputsChanged:devicesRoot.emitAll()}
|
|
9
|
+
Component.onCompleted:emitAll();Connections{target:renderer;function onNodeChanged(){devicesRoot.emitAll()}}
|
|
10
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import QtMultimedia
|
|
3
|
+
|
|
4
|
+
Item {
|
|
5
|
+
id: playerRoot
|
|
6
|
+
property var renderer: null
|
|
7
|
+
property alias mediaPlayer: nativePlayer
|
|
8
|
+
property alias audioOutput: nativeAudioOutput
|
|
9
|
+
property int handledCommandRevision: -1
|
|
10
|
+
function audioDeviceValid(){var requested=String(renderer?renderer.prop("audio_device",""):"");if(requested==="")return true;var devices=mediaDevices.audioOutputs;for(var index=0;index<devices.length;index++)if(String(devices[index].id)===requested||devices[index].description===requested)return true;if(renderer)renderer.componentError("audio_output_device_not_found","The declared media-player audio output does not exist",{device:requested});return false}
|
|
11
|
+
function audioDevice(){var requested=String(renderer?renderer.prop("audio_device",""):"");var devices=mediaDevices.audioOutputs;if(requested==="")return mediaDevices.defaultAudioOutput;for(var index=0;index<devices.length;index++)if(String(devices[index].id)===requested||devices[index].description===requested)return devices[index];return null}
|
|
12
|
+
function send(name,payload){if(renderer&&renderer.subscribed(name))renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,name,payload||{})}
|
|
13
|
+
function command(){if(!renderer)return;var revision=Number(renderer.prop("command_revision",0));if(revision===handledCommandRevision)return;handledCommandRevision=revision;var value=String(renderer.prop("command",renderer.prop("playback","")));if(value==="play")nativePlayer.play();else if(value==="pause")nativePlayer.pause();else if(value==="stop")nativePlayer.stop()}
|
|
14
|
+
MediaDevices{id:mediaDevices}
|
|
15
|
+
AudioOutput { id:nativeAudioOutput;device:playerRoot.audioDevice();volume:playerRoot.audioDeviceValid()?Math.max(0,Math.min(1,Number(renderer?renderer.prop("volume",1):1))):0;muted:!playerRoot.audioDeviceValid()||(renderer&&renderer.prop("muted",false)===true) }
|
|
16
|
+
MediaPlayer {
|
|
17
|
+
id:nativePlayer;source:renderer?renderer.assetUrl(renderer.prop("source","")):"";autoPlay:renderer&&renderer.prop("auto_play",false)===true;loops:Number(renderer?renderer.prop("loops",1):1);playbackRate:Number(renderer?renderer.prop("playback_rate",1):1);position:Number(renderer?renderer.prop("position",0):0);audioOutput:nativeAudioOutput
|
|
18
|
+
onPlaybackStateChanged:{var name=playbackState===MediaPlayer.PlayingState?"play":(playbackState===MediaPlayer.PausedState?"pause":"stop");playerRoot.send(name,{})}
|
|
19
|
+
onMediaStatusChanged:playerRoot.send("media_status",{value:mediaStatus})
|
|
20
|
+
onErrorOccurred:function(error,message){renderer.componentError("media_playback_failed",message,{native_code:error,source:String(source)})}
|
|
21
|
+
onPositionChanged:playerRoot.send("position",{value:position,duration:duration})
|
|
22
|
+
onDurationChanged:playerRoot.send("duration",{value:duration})
|
|
23
|
+
onBufferProgressChanged:playerRoot.send("buffer",{value:bufferProgress})
|
|
24
|
+
onTracksChanged:playerRoot.send("tracks",{audio:audioTracks.length,video:videoTracks.length,subtitles:subtitleTracks.length})
|
|
25
|
+
}
|
|
26
|
+
Component.onCompleted:command();Connections{target:renderer;function onNodeChanged(){playerRoot.command()}}
|
|
27
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import QtMultimedia
|
|
3
|
+
|
|
4
|
+
Item {
|
|
5
|
+
id:recorderRoot;property var renderer:null;property alias mediaRecorder:nativeRecorder;property int handledCommandRevision:-1;readonly property var sessionItem:renderer?renderer.findRenderedItem(renderer.prop("session","")):null
|
|
6
|
+
function quality(){var value=String(renderer?renderer.prop("quality","normal"):"normal");if(value==="very_low")return MediaRecorder.VeryLowQuality;if(value==="low")return MediaRecorder.LowQuality;if(value==="high")return MediaRecorder.HighQuality;if(value==="very_high")return MediaRecorder.VeryHighQuality;return MediaRecorder.NormalQuality}
|
|
7
|
+
function resolution(){var value=renderer?renderer.prop("resolution",[]):[];if(Array.isArray(value))return Qt.size(Number(value[0]||0),Number(value[1]||0));if(value&&typeof value==="object")return Qt.size(Number(value.width||0),Number(value.height||0));return Qt.size(0,0)}
|
|
8
|
+
function fileFormat(){var value=String(renderer?renderer.prop("media_format","unspecified"):"unspecified").toLowerCase();var values={wmv:MediaFormat.WMV,avi:MediaFormat.AVI,matroska:MediaFormat.Matroska,mkv:MediaFormat.Matroska,mp4:MediaFormat.MPEG4,mpeg4:MediaFormat.MPEG4,ogg:MediaFormat.Ogg,quicktime:MediaFormat.QuickTime,webm:MediaFormat.WebM,aac:MediaFormat.AAC,mp3:MediaFormat.MP3,flac:MediaFormat.FLAC,wave:MediaFormat.Wave,wav:MediaFormat.Wave};return values[value]===undefined?MediaFormat.UnspecifiedFormat:values[value]}
|
|
9
|
+
function audioCodec(){var value=String(renderer?renderer.prop("audio_codec","unspecified"):"unspecified").toLowerCase();var values={mp3:MediaFormat.AudioCodec.MP3,aac:MediaFormat.AudioCodec.AAC,ac3:MediaFormat.AudioCodec.AC3,eac3:MediaFormat.AudioCodec.EAC3,flac:MediaFormat.AudioCodec.FLAC,opus:MediaFormat.AudioCodec.Opus,vorbis:MediaFormat.AudioCodec.Vorbis,wave:MediaFormat.AudioCodec.Wave,wma:MediaFormat.AudioCodec.WMA,alac:MediaFormat.AudioCodec.ALAC};return values[value]===undefined?MediaFormat.AudioCodec.Unspecified:values[value]}
|
|
10
|
+
function videoCodec(){var value=String(renderer?renderer.prop("video_codec","unspecified"):"unspecified").toLowerCase();var values={mpeg1:MediaFormat.VideoCodec.MPEG1,mpeg2:MediaFormat.VideoCodec.MPEG2,mpeg4:MediaFormat.VideoCodec.MPEG4,h264:MediaFormat.VideoCodec.H264,h265:MediaFormat.VideoCodec.H265,vp8:MediaFormat.VideoCodec.VP8,vp9:MediaFormat.VideoCodec.VP9,av1:MediaFormat.VideoCodec.AV1,theora:MediaFormat.VideoCodec.Theora,wmv:MediaFormat.VideoCodec.WMV,motion_jpeg:MediaFormat.VideoCodec.MotionJPEG};return values[value]===undefined?MediaFormat.VideoCodec.Unspecified:values[value]}
|
|
11
|
+
function send(name,payload){if(renderer&&renderer.subscribed(name))renderer.bridge.sendEvent(renderer.surfaceName,renderer.controlId,name,payload||{})}
|
|
12
|
+
function connectSession(){if(sessionItem&&sessionItem.captureSession!==undefined)sessionItem.captureSession.recorder=nativeRecorder}
|
|
13
|
+
function command(){if(!renderer)return;var revision=Number(renderer.prop("command_revision",0));if(revision===handledCommandRevision)return;handledCommandRevision=revision;var value=String(renderer.prop("command",""));if(value==="record")nativeRecorder.record();else if(value==="pause")nativeRecorder.pause();else if(value==="stop")nativeRecorder.stop()}
|
|
14
|
+
MediaRecorder{id:nativeRecorder;outputLocation:renderer?renderer.assetUrl(renderer.prop("output_location","")):"";quality:recorderRoot.quality();videoResolution:recorderRoot.resolution();mediaFormat.fileFormat:recorderRoot.fileFormat();mediaFormat.audioCodec:recorderRoot.audioCodec();mediaFormat.videoCodec:recorderRoot.videoCodec();videoFrameRate:Number(renderer?renderer.prop("frame_rate",0):0);audioBitRate:Number(renderer?renderer.prop("audio_bit_rate",0):0);videoBitRate:Number(renderer?renderer.prop("video_bit_rate",0):0);onRecorderStateChanged:{var name=recorderState===MediaRecorder.RecordingState?"record":(recorderState===MediaRecorder.PausedState?"pause":"stop");recorderRoot.send(name,{})} onDurationChanged:recorderRoot.send("duration",{value:duration});onErrorOccurred:function(error,errorString){renderer.componentError("media_recording_failed",errorString,{native_code:error})} onActualLocationChanged:recorderRoot.send("location",{value:String(actualLocation)})}
|
|
15
|
+
Component.onCompleted:{connectSession();command()}onSessionItemChanged:connectSession();Connections{target:renderer;function onNodeChanged(){recorderRoot.command()}}
|
|
16
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import QtQuick.Controls as QQC
|
|
3
|
+
import Qt.labs.qmlmodels
|
|
4
|
+
import "../../Theme"
|
|
5
|
+
|
|
6
|
+
QQC.Menu {
|
|
7
|
+
id: menuRoot
|
|
8
|
+
|
|
9
|
+
required property var renderer
|
|
10
|
+
readonly property var menuEntries: renderer.prop("items", [])
|
|
11
|
+
readonly property bool requestedOpen: renderer.prop("opened", false) === true
|
|
12
|
+
&& renderer.prop("visible", true) !== false
|
|
13
|
+
|
|
14
|
+
function entryValue(entry, name, fallback) {
|
|
15
|
+
return entry !== null && typeof entry === "object" && entry[name] !== undefined
|
|
16
|
+
? entry[name] : fallback
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function entryLabel(entry) {
|
|
20
|
+
return entry !== null && typeof entry === "object"
|
|
21
|
+
? String(entry.label === undefined ? (entry.text === undefined ? "" : entry.text) : entry.label)
|
|
22
|
+
: String(entry === null ? "" : entry)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function entryPayload(index, entry, item) {
|
|
26
|
+
var label = entryLabel(entry)
|
|
27
|
+
return {
|
|
28
|
+
index: index,
|
|
29
|
+
label: label,
|
|
30
|
+
value: entryValue(entry, "value", label),
|
|
31
|
+
checked: item ? item.checked : false
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function closePolicyValue(value) {
|
|
36
|
+
var names = Array.isArray(value) ? value : [value || "escape_and_outside"]
|
|
37
|
+
var result = 0
|
|
38
|
+
for (var index = 0; index < names.length; index++) {
|
|
39
|
+
var name = String(names[index])
|
|
40
|
+
if (name === "escape" || name === "escape_and_outside") result |= QQC.Popup.CloseOnEscape
|
|
41
|
+
if (name === "outside" || name === "escape_and_outside") result |= QQC.Popup.CloseOnPressOutside
|
|
42
|
+
if (name === "outside_parent") result |= QQC.Popup.CloseOnPressOutsideParent
|
|
43
|
+
if (name === "release_outside") result |= QQC.Popup.CloseOnReleaseOutside
|
|
44
|
+
if (name === "release_outside_parent") result |= QQC.Popup.CloseOnReleaseOutsideParent
|
|
45
|
+
}
|
|
46
|
+
return result
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function syncOpenState() {
|
|
50
|
+
if (requestedOpen === opened) return
|
|
51
|
+
if (requestedOpen) open()
|
|
52
|
+
else close()
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
title: String(renderer.prop("title", ""))
|
|
56
|
+
x: Number(renderer.prop("x", 0))
|
|
57
|
+
y: Number(renderer.prop("y", 0))
|
|
58
|
+
width: Number(renderer.prop("width", 240))
|
|
59
|
+
modal: renderer.prop("modal", false) === true
|
|
60
|
+
closePolicy: closePolicyValue(renderer.prop("close_policy", "escape_and_outside"))
|
|
61
|
+
enabled: renderer.prop("enabled", true) !== false
|
|
62
|
+
|
|
63
|
+
background: Rectangle {
|
|
64
|
+
color: renderer.prop("background", Color.background)
|
|
65
|
+
radius: Number(renderer.prop("radius", Style.cornerRadius))
|
|
66
|
+
border.width: String(renderer.prop("border_color", "")).length > 0 ? Style.normalBorderWidth : 0
|
|
67
|
+
border.color: renderer.prop("border_color", "transparent")
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
Instantiator {
|
|
71
|
+
model: Array.isArray(menuRoot.menuEntries) ? menuRoot.menuEntries : []
|
|
72
|
+
delegate: DelegateChooser {
|
|
73
|
+
role: "separator"
|
|
74
|
+
|
|
75
|
+
DelegateChoice {
|
|
76
|
+
roleValue: true
|
|
77
|
+
QQC.MenuSeparator {}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
DelegateChoice {
|
|
81
|
+
QQC.MenuItem {
|
|
82
|
+
required property int index
|
|
83
|
+
required property var modelData
|
|
84
|
+
text: menuRoot.entryLabel(modelData)
|
|
85
|
+
enabled: menuRoot.enabled && menuRoot.entryValue(modelData, "enabled", true) !== false
|
|
86
|
+
checkable: menuRoot.entryValue(modelData, "checkable", false) === true
|
|
87
|
+
checked: menuRoot.entryValue(modelData, "checked", false) === true
|
|
88
|
+
font.family: String(renderer.prop("font_family", renderer.fontFamily))
|
|
89
|
+
font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
|
|
90
|
+
icon.name: String(menuRoot.entryValue(modelData, "icon", ""))
|
|
91
|
+
icon.source: String(menuRoot.entryValue(modelData, "icon_source", ""))
|
|
92
|
+
icon.color: checked ? renderer.prop("accent", Color.accent)
|
|
93
|
+
: renderer.prop("foreground", renderer.foreground)
|
|
94
|
+
onClicked: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
|
|
95
|
+
"trigger", menuRoot.entryPayload(index, modelData, this))
|
|
96
|
+
onToggled: {
|
|
97
|
+
if (renderer.subscribed("toggle"))
|
|
98
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
|
|
99
|
+
"toggle", menuRoot.entryPayload(index, modelData, this))
|
|
100
|
+
}
|
|
101
|
+
onHighlightedChanged: {
|
|
102
|
+
if (highlighted && renderer.subscribed("highlight"))
|
|
103
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
|
|
104
|
+
"highlight", menuRoot.entryPayload(index, modelData, this))
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
onObjectAdded: function(index, object) { menuRoot.insertItem(index, object) }
|
|
110
|
+
onObjectRemoved: function(index, object) { menuRoot.removeItem(object) }
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
Component.onCompleted: syncOpenState()
|
|
114
|
+
onRequestedOpenChanged: syncOpenState()
|
|
115
|
+
onOpened: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "open", {})
|
|
116
|
+
onClosed: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "close", {})
|
|
117
|
+
onAboutToShow: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "about_to_show", {})
|
|
118
|
+
onAboutToHide: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "about_to_hide", {})
|
|
119
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import QtQuick.Controls as QQC
|
|
3
|
+
import Qt.labs.qmlmodels
|
|
4
|
+
import "../../Theme"
|
|
5
|
+
|
|
6
|
+
QQC.MenuBar {
|
|
7
|
+
id: menuBarRoot
|
|
8
|
+
|
|
9
|
+
required property var renderer
|
|
10
|
+
readonly property var menuDefinitions: renderer.prop("menus", [])
|
|
11
|
+
|
|
12
|
+
function valueOf(object, name, fallback) {
|
|
13
|
+
return object !== null && typeof object === "object" && object[name] !== undefined
|
|
14
|
+
? object[name] : fallback
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function labelOf(object) {
|
|
18
|
+
return object !== null && typeof object === "object"
|
|
19
|
+
? String(object.label === undefined ? (object.text === undefined ? "" : object.text) : object.label)
|
|
20
|
+
: String(object === null ? "" : object)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function itemPayload(menuIndex, itemIndex, definition, item) {
|
|
24
|
+
var label = labelOf(definition)
|
|
25
|
+
return {
|
|
26
|
+
menu_index: menuIndex,
|
|
27
|
+
item_index: itemIndex,
|
|
28
|
+
label: label,
|
|
29
|
+
value: valueOf(definition, "value", label),
|
|
30
|
+
checked: item ? item.checked : false
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
implicitWidth: Number(renderer.prop("width", 640))
|
|
35
|
+
implicitHeight: Number(renderer.prop("height", 42))
|
|
36
|
+
spacing: Number(renderer.prop("spacing", 0))
|
|
37
|
+
padding: Number(renderer.prop("padding", Style.spacing.xs))
|
|
38
|
+
enabled: renderer.prop("enabled", true) !== false
|
|
39
|
+
visible: renderer.prop("visible", true) !== false
|
|
40
|
+
|
|
41
|
+
background: Rectangle {
|
|
42
|
+
color: renderer.prop("background", Color.background)
|
|
43
|
+
radius: Number(renderer.prop("radius", 0))
|
|
44
|
+
border.width: String(renderer.prop("border_color", "")).length > 0 ? Style.normalBorderWidth : 0
|
|
45
|
+
border.color: renderer.prop("border_color", "transparent")
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
Instantiator {
|
|
49
|
+
model: Array.isArray(menuBarRoot.menuDefinitions) ? menuBarRoot.menuDefinitions : []
|
|
50
|
+
delegate: QQC.Menu {
|
|
51
|
+
id: nativeMenu
|
|
52
|
+
required property int index
|
|
53
|
+
required property var modelData
|
|
54
|
+
readonly property int menuIndex: index
|
|
55
|
+
readonly property var menuData: modelData
|
|
56
|
+
title: String(menuBarRoot.valueOf(menuData, "title", menuBarRoot.labelOf(menuData)))
|
|
57
|
+
enabled: menuBarRoot.enabled && menuBarRoot.valueOf(menuData, "enabled", true) !== false
|
|
58
|
+
|
|
59
|
+
background: Rectangle {
|
|
60
|
+
color: renderer.prop("background", Color.background)
|
|
61
|
+
radius: Number(renderer.prop("radius", Style.cornerRadius))
|
|
62
|
+
border.width: String(renderer.prop("border_color", "")).length > 0 ? Style.normalBorderWidth : 0
|
|
63
|
+
border.color: renderer.prop("border_color", "transparent")
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
Instantiator {
|
|
67
|
+
model: Array.isArray(nativeMenu.menuData.items) ? nativeMenu.menuData.items : []
|
|
68
|
+
delegate: DelegateChooser {
|
|
69
|
+
role: "separator"
|
|
70
|
+
|
|
71
|
+
DelegateChoice {
|
|
72
|
+
roleValue: true
|
|
73
|
+
QQC.MenuSeparator {}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
DelegateChoice {
|
|
77
|
+
QQC.MenuItem {
|
|
78
|
+
required property int index
|
|
79
|
+
required property var modelData
|
|
80
|
+
text: menuBarRoot.labelOf(modelData)
|
|
81
|
+
enabled: nativeMenu.enabled && menuBarRoot.valueOf(modelData, "enabled", true) !== false
|
|
82
|
+
checkable: menuBarRoot.valueOf(modelData, "checkable", false) === true
|
|
83
|
+
checked: menuBarRoot.valueOf(modelData, "checked", false) === true
|
|
84
|
+
font.family: String(renderer.prop("font_family", renderer.fontFamily))
|
|
85
|
+
font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
|
|
86
|
+
icon.name: String(menuBarRoot.valueOf(modelData, "icon", ""))
|
|
87
|
+
icon.source: String(menuBarRoot.valueOf(modelData, "icon_source", ""))
|
|
88
|
+
icon.color: checked ? renderer.prop("accent", Color.accent)
|
|
89
|
+
: renderer.prop("foreground", renderer.foreground)
|
|
90
|
+
onClicked: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
|
|
91
|
+
"trigger", menuBarRoot.itemPayload(nativeMenu.menuIndex, index, modelData, this))
|
|
92
|
+
onToggled: {
|
|
93
|
+
if (renderer.subscribed("toggle"))
|
|
94
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
|
|
95
|
+
"toggle", menuBarRoot.itemPayload(nativeMenu.menuIndex, index, modelData, this))
|
|
96
|
+
}
|
|
97
|
+
onHighlightedChanged: {
|
|
98
|
+
if (highlighted && renderer.subscribed("highlight"))
|
|
99
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
|
|
100
|
+
"highlight", menuBarRoot.itemPayload(nativeMenu.menuIndex, index, modelData, this))
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
onObjectAdded: function(index, object) { nativeMenu.insertItem(index, object) }
|
|
106
|
+
onObjectRemoved: function(index, object) { nativeMenu.removeItem(object) }
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
onOpened: {
|
|
110
|
+
if (renderer.subscribed("menu_open"))
|
|
111
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "menu_open",
|
|
112
|
+
{ index: menuIndex, title: title })
|
|
113
|
+
}
|
|
114
|
+
onClosed: {
|
|
115
|
+
if (renderer.subscribed("menu_close"))
|
|
116
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "menu_close",
|
|
117
|
+
{ index: menuIndex, title: title })
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
onObjectAdded: function(index, object) { menuBarRoot.insertMenu(index, object) }
|
|
121
|
+
onObjectRemoved: function(index, object) { menuBarRoot.removeMenu(object) }
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
onVisibleChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
|
|
125
|
+
visible ? "show" : "hide", {})
|
|
126
|
+
onActiveFocusChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
|
|
127
|
+
activeFocus ? "focus" : "blur", {})
|
|
128
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import QtQuick.Controls as QQC
|
|
3
|
+
import "../../Theme"
|
|
4
|
+
|
|
5
|
+
QQC.MenuItem {
|
|
6
|
+
id: itemRoot
|
|
7
|
+
|
|
8
|
+
required property var renderer
|
|
9
|
+
|
|
10
|
+
function payload(shortcutActivation) {
|
|
11
|
+
return {
|
|
12
|
+
label: text,
|
|
13
|
+
value: renderer.prop("value", text),
|
|
14
|
+
checked: checked,
|
|
15
|
+
shortcut: shortcutActivation === true
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
text: String(renderer.prop("text", ""))
|
|
20
|
+
enabled: renderer.prop("enabled", true) !== false
|
|
21
|
+
visible: renderer.prop("visible", true) !== false
|
|
22
|
+
checkable: renderer.prop("checkable", false) === true
|
|
23
|
+
checked: renderer.prop("checked", false) === true
|
|
24
|
+
highlighted: renderer.prop("highlighted", false) === true
|
|
25
|
+
hoverEnabled: renderer.subscribed("hover") || renderer.subscribed("highlight")
|
|
26
|
+
implicitWidth: Number(renderer.prop("width", 240))
|
|
27
|
+
implicitHeight: Number(renderer.prop("height", 42))
|
|
28
|
+
icon.name: String(renderer.prop("icon", ""))
|
|
29
|
+
icon.source: String(renderer.prop("icon_source", ""))
|
|
30
|
+
icon.color: renderer.prop("icon_color", highlighted
|
|
31
|
+
? renderer.prop("highlighted_foreground", renderer.prop("accent", Color.accent))
|
|
32
|
+
: renderer.prop("foreground", renderer.foreground))
|
|
33
|
+
font.family: String(renderer.prop("font_family", renderer.fontFamily))
|
|
34
|
+
font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
|
|
35
|
+
palette.buttonText: highlighted
|
|
36
|
+
? renderer.prop("highlighted_foreground", renderer.prop("accent", Color.accent))
|
|
37
|
+
: (enabled ? renderer.prop("foreground", renderer.foreground)
|
|
38
|
+
: renderer.prop("muted", Color.muted))
|
|
39
|
+
|
|
40
|
+
background: Rectangle {
|
|
41
|
+
color: itemRoot.highlighted
|
|
42
|
+
? renderer.prop("highlighted_background", renderer.prop("background", "transparent"))
|
|
43
|
+
: renderer.prop("background", "transparent")
|
|
44
|
+
radius: Number(renderer.prop("radius", Style.cornerRadius))
|
|
45
|
+
border.width: String(renderer.prop("border_color", "")).length > 0 ? Style.normalBorderWidth : 0
|
|
46
|
+
border.color: renderer.prop("border_color", "transparent")
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
Shortcut {
|
|
50
|
+
sequence: String(renderer.prop("shortcut", ""))
|
|
51
|
+
enabled: itemRoot.enabled && sequence.toString().length > 0
|
|
52
|
+
onActivated: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
|
|
53
|
+
"trigger", itemRoot.payload(true))
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
onClicked: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
|
|
57
|
+
"trigger", payload(false))
|
|
58
|
+
onToggled: {
|
|
59
|
+
var current = payload(false)
|
|
60
|
+
if (renderer.subscribed("toggle"))
|
|
61
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "toggle", current)
|
|
62
|
+
if (renderer.subscribed("change"))
|
|
63
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "change", current)
|
|
64
|
+
}
|
|
65
|
+
onPressed: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "press", payload(false))
|
|
66
|
+
onReleased: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "release", payload(false))
|
|
67
|
+
onHoveredChanged: {
|
|
68
|
+
if (renderer.subscribed("hover"))
|
|
69
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "hover", { value: hovered })
|
|
70
|
+
}
|
|
71
|
+
onHighlightedChanged: {
|
|
72
|
+
if (renderer.subscribed("highlight"))
|
|
73
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "highlight", { value: highlighted })
|
|
74
|
+
}
|
|
75
|
+
onActiveFocusChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
|
|
76
|
+
activeFocus ? "focus" : "blur", {})
|
|
77
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import QtQuick.Controls as QQC
|
|
3
|
+
|
|
4
|
+
QQC.MenuSeparator {
|
|
5
|
+
id: separatorRoot
|
|
6
|
+
|
|
7
|
+
required property var renderer
|
|
8
|
+
|
|
9
|
+
implicitWidth: Number(renderer.prop("width", 220))
|
|
10
|
+
implicitHeight: Number(renderer.prop("height",
|
|
11
|
+
Number(renderer.prop("thickness", 1)) + Number(renderer.prop("padding", 8)) * 2))
|
|
12
|
+
padding: Number(renderer.prop("padding", 8))
|
|
13
|
+
enabled: renderer.prop("enabled", true) !== false
|
|
14
|
+
visible: renderer.prop("visible", true) !== false
|
|
15
|
+
opacity: Number(renderer.prop("opacity", 0.25))
|
|
16
|
+
|
|
17
|
+
contentItem: Item {}
|
|
18
|
+
background: Rectangle {
|
|
19
|
+
anchors.left: parent.left
|
|
20
|
+
anchors.right: parent.right
|
|
21
|
+
anchors.verticalCenter: parent.verticalCenter
|
|
22
|
+
anchors.leftMargin: separatorRoot.padding
|
|
23
|
+
anchors.rightMargin: separatorRoot.padding
|
|
24
|
+
height: Number(renderer.prop("thickness", 1))
|
|
25
|
+
color: renderer.prop("color", renderer.foreground)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
onVisibleChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
|
|
29
|
+
visible ? "show" : "hide", {})
|
|
30
|
+
}
|