diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/CMakeLists.txt | 8 | ||||
-rw-r--r-- | src/main.cpp | 23 | ||||
-rw-r--r-- | src/main.qml | 134 | ||||
-rw-r--r-- | src/resources.qrc | 5 |
4 files changed, 170 insertions, 0 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..446b4c9 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,8 @@ +add_library(asteroid-stopwatch main.cpp resources.qrc) +set_target_properties(asteroid-stopwatch PROPERTIES PREFIX "" SUFFIX "") + +target_link_libraries(asteroid-stopwatch PUBLIC + AsteroidApp) + +install(TARGETS asteroid-stopwatch + DESTINATION ${CMAKE_INSTALL_BINDIR}) diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..a44544c --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2017 - Florent Revest <revestflo@gmail.com> + * + * 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 <http://www.gnu.org/licenses/>. + */ + +#include <asteroidapp.h> + +int main(int argc, char *argv[]) +{ + return AsteroidApp::main(argc, argv); +} diff --git a/src/main.qml b/src/main.qml new file mode 100644 index 0000000..a0b6e4a --- /dev/null +++ b/src/main.qml @@ -0,0 +1,134 @@ +/* + * Copyright (C) 2016 Florent Revest <revestflo@gmail.com> + * 2015 Tim Süberkrüb <tim.sueberkrueb@web.de> + * 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 <http://www.gnu.org/licenses/>. + */ + +import QtQuick 2.9 +import org.asteroid.controls 1.0 +import Nemo.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 '<font color=\"#FFFFFF\" size="3">' + Math.floor(mod / 3600000) + '<sup>h</sup>' + '<br></font>' + + '<font color=\"#CCCCF3\" size="1">' + zeroPad(Math.floor((mod % 3600000) / 60000)) + '<sup>m</sup>' + + zeroPad(Math.floor((mod % 60000) / 1000)) + '<sup>s</sup></font>' + + } else if (mod >= 60000) { // Minutes + Seconds + Tenth + return '<font color="#FFFFFF" size="3">' + zeroPad(Math.floor((mod % 3600000) / 60000)) + '<sup>m</sup>' + '<br></font>' + + '<font color="#CCCCF3" size="1">' + zeroPad(Math.floor((mod % 60000) / 1000)) + '<sup>s</sup>' + + Math.floor((mod % 1000) / 100) + '</font>' + } else { // Seconds + Tenth + return '<font color="#FFFFFF" size="3">' + zeroPad(Math.floor((mod % 60000) / 1000)) + '<sup>s</sup>' + '</font>' + + '<font color="#CCCCF3" size="1">' + Math.floor((mod % 1000) / 100) + '</font>' + } + } + + 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" + 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 + } + } +} diff --git a/src/resources.qrc b/src/resources.qrc new file mode 100644 index 0000000..5f6483a --- /dev/null +++ b/src/resources.qrc @@ -0,0 +1,5 @@ +<RCC> + <qresource prefix="/"> + <file>main.qml</file> + </qresource> +</RCC> |