Warning, /plasma/kdeplasma-addons/applets/timer/package/contents/ui/TimerEdit.qml is written in an unsupported language. File is not indexed.

0001 /*
0002  *  SPDX-FileCopyrightText: 2020 Ɓukasz Korbel <corebell.it@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 import QtQuick 2.15
0008 import org.kde.plasma.plasmoid 2.0
0009 import org.kde.plasma.core as PlasmaCore
0010 import org.kde.ksvg 1.0 as KSvg
0011 import org.kde.kquickcontrolsaddons 2.0 as QtExtra
0012 import org.kde.plasma.private.timer 0.1 as TimerPlasmoid
0013 
0014 Row {
0015     id: timerEdit
0016     property int value // time in seconds
0017     property bool editable: true
0018     // in alert mode 2nd set of digits from svg file will be drawn
0019     property bool alertMode: false
0020 
0021     signal digitModified(int valueDelta)
0022 
0023     QtObject {
0024         id: internal
0025         readonly property string digitSuffix: alertMode ? "_1" : ""
0026         // digits count include separators with 50% of digit width
0027         readonly property real digits: root.showSeconds ? 7 : 4.5;
0028         readonly property int digitH: (parent.height / 2) * digits < parent.width ? parent.height : parent.width / digits * 2
0029         readonly property int digitW: digitH / 2;
0030         property string valueString: "000000"
0031     }
0032 
0033     Component {
0034         id: digit
0035         KSvg.SvgItem {
0036             property int meaning
0037             property int num
0038             readonly property int mouseWheelAngleThreshold: 5
0039             width: internal.digitW
0040             height: internal.digitH
0041 
0042             activeFocusOnTab: true
0043             imagePath: "widgets/timer"
0044             elementId: num + internal.digitSuffix
0045 
0046             Keys.onPressed: {
0047                 switch (event.key) {
0048                 case Qt.Key_Return:
0049                 case Qt.Key_Enter:
0050                 case Qt.Key_Space:
0051                 case Qt.Key_Select:
0052                     root.toggleTimer();
0053                     break;
0054                 case Qt.Key_Up:
0055                     if (value + meaning < 24*60*60) {
0056                         timerEdit.digitModified(meaning)
0057                     }
0058                     break;
0059                 case Qt.Key_Down:
0060                     if (value - meaning >= 0) {
0061                         timerEdit.digitModified(-meaning)
0062                     }
0063                     break;
0064                 case Qt.Key_Left:
0065                     nextItemInFocusChain(false).forceActiveFocus(Qt.BacktabFocusReason);
0066                     break;
0067                 case Qt.Key_Right:
0068                     nextItemInFocusChain(true).forceActiveFocus(Qt.TabFocusReason);
0069                     break;
0070                 default:
0071                     return;
0072                 }
0073                 event.accepted = true;
0074             }
0075 
0076             MouseArea {
0077                 anchors.fill: parent
0078                 enabled: editable
0079                 propagateComposedEvents: true
0080 
0081                 onWheel: wheel => {
0082                     wheel.accepted = true
0083                     if (wheel.angleDelta.y > mouseWheelAngleThreshold) {
0084                         if (value + meaning < 24*60*60) {
0085                             timerEdit.digitModified(meaning)
0086                         }
0087                     } else if (wheel.angleDelta.y < -mouseWheelAngleThreshold) {
0088                         if (value - meaning >= 0) {
0089                             timerEdit.digitModified(-meaning)
0090                         }
0091                     }
0092                 }
0093             }
0094         }
0095     }
0096 
0097     Component {
0098         id: separator
0099         KSvg.SvgItem {
0100             width: internal.digitW / 2;
0101             height: internal.digitH;
0102             imagePath: "widgets/timer"
0103             elementId: "separator" + internal.digitSuffix
0104         }
0105     }
0106 
0107     // Following 8 loaders will prepare all elements
0108     // to display time in format "hh:mm:ss"
0109 
0110     Loader {
0111         id: hour1
0112         sourceComponent: digit
0113         onLoaded: {
0114             item.meaning = 60*60*10 //10h
0115             item.num = internal.valueString[0]
0116         }
0117     }
0118     Loader {
0119         id: hour2
0120         sourceComponent: digit
0121         onLoaded: {
0122             item.meaning = 60*60 //1h
0123             item.num = internal.valueString[1]
0124         }
0125     }
0126 
0127     Loader { sourceComponent: separator } // ":"
0128 
0129     Loader {
0130         id: minute1
0131         sourceComponent: digit
0132         onLoaded: {
0133             item.meaning = 600 //10min
0134             item.num = internal.valueString[2]
0135         }
0136     }
0137     Loader {
0138         id: minute2
0139         sourceComponent: digit
0140         onLoaded: {
0141             item.meaning = 60 //1min
0142             item.num = internal.valueString[3]
0143         }
0144     }
0145 
0146     Loader { sourceComponent: root.showSeconds ? separator : undefined } // ":"
0147 
0148     Loader {
0149         id: second1
0150         sourceComponent: root.showSeconds ? digit : undefined
0151         onLoaded: {
0152             item.meaning = 10 //10s
0153             item.num = internal.valueString[4]
0154         }
0155     }
0156     Loader {
0157         id: second2
0158         sourceComponent: root.showSeconds ? digit : undefined
0159         onLoaded: {
0160             item.meaning = 1 //1s
0161             item.num = internal.valueString[5]
0162         }
0163     }
0164 
0165     onValueChanged: {
0166         // update all 6 digits in one signal handler
0167         internal.valueString = TimerPlasmoid.Timer.secondsToString(value, "hhmmss")
0168         if (hour1.item === null) return
0169         hour1.item.num = internal.valueString[0]
0170         hour2.item.num = internal.valueString[1]
0171         minute1.item.num = internal.valueString[2]
0172         minute2.item.num = internal.valueString[3]
0173         second1.item.num = internal.valueString[4]
0174         second2.item.num = internal.valueString[5]
0175     }
0176 }
0177