/* * Copyright (C) 2016 Florent Revest * 2015 Tim Süberkrüb * Part of this code is based on "Stopwatch" (https://github.com/baleboy/stopwatch) * Copyright (C) 2011 Francesco Balestrieri * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import QtQuick 2.5 import org.asteroid.controls 1.0 Application { id: app centerColor: "#b01c7e" outerColor: "#420a2f" property bool running property var previousTime property int elapsed: 0 function zeroPad(n) { return (n < 10 ? "0" : "") + n } function toTimeString(usec) { var mod = Math.abs(usec) if (mod >= 3600000) { // Hours + Minutes + Seconds return '' + Math.floor(mod / 3600000) + 'h' + '
' + '' + zeroPad(Math.floor((mod % 3600000) / 60000)) + 'm' + zeroPad(Math.floor((mod % 60000) / 1000)) + 's' } else if (mod >= 60000) { // Minutes + Seconds + Tenth return '' + zeroPad(Math.floor((mod % 3600000) / 60000)) + 'm' + '
' + '' + zeroPad(Math.floor((mod % 60000) / 1000)) + 's' + Math.floor((mod % 1000) / 100) + '' } else { // Seconds + Tenth return '' + zeroPad(Math.floor((mod % 60000) / 1000)) + 's' + '' + '' + Math.floor((mod % 1000) / 100) + '' } } Item { id: mainPage anchors.fill: parent state: "zero" states: [ State { name: "zero" }, State { name: "running" }, State { name: "paused" } ] Text { id: elapsedLabel textFormat: Text.RichText anchors.centerIn: parent text: toTimeString(elapsed) font.pixelSize: parent.height*0.25 color: "#FFFFFF" horizontalAlignment: Text.AlignHCenter SequentialAnimation { running: mainPage.state == "paused" loops: Animation.Infinite NumberAnimation { target: elapsedLabel; property: "opacity"; from: 1; to: 0; duration: 500 } NumberAnimation { target: elapsedLabel; property: "opacity"; from: 0; to: 1; duration: 500 } onStopped: elapsedLabel.opacity = 1 } } MouseArea { anchors.fill: parent onClicked: { switch (mainPage.state) { case "zero": case "paused": previousTime = new Date; stopwatch.start(); mainPage.state = "running"; break; case "running": mainPage.state = "paused"; stopwatch.stop(); break; } } } IconButton { id: resetButton iconColor: "white" pressedIconColor: "lightgrey" iconName: "ios-refresh" visible: mainPage.state === "paused" hovered: false anchors { horizontalCenter: parent.horizontalCenter topMargin: Units.dp(8) top: parent.top } onClicked: { elapsed = 0; mainPage.state = "zero" } } } Timer { id: stopwatch interval: 100 repeat: true running: false triggeredOnStart: true onTriggered: { var currentTime = new Date var delta = (currentTime.getTime() - previousTime.getTime()) previousTime = currentTime elapsed += delta } } }