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