/* * 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.9 import org.asteroid.controls 1.0 import org.nemomobile.configuration 1.0 Application { id: app centerColor: "#b01c7e" outerColor: "#420a2f" ConfigurationValue { id: previousTime key: "/stopwatch/previousTime" defaultValue: -1 } ConfigurationValue { id: elapsed key: "/stopwatch/elapsed" defaultValue: -1 } ConfigurationValue { id: running key: "/stopwatch/running" defaultValue: false } 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: running.value ? "running" : elapsed.value == -1 ? "zero" : "paused" states: [ State { name: "zero" }, State { name: "running" }, State { name: "paused" } ] Label { id: elapsedLabel textFormat: Text.RichText anchors.centerIn: parent text: toTimeString(elapsed.value) font.pixelSize: Dims.h(25) 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": var curTime = new Date previousTime.value = curTime.getTime() running.value = true break; case "running": running.value = false break; } } } IconButton { id: resetButton iconName: "ios-refresh" visible: mainPage.state === "paused" edge: Qt.TopEdge onClicked: elapsed.value = -1 } } Timer { interval: 100 repeat: true running: mainPage.state == "running" triggeredOnStart: true onTriggered: { var currentTime = new Date var delta = (currentTime.getTime() - previousTime.value) previousTime.value = currentTime.getTime() elapsed.value += delta } } }