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
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() |
|
} |
|
} |
|
} |
|
}
|
|
|