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,70 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import QtQuick.Controls as QQC
|
|
3
|
+
import QtQuick.Dialogs
|
|
4
|
+
import "../../Theme"
|
|
5
|
+
|
|
6
|
+
QQC.Button {
|
|
7
|
+
id: picker
|
|
8
|
+
|
|
9
|
+
required property var renderer
|
|
10
|
+
readonly property color selectedColor: dialog.selectedColor
|
|
11
|
+
|
|
12
|
+
implicitWidth: Number(renderer.prop("width", 180))
|
|
13
|
+
implicitHeight: Number(renderer.prop("height", 40))
|
|
14
|
+
enabled: renderer.prop("enabled", true) !== false
|
|
15
|
+
onClicked: dialog.open()
|
|
16
|
+
|
|
17
|
+
background: Rectangle {
|
|
18
|
+
color: renderer.prop("background", Color.popups.background)
|
|
19
|
+
radius: Number(renderer.prop("radius", Style.cornerRadius))
|
|
20
|
+
border.width: Style.normalBorderWidth
|
|
21
|
+
border.color: picker.activeFocus
|
|
22
|
+
? Color.accent
|
|
23
|
+
: renderer.prop("border_color", renderer.prop("foreground", renderer.foreground))
|
|
24
|
+
opacity: picker.down ? 0.72 : 1
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
contentItem: Row {
|
|
28
|
+
spacing: Style.spacing.controlGap
|
|
29
|
+
Rectangle {
|
|
30
|
+
width: Math.max(20, picker.height - Style.spacing.controlPaddingY * 2)
|
|
31
|
+
height: width
|
|
32
|
+
radius: Math.min(Number(renderer.prop("radius", Style.cornerRadius)), width / 2)
|
|
33
|
+
color: picker.selectedColor
|
|
34
|
+
border.width: Style.normalBorderWidth
|
|
35
|
+
border.color: renderer.prop("border_color", renderer.foreground)
|
|
36
|
+
}
|
|
37
|
+
Text {
|
|
38
|
+
anchors.verticalCenter: parent.verticalCenter
|
|
39
|
+
text: String(renderer.prop("label", picker.selectedColor.toString()))
|
|
40
|
+
textFormat: Text.PlainText
|
|
41
|
+
color: renderer.prop("foreground", renderer.foreground)
|
|
42
|
+
font.family: String(renderer.prop("font_family", renderer.fontFamily))
|
|
43
|
+
font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
ColorDialog {
|
|
48
|
+
id: dialog
|
|
49
|
+
title: String(renderer.prop("title", "Choose a color"))
|
|
50
|
+
selectedColor: renderer.prop("color", "#ffffff")
|
|
51
|
+
visible: renderer.prop("opened", false) === true
|
|
52
|
+
options: (renderer.prop("show_alpha", false) === true ? ColorDialog.ShowAlphaChannel : 0)
|
|
53
|
+
| (renderer.prop("no_buttons", false) === true ? ColorDialog.NoButtons : 0)
|
|
54
|
+
| (renderer.prop("native_dialog", true) === false ? ColorDialog.DontUseNativeDialog : 0)
|
|
55
|
+
|
|
56
|
+
onSelectedColorChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "input", {
|
|
57
|
+
value: selectedColor.toString()
|
|
58
|
+
})
|
|
59
|
+
onAccepted: {
|
|
60
|
+
var value = selectedColor.toString()
|
|
61
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "change", { value: value })
|
|
62
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "accept", { value: value })
|
|
63
|
+
}
|
|
64
|
+
onRejected: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "reject", {
|
|
65
|
+
value: selectedColor.toString()
|
|
66
|
+
})
|
|
67
|
+
onVisibleChanged: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
|
|
68
|
+
visible ? "open" : "close", { value: selectedColor.toString() })
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import QtQuick.Effects
|
|
3
|
+
|
|
4
|
+
Item {
|
|
5
|
+
required property var renderer
|
|
6
|
+
implicitWidth: Number(renderer.prop("width", 240)); implicitHeight: Number(renderer.prop("height", 160))
|
|
7
|
+
Item { id: sourceHost; anchors.fill: parent; Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent } }
|
|
8
|
+
ShaderEffectSource { id: sourceTexture; anchors.fill: parent; sourceItem: sourceHost; hideSource: true; visible: false }
|
|
9
|
+
MultiEffect {
|
|
10
|
+
anchors.fill: parent; source: sourceTexture
|
|
11
|
+
colorization: Number(renderer.prop("amount", 1)); colorizationColor: renderer.prop("color", "white")
|
|
12
|
+
brightness: Number(renderer.prop("brightness", 0)); contrast: Number(renderer.prop("contrast", 0)); saturation: Number(renderer.prop("saturation", 0))
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
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
|
+
Column {
|
|
10
|
+
required property var renderer
|
|
11
|
+
spacing: Number(renderer.prop("spacing", Style.spacing.panelGap))
|
|
12
|
+
|
|
13
|
+
Repeater {
|
|
14
|
+
model: renderer.node && Array.isArray(renderer.node.children) ? renderer.node.children : []
|
|
15
|
+
delegate: renderer.columnChildDelegateComponent
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
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
|
+
ColumnLayout {
|
|
10
|
+
required property var renderer
|
|
11
|
+
spacing: Number(renderer.prop("spacing", Style.spacing.panelGap))
|
|
12
|
+
Repeater { model: renderer.node.children || []; delegate: renderer.layoutChildDelegateComponent }
|
|
13
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
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.ConfirmDialog {
|
|
10
|
+
required property var renderer
|
|
11
|
+
opened: renderer.prop("opened", false) === true; message: String(renderer.prop("message", ""))
|
|
12
|
+
cancelText: String(renderer.prop("cancel_text", "Cancel")); confirmText: String(renderer.prop("confirm_text", "Confirm"))
|
|
13
|
+
selectedIndex: Number(renderer.prop("selected_index", 1)); visible: renderer.prop("visible", true) !== false
|
|
14
|
+
background: renderer.prop("background", Color.background); foreground: renderer.prop("foreground", renderer.foreground)
|
|
15
|
+
scrim: renderer.prop("scrim", Util.alpha(Color.background, 0.7)); selectedBackground: renderer.prop("selected_background", Util.alpha(renderer.foreground, 0.08))
|
|
16
|
+
selectedText: renderer.prop("selected_text", Color.accent); fontFamily: String(renderer.prop("font_family", renderer.fontFamily))
|
|
17
|
+
cornerRadius: Number(renderer.prop("corner_radius", Style.cornerRadius))
|
|
18
|
+
onCanceled: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "cancel", {})
|
|
19
|
+
onConfirmed: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "confirm", {})
|
|
20
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
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
|
+
function bounded(value, minimum, maximum) {
|
|
12
|
+
return Math.max(Number(minimum), Math.min(Number(maximum), Number(value)))
|
|
13
|
+
}
|
|
14
|
+
readonly property real naturalWidth: constrainedContent.implicitWidth
|
|
15
|
+
readonly property real naturalHeight: constrainedContent.implicitHeight
|
|
16
|
+
readonly property real desiredWidth: Number(renderer.prop("width", naturalWidth))
|
|
17
|
+
readonly property real desiredHeight: Number(renderer.prop("height", naturalHeight))
|
|
18
|
+
implicitWidth: bounded(desiredWidth, renderer.prop("min_width", 0), renderer.prop("max_width", Number.MAX_VALUE))
|
|
19
|
+
implicitHeight: bounded(desiredHeight, renderer.prop("min_height", 0), renderer.prop("max_height", Number.MAX_VALUE))
|
|
20
|
+
clip: renderer.prop("clip", false) === true
|
|
21
|
+
Item {
|
|
22
|
+
id: constrainedContent
|
|
23
|
+
anchors.centerIn: parent
|
|
24
|
+
implicitWidth: childrenRect.width
|
|
25
|
+
implicitHeight: childrenRect.height
|
|
26
|
+
Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent }
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
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.BorderSurface {
|
|
10
|
+
required property var renderer
|
|
11
|
+
readonly property int innerPadding: Number(renderer.prop("padding", 0))
|
|
12
|
+
implicitWidth: content.implicitWidth + innerPadding * 2
|
|
13
|
+
implicitHeight: content.implicitHeight + innerPadding * 2
|
|
14
|
+
color: "transparent"
|
|
15
|
+
borderSpec: renderer.prop("bordered", false)
|
|
16
|
+
? Border.controlSpec("normal", renderer.foreground, Color.accent)
|
|
17
|
+
: Border.none()
|
|
18
|
+
radius: Style.cornerRadius
|
|
19
|
+
|
|
20
|
+
Column {
|
|
21
|
+
id: content
|
|
22
|
+
anchors.centerIn: parent
|
|
23
|
+
spacing: Number(renderer.prop("spacing", Style.spacing.panelGap))
|
|
24
|
+
|
|
25
|
+
Repeater {
|
|
26
|
+
model: renderer.node && Array.isArray(renderer.node.children) ? renderer.node.children : []
|
|
27
|
+
delegate: renderer.childDelegateComponent
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import QtQuick.Controls as QQC
|
|
3
|
+
import Qt.labs.qmlmodels
|
|
4
|
+
import "../../Theme"
|
|
5
|
+
|
|
6
|
+
Item {
|
|
7
|
+
id: contextRoot
|
|
8
|
+
|
|
9
|
+
required property var renderer
|
|
10
|
+
readonly property var menuEntries: renderer.prop("items", [])
|
|
11
|
+
readonly property string targetId: String(renderer.prop("target", ""))
|
|
12
|
+
readonly property var targetItem: targetId.length > 0 ? renderer.findRenderedItem(targetId) : null
|
|
13
|
+
readonly property bool requestedOpen: renderer.prop("opened", false) === true
|
|
14
|
+
&& renderer.prop("visible", true) !== false
|
|
15
|
+
|
|
16
|
+
function entryValue(entry, name, fallback) {
|
|
17
|
+
return entry !== null && typeof entry === "object" && entry[name] !== undefined
|
|
18
|
+
? entry[name] : fallback
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function entryLabel(entry) {
|
|
22
|
+
return entry !== null && typeof entry === "object"
|
|
23
|
+
? String(entry.label === undefined ? (entry.text === undefined ? "" : entry.text) : entry.label)
|
|
24
|
+
: String(entry === null ? "" : entry)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function entryPayload(index, entry, item) {
|
|
28
|
+
var label = entryLabel(entry)
|
|
29
|
+
return {
|
|
30
|
+
index: index,
|
|
31
|
+
label: label,
|
|
32
|
+
value: entryValue(entry, "value", label),
|
|
33
|
+
checked: item ? item.checked : false
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function closePolicyValue(value) {
|
|
38
|
+
var names = Array.isArray(value) ? value : [value || "escape_and_outside"]
|
|
39
|
+
var result = 0
|
|
40
|
+
for (var index = 0; index < names.length; index++) {
|
|
41
|
+
var name = String(names[index])
|
|
42
|
+
if (name === "escape" || name === "escape_and_outside") result |= QQC.Popup.CloseOnEscape
|
|
43
|
+
if (name === "outside" || name === "escape_and_outside") result |= QQC.Popup.CloseOnPressOutside
|
|
44
|
+
if (name === "outside_parent") result |= QQC.Popup.CloseOnPressOutsideParent
|
|
45
|
+
if (name === "release_outside") result |= QQC.Popup.CloseOnReleaseOutside
|
|
46
|
+
if (name === "release_outside_parent") result |= QQC.Popup.CloseOnReleaseOutsideParent
|
|
47
|
+
}
|
|
48
|
+
return result
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function syncOpenState() {
|
|
52
|
+
if (requestedOpen === nativeMenu.opened) return
|
|
53
|
+
if (requestedOpen) {
|
|
54
|
+
nativeMenu.x = Number(renderer.prop("x", 0))
|
|
55
|
+
nativeMenu.y = Number(renderer.prop("y", 0))
|
|
56
|
+
nativeMenu.open()
|
|
57
|
+
} else nativeMenu.close()
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
width: Number(renderer.prop("activation_width", 0))
|
|
61
|
+
height: Number(renderer.prop("activation_height", 0))
|
|
62
|
+
visible: renderer.prop("visible", true) !== false
|
|
63
|
+
|
|
64
|
+
TapHandler {
|
|
65
|
+
id: contextHandler
|
|
66
|
+
parent: contextRoot.targetItem || contextRoot
|
|
67
|
+
enabled: contextRoot.visible && renderer.prop("enabled", true) !== false
|
|
68
|
+
acceptedButtons: Qt.RightButton
|
|
69
|
+
onTapped: function(eventPoint, button) {
|
|
70
|
+
var host = contextRoot.targetItem || contextRoot
|
|
71
|
+
var localPoint = host === contextRoot
|
|
72
|
+
? eventPoint.position : host.mapToItem(contextRoot, eventPoint.position)
|
|
73
|
+
if (renderer.subscribed("request"))
|
|
74
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "request",
|
|
75
|
+
{ x: localPoint.x, y: localPoint.y, button: button })
|
|
76
|
+
nativeMenu.popup(localPoint)
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
QQC.Menu {
|
|
81
|
+
id: nativeMenu
|
|
82
|
+
width: Number(renderer.prop("width", 240))
|
|
83
|
+
modal: renderer.prop("modal", false) === true
|
|
84
|
+
closePolicy: contextRoot.closePolicyValue(renderer.prop("close_policy", "escape_and_outside"))
|
|
85
|
+
enabled: renderer.prop("enabled", true) !== false
|
|
86
|
+
|
|
87
|
+
background: Rectangle {
|
|
88
|
+
color: renderer.prop("background", Color.background)
|
|
89
|
+
radius: Number(renderer.prop("radius", Style.cornerRadius))
|
|
90
|
+
border.width: String(renderer.prop("border_color", "")).length > 0 ? Style.normalBorderWidth : 0
|
|
91
|
+
border.color: renderer.prop("border_color", "transparent")
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
Instantiator {
|
|
95
|
+
model: Array.isArray(contextRoot.menuEntries) ? contextRoot.menuEntries : []
|
|
96
|
+
delegate: DelegateChooser {
|
|
97
|
+
role: "separator"
|
|
98
|
+
DelegateChoice { roleValue: true; QQC.MenuSeparator {} }
|
|
99
|
+
DelegateChoice {
|
|
100
|
+
QQC.MenuItem {
|
|
101
|
+
required property int index
|
|
102
|
+
required property var modelData
|
|
103
|
+
text: contextRoot.entryLabel(modelData)
|
|
104
|
+
enabled: nativeMenu.enabled && contextRoot.entryValue(modelData, "enabled", true) !== false
|
|
105
|
+
checkable: contextRoot.entryValue(modelData, "checkable", false) === true
|
|
106
|
+
checked: contextRoot.entryValue(modelData, "checked", false) === true
|
|
107
|
+
font.family: String(renderer.prop("font_family", renderer.fontFamily))
|
|
108
|
+
font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
|
|
109
|
+
icon.name: String(contextRoot.entryValue(modelData, "icon", ""))
|
|
110
|
+
icon.source: String(contextRoot.entryValue(modelData, "icon_source", ""))
|
|
111
|
+
icon.color: checked ? renderer.prop("accent", Color.accent)
|
|
112
|
+
: renderer.prop("foreground", renderer.foreground)
|
|
113
|
+
onClicked: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
|
|
114
|
+
"trigger", contextRoot.entryPayload(index, modelData, this))
|
|
115
|
+
onToggled: {
|
|
116
|
+
if (renderer.subscribed("toggle"))
|
|
117
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
|
|
118
|
+
"toggle", contextRoot.entryPayload(index, modelData, this))
|
|
119
|
+
}
|
|
120
|
+
onHighlightedChanged: {
|
|
121
|
+
if (highlighted && renderer.subscribed("highlight"))
|
|
122
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId,
|
|
123
|
+
"highlight", contextRoot.entryPayload(index, modelData, this))
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
onObjectAdded: function(index, object) { nativeMenu.insertItem(index, object) }
|
|
129
|
+
onObjectRemoved: function(index, object) { nativeMenu.removeItem(object) }
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
onOpened: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "open", {})
|
|
133
|
+
onClosed: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "close", {})
|
|
134
|
+
onAboutToShow: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "about_to_show", {})
|
|
135
|
+
onAboutToHide: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "about_to_hide", {})
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
Component.onCompleted: syncOpenState()
|
|
139
|
+
onRequestedOpenChanged: syncOpenState()
|
|
140
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
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.CursorSurface {
|
|
10
|
+
required property var renderer
|
|
11
|
+
implicitWidth: Number(renderer.prop("width", contentItem.implicitWidth)); implicitHeight: Number(renderer.prop("height", contentItem.implicitHeight))
|
|
12
|
+
current: renderer.prop("current", false) === true; outline: renderer.prop("outline", false) === true; bordered: renderer.prop("bordered", false) === true
|
|
13
|
+
hasCursor: renderer.prop("cursor", false) === true; foreground: renderer.prop("foreground", renderer.foreground)
|
|
14
|
+
accent: renderer.prop("accent", Color.accent); fill: renderer.prop("fill", Style.hoverFillFor(foreground, accent))
|
|
15
|
+
currentFill: renderer.prop("current_fill", Style.selectedFillFor(foreground, accent))
|
|
16
|
+
Column { id: contentItem; anchors.centerIn: parent; Repeater { model: renderer.node.children || []; delegate: renderer.childDelegateComponent } }
|
|
17
|
+
MouseArea { anchors.fill: parent; onClicked: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "click", {}) }
|
|
18
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import "." as Builtins
|
|
3
|
+
|
|
4
|
+
Item {
|
|
5
|
+
id: dataRoot
|
|
6
|
+
property var renderer: null
|
|
7
|
+
implicitWidth: Number(renderer ? renderer.prop("width", 720) : 720)
|
|
8
|
+
implicitHeight: Number(renderer ? renderer.prop("height", 440) : 440)
|
|
9
|
+
|
|
10
|
+
function valueFor(row, field) {
|
|
11
|
+
if (row === null || typeof row !== "object") return row
|
|
12
|
+
return row[String(field || "")]
|
|
13
|
+
}
|
|
14
|
+
function processedRows() {
|
|
15
|
+
if (!renderer) return []
|
|
16
|
+
var rows = renderer.prop("rows", []).slice()
|
|
17
|
+
var filter = String(renderer.prop("filter", "")).toLowerCase()
|
|
18
|
+
if (filter !== "") rows = rows.filter(function(row) { return JSON.stringify(row).toLowerCase().indexOf(filter) >= 0 })
|
|
19
|
+
var columns = renderer.prop("columns", [])
|
|
20
|
+
var sortColumn = Number(renderer.prop("sort_column", -1))
|
|
21
|
+
if (sortColumn >= 0 && sortColumn < columns.length) {
|
|
22
|
+
var column = columns[sortColumn]
|
|
23
|
+
var key = column && typeof column === "object" ? (column.key === undefined ? column.field : column.key) : column
|
|
24
|
+
var descending = String(renderer.prop("sort_order", "ascending")) === "descending"
|
|
25
|
+
rows.sort(function(left, right) {
|
|
26
|
+
var a = dataRoot.valueFor(left, key); var b = dataRoot.valueFor(right, key)
|
|
27
|
+
if (a === b) return 0
|
|
28
|
+
var result = a === null || a === undefined ? -1 : (b === null || b === undefined ? 1 : (a < b ? -1 : 1))
|
|
29
|
+
return descending ? -result : result
|
|
30
|
+
})
|
|
31
|
+
}
|
|
32
|
+
var pageSize = Math.max(0, Number(renderer.prop("page_size", 0)))
|
|
33
|
+
if (pageSize > 0) {
|
|
34
|
+
var page = Math.max(1, Number(renderer.prop("page", 1)))
|
|
35
|
+
rows = rows.slice((page - 1) * pageSize, page * pageSize)
|
|
36
|
+
}
|
|
37
|
+
return rows
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
QtObject {
|
|
41
|
+
id: proxyRenderer
|
|
42
|
+
readonly property var bridge: dataRoot.renderer ? dataRoot.renderer.bridge : null
|
|
43
|
+
readonly property string surfaceName: dataRoot.renderer ? dataRoot.renderer.surfaceName : ""
|
|
44
|
+
readonly property string controlId: dataRoot.renderer ? dataRoot.renderer.controlId : ""
|
|
45
|
+
readonly property color foreground: dataRoot.renderer ? dataRoot.renderer.foreground : "white"
|
|
46
|
+
readonly property string fontFamily: dataRoot.renderer ? dataRoot.renderer.fontFamily : ""
|
|
47
|
+
function prop(name, fallback) { return name === "rows" ? dataRoot.processedRows() : dataRoot.renderer.prop(name, fallback) }
|
|
48
|
+
}
|
|
49
|
+
Builtins.TableView { anchors.fill: parent; renderer: proxyRenderer }
|
|
50
|
+
|
|
51
|
+
TapHandler {
|
|
52
|
+
enabled: renderer && renderer.subscribed("sort") && renderer.prop("show_header", true) !== false
|
|
53
|
+
onTapped: function(eventPoint) {
|
|
54
|
+
var columns = renderer.prop("columns", [])
|
|
55
|
+
var x = eventPoint.position.x - Number(renderer.prop("padding", 0))
|
|
56
|
+
var cursor = 0
|
|
57
|
+
for (var index = 0; index < columns.length; index++) {
|
|
58
|
+
var width = Number(columns[index] && columns[index].width !== undefined ? columns[index].width : renderer.prop("column_width", 160))
|
|
59
|
+
if (x >= cursor && x < cursor + width) {
|
|
60
|
+
var current = Number(renderer.prop("sort_column", -1))
|
|
61
|
+
var order = current === index && String(renderer.prop("sort_order", "ascending")) === "ascending" ? "descending" : "ascending"
|
|
62
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "sort", { column: index, order: order })
|
|
63
|
+
break
|
|
64
|
+
}
|
|
65
|
+
cursor += width
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import QtQuick.Controls as QQC
|
|
3
|
+
import QtQuick.Controls.Basic as Basic
|
|
4
|
+
import "../../Theme"
|
|
5
|
+
|
|
6
|
+
QQC.Button {
|
|
7
|
+
id: picker
|
|
8
|
+
|
|
9
|
+
required property var renderer
|
|
10
|
+
property string externalDate: String(renderer.prop("date", ""))
|
|
11
|
+
property var selectedDate: parseDate(externalDate)
|
|
12
|
+
property int shownMonth: selectedDate ? selectedDate.getMonth() : new Date().getMonth()
|
|
13
|
+
property int shownYear: selectedDate ? selectedDate.getFullYear() : new Date().getFullYear()
|
|
14
|
+
|
|
15
|
+
function parseDate(value) {
|
|
16
|
+
var match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(String(value || ""))
|
|
17
|
+
if (!match) return null
|
|
18
|
+
var parsed = new Date(Number(match[1]), Number(match[2]) - 1, Number(match[3]), 12, 0, 0)
|
|
19
|
+
return isNaN(parsed.getTime()) ? null : parsed
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function isoDate(value) {
|
|
23
|
+
function pad(number) { return number < 10 ? "0" + number : String(number) }
|
|
24
|
+
return value.getFullYear() + "-" + pad(value.getMonth() + 1) + "-" + pad(value.getDate())
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function sameDate(left, right) {
|
|
28
|
+
return left && right && left.getFullYear() === right.getFullYear()
|
|
29
|
+
&& left.getMonth() === right.getMonth() && left.getDate() === right.getDate()
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function withinBounds(value) {
|
|
33
|
+
var minimum = parseDate(renderer.prop("minimum", ""))
|
|
34
|
+
var maximum = parseDate(renderer.prop("maximum", ""))
|
|
35
|
+
return (!minimum || value >= minimum) && (!maximum || value <= maximum)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function navigate(offset) {
|
|
39
|
+
var next = new Date(shownYear, shownMonth + offset, 1, 12, 0, 0)
|
|
40
|
+
shownMonth = next.getMonth()
|
|
41
|
+
shownYear = next.getFullYear()
|
|
42
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "navigate", {
|
|
43
|
+
month: shownMonth + 1, year: shownYear
|
|
44
|
+
})
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
onExternalDateChanged: {
|
|
48
|
+
var parsed = parseDate(externalDate)
|
|
49
|
+
selectedDate = parsed
|
|
50
|
+
if (parsed) {
|
|
51
|
+
shownMonth = parsed.getMonth()
|
|
52
|
+
shownYear = parsed.getFullYear()
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
implicitWidth: Number(renderer.prop("width", 200))
|
|
57
|
+
implicitHeight: Number(renderer.prop("height", 40))
|
|
58
|
+
enabled: renderer.prop("enabled", true) !== false
|
|
59
|
+
onClicked: calendarPopup.open()
|
|
60
|
+
|
|
61
|
+
background: Rectangle {
|
|
62
|
+
color: renderer.prop("background", Color.popups.background)
|
|
63
|
+
radius: Number(renderer.prop("radius", Style.cornerRadius))
|
|
64
|
+
border.width: Style.normalBorderWidth
|
|
65
|
+
border.color: picker.activeFocus
|
|
66
|
+
? renderer.prop("accent", Color.accent)
|
|
67
|
+
: renderer.prop("border_color", renderer.foreground)
|
|
68
|
+
opacity: picker.down ? 0.72 : 1
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
contentItem: Row {
|
|
72
|
+
spacing: Style.spacing.controlGap
|
|
73
|
+
Text {
|
|
74
|
+
anchors.verticalCenter: parent.verticalCenter
|
|
75
|
+
text: String(renderer.prop("label", ""))
|
|
76
|
+
visible: text.length > 0
|
|
77
|
+
color: renderer.prop("muted", Color.muted)
|
|
78
|
+
font.family: String(renderer.prop("font_family", renderer.fontFamily))
|
|
79
|
+
font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
|
|
80
|
+
}
|
|
81
|
+
Text {
|
|
82
|
+
anchors.verticalCenter: parent.verticalCenter
|
|
83
|
+
text: picker.selectedDate
|
|
84
|
+
? Qt.formatDate(picker.selectedDate, String(renderer.prop("format", "yyyy-MM-dd")))
|
|
85
|
+
: String(renderer.prop("placeholder", "Choose a date"))
|
|
86
|
+
color: renderer.prop("foreground", renderer.foreground)
|
|
87
|
+
font.family: String(renderer.prop("font_family", renderer.fontFamily))
|
|
88
|
+
font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
QQC.Popup {
|
|
93
|
+
id: calendarPopup
|
|
94
|
+
width: Number(renderer.prop("popup_width", 320))
|
|
95
|
+
height: calendarColumn.implicitHeight + topPadding + bottomPadding
|
|
96
|
+
visible: renderer.prop("opened", false) === true
|
|
97
|
+
closePolicy: QQC.Popup.CloseOnEscape | QQC.Popup.CloseOnPressOutside
|
|
98
|
+
padding: Style.spacing.md
|
|
99
|
+
|
|
100
|
+
onOpened: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "open", {})
|
|
101
|
+
onClosed: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "close", {})
|
|
102
|
+
|
|
103
|
+
background: Rectangle {
|
|
104
|
+
color: renderer.prop("popup_background", Color.popups.background)
|
|
105
|
+
radius: Number(renderer.prop("radius", Style.cornerRadius))
|
|
106
|
+
border.width: Style.normalBorderWidth
|
|
107
|
+
border.color: renderer.prop("border_color", renderer.foreground)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
contentItem: Column {
|
|
111
|
+
id: calendarColumn
|
|
112
|
+
spacing: Style.spacing.sm
|
|
113
|
+
|
|
114
|
+
Row {
|
|
115
|
+
width: parent.width
|
|
116
|
+
spacing: Style.spacing.sm
|
|
117
|
+
QQC.ToolButton {
|
|
118
|
+
text: "‹"
|
|
119
|
+
onClicked: picker.navigate(-1)
|
|
120
|
+
}
|
|
121
|
+
Text {
|
|
122
|
+
width: parent.width - parent.spacing * 2 - 80
|
|
123
|
+
height: 40
|
|
124
|
+
horizontalAlignment: Text.AlignHCenter
|
|
125
|
+
verticalAlignment: Text.AlignVCenter
|
|
126
|
+
text: Qt.formatDate(new Date(picker.shownYear, picker.shownMonth, 1), "MMMM yyyy")
|
|
127
|
+
color: renderer.prop("foreground", renderer.foreground)
|
|
128
|
+
font.family: String(renderer.prop("font_family", renderer.fontFamily))
|
|
129
|
+
font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
|
|
130
|
+
font.bold: true
|
|
131
|
+
}
|
|
132
|
+
QQC.ToolButton {
|
|
133
|
+
text: "›"
|
|
134
|
+
onClicked: picker.navigate(1)
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
Basic.DayOfWeekRow {
|
|
139
|
+
width: parent.width
|
|
140
|
+
locale: monthGrid.locale
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
Basic.MonthGrid {
|
|
144
|
+
id: monthGrid
|
|
145
|
+
width: parent.width
|
|
146
|
+
month: picker.shownMonth
|
|
147
|
+
year: picker.shownYear
|
|
148
|
+
|
|
149
|
+
delegate: Rectangle {
|
|
150
|
+
required property var model
|
|
151
|
+
implicitWidth: 36
|
|
152
|
+
implicitHeight: 32
|
|
153
|
+
radius: Number(renderer.prop("radius", Style.cornerRadius)) / 2
|
|
154
|
+
color: picker.sameDate(model.date, picker.selectedDate)
|
|
155
|
+
? renderer.prop("accent", Color.accent) : "transparent"
|
|
156
|
+
opacity: model.month === monthGrid.month ? 1 : 0.35
|
|
157
|
+
|
|
158
|
+
Text {
|
|
159
|
+
anchors.centerIn: parent
|
|
160
|
+
text: model.day
|
|
161
|
+
color: picker.sameDate(model.date, picker.selectedDate)
|
|
162
|
+
? renderer.prop("background", Color.popups.background)
|
|
163
|
+
: renderer.prop("foreground", renderer.foreground)
|
|
164
|
+
font.family: String(renderer.prop("font_family", renderer.fontFamily))
|
|
165
|
+
font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
onClicked: function(date) {
|
|
170
|
+
if (!picker.withinBounds(date)) return
|
|
171
|
+
picker.selectedDate = date
|
|
172
|
+
var value = picker.isoDate(date)
|
|
173
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "input", { value: value })
|
|
174
|
+
renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "change", { value: value })
|
|
175
|
+
if (renderer.prop("close_on_select", true) !== false) calendarPopup.close()
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import QtQuick.Controls as QQC
|
|
3
|
+
import "../../Theme"
|
|
4
|
+
|
|
5
|
+
QQC.DayOfWeekRow {
|
|
6
|
+
id: dayRoot
|
|
7
|
+
property var renderer: null
|
|
8
|
+
implicitWidth: Number(renderer ? renderer.prop("width", 320) : 320); implicitHeight: Number(renderer ? renderer.prop("height", 36) : 36)
|
|
9
|
+
locale: Qt.locale(String(renderer ? renderer.prop("locale", Qt.locale().name) : Qt.locale().name))
|
|
10
|
+
delegate: Rectangle { required property var model; color: renderer.prop("background", "transparent"); Text { anchors.fill: parent; text: model.shortName; color: renderer.prop("foreground", renderer.prop("muted", renderer.foreground)); font.family: renderer.prop("font_family", renderer.fontFamily); font.pixelSize: Number(renderer.prop("font_size", Style.font.body)); horizontalAlignment: Text.AlignHCenter; verticalAlignment: Text.AlignVCenter } TapHandler { onTapped: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "day_click", { day: model.day, name: model.longName }) } }
|
|
11
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import QtQuick.Controls as QQC
|
|
3
|
+
import QtQuick.Layouts
|
|
4
|
+
import QtMultimedia
|
|
5
|
+
import QtQuick.VectorImage
|
|
6
|
+
import "../../Theme"
|
|
7
|
+
import "../../Controls" as ZuiControls
|
|
8
|
+
|
|
9
|
+
QQC.DelayButton {
|
|
10
|
+
required property var renderer
|
|
11
|
+
id: nativeDelayButton
|
|
12
|
+
text: String(renderer.prop("text", ""))
|
|
13
|
+
delay: Number(renderer.prop("delay", 1000))
|
|
14
|
+
enabled: renderer.prop("enabled", true) !== false
|
|
15
|
+
implicitWidth: Number(renderer.prop("width", 140))
|
|
16
|
+
implicitHeight: Number(renderer.prop("height", 40))
|
|
17
|
+
background: Rectangle {
|
|
18
|
+
radius: Style.cornerRadius
|
|
19
|
+
color: renderer.prop("background", Color.popups.background)
|
|
20
|
+
border.width: Style.normalBorderWidth
|
|
21
|
+
border.color: nativeDelayButton.activeFocus ? renderer.prop("accent", Color.accent) : renderer.prop("foreground", renderer.foreground)
|
|
22
|
+
Rectangle {
|
|
23
|
+
width: parent.width * nativeDelayButton.progress
|
|
24
|
+
height: parent.height
|
|
25
|
+
radius: parent.radius
|
|
26
|
+
color: renderer.prop("progress_background", renderer.prop("accent", Color.accent))
|
|
27
|
+
opacity: 0.45
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
contentItem: Text {
|
|
31
|
+
text: nativeDelayButton.text
|
|
32
|
+
textFormat: Text.PlainText
|
|
33
|
+
color: renderer.prop("foreground", renderer.foreground)
|
|
34
|
+
font.family: String(renderer.prop("font_family", renderer.fontFamily))
|
|
35
|
+
font.pixelSize: Number(renderer.prop("font_size", Style.font.body))
|
|
36
|
+
font.bold: true
|
|
37
|
+
horizontalAlignment: Text.AlignHCenter
|
|
38
|
+
verticalAlignment: Text.AlignVCenter
|
|
39
|
+
}
|
|
40
|
+
onActivated: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "activate", {})
|
|
41
|
+
onProgressChanged: {
|
|
42
|
+
if (renderer.subscribed("progress")) renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "progress", { value: progress })
|
|
43
|
+
}
|
|
44
|
+
onPressed: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "press", {})
|
|
45
|
+
onReleased: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "release", {})
|
|
46
|
+
onCanceled: renderer.bridge.sendEvent(renderer.surfaceName, renderer.controlId, "cancel", {})
|
|
47
|
+
}
|