1/* 2 * SPDX-FileCopyrightText: 2020 Łukasz Korbel <corebell.it@gmail.com> 3 * 4 * SPDX-License-Identifier: GPL-2.0-or-later 5 */ 6 7import QtQuick 2.5 8import org.kde.plasma.plasmoid 2.0 9import org.kde.plasma.core 2.0 as PlasmaCore 10import org.kde.plasma.components 2.0 as PlasmaComponents 11import org.kde.kquickcontrolsaddons 2.0 as QtExtra 12import org.kde.plasma.private.timer 0.1 as TimerPlasmoid 13 14Row { 15 id: timerEdit 16 property int value // time in seconds 17 property bool editable: true 18 // in alert mode 2nd set of digits from svg file will be drawn 19 property bool alertMode: false 20 // display seconds in addition to hours and minutes (default: enabled) 21 readonly property bool showSeconds: plasmoid.configuration.showSeconds; 22 23 signal digitModified(int valueDelta) 24 25 QtObject { 26 id: internal 27 readonly property string digitSuffix: alertMode ? "_1" : "" 28 // digits count include separators with 50% of digit width 29 readonly property real digits: showSeconds ? 7 : 4.5; 30 readonly property int digitH: (parent.height / 2) * digits < parent.width ? parent.height : parent.width / digits * 2 31 readonly property int digitW: digitH / 2; 32 property string valueString: "000000" 33 } 34 35 Component { 36 id: digit 37 PlasmaCore.SvgItem { 38 property int meaning 39 property int num 40 readonly property int mouseWheelAngleThreshold: 5 41 width: internal.digitW 42 height: internal.digitH 43 svg: timerSvg 44 elementId: num + internal.digitSuffix 45 46 MouseArea { 47 anchors.fill: parent 48 enabled: editable 49 onWheel: { 50 wheel.accepted = true 51 if (wheel.angleDelta.y > mouseWheelAngleThreshold) { 52 if (value + meaning < 24*60*60) { 53 timerEdit.digitModified(meaning) 54 } 55 } else if (wheel.angleDelta.y < -mouseWheelAngleThreshold) { 56 if (value - meaning >= 0) { 57 timerEdit.digitModified(-meaning) 58 } 59 } 60 } 61 } 62 } 63 } 64 65 Component { 66 id: separator 67 PlasmaCore.SvgItem { 68 svg: timerSvg 69 width: internal.digitW / 2; 70 height: internal.digitH; 71 elementId: "separator" + internal.digitSuffix 72 } 73 } 74 75 PlasmaCore.Svg { 76 id: timerSvg 77 imagePath: "widgets/timer" 78 } 79 80 // Following 8 loaders will prepare all elements 81 // to display time in format "hh:mm:ss" 82 83 Loader { 84 id: hour1 85 sourceComponent: digit 86 onLoaded: { 87 item.meaning = 60*60*10 //10h 88 item.num = internal.valueString[0] 89 } 90 } 91 Loader { 92 id: hour2 93 sourceComponent: digit 94 onLoaded: { 95 item.meaning = 60*60 //1h 96 item.num = internal.valueString[1] 97 } 98 } 99 100 Loader { sourceComponent: separator } // ":" 101 102 Loader { 103 id: minute1 104 sourceComponent: digit 105 onLoaded: { 106 item.meaning = 600 //10min 107 item.num = internal.valueString[2] 108 } 109 } 110 Loader { 111 id: minute2 112 sourceComponent: digit 113 onLoaded: { 114 item.meaning = 60 //1min 115 item.num = internal.valueString[3] 116 } 117 } 118 119 Loader { sourceComponent: showSeconds ? separator : undefined } // ":" 120 121 Loader { 122 id: second1 123 sourceComponent: showSeconds ? digit : undefined 124 onLoaded: { 125 item.meaning = 10 //10s 126 item.num = internal.valueString[4] 127 } 128 } 129 Loader { 130 id: second2 131 sourceComponent: showSeconds ? digit : undefined 132 onLoaded: { 133 item.meaning = 1 //1s 134 item.num = internal.valueString[5] 135 } 136 } 137 138 onValueChanged: { 139 // update all 6 digits in one signal handler 140 internal.valueString = TimerPlasmoid.Timer.secondsToString(value, "hhmmss") 141 if (hour1.item === null) return 142 hour1.item.num = internal.valueString[0] 143 hour2.item.num = internal.valueString[1] 144 minute1.item.num = internal.valueString[2] 145 minute2.item.num = internal.valueString[3] 146 second1.item.num = internal.valueString[4] 147 second2.item.num = internal.valueString[5] 148 } 149} 150 151