forked from Sepanta/console-emulator
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.
220 lines
4.1 KiB
220 lines
4.1 KiB
3 years ago
|
import QtQuick 2.0
|
||
|
import QtQuick.Controls 2.13
|
||
|
import QtGraphicalEffects 1.13
|
||
|
|
||
|
import "qrc:/theme"
|
||
|
import "qrc:/const"
|
||
|
|
||
|
Item {
|
||
|
id: main
|
||
|
property var color: Theme.current.green
|
||
|
property var colorDeep: Theme.current.greenDeep
|
||
|
property var sliderSize: Const.sliderHeight
|
||
|
property var backgroundLenght: Const.sliderWidth
|
||
|
property bool flip: false
|
||
|
property var value: control.value
|
||
|
|
||
|
implicitHeight: sliderSize
|
||
|
width: backgroundLenght
|
||
|
|
||
|
Slider {
|
||
|
id: control
|
||
|
width: (4 / 5) * parent.width
|
||
|
height: Const.sliderThickness
|
||
|
x: parent.width - width
|
||
|
y: 0
|
||
|
|
||
|
from: flip ? -1 : 1
|
||
|
to: flip ? -5 : 5
|
||
|
stepSize: 1
|
||
|
value: flip ? -1 : 1
|
||
|
snapMode: Slider.SnapOnRelease
|
||
|
|
||
|
transform: Rotation {
|
||
|
origin {
|
||
|
x: control.width / 2 - main.width / 10
|
||
|
y: control.height / 2
|
||
|
}
|
||
|
|
||
|
axis {
|
||
|
z: 0
|
||
|
x: 0
|
||
|
y: 1
|
||
|
}
|
||
|
|
||
|
angle: flip ? 180 : 0
|
||
|
}
|
||
|
|
||
|
background: Item {
|
||
|
id: controlBackground
|
||
|
width: main.width
|
||
|
height: parent.height
|
||
|
x: - parent.x
|
||
|
|
||
|
Item {
|
||
|
id: backgroundObject
|
||
|
width: parent.width
|
||
|
height: parent.height
|
||
|
|
||
|
Rectangle {
|
||
|
id: backgroundArea
|
||
|
width: parent.width
|
||
|
height: parent.height
|
||
|
radius: height / 2
|
||
|
color: "pink"
|
||
|
}
|
||
|
|
||
|
Item {
|
||
|
id: backgroundGrad
|
||
|
implicitWidth: parent.implicitWidth
|
||
|
implicitHeight: parent.implicitHeight
|
||
|
anchors.fill: parent
|
||
|
|
||
|
layer.enabled: true
|
||
|
layer.effect: OpacityMask {
|
||
|
maskSource: backgroundArea
|
||
|
}
|
||
|
|
||
|
Rectangle {
|
||
|
width: parent.width
|
||
|
height: parent.height
|
||
|
color: "transparent"
|
||
|
|
||
|
LinearGradient {
|
||
|
anchors.fill: parent
|
||
|
start: Qt.point(parent.width / 2 , parent.height)
|
||
|
end: Qt.point(0, 0)
|
||
|
gradient: Gradient {
|
||
|
GradientStop {
|
||
|
position: 0
|
||
|
color: Theme.current.none
|
||
|
}
|
||
|
|
||
|
GradientStop {
|
||
|
position: 1
|
||
|
color: Theme.current.noneDeep
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Rectangle {
|
||
|
id: progressArea
|
||
|
width: (control.visualPosition * parent.width * 4 / 5) + (parent.width / 5)
|
||
|
height: parent.height
|
||
|
radius: height / 2
|
||
|
color: "pink"
|
||
|
}
|
||
|
|
||
|
Item {
|
||
|
id: progressGrad
|
||
|
anchors.fill: progressArea
|
||
|
|
||
|
layer.enabled: true
|
||
|
layer.effect: OpacityMask {
|
||
|
maskSource: progressArea
|
||
|
}
|
||
|
|
||
|
Rectangle {
|
||
|
width: parent.width
|
||
|
height: parent.height
|
||
|
color: "transparent"
|
||
|
|
||
|
LinearGradient {
|
||
|
anchors.fill: parent
|
||
|
start: Qt.point(parent.width / 2 , parent.height)
|
||
|
end: Qt.point(0, 0)
|
||
|
gradient: Gradient {
|
||
|
GradientStop {
|
||
|
position: 0
|
||
|
color: main.color
|
||
|
}
|
||
|
|
||
|
GradientStop {
|
||
|
position: 1
|
||
|
color: main.colorDeep
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
DropShadow {
|
||
|
id: dropDown
|
||
|
anchors.fill: backgroundObject
|
||
|
source: backgroundObject
|
||
|
horizontalOffset: 3
|
||
|
verticalOffset: 3
|
||
|
radius: 4
|
||
|
samples: 8
|
||
|
color: Theme.current.light
|
||
|
}
|
||
|
|
||
|
DropShadow {
|
||
|
id: dropUp
|
||
|
anchors.fill: backgroundObject
|
||
|
source: backgroundObject
|
||
|
horizontalOffset: - 3
|
||
|
verticalOffset: - 3
|
||
|
radius: 4
|
||
|
samples: 8
|
||
|
color: Theme.current.light
|
||
|
}
|
||
|
|
||
|
InnerShadow {
|
||
|
id: inner
|
||
|
anchors.fill: backgroundObject
|
||
|
source: backgroundObject
|
||
|
horizontalOffset: 3
|
||
|
verticalOffset: 3
|
||
|
radius: 3
|
||
|
samples: 6
|
||
|
smooth: true
|
||
|
color: Theme.current.lightShadow
|
||
|
}
|
||
|
}
|
||
|
|
||
|
handle: KnobImage {
|
||
|
id: knob
|
||
|
x: control.leftPadding + (control.visualPosition * control.availableWidth) - width / 2
|
||
|
y: control.topPadding + control.availableHeight / 2 - height / 2
|
||
|
implicitWidth: sliderSize
|
||
|
implicitHeight: sliderSize
|
||
|
radius: implicitHeight / 2
|
||
|
|
||
|
Item {
|
||
|
width: parent.width
|
||
|
height: parent.height
|
||
|
anchors.centerIn: knob
|
||
|
|
||
|
Text {
|
||
|
horizontalAlignment: Text.horizontalCenter
|
||
|
text: control.value
|
||
|
color: Theme.current.text
|
||
|
anchors.verticalCenter: parent.verticalCenter
|
||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||
|
}
|
||
|
|
||
|
transform: Rotation {
|
||
|
origin {
|
||
|
x: knob.width / 2
|
||
|
y: knob.height / 2
|
||
|
}
|
||
|
|
||
|
axis {
|
||
|
z: 0
|
||
|
x: 0
|
||
|
y: 1
|
||
|
}
|
||
|
|
||
|
angle: flip ? 180 : 0
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|