Initial commit.
commit
cf0bfa7fe2
|
@ -0,0 +1,2 @@
|
||||||
|
/cmake-build-debug/
|
||||||
|
/.idea/
|
|
@ -0,0 +1,20 @@
|
||||||
|
cmake_minimum_required(VERSION 3.17)
|
||||||
|
project(Timer)
|
||||||
|
|
||||||
|
set(CMAKE_CXX_STANDARD 14)
|
||||||
|
|
||||||
|
# Find includes in the build directories
|
||||||
|
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||||
|
|
||||||
|
# Turn on automatic invocation of the MOC, UIC & RCC
|
||||||
|
set(CMAKE_AUTOMOC ON)
|
||||||
|
set(CMAKE_AUTOUIC ON)
|
||||||
|
set(CMAKE_AUTORCC ON)
|
||||||
|
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
|
||||||
|
|
||||||
|
find_package(Qt5 REQUIRED COMPONENTS Widgets)
|
||||||
|
|
||||||
|
add_executable(Timer src/main.cpp src/MainWindow.cpp src/MainWindow.h src/TimerThread.cpp src/TimerThread.h src/Structs.h src/config.h)
|
||||||
|
|
||||||
|
target_link_libraries(Timer Qt5::Widgets)
|
|
@ -0,0 +1,75 @@
|
||||||
|
//
|
||||||
|
// Created by kalle on 10/30/20.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <QtWidgets/QVBoxLayout>
|
||||||
|
#include <QtWidgets/QLabel>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <iostream>
|
||||||
|
#include <QtCore/QCoreApplication>
|
||||||
|
#include "MainWindow.h"
|
||||||
|
#include "TimerThread.h"
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
MainWindow::MainWindow() {
|
||||||
|
centralWidget = new QWidget();
|
||||||
|
layout = new QVBoxLayout();
|
||||||
|
label = new QLabel();
|
||||||
|
|
||||||
|
labelStyle = new QString("font: 40pt; color: %1;");
|
||||||
|
labelString = new QString("%1:%2:%3");
|
||||||
|
|
||||||
|
label->setStyleSheet(labelStyle->arg(PAUSED_COLOR));
|
||||||
|
|
||||||
|
layout->addWidget(label);
|
||||||
|
|
||||||
|
this->setWindowFlag(Qt::FramelessWindowHint, true);
|
||||||
|
this->setAttribute(Qt::WA_TranslucentBackground);
|
||||||
|
|
||||||
|
centralWidget->setLayout(layout);
|
||||||
|
|
||||||
|
this->setCentralWidget(centralWidget);
|
||||||
|
|
||||||
|
this->timerThread = new TimerThread(QCoreApplication::arguments().at(1).toInt(),
|
||||||
|
QCoreApplication::arguments().at(2).toInt(),
|
||||||
|
QCoreApplication::arguments().at(3).toInt());
|
||||||
|
|
||||||
|
connect(timerThread, &TimerThread::timeUpdated, this, &MainWindow::onTimeUpdated);
|
||||||
|
connect(timerThread, &TimerThread::changeColor, this, &MainWindow::onChangeColor);
|
||||||
|
connect(this, &MainWindow::pauseTimer, timerThread, &TimerThread::onPauseChanged);
|
||||||
|
connect(this, &MainWindow::resetTimer, timerThread, &TimerThread::onReset);
|
||||||
|
|
||||||
|
timerThread->start();
|
||||||
|
}
|
||||||
|
|
||||||
|
MainWindow::~MainWindow() {
|
||||||
|
this->close();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_actionExit_triggered() {
|
||||||
|
this->close();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onTimeUpdated(TimeData timeData) {
|
||||||
|
this->label->setText(QString::fromStdString(padStringLeft(std::to_string(timeData.hours), 2) + ":" + padStringLeft(std::to_string(timeData.minutes), 2) + ":" + padStringLeft(std::to_string(timeData.seconds), 2)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onChangeColor(char* color) {
|
||||||
|
this->label->setStyleSheet(labelStyle->arg(color));
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::mousePressEvent(QMouseEvent *event) {
|
||||||
|
if (event->button() == Qt::LeftButton) {
|
||||||
|
emit pauseTimer();
|
||||||
|
event->accept();
|
||||||
|
} else if (event->button() == Qt::RightButton){
|
||||||
|
emit resetTimer();
|
||||||
|
event->accept();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string MainWindow::padStringLeft(const std::string& string, int amount) {
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << std::setfill('0') << std::setw (amount) << string;
|
||||||
|
return ss.str();
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
//
|
||||||
|
// Created by kalle on 10/30/20.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef TIMER_MAINWINDOW_H
|
||||||
|
#define TIMER_MAINWINDOW_H
|
||||||
|
|
||||||
|
|
||||||
|
#include <QtWidgets/QMainWindow>
|
||||||
|
#include <QtWidgets/QVBoxLayout>
|
||||||
|
#include <QtWidgets/QLabel>
|
||||||
|
#include <QMouseEvent>
|
||||||
|
#include "TimerThread.h"
|
||||||
|
|
||||||
|
class MainWindow : public QMainWindow {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit MainWindow();
|
||||||
|
~MainWindow() override;
|
||||||
|
void mousePressEvent(QMouseEvent *event);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QWidget *centralWidget;
|
||||||
|
QVBoxLayout *layout;
|
||||||
|
QLabel *label;
|
||||||
|
TimerThread *timerThread;
|
||||||
|
QString *labelStyle;
|
||||||
|
QString *labelString;
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void on_actionExit_triggered();
|
||||||
|
void onTimeUpdated(TimeData);
|
||||||
|
void onChangeColor(char*);
|
||||||
|
static std::string padStringLeft(const std::string&, int);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void pauseTimer();
|
||||||
|
void resetTimer();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif //TIMER_MAINWINDOW_H
|
|
@ -0,0 +1,14 @@
|
||||||
|
//
|
||||||
|
// Created by kalle on 11/15/20.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef TIMER_STRUCTS_H
|
||||||
|
#define TIMER_STRUCTS_H
|
||||||
|
|
||||||
|
struct TimeData {
|
||||||
|
int seconds;
|
||||||
|
int minutes;
|
||||||
|
int hours;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //TIMER_STRUCTS_H
|
|
@ -0,0 +1,75 @@
|
||||||
|
//
|
||||||
|
// Created by kalle on 11/15/20.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "TimerThread.h"
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
TimerThread::TimerThread(int hours, int minutes, int seconds) {
|
||||||
|
initialTimeData.seconds = seconds;
|
||||||
|
initialTimeData.minutes = minutes;
|
||||||
|
initialTimeData.hours = hours;
|
||||||
|
|
||||||
|
timeDate.seconds = seconds;
|
||||||
|
timeDate.minutes = minutes;
|
||||||
|
timeDate.hours = hours;
|
||||||
|
|
||||||
|
paused = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TimerThread::onPauseChanged() {
|
||||||
|
paused = !paused;
|
||||||
|
if (paused)
|
||||||
|
emit changeColor(PAUSED_COLOR);
|
||||||
|
else
|
||||||
|
emit changeColor(RUNNING_COLOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TimerThread::onReset() {
|
||||||
|
paused = true;
|
||||||
|
emit changeColor(PAUSED_COLOR);
|
||||||
|
|
||||||
|
timeDate.seconds = initialTimeData.seconds;
|
||||||
|
timeDate.minutes = initialTimeData.minutes;
|
||||||
|
timeDate.hours = initialTimeData.hours;
|
||||||
|
emit timeUpdated(timeDate);
|
||||||
|
}
|
||||||
|
|
||||||
|
[[noreturn]] void TimerThread::run() {
|
||||||
|
while (true) {
|
||||||
|
emit timeUpdated(timeDate);
|
||||||
|
|
||||||
|
sleep(1);
|
||||||
|
|
||||||
|
if (paused)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (timeDate.seconds != 0) {
|
||||||
|
timeDate.seconds--;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
timeDate.seconds = 59;
|
||||||
|
|
||||||
|
if (timeDate.minutes != 0) {
|
||||||
|
timeDate.minutes--;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
timeDate.minutes = 59;
|
||||||
|
|
||||||
|
if (timeDate.hours != 0) {
|
||||||
|
timeDate.hours--;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
paused = true;
|
||||||
|
timeDate.seconds = 0;
|
||||||
|
timeDate.minutes = 0;
|
||||||
|
timeDate.hours = 0;
|
||||||
|
|
||||||
|
emit changeColor(DONE_COLOR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
//
|
||||||
|
// Created by kalle on 11/15/20.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef TIMER_TIMERTHREAD_H
|
||||||
|
#define TIMER_TIMERTHREAD_H
|
||||||
|
|
||||||
|
|
||||||
|
#include <QtCore/QThread>
|
||||||
|
#include "Structs.h"
|
||||||
|
|
||||||
|
class TimerThread : public QThread {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit TimerThread(int hours, int minutes, int seconds);
|
||||||
|
[[noreturn]] void run() override;
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void onPauseChanged();
|
||||||
|
void onReset();
|
||||||
|
|
||||||
|
private:
|
||||||
|
TimeData initialTimeData{};
|
||||||
|
TimeData timeDate{};
|
||||||
|
bool paused;
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void timeUpdated(TimeData);
|
||||||
|
void changeColor(char*);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif //TIMER_TIMERTHREAD_H
|
|
@ -0,0 +1,12 @@
|
||||||
|
//
|
||||||
|
// Created by kalle on 10/30/20.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef TIMER_CONFIG_H
|
||||||
|
#define TIMER_CONFIG_H
|
||||||
|
|
||||||
|
#define PAUSED_COLOR "#B30000"
|
||||||
|
#define RUNNING_COLOR "#AAAAAA"
|
||||||
|
#define DONE_COLOR "#40FF00"
|
||||||
|
|
||||||
|
#endif //TIMER_CONFIG_H
|
|
@ -0,0 +1,20 @@
|
||||||
|
#include <QtWidgets/QApplication>
|
||||||
|
#include <iostream>
|
||||||
|
#include "MainWindow.h"
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
if (argc != 4) {
|
||||||
|
std::cout << "Usage: Timer <hours> <minutes> <seconds>" << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
qRegisterMetaType<TimeData>("TimeData");
|
||||||
|
|
||||||
|
QApplication app(argc, argv);
|
||||||
|
MainWindow window;
|
||||||
|
window.show();
|
||||||
|
|
||||||
|
return app.exec();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue