地面站终端 App
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123 lines
3.9 KiB

import QtQuick 2.15
import QtQuick.Controls 2.15
import QGroundControl.ScreenTools 1.0
import QGroundControl.Palette 1.0
/// The SliderSwitch control implements a sliding switch control similar to the power off
/// control on an iPhone. It supports holding the space bar to slide the switch.
Rectangle {
id: _root
implicitWidth: label.contentWidth + (_diameter * 2.5) + (_border * 4)
implicitHeight: label.height * 2.5
radius: height /2
color: qgcPal.windowShade
signal accept ///< Action confirmed
property string confirmText ///< Text for slider
property alias fontPointSize: label.font.pointSize ///< Point size for text
property real _border: 4
property real _diameter: height - (_border * 2)
property real _dragStartX: _border
property real _dragStopX: _root.width - (_diameter + _border)
property bool _waitingForLastAutoRepeat: false
Keys.onSpacePressed: {
if (visible && event.modifiers === Qt.NoModifier && event.isAutoRepeat && !sliderDragArea.drag.active) {
event.accepted = true
if (_waitingForLastAutoRepeat) {
resetSpaceBarSliding()
accept()
} else {
sliderAnimation.start()
spaceBarTimout.restart()
}
}
}
function resetSpaceBarSliding() {
_waitingForLastAutoRepeat = false
spaceBarTimout.stop()
slider.reset()
}
Timer {
id: spaceBarTimout
interval: 200
repeat: false
onTriggered: _root.resetSpaceBarSliding()
}
QGCPalette { id: qgcPal; colorGroupEnabled: true }
QGCLabel {
id: label
x: _diameter + _border
width: parent.width - x
anchors.verticalCenter: parent.verticalCenter
horizontalAlignment: Text.AlignHCenter
text: confirmText
color: qgcPal.buttonText
}
Rectangle {
id: slider
x: _border
y: _border
height: _diameter
width: _diameter
radius: _diameter / 2
color: qgcPal.primaryButton
QGCColoredImage {
anchors.centerIn: parent
width: parent.width * 0.8
height: parent.height * 0.8
sourceSize.height: height
fillMode: Image.PreserveAspectFit
smooth: false
mipmap: false
color: qgcPal.buttonText
cache: false
source: "/res/ArrowRight.svg"
}
PropertyAnimation on x {
id: sliderAnimation
duration: 1500
from: _dragStartX
to: _dragStopX
running: false
onFinished: _waitingForLastAutoRepeat = true
}
function reset() {
slider.x = _border
sliderAnimation.stop()
}
}
QGCMouseArea {
id: sliderDragArea
anchors.leftMargin: -ScreenTools.defaultFontPixelWidth * 15
fillItem: slider
drag.target: slider
drag.axis: Drag.XAxis
drag.minimumX: _dragStartX
drag.maximumX: _dragStopX
preventStealing: true
property bool dragActive: drag.active
onDragActiveChanged: {
if (!sliderDragArea.drag.active) {
if (slider.x > _dragStopX - _border) {
_root.accept()
}
slider.reset()
}
}
}
}