Drop MySlider.qml in favor of compatibility
This commit is contained in:
parent
476866697a
commit
c3c7aa8fcc
3 changed files with 6 additions and 296 deletions
|
@ -40,7 +40,6 @@ SOURCES += src/harbour-batterybuddy.cpp \
|
|||
DISTFILES += qml/harbour-batterybuddy.qml \
|
||||
qml/components/AboutLabel.qml \
|
||||
qml/components/MyLabel.qml \
|
||||
qml/components/MySlider.qml \
|
||||
qml/pages\LicensePage.qml \
|
||||
qml/cover/CoverPage.qml \
|
||||
../rpm/harbour-batterybuddy.spec \
|
||||
|
|
|
@ -1,287 +0,0 @@
|
|||
/****************************************************************************************
|
||||
**
|
||||
** Copyright (C) 2013 Jolla Ltd.
|
||||
** Contact: Martin Jones <martin.jones@jollamobile.com>
|
||||
** All rights reserved.
|
||||
**
|
||||
** This file is part of Sailfish Silica UI component package.
|
||||
**
|
||||
** You may use this file under the terms of BSD license as follows:
|
||||
**
|
||||
** Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are met:
|
||||
** * Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in the
|
||||
** documentation and/or other materials provided with the distribution.
|
||||
** * Neither the name of the Jolla Ltd nor the
|
||||
** names of its contributors may be used to endorse or promote products
|
||||
** derived from this software without specific prior written permission.
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR
|
||||
** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
**
|
||||
****************************************************************************************/
|
||||
|
||||
// Modified by Matti Viljanen 2020: Added left-to-right/right-to-left support
|
||||
|
||||
import QtQuick 2.4
|
||||
import Sailfish.Silica 1.0
|
||||
import Sailfish.Silica.private 1.0
|
||||
|
||||
MouseArea {
|
||||
id: slider
|
||||
|
||||
property real maximumValue: 1.0
|
||||
property real minimumValue: 0.0
|
||||
property real stepSize
|
||||
property real value: 0.0
|
||||
readonly property real sliderValue: Math.max(minimumValue, Math.min(maximumValue, value))
|
||||
property bool handleVisible: true
|
||||
property string valueText
|
||||
property alias label: labelText.text
|
||||
property bool down: pressed && !DragFilter.canceled && !_cancel
|
||||
property bool highlighted: down
|
||||
property real leftMargin: Math.round(Screen.width/8)
|
||||
property real rightMargin: Math.round(Screen.width/8)
|
||||
property color highlightColor: Theme.highlightColor
|
||||
property color secondaryHighlightColor: Theme.secondaryHighlightColor
|
||||
property int highlightDirection: Qt.LeftToRight
|
||||
|
||||
property bool _hasValueLabel: false
|
||||
property Item _valueLabel
|
||||
property real _oldValue
|
||||
property real _precFactor: 1.0
|
||||
|
||||
property real _grooveWidth: Math.max(0, width - leftMargin - rightMargin)
|
||||
property bool _widthChanged
|
||||
property bool _cancel
|
||||
|
||||
property bool _componentComplete
|
||||
property int _extraPadding: Math.max(height - implicitHeight, 0) / 2
|
||||
|
||||
DragFilter.orientations: Qt.Vertical
|
||||
onPreventStealingChanged: if (preventStealing) slider.DragFilter.end()
|
||||
|
||||
onStepSizeChanged: {
|
||||
// Avoid rounding errors. We assume that the range will
|
||||
// be sensibly related to stepSize
|
||||
var decimial = Math.floor(stepSize) - stepSize
|
||||
if (decimial < 0.001) {
|
||||
_precFactor = Math.pow(10, 7)
|
||||
} else if (decimial < 0.1) {
|
||||
_precFactor = Math.pow(10, 4)
|
||||
} else {
|
||||
_precFactor = 1.0
|
||||
}
|
||||
}
|
||||
|
||||
implicitHeight: labelText.visible ? (background.topPadding + background.height / 2 + 2 * Theme.paddingMedium + labelText.height)
|
||||
: (background.topPadding + background.height + background.bottomPadding)
|
||||
|
||||
onWidthChanged: updateWidth()
|
||||
onLeftMarginChanged: updateWidth()
|
||||
onRightMarginChanged: updateWidth()
|
||||
|
||||
// changing the width of the slider shouldn't animate the slider bar/handle
|
||||
function updateWidth() {
|
||||
_widthChanged = true
|
||||
_grooveWidth = Math.max(0, width - leftMargin - rightMargin)
|
||||
_widthChanged = false
|
||||
}
|
||||
|
||||
function cancel() {
|
||||
_cancel = true
|
||||
value = _oldValue
|
||||
}
|
||||
|
||||
drag {
|
||||
target: draggable
|
||||
minimumX: leftMargin - highlight.width/2
|
||||
maximumX: slider.width - rightMargin - highlight.width/2
|
||||
axis: Drag.XAxis
|
||||
onActiveChanged: if (drag.active && !slider.DragFilter.canceled) slider.DragFilter.end()
|
||||
}
|
||||
|
||||
function _updateValueToDraggable() {
|
||||
if (width > (leftMargin + rightMargin)) {
|
||||
var pos = draggable.x + highlight.width/2 - leftMargin
|
||||
value = _calcValue((pos / _grooveWidth) * (maximumValue - minimumValue) + minimumValue)
|
||||
}
|
||||
}
|
||||
|
||||
function _calcValue(newVal) {
|
||||
if (newVal <= minimumValue) {
|
||||
return minimumValue
|
||||
}
|
||||
|
||||
if (stepSize > 0.0) {
|
||||
var offset = newVal - minimumValue
|
||||
var intervals = Math.round(offset / stepSize)
|
||||
newVal = Math.round((minimumValue + (intervals * stepSize)) * _precFactor) / _precFactor
|
||||
}
|
||||
|
||||
if (newVal > maximumValue) {
|
||||
return maximumValue
|
||||
}
|
||||
|
||||
return newVal
|
||||
}
|
||||
|
||||
onPressed: {
|
||||
slider.DragFilter.begin(mouse.x, mouse.y)
|
||||
_cancel = false
|
||||
_oldValue = value
|
||||
draggable.x = Math.min(Math.max(drag.minimumX, mouseX - highlight.width/2), drag.maximumX)
|
||||
}
|
||||
|
||||
onReleased: {
|
||||
if (!_cancel) {
|
||||
_updateValueToDraggable()
|
||||
_oldValue = value
|
||||
}
|
||||
}
|
||||
|
||||
onCanceled: {
|
||||
slider.DragFilter.end()
|
||||
value = _oldValue
|
||||
}
|
||||
|
||||
onValueTextChanged: {
|
||||
if (valueText && !_hasValueLabel) {
|
||||
_hasValueLabel = true
|
||||
var valueIndicatorComponent = Qt.createComponent("/usr/lib/qt5/qml/Sailfish/Silica/private/SliderValueLabel.qml")
|
||||
if (valueIndicatorComponent.status === Component.Ready) {
|
||||
_valueLabel = valueIndicatorComponent.createObject(slider)
|
||||
} else {
|
||||
console.log(valueIndicatorComponent.errorString())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FontMetrics {
|
||||
id: fontMetrics
|
||||
font.pixelSize: Theme.fontSizeHuge
|
||||
}
|
||||
|
||||
GlassItem {
|
||||
id: background
|
||||
// extra painting margins (Theme.paddingMedium on both sides) are needed,
|
||||
// because glass item doesn't visibly paint across the full width of the item
|
||||
property int bottomPadding: (Theme.itemSizeSmall - height) / 2
|
||||
// ascent enough to keep text in slider area
|
||||
property int topPadding: (slider._valueLabel != null && slider._valueLabel.visible) ? fontMetrics.ascent
|
||||
: bottomPadding
|
||||
|
||||
x: slider.leftMargin-Theme.paddingMedium
|
||||
width: slider._grooveWidth + 2*Theme.paddingMedium
|
||||
y: slider._extraPadding + topPadding
|
||||
height: Theme.itemSizeExtraSmall/2
|
||||
|
||||
dimmed: true
|
||||
radius: 0.06
|
||||
falloffRadius: 0.09
|
||||
ratio: 0.0
|
||||
color: slider.highlighted ? slider.highlightColor : Theme.secondaryColor
|
||||
}
|
||||
|
||||
GlassItem {
|
||||
id: progressBar
|
||||
anchors {
|
||||
verticalCenter: background.verticalCenter
|
||||
left: highlightDirection === Qt.LeftToRight ? background.left : highlight.horizontalCenter
|
||||
right: highlightDirection === Qt.LeftToRight ? highlight.horizontalCenter : background.right
|
||||
leftMargin: highlightDirection === Qt.LeftToRight ? 0 : -highlight.width/8
|
||||
rightMargin: highlightDirection === Qt.LeftToRight ? -highlight.width/8 : 0
|
||||
}
|
||||
height: Theme.itemSizeExtraSmall/2
|
||||
visible: sliderValue > minimumValue
|
||||
dimmed: false
|
||||
radius: 0.05
|
||||
falloffRadius: 0.14
|
||||
ratio: 0.0
|
||||
color: slider.highlighted ? slider.highlightColor : Theme.primaryColor
|
||||
Behavior on width {
|
||||
enabled: !_widthChanged
|
||||
SmoothedAnimation {
|
||||
duration: 300
|
||||
velocity: 1500*Theme.pixelRatio
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
id: draggable
|
||||
width: highlight.width
|
||||
height: highlight.height
|
||||
onXChanged: {
|
||||
if (_cancel || slider.DragFilter.canceled) {
|
||||
return
|
||||
}
|
||||
if (slider.drag.active) {
|
||||
_updateValueToDraggable()
|
||||
}
|
||||
}
|
||||
}
|
||||
GlassItem {
|
||||
id: highlight
|
||||
x: (maximumValue > minimumValue)
|
||||
? (sliderValue - minimumValue) / (maximumValue - minimumValue) * _grooveWidth - highlight.width/2 + leftMargin
|
||||
: leftMargin - highlight.width/2
|
||||
width: Theme.itemSizeMedium
|
||||
height: Theme.itemSizeMedium
|
||||
radius: 0.17
|
||||
falloffRadius: 0.17
|
||||
anchors.verticalCenter: background.verticalCenter
|
||||
visible: handleVisible
|
||||
color: slider.highlighted ? slider.highlightColor : Theme.primaryColor
|
||||
Behavior on x {
|
||||
enabled: !_widthChanged
|
||||
SmoothedAnimation {
|
||||
duration: 300
|
||||
velocity: 1500*Theme.pixelRatio
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Label {
|
||||
id: labelText
|
||||
visible: text.length
|
||||
font.pixelSize: Theme.fontSizeSmall
|
||||
color: slider.highlighted ? slider.secondaryHighlightColor : Theme.secondaryColor
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.top: background.verticalCenter
|
||||
anchors.topMargin: Theme.paddingMedium
|
||||
width: Math.min(paintedWidth, parent.width - 2*Theme.paddingMedium)
|
||||
truncationMode: TruncationMode.Fade
|
||||
}
|
||||
states: State {
|
||||
name: "invalidRange"
|
||||
when: _componentComplete && minimumValue >= maximumValue
|
||||
PropertyChanges {
|
||||
target: progressBar
|
||||
width: progressBar.height
|
||||
}
|
||||
PropertyChanges {
|
||||
target: slider
|
||||
enabled: false
|
||||
opacity: 0.6
|
||||
}
|
||||
StateChangeScript {
|
||||
script: console.log("Warning: Slider.maximumValue needs to be higher than Slider.minimumValue")
|
||||
}
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
_componentComplete = true
|
||||
}
|
||||
}
|
|
@ -161,7 +161,7 @@ Page {
|
|||
onCheckedChanged: settings.limitEnabled = checked
|
||||
}
|
||||
|
||||
MySlider {
|
||||
Slider {
|
||||
id: highLimitSlider
|
||||
handleVisible: enabled
|
||||
width: parent.width
|
||||
|
@ -170,7 +170,6 @@ Page {
|
|||
maximumValue: 95
|
||||
stepSize: 1
|
||||
valueText: value + "%"
|
||||
highlightDirection: Qt.RightToLeft
|
||||
onValueChanged: {
|
||||
if(lowLimitSlider.value >= value)
|
||||
lowLimitSlider.value = value - 1
|
||||
|
@ -180,7 +179,7 @@ Page {
|
|||
settings.highLimit = value
|
||||
}
|
||||
}
|
||||
MySlider {
|
||||
Slider {
|
||||
id: lowLimitSlider
|
||||
handleVisible: enabled
|
||||
width: parent.width
|
||||
|
@ -231,7 +230,7 @@ Page {
|
|||
text: qsTr("Show low charge notification")
|
||||
onCheckedChanged: settings.lowNotificationsEnabled = checked
|
||||
}
|
||||
MySlider {
|
||||
Slider {
|
||||
id: highAlertSlider
|
||||
width: parent.width
|
||||
label: qsTr("Battery full notification")
|
||||
|
@ -239,7 +238,6 @@ Page {
|
|||
maximumValue: 100
|
||||
stepSize: 1
|
||||
valueText: value + "%"
|
||||
highlightDirection: Qt.RightToLeft
|
||||
onValueChanged: {
|
||||
if(lowAlertSlider.value >= value)
|
||||
lowAlertSlider.value = value - 1
|
||||
|
@ -249,7 +247,7 @@ Page {
|
|||
settings.highAlert = value
|
||||
}
|
||||
}
|
||||
MySlider {
|
||||
Slider {
|
||||
id: lowAlertSlider
|
||||
width: parent.width
|
||||
label: qsTr("Battery low notification")
|
||||
|
@ -266,7 +264,7 @@ Page {
|
|||
settings.highAlert = highAlertSlider.value
|
||||
}
|
||||
}
|
||||
MySlider {
|
||||
Slider {
|
||||
id: highIntervalSlider
|
||||
width: parent.width
|
||||
label: qsTr("Battery high notification interval")
|
||||
|
@ -276,7 +274,7 @@ Page {
|
|||
valueText: Math.floor(value / 60) + (value % 60 < 10 ? ":0" + value % 60 : ":" + value % 60)
|
||||
onReleased: settings.highNotificationsInterval = value
|
||||
}
|
||||
MySlider {
|
||||
Slider {
|
||||
id: lowIntervalSlider
|
||||
width: parent.width
|
||||
label: qsTr("Battery low notification interval")
|
||||
|
|
Loading…
Reference in a new issue