diff --git a/Chronos.pro b/Chronos.pro index 49469ba..236f988 100644 --- a/Chronos.pro +++ b/Chronos.pro @@ -3,23 +3,30 @@ greaterThan(QT_MAJOR_VERSION, 5): QT += widgets CONFIG += c++17 +win32:VERSION = 2.2.0.0 # major.minor.patch.build +else:VERSION = 2.2.0 # major.minor.patch + +DEFINES += APP_VERSION=\"\\\"$${VERSION}\\\"\" + # remove possible other optimization flags win32 { message("Build for Windows") QMAKE_CXXFLAGS_RELEASE -= -O QMAKE_CXXFLAGS_RELEASE -= -O1 QMAKE_CXXFLAGS_RELEASE *= -O2 + DEFINES += APP_OS=\"\\\"Windows\\\"\" + DEFINES += APP_OS_VERSION=\"\\\"$$system(wmic os get version /value)\\\"\" equals(QMAKE_TARGET.arch, arm64) { message("CPU Architecture : aarch64") - # Add specific arm stuff here + DEFINES += APP_ARCH=\"\\\"arm64\\\"\" } equals(QMAKE_TARGET.arch, x86_64) { message("CPU Architecture : x64") QMAKE_CXXFLAGS_RELEASE += -favor:INTEL64 + DEFINES += APP_ARCH=\"\\\"x64\\\"\" } RC_ICONS = icon.ico - VERSION = 2.0.0.0 - QMAKE_TARGET_COMPANY = "Aurélie Delhaie" + QMAKE_TARGET_COMPANY = "Aurelie Delhaie" QMAKE_TARGET_PRODUCT = "Chronos" QMAKE_TARGET_DESCRIPTION = "Chronos" } @@ -32,11 +39,23 @@ macx { QMAKE_CXXFLAGS_RELEASE -= -O1 QMAKE_CXXFLAGS_RELEASE -= -O2 QMAKE_CXXFLAGS_RELEASE *= -O3 + DEFINES += APP_OS=\"\\\"macOS\\\"\" + DEFINES += APP_OS_VERSION=\"\\\"$$system(uname -r)\\\"\" equals(QMAKE_APPLE_DEVICE_ARCHS, arm64) { message("CPU Architecture : aarch64") + DEFINES += APP_ARCH=\"\\\"aarch64\\\"\" QMAKE_CXXFLAGS_RELEASE += -mcpu=apple-a14 } - VERSION = 2.0.0 +} + +linux-g++* { + message("Build for Linux") + DEFINES += APP_OS=\"\\\"$$system(cat /etc/issue | cut -d\' \' -f1)\\\"\" + DEFINES += APP_OS_VERSION=\"\\\"$$system(uname -r)\\\"\" + DEFINES += APP_ARCH=\"\\\"amd64\\\"\" + QMAKE_CXXFLAGS_RELEASE *= -O3 + QMAKE_CXXFLAGS_RELEASE += -march=skylake + VERSION = 1.1.0 } # add the desired -O3 if not present, MinGW only @@ -68,6 +87,7 @@ SOURCES += \ sources/setdaydialog.cpp \ sources/tools.cpp \ sources/models/week.cpp \ + sources/weekoption.cpp \ sources/welcome.cpp \ sources/models/year.cpp @@ -83,10 +103,12 @@ HEADERS += \ sources/setdaydialog.h \ sources/tools.h \ sources/models/week.h \ + sources/weekoption.h \ sources/welcome.h \ sources/models/year.h FORMS += \ + sources/weekoption.ui \ ui/configurationdialog.ui \ ui/breakdialog.ui \ ui/aboutbox.ui \ diff --git a/Chronos.pro.user b/Chronos.pro.user index 72b2744..c0c610c 100644 --- a/Chronos.pro.user +++ b/Chronos.pro.user @@ -1,14 +1,14 @@ - + EnvironmentId - {f1407b1e-b4d5-4aac-ba0d-b38072a0dfb8} + {dbe9fba1-e5a9-4d98-85bf-f46da0900eba} ProjectExplorer.Project.ActiveTarget - 0 + 0 ProjectExplorer.Project.EditorSettings @@ -28,7 +28,7 @@ QmlJSGlobal - 2 + 2 UTF-8 false 4 @@ -77,45 +77,40 @@ true true Builtin.DefaultTidyAndClazy - 4 + 8 true - - true - ProjectExplorer.Project.Target.0 Desktop - Qt 6.2.0 for macOS - Qt 6.2.0 for macOS - qt.qt6.620.clang_64_kit - 0 - 0 - 0 + Desktop Qt 6.2.3 GCC 64bit + Desktop Qt 6.2.3 GCC 64bit + qt.qt6.623.gcc_64_kit + 0 + 0 + 0 0 - /Volumes/Macintosh SSD/sources/Qt/build-Chronos-Qt_6_2_0_for_macOS-Debug - /Volumes/Macintosh SSD/sources/Qt/build-Chronos-Qt_6_2_0_for_macOS-Debug + /home/aurelie/src/build-Chronos-Desktop_Qt_6_2_3_GCC_64bit-Debug + /home/aurelie/src/build-Chronos-Desktop_Qt_6_2_3_GCC_64bit-Debug true QtProjectManager.QMakeBuildStep false - - arm-darwin-generic-mach_o-64bit - + true Qt4ProjectManager.MakeStep - 2 + 2 Build Build ProjectExplorer.BuildSteps.Build @@ -126,7 +121,7 @@ Qt4ProjectManager.MakeStep clean - 1 + 1 Clean Clean ProjectExplorer.BuildSteps.Clean @@ -134,28 +129,27 @@ 2 false + false Debug Qt4ProjectManager.Qt4BuildConfiguration 2 - /Volumes/Macintosh SSD/sources/Qt/build-Chronos-Qt_6_2_0_for_macOS-Release - /Volumes/Macintosh SSD/sources/Qt/build-Chronos-Qt_6_2_0_for_macOS-Release + /home/aurelie/src/build-Chronos-Desktop_Qt_6_2_3_GCC_64bit-Release + /home/aurelie/src/build-Chronos-Desktop_Qt_6_2_3_GCC_64bit-Release true QtProjectManager.QMakeBuildStep - true - - arm-darwin-generic-mach_o-64bit - + false + true Qt4ProjectManager.MakeStep - 2 + 2 Build Build ProjectExplorer.BuildSteps.Build @@ -166,7 +160,7 @@ Qt4ProjectManager.MakeStep clean - 1 + 1 Clean Clean ProjectExplorer.BuildSteps.Clean @@ -174,6 +168,7 @@ 2 false + false Release Qt4ProjectManager.Qt4BuildConfiguration @@ -182,20 +177,20 @@ 0 - /Volumes/Macintosh SSD/sources/Qt/build-Chronos-Qt_6_2_0_for_macOS-Profile - /Volumes/Macintosh SSD/sources/Qt/build-Chronos-Qt_6_2_0_for_macOS-Profile + /home/aurelie/src/build-Chronos-Desktop_Qt_6_2_3_GCC_64bit-Profile + /home/aurelie/src/build-Chronos-Desktop_Qt_6_2_3_GCC_64bit-Profile true QtProjectManager.QMakeBuildStep - true + false true Qt4ProjectManager.MakeStep - 2 + 2 Build Build ProjectExplorer.BuildSteps.Build @@ -206,7 +201,7 @@ Qt4ProjectManager.MakeStep clean - 1 + 1 Clean Clean ProjectExplorer.BuildSteps.Clean @@ -214,6 +209,7 @@ 2 false + false Profile Qt4ProjectManager.Qt4BuildConfiguration @@ -221,10 +217,10 @@ 0 0 - 3 + 3 - 0 + 0 Deploy Deploy ProjectExplorer.BuildSteps.Deploy @@ -234,7 +230,7 @@ false ProjectExplorer.DefaultDeployConfiguration - 1 + 1 true true @@ -242,21 +238,21 @@ 2 - Qt4ProjectManager.Qt4RunConfiguration:/Volumes/Macintosh SSD/sources/Qt/Chronos/Chronos.pro - /Volumes/Macintosh SSD/sources/Qt/Chronos/Chronos.pro + Qt4ProjectManager.Qt4RunConfiguration:/home/aurelie/src/Chronos/Chronos.pro + /home/aurelie/src/Chronos/Chronos.pro false true true false true - /Volumes/Macintosh SSD/sources/Qt/build-Chronos-Qt_6_2_0_for_macOS-Debug/Chronos.app/Contents/MacOS + /home/aurelie/src/build-Chronos-Desktop_Qt_6_2_3_GCC_64bit-Debug - 1 + 1 ProjectExplorer.Project.TargetCount - 1 + 1 ProjectExplorer.Project.Updater.FileVersion diff --git a/icon-1.png b/icon-1.png new file mode 100644 index 0000000..e69d512 Binary files /dev/null and b/icon-1.png differ diff --git a/sources/aboutbox.cpp b/sources/aboutbox.cpp index fd62a7b..638caa0 100644 --- a/sources/aboutbox.cpp +++ b/sources/aboutbox.cpp @@ -11,8 +11,8 @@ AboutBox::AboutBox(QWidget *parent) : xmin = ui->frame->x(); ymax = ui->frame->x() + ui->frame->height(); ymin = ui->frame->y(); - ui->systemLabel->setText(QString("Built on %1 (%2-%3)").arg(QSysInfo::prettyProductName(), QSysInfo::kernelVersion(), QSysInfo::buildCpuArchitecture())); - ui->versionLabel->setText(QString("Version: %1").arg(VERSION)); + ui->systemLabel->setText(QString("Built on %1 %2 (%3)").arg(APP_OS, APP_OS_VERSION, APP_ARCH)); + ui->versionLabel->setText(QString("Version: %1").arg(APP_VERSION)); } AboutBox::~AboutBox() diff --git a/sources/aboutbox.h b/sources/aboutbox.h index c260e7c..4062f06 100644 --- a/sources/aboutbox.h +++ b/sources/aboutbox.h @@ -1,8 +1,6 @@ #ifndef ABOUTBOX_H #define ABOUTBOX_H -#define VERSION "2.1.0" - #include #include #include diff --git a/sources/mainwindow.cpp b/sources/mainwindow.cpp index f00634c..7e9df4f 100644 --- a/sources/mainwindow.cpp +++ b/sources/mainwindow.cpp @@ -11,6 +11,11 @@ MainWindow::MainWindow(QWidget *parent) MainWindow::~MainWindow() { + delete week_template; + foreach (Year *y, years) { + delete y; + } + years.clear(); delete ui; } @@ -35,6 +40,8 @@ void MainWindow::init() { objectId.insert(ui->fri_button->objectName(), Identifier::fri); connect(ui->aboutButton, &QPushButton::clicked, this, &MainWindow::open_about); connect(ui->template_settings_button, &QPushButton::clicked, this, &MainWindow::edit_template); + connect(ui->today_button, &QPushButton::clicked, this, &MainWindow::set_date_to_now); + connect(ui->week_options_button, &QPushButton::clicked, this, &MainWindow::set_week_options); connect(ui->dateEdit, &QDateEdit::dateTimeChanged, this, &MainWindow::compute_week_number); connect(ui->mon_button, &QPushButton::clicked, this, &MainWindow::edit); connect(ui->tue_button, &QPushButton::clicked, this, &MainWindow::edit); @@ -48,9 +55,9 @@ void MainWindow::init() { if (QFile::exists(get_save_file_path())) { open_save(); } else { + week_template = new Week(); Welcome w(week_template); w.exec(); - week_template = w.get_result(); saveLoaded = true; } if (saveLoaded) { @@ -65,7 +72,8 @@ void MainWindow::highlightDayOfWeek() { ui->wedLabel->setText("Mercredi"); ui->thuLabel->setText("Jeudi"); ui->friLabel->setText("Vendredi"); - if (todayWeekNumber == current_week.getWeekNumber()) { + if (todayWeekNumber == current_week->getWeekNumber()) { + ui->today_button->setDisabled(true); switch (dayOfWeek) { case 1: { ui->monLabel->setText(QString("> %1 <").arg(ui->monLabel->text())); @@ -89,6 +97,8 @@ void MainWindow::highlightDayOfWeek() { } default: break; } + } else { + ui->today_button->setDisabled(false); } } @@ -112,8 +122,8 @@ void MainWindow::open_save() { week_template = Week::from_json(obj[KEY_TEMPLATE].toObject()); QJsonArray arr = obj[KEY_YEARS].toArray(); foreach (QJsonValue val, arr) { - Year y = Year::from_json(val.toObject()); - years[y.getNumber()] = y; + Year *y = Year::from_json(val.toObject()); + years[y->getNumber()] = y; } saveLoaded = true; } @@ -126,11 +136,11 @@ void MainWindow::panic_dialog(QString text) { void MainWindow::save_to_file() { QJsonArray arr; - foreach (Year y, years) { - arr.append(y.to_json()); + foreach (Year *y, years) { + arr.append(y->to_json()); } QJsonObject obj { - {KEY_TEMPLATE, week_template.to_json()}, + {KEY_TEMPLATE, week_template->to_json()}, {KEY_YEARS, arr}, {KEY_SAVE_FILE_VERSION, SAVE_FILE_VERSION} }; @@ -150,19 +160,18 @@ void MainWindow::compute_week_number(const QDateTime &dt) { if (years.contains(y)) { current_year = years[y]; } else { - Year nYear(y); + Year *nYear = new Year(y); years[y] = nYear; current_year = nYear; save_to_file(); } - if (current_year.getWeeks().contains(n)) { - auto weeks = current_year.getWeeks(); - current_week = weeks[n]; + if (current_year->hasWeek(n)) { + current_week = current_year->getWeek(n); } else { - current_week = Week(week_template); - current_week.setWeekNumber(n); - current_year.addWeek(current_week); + current_week = new Week(week_template); + current_week->setWeekNumber(n); + current_year->addWeek(current_week); save_to_file(); } compute_time(); @@ -170,12 +179,12 @@ void MainWindow::compute_week_number(const QDateTime &dt) { } void MainWindow::compute_time() { - ui->mon_time_label->setText(Tools::double_to_string_time(current_week.getMon().get_total())); - ui->tue_time_label->setText(Tools::double_to_string_time(current_week.getTue().get_total())); - ui->wed_time_label->setText(Tools::double_to_string_time(current_week.getWed().get_total())); - ui->thu_time_label->setText(Tools::double_to_string_time(current_week.getThu().get_total())); - ui->fri_time_label->setText(Tools::double_to_string_time(current_week.getFri().get_total())); - ui->total_time_label->setText(Tools::double_to_string_time(current_week.total())); + ui->mon_time_label->setText(Tools::double_to_string_time(current_week->getMon()->get_total())); + ui->tue_time_label->setText(Tools::double_to_string_time(current_week->getTue()->get_total())); + ui->wed_time_label->setText(Tools::double_to_string_time(current_week->getWed()->get_total())); + ui->thu_time_label->setText(Tools::double_to_string_time(current_week->getThu()->get_total())); + ui->fri_time_label->setText(Tools::double_to_string_time(current_week->getFri()->get_total())); + ui->total_time_label->setText(Tools::double_to_string_time(current_week->total())); updateStartLabel(); updateBreakLabel(); updateEndLabel(); @@ -184,10 +193,12 @@ void MainWindow::compute_time() { double late = 0.0; double overtime = 0.0; int todayWeekNumber = QDate::currentDate().weekNumber(); - foreach (Week w, current_year.getWeeks()) { - if (w.getWeekNumber() <= todayWeekNumber) { - late += (week_template.total() - w.total()); - overtime += (w.total() - week_template.total()); + QMapIterator i = current_year->iterator(); + while (i.hasNext()) { + Week *w = i.next().value(); + if (w->getWeekNumber() <= todayWeekNumber) { + late += (week_template->total() - w->total()) - w->getTimeDeltaInHours(); + overtime += (w->total() - week_template->total()) + w->getTimeDeltaInHours(); } } ui->late_time_label->setText(Tools::double_to_string_time((late > 0.0) ? late : 0.0)); @@ -195,72 +206,64 @@ void MainWindow::compute_time() { } void MainWindow::updateValidIcon() { - ui->mondayValidate->setVisible(current_week.getMon().get_validate()); - ui->tuesdayValidate->setVisible(current_week.getTue().get_validate()); - ui->wednesdayValidate->setVisible(current_week.getWed().get_validate()); - ui->thurdayValidate->setVisible(current_week.getThu().get_validate()); - ui->fridayValidate->setVisible(current_week.getFri().get_validate()); + ui->mondayValidate->setVisible(current_week->getMon()->get_validate()); + ui->tuesdayValidate->setVisible(current_week->getTue()->get_validate()); + ui->wednesdayValidate->setVisible(current_week->getWed()->get_validate()); + ui->thurdayValidate->setVisible(current_week->getThu()->get_validate()); + ui->fridayValidate->setVisible(current_week->getFri()->get_validate()); } void MainWindow::updateStartLabel() { - ui->monStartLabel->setText(current_week.getMon().get_start().toString("HH:mm")); - ui->tueStartLabel->setText(current_week.getTue().get_start().toString("HH:mm")); - ui->wedStartLabel->setText(current_week.getWed().get_start().toString("HH:mm")); - ui->thuStartLabel->setText(current_week.getThu().get_start().toString("HH:mm")); - ui->friStartLabel->setText(current_week.getFri().get_start().toString("HH:mm")); + ui->monStartLabel->setText(current_week->getMon()->get_start().toString("HH:mm")); + ui->tueStartLabel->setText(current_week->getTue()->get_start().toString("HH:mm")); + ui->wedStartLabel->setText(current_week->getWed()->get_start().toString("HH:mm")); + ui->thuStartLabel->setText(current_week->getThu()->get_start().toString("HH:mm")); + ui->friStartLabel->setText(current_week->getFri()->get_start().toString("HH:mm")); } void MainWindow::updateBreakLabel() { - ui->monBreakLabel->setText(QString("%1 min.").arg(current_week.getMon().get_time_break())); - ui->tueBreakLabel->setText(QString("%1 min.").arg(current_week.getTue().get_time_break())); - ui->wedBreakLabel->setText(QString("%1 min.").arg(current_week.getWed().get_time_break())); - ui->thuBreakLabel->setText(QString("%1 min.").arg(current_week.getThu().get_time_break())); - ui->friBreakLabel->setText(QString("%1 min.").arg(current_week.getFri().get_time_break())); + ui->monBreakLabel->setText(QString("%1 min.").arg(current_week->getMon()->get_time_break())); + ui->tueBreakLabel->setText(QString("%1 min.").arg(current_week->getTue()->get_time_break())); + ui->wedBreakLabel->setText(QString("%1 min.").arg(current_week->getWed()->get_time_break())); + ui->thuBreakLabel->setText(QString("%1 min.").arg(current_week->getThu()->get_time_break())); + ui->friBreakLabel->setText(QString("%1 min.").arg(current_week->getFri()->get_time_break())); } void MainWindow::updateEndLabel() { - ui->monEndLabel->setText(current_week.getMon().get_end().toString("HH:mm")); - ui->tueEndLabel->setText(current_week.getTue().get_end().toString("HH:mm")); - ui->wedEndLabel->setText(current_week.getWed().get_end().toString("HH:mm")); - ui->thuEndLabel->setText(current_week.getThu().get_end().toString("HH:mm")); - ui->friEndLabel->setText(current_week.getFri().get_end().toString("HH:mm")); + ui->monEndLabel->setText(current_week->getMon()->get_end().toString("HH:mm")); + ui->tueEndLabel->setText(current_week->getTue()->get_end().toString("HH:mm")); + ui->wedEndLabel->setText(current_week->getWed()->get_end().toString("HH:mm")); + ui->thuEndLabel->setText(current_week->getThu()->get_end().toString("HH:mm")); + ui->friEndLabel->setText(current_week->getFri()->get_end().toString("HH:mm")); } void MainWindow::edit() { QString name = QObject::sender()->objectName(); switch (get_identifier(name)) { case mon: - current_week.setMon(modify_value(current_week.getMon())); + modify_value(current_week->getMon()); break; case tue: - current_week.setTue(modify_value(current_week.getTue())); + modify_value(current_week->getTue()); break; case wed: - current_week.setWed(modify_value(current_week.getWed())); + modify_value(current_week->getWed()); break; case thu: - current_week.setThu(modify_value(current_week.getThu())); + modify_value(current_week->getThu()); break; case fri: - current_week.setFri(modify_value(current_week.getFri())); + modify_value(current_week->getFri()); break; } - auto weeks = current_year.getWeeks(); - weeks[current_week.getWeekNumber()] = current_week; - current_year.setWeeks(weeks); - years[current_year.getNumber()] = current_year; save_to_file(); compute_time(); } -Day MainWindow::modify_value(Day d) { - bool isNotValidable = (current_week.getWeekNumber() > todayWeekNumber); +void MainWindow::modify_value(Day *d) { + bool isNotValidable = (current_week->getWeekNumber() > todayWeekNumber); SetDayDialog sdd(d, isNotValidable, this); - int result = sdd.exec(); - if (result == QDialog::Accepted) { - return sdd.get_result(); - } - return d; + sdd.exec(); } Identifier MainWindow::get_identifier(QString objectName) { @@ -271,7 +274,6 @@ void MainWindow::edit_template() { Welcome w(week_template); int res = w.exec(); if (res == QDialog::Accepted) { - week_template = w.get_result(); save_to_file(); compute_time(); } @@ -281,3 +283,14 @@ void MainWindow::open_about() { AboutBox a(this); a.exec(); } + +void MainWindow::set_week_options() +{ + WeekOption ow(current_week, this); + int result = ow.exec(); + if (result == QDialog::Accepted) { + current_week->setTimeDelta(ow.get_time_delta()); + save_to_file(); + compute_time(); + } +} diff --git a/sources/mainwindow.h b/sources/mainwindow.h index c65185d..feab318 100644 --- a/sources/mainwindow.h +++ b/sources/mainwindow.h @@ -27,6 +27,7 @@ #include "welcome.h" #include "tools.h" #include "aboutbox.h" +#include "weekoption.h" QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } @@ -59,23 +60,24 @@ private: QString get_save_file_path(); Identifier get_identifier(QString objectName); - Day modify_value(Day); + void modify_value(Day*); - Week week_template; - Week current_week; - Year current_year; - QMap years; + Week* week_template; + Week* current_week; + Year* current_year; + QMap years; QMap objectId; int todayWeekNumber; int dayOfWeek; bool saveLoaded; -public slots: +private slots: void compute_week_number(const QDateTime &dt); void compute_time(); void set_date_to_now(); void edit(); void edit_template(); void open_about(); + void set_week_options(); }; #endif // MAINWINDOW_H diff --git a/sources/models/breakpoint.cpp b/sources/models/breakpoint.cpp index e84a133..7d3ed97 100644 --- a/sources/models/breakpoint.cpp +++ b/sources/models/breakpoint.cpp @@ -5,6 +5,12 @@ BreakPoint::BreakPoint() } +BreakPoint::BreakPoint(BreakPoint *old) +{ + this->start = old->start; + this->end = old->end; +} + BreakPoint::BreakPoint(QTime start, QTime end) { this->start = start; @@ -45,12 +51,12 @@ QJsonObject BreakPoint::to_json() return obj; } -BreakPoint BreakPoint::from_json(QJsonObject obj) +BreakPoint* BreakPoint::from_json(QJsonObject obj) { - BreakPoint result; + BreakPoint *result = new BreakPoint(); - result.start = QTime::fromString(obj["start"].toString(), Qt::DateFormat::ISODate); - result.end = QTime::fromString(obj["end"].toString(), Qt::DateFormat::ISODate); + result->start = QTime::fromString(obj["start"].toString(), Qt::DateFormat::ISODate); + result->end = QTime::fromString(obj["end"].toString(), Qt::DateFormat::ISODate); return result; } diff --git a/sources/models/breakpoint.h b/sources/models/breakpoint.h index 942e879..c250024 100644 --- a/sources/models/breakpoint.h +++ b/sources/models/breakpoint.h @@ -13,6 +13,7 @@ private: public: BreakPoint(); + BreakPoint(BreakPoint*); BreakPoint(QTime, QTime); QTime getStart(); @@ -23,7 +24,7 @@ public: void setEnd(QTime); QJsonObject to_json(); - static BreakPoint from_json(QJsonObject); + static BreakPoint* from_json(QJsonObject); }; #endif // BREAKPOINT_H diff --git a/sources/models/day.cpp b/sources/models/day.cpp index e062b79..2a7f0ac 100644 --- a/sources/models/day.cpp +++ b/sources/models/day.cpp @@ -4,11 +4,29 @@ Day::Day() { start = QTime(9, 0, 0, 0); end = QTime(17, 15, 0, 0); - BreakPoint lunch(QTime(12, 0, 0, 0), QTime(12, 45, 0, 0)); + BreakPoint *lunch = new BreakPoint(QTime(12, 0, 0, 0), QTime(12, 45, 0, 0)); breaks.append(lunch); validate = false; } +Day::Day(Day *old) +{ + start = QTime(9, 0, 0, 0); + end = QTime(17, 15, 0, 0); + BreakPoint *lunch = new BreakPoint(QTime(12, 0, 0, 0), QTime(12, 45, 0, 0)); + breaks.append(lunch); + validate = false; + update(old); +} + +Day::~Day() +{ + foreach (BreakPoint *bp, breaks) { + delete bp; + } + breaks.clear(); +} + float Day::get_total() { int sec = start.secsTo(end); int minutes = sec / 60; @@ -30,7 +48,7 @@ void Day::set_validate(bool value) { validate = value; } -void Day::setBreaks(QVector breaks) +void Day::setBreaks(QVector breaks) { this->breaks = breaks; } @@ -45,7 +63,7 @@ QTime Day::get_end() return end; } -QVector Day::getBreaks() +QVector Day::getBreaks() { return breaks; } @@ -53,8 +71,8 @@ QVector Day::getBreaks() QJsonObject Day::to_json() { QJsonArray arr; - foreach (BreakPoint bp, breaks) { - arr.append(bp.to_json()); + foreach (BreakPoint *bp, breaks) { + arr.append(bp->to_json()); } QJsonObject obj{ {KEY_START, start.toString(Qt::DateFormat::ISODate)}, @@ -66,18 +84,18 @@ QJsonObject Day::to_json() return obj; } -Day Day::from_json(QJsonObject obj) +Day* Day::from_json(QJsonObject obj) { - Day result; + Day *result = new Day(); - result.start = QTime::fromString(obj[KEY_START].toString(), Qt::DateFormat::ISODate); - result.end = QTime::fromString(obj[KEY_END].toString(), Qt::DateFormat::ISODate); - result.validate = obj[KEY_VALIDATE].toBool(); + result->start = QTime::fromString(obj[KEY_START].toString(), Qt::DateFormat::ISODate); + result->end = QTime::fromString(obj[KEY_END].toString(), Qt::DateFormat::ISODate); + result->validate = obj[KEY_VALIDATE].toBool(); - result.breaks.clear(); + result->breaks.clear(); QJsonArray arr = obj[KEY_BREAKS].toArray(); foreach (QJsonValue val, arr) { - result.breaks.append(BreakPoint::from_json(val.toObject())); + result->breaks.append(BreakPoint::from_json(val.toObject())); } return result; @@ -90,8 +108,24 @@ bool Day::get_validate() { float Day::get_time_break() { float result = 0; - foreach (BreakPoint bp, breaks) { - result += bp.getDuration(); + foreach (BreakPoint* bp, breaks) { + result += bp->getDuration(); } return result; } + +void Day::update(Day *old) +{ + this->start = old->start; + this->end = old->end; + this->validate = old->validate; + + foreach (BreakPoint *bp, breaks) { + delete bp; + } + breaks.clear(); + + foreach (BreakPoint *bp, old->breaks) { + this->breaks.append(new BreakPoint(bp)); + } +} diff --git a/sources/models/day.h b/sources/models/day.h index dd66522..77719c0 100644 --- a/sources/models/day.h +++ b/sources/models/day.h @@ -19,27 +19,30 @@ class Day private: QTime start; QTime end; - QVector breaks; + QVector breaks; bool validate; public: Day(); + Day(Day*); + ~Day(); void set_start(QTime value); void set_end(QTime value); void set_validate(bool); - void setBreaks(QVector); + void setBreaks(QVector); QTime get_start(); QTime get_end(); - QVector getBreaks(); + QVector getBreaks(); bool get_validate(); float get_time_break(); + void update(Day *); QJsonObject to_json(); float get_total(); - static Day from_json(QJsonObject); + static Day* from_json(QJsonObject); }; #endif // DAY_H diff --git a/sources/models/week.cpp b/sources/models/week.cpp index 88e8de8..c2531ad 100644 --- a/sources/models/week.cpp +++ b/sources/models/week.cpp @@ -2,85 +2,135 @@ Week::Week() { - mon = Day(); - tue = Day(); - wed = Day(); - thu = Day(); - fri = Day(); + mon = new Day(); + tue = new Day(); + wed = new Day(); + thu = new Day(); + fri = new Day(); + time_delta = 0; week_number = 0; } -Week Week::from_json(QJsonObject obj) { - Week w; - w.mon = Day::from_json(obj[MONDAY].toObject()); - w.tue = Day::from_json(obj[TUESDAY].toObject()); - w.wed = Day::from_json(obj[WEDNESDAY].toObject()); - w.thu = Day::from_json(obj[THURDAY].toObject()); - w.fri = Day::from_json(obj[FRIDAY].toObject()); - w.week_number = obj[WEEK_NUMBER].toInt(); +Week::Week(Week *old) +{ + mon = new Day(); + tue = new Day(); + wed = new Day(); + thu = new Day(); + fri = new Day(); + time_delta = 0; + week_number = 0; + update(old); +} + +Week::~Week() +{ + delete mon; + delete tue; + delete wed; + delete thu; + delete fri; +} + +Week* Week::from_json(QJsonObject obj) { + Week *w = new Week(); + w->mon = Day::from_json(obj[MONDAY].toObject()); + w->tue = Day::from_json(obj[TUESDAY].toObject()); + w->wed = Day::from_json(obj[WEDNESDAY].toObject()); + w->thu = Day::from_json(obj[THURDAY].toObject()); + w->fri = Day::from_json(obj[FRIDAY].toObject()); + w->time_delta = obj[TIME_DELTA].toInt(0); + w->week_number = obj[WEEK_NUMBER].toInt(); return w; } QJsonObject Week::to_json() { QJsonObject obj { - {MONDAY, mon.to_json()}, - {TUESDAY, tue.to_json()}, - {WEDNESDAY, wed.to_json()}, - {THURDAY, thu.to_json()}, - {FRIDAY, fri.to_json()}, + {MONDAY, mon->to_json()}, + {TUESDAY, tue->to_json()}, + {WEDNESDAY, wed->to_json()}, + {THURDAY, thu->to_json()}, + {FRIDAY, fri->to_json()}, + {TIME_DELTA, time_delta}, {WEEK_NUMBER, week_number} }; return obj; } double Week::total() { - return mon.get_total() + tue.get_total() + wed.get_total() + thu.get_total() + fri.get_total(); + return mon->get_total() + tue->get_total() + wed->get_total() + thu->get_total() + fri->get_total(); } -Day Week::getMon() { +Day* Week::getMon() { return mon; } -Day Week::getTue() { +Day* Week::getTue() { return tue; } -Day Week::getWed() { +Day* Week::getWed() { return wed; } -Day Week::getThu() { +Day* Week::getThu() { return thu; } -Day Week::getFri() { +Day* Week::getFri() { return fri; } +void Week::update(Week *old) +{ + mon = new Day(old->mon); + tue = new Day(old->tue); + wed = new Day(old->wed); + thu = new Day(old->thu); + fri = new Day(old->fri); + time_delta = old->time_delta; + week_number = old->week_number; +} + int Week::getWeekNumber() { return week_number; } -void Week::setMon(Day value) { +int Week::getTimeDelta() +{ + return time_delta; +} + +float Week::getTimeDeltaInHours() +{ + return time_delta/60.0; +} + +void Week::setMon(Day* value) { mon = value; } -void Week::setTue(Day value) { +void Week::setTue(Day* value) { tue = value; } -void Week::setWed(Day value) { +void Week::setWed(Day* value) { wed = value; } -void Week::setThu(Day value) { +void Week::setThu(Day* value) { thu = value; } -void Week::setFri(Day value) { +void Week::setFri(Day* value) { fri = value; } void Week::setWeekNumber(int value) { week_number = value; } + +void Week::setTimeDelta(int value) +{ + time_delta = value; +} diff --git a/sources/models/week.h b/sources/models/week.h index ae8d817..109b3b9 100644 --- a/sources/models/week.h +++ b/sources/models/week.h @@ -6,6 +6,7 @@ #define WEDNESDAY "wednesday" #define THURDAY "thurday" #define FRIDAY "friday" +#define TIME_DELTA "timeDelta" #define WEEK_NUMBER "weekNumber" #include @@ -15,31 +16,38 @@ class Week { public: Week(); + Week(Week*); + ~Week(); double total(); - void setMon(Day); - void setTue(Day); - void setWed(Day); - void setThu(Day); - void setFri(Day); + void setMon(Day*); + void setTue(Day*); + void setWed(Day*); + void setThu(Day*); + void setFri(Day*); void setWeekNumber(int); + void setTimeDelta(int); - Day getMon(); - Day getTue(); - Day getWed(); - Day getThu(); - Day getFri(); + Day* getMon(); + Day* getTue(); + Day* getWed(); + Day* getThu(); + Day* getFri(); + void update(Week *); int getWeekNumber(); + int getTimeDelta(); + float getTimeDeltaInHours(); - static Week from_json(QJsonObject); + static Week* from_json(QJsonObject); QJsonObject to_json(); private: - Day mon; - Day tue; - Day wed; - Day thu; - Day fri; + Day* mon; + Day* tue; + Day* wed; + Day* thu; + Day* fri; + int time_delta; int week_number; }; diff --git a/sources/models/year.cpp b/sources/models/year.cpp index 46264d2..85fb53e 100644 --- a/sources/models/year.cpp +++ b/sources/models/year.cpp @@ -5,19 +5,35 @@ Year::Year() } +Year::Year(Year *old) +{ + this->number = old->number; + foreach (int weekNumber, old->weeks.keys()) { + weeks[weekNumber] = new Week(old->weeks[weekNumber]); + } +} + +Year::~Year() +{ + foreach (Week *w, weeks) { + delete w; + } + weeks.clear(); +} + Year::Year(int number) { this->number = number; } -Year Year::from_json(QJsonObject obj) +Year* Year::from_json(QJsonObject obj) { - Year result; - result.number = obj[KEY_NUMBER].toInt(); + Year *result = new Year(); + result->number = obj[KEY_NUMBER].toInt(); QJsonArray arr = obj[KEY_WEEKS].toArray(); foreach (QJsonValue val, arr) { - Week w = Week::from_json(val.toObject()); - result.weeks[w.getWeekNumber()] = w; + Week* w = Week::from_json(val.toObject()); + result->weeks[w->getWeekNumber()] = w; } return result; } @@ -26,17 +42,28 @@ QJsonObject Year::to_json() { QJsonObject obj; QJsonArray arr; - foreach (Week w, weeks) { - arr.append(w.to_json()); + foreach (Week *w, weeks) { + arr.append(w->to_json()); } obj[KEY_NUMBER] = number; obj[KEY_WEEKS] = arr; return obj; } -QMap Year::getWeeks() +Week *Year::getWeek(int weekNumber) { - return weeks; + return weeks[weekNumber]; +} + +bool Year::hasWeek(int weekNumber) +{ + return weeks.contains(weekNumber); +} + +QMapIterator Year::iterator() +{ + QMapIterator i(weeks); + return i; } int Year::getNumber() @@ -44,12 +71,7 @@ int Year::getNumber() return number; } -void Year::addWeek(Week w) +void Year::addWeek(Week* w) { - weeks[w.getWeekNumber()] = w; -} - -void Year::setWeeks(QMap weeks) -{ - this->weeks = weeks; + weeks[w->getWeekNumber()] = w; } diff --git a/sources/models/year.h b/sources/models/year.h index ce65d94..b1e9bb0 100644 --- a/sources/models/year.h +++ b/sources/models/year.h @@ -6,6 +6,8 @@ #include #include +#include +#include #include "week.h" @@ -13,20 +15,23 @@ class Year { private: int number; - QMap weeks; + QMap weeks; public: Year(); + Year(Year*); + ~Year(); Year(int number); - static Year from_json(QJsonObject); + static Year* from_json(QJsonObject); QJsonObject to_json(); - QMap getWeeks(); + Week *getWeek(int); + bool hasWeek(int); + QMapIterator iterator(); int getNumber(); - void addWeek(Week w); - void setWeeks(QMap weeks); + void addWeek(Week* w); }; #endif // YEAR_H diff --git a/sources/setdaydialog.cpp b/sources/setdaydialog.cpp index 2f99b7a..ff06690 100644 --- a/sources/setdaydialog.cpp +++ b/sources/setdaydialog.cpp @@ -1,11 +1,12 @@ #include "setdaydialog.h" #include "ui_setdaydialog.h" -SetDayDialog::SetDayDialog(Day d, bool isNotValidable, QWidget *parent) : +SetDayDialog::SetDayDialog(Day *d, bool isNotValidable, QWidget *parent) : QDialog(parent), ui(new Ui::SetDayDialog) { ui->setupUi(this); + copy = new Day(d); ui->validateButton->setEnabled(!isNotValidable); ui->validateButton->setVisible(!isNotValidable); this->d = d; @@ -14,43 +15,47 @@ SetDayDialog::SetDayDialog(Day d, bool isNotValidable, QWidget *parent) : SetDayDialog::~SetDayDialog() { + delete copy; delete ui; } void SetDayDialog::init() { - ui->start_edit->setTime(d.get_start()); - ui->end_edit->setTime(d.get_end()); + ui->start_edit->setTime(copy->get_start()); + ui->end_edit->setTime(copy->get_end()); updateBreakList(); connect(ui->start_edit, &QTimeEdit::timeChanged, this, &SetDayDialog::compute_time); connect(ui->end_edit, &QTimeEdit::timeChanged, this, &SetDayDialog::compute_time); - connect(ui->validateButton, &QPushButton::clicked, this, &SetDayDialog::validate); + connect(ui->validateButton, &QPushButton::clicked, this, &SetDayDialog::validate_and_accept); + connect(ui->pushButton, &QPushButton::clicked, this, &SetDayDialog::accept); connect(ui->addBreakButton, &QPushButton::clicked, this, &SetDayDialog::add_break_point); connect(ui->removeBreakButton, &QPushButton::clicked, this, &SetDayDialog::remove_break_point); connect(ui->breakList, &QListWidget::currentRowChanged, this, &SetDayDialog::break_selected); - ui->total_label->setText(Tools::double_to_string_time(d.get_total())); + ui->total_label->setText(Tools::double_to_string_time(d->get_total())); } void SetDayDialog::updateBreakList() { ui->breakList->clear(); - foreach (BreakPoint bp, d.getBreaks()) { - ui->breakList->addItem(QString("%1 -> %2").arg(bp.getStart().toString("hh:mm"), bp.getEnd().toString("hh:mm"))); + foreach (BreakPoint *bp, copy->getBreaks()) { + ui->breakList->addItem(QString("%1 -> %2").arg(bp->getStart().toString("hh:mm"), bp->getEnd().toString("hh:mm"))); } } void SetDayDialog::compute_time() { - d.set_validate(false); - d.set_start(ui->start_edit->time()); - d.set_end(ui->end_edit->time()); - ui->total_label->setText(Tools::double_to_string_time(d.get_total())); + copy->set_validate(false); + copy->set_start(ui->start_edit->time()); + copy->set_end(ui->end_edit->time()); + ui->total_label->setText(Tools::double_to_string_time(copy->get_total())); } -Day SetDayDialog::get_result() { - return d; +void SetDayDialog::accept() +{ + d->update(copy); + QDialog::accept(); } -void SetDayDialog::validate() { - d.set_validate(true); +void SetDayDialog::validate_and_accept() { + d->set_validate(true); accept(); } @@ -60,9 +65,9 @@ void SetDayDialog::add_break_point() int result = bd.exec(); if (result == QDialog::Accepted) { BreakPoint bp = bd.get_result(); - auto breaks = d.getBreaks(); - breaks.append(bp); - d.setBreaks(breaks); + auto breaks = copy->getBreaks(); + breaks.append(new BreakPoint(bp)); + copy->setBreaks(breaks); updateBreakList(); compute_time(); } @@ -72,9 +77,11 @@ void SetDayDialog::remove_break_point() { int i = ui->breakList->currentRow(); if (i > -1) { - auto breaks = d.getBreaks(); + auto breaks = copy->getBreaks(); + BreakPoint *bp = breaks.at(i); breaks.removeAt(i); - d.setBreaks(breaks); + delete bp; + copy->setBreaks(breaks); updateBreakList(); compute_time(); } diff --git a/sources/setdaydialog.h b/sources/setdaydialog.h index 9fd29fb..4e003fc 100644 --- a/sources/setdaydialog.h +++ b/sources/setdaydialog.h @@ -18,14 +18,13 @@ class SetDayDialog : public QDialog Q_OBJECT public: - explicit SetDayDialog(Day d, bool isNotValidable, QWidget *parent = nullptr); + explicit SetDayDialog(Day *d, bool isNotValidable, QWidget *parent = nullptr); ~SetDayDialog(); - Day get_result(); - private slots: void compute_time(); - void validate(); + void validate_and_accept(); + void accept(); void add_break_point(); void remove_break_point(); void break_selected(int); @@ -33,7 +32,8 @@ private slots: private: Ui::SetDayDialog *ui; - Day d; + Day *copy; + Day *d; void init(); void updateBreakList(); diff --git a/sources/weekoption.cpp b/sources/weekoption.cpp new file mode 100644 index 0000000..6884e66 --- /dev/null +++ b/sources/weekoption.cpp @@ -0,0 +1,27 @@ +#include "weekoption.h" +#include "ui_weekoption.h" + +WeekOption::WeekOption(Week *w, QWidget *parent) : + QDialog(parent), + ui(new Ui::WeekOption) +{ + ui->setupUi(this); + this->time_delta = w->getTimeDelta(); + ui->time_delta_spinbox->setValue(time_delta); + connect(ui->time_delta_spinbox, &QSpinBox::valueChanged, this, &WeekOption::set_time_delta); +} + +WeekOption::~WeekOption() +{ + delete ui; +} + +int WeekOption::get_time_delta() +{ + return this->time_delta; +} + +void WeekOption::set_time_delta(int value) +{ + this->time_delta = value; +} diff --git a/sources/weekoption.h b/sources/weekoption.h new file mode 100644 index 0000000..ef88da2 --- /dev/null +++ b/sources/weekoption.h @@ -0,0 +1,30 @@ +#ifndef WEEKOPTION_H +#define WEEKOPTION_H + +#include + +#include "models/week.h" + +namespace Ui { +class WeekOption; +} + +class WeekOption : public QDialog +{ + Q_OBJECT + +public: + explicit WeekOption(Week *w, QWidget *parent = nullptr); + ~WeekOption(); + int get_time_delta(); + +private slots: + void set_time_delta(int); + +private: + Ui::WeekOption *ui; + + int time_delta; +}; + +#endif // WEEKOPTION_H diff --git a/sources/weekoption.ui b/sources/weekoption.ui new file mode 100644 index 0000000..f8c9743 --- /dev/null +++ b/sources/weekoption.ui @@ -0,0 +1,143 @@ + + + WeekOption + + + + 0 + 0 + 372 + 159 + + + + + 372 + 159 + + + + + 372 + 159 + + + + Options + + + + + 280 + 40 + 81 + 27 + + + + min + + + -1000 + + + 1000 + + + + + + 10 + 10 + 101 + 18 + + + + + true + + + + Réalignement + + + + + + 10 + 44 + 131 + 18 + + + + Delta (en minutes) + + + + + + 270 + 120 + 88 + 26 + + + + Valider + + + + + + 142 + 55 + 131 + 16 + + + + 0 + + + 1 + + + Qt::Horizontal + + + + + + 120 + 16 + 241 + 16 + + + + Qt::Horizontal + + + + + + + validate_button + clicked() + WeekOption + accept() + + + 313 + 132 + + + 185 + 79 + + + + + diff --git a/sources/welcome.cpp b/sources/welcome.cpp index 05ff99f..566bc19 100644 --- a/sources/welcome.cpp +++ b/sources/welcome.cpp @@ -1,7 +1,7 @@ #include "welcome.h" #include "ui_welcome.h" -Welcome::Welcome(Week wtemplate, QWidget *parent) : +Welcome::Welcome(Week *wtemplate, QWidget *parent) : QDialog(parent), ui(new Ui::Welcome) { @@ -34,43 +34,39 @@ Week Welcome::get_result() { } void Welcome::set_value_to_widget() { - ui->mon_time_label->setText(Tools::double_to_string_time(w.getMon().get_total())); - ui->tue_time_label->setText(Tools::double_to_string_time(w.getTue().get_total())); - ui->wed_time_label->setText(Tools::double_to_string_time(w.getWed().get_total())); - ui->thu_time_label->setText(Tools::double_to_string_time(w.getThu().get_total())); - ui->fri_time_label->setText(Tools::double_to_string_time(w.getFri().get_total())); - ui->total->setText(Tools::double_to_string_time(w.total())); + ui->mon_time_label->setText(Tools::double_to_string_time(w->getMon()->get_total())); + ui->tue_time_label->setText(Tools::double_to_string_time(w->getTue()->get_total())); + ui->wed_time_label->setText(Tools::double_to_string_time(w->getWed()->get_total())); + ui->thu_time_label->setText(Tools::double_to_string_time(w->getThu()->get_total())); + ui->fri_time_label->setText(Tools::double_to_string_time(w->getFri()->get_total())); + ui->total->setText(Tools::double_to_string_time(w->total())); } void Welcome::edit() { QString name = QObject::sender()->objectName(); switch (get_identifier(name)) { case mon: - w.setMon(modify_value(w.getMon())); + modify_value(w->getMon()); break; case tue: - w.setTue(modify_value(w.getTue())); + modify_value(w->getTue()); break; case wed: - w.setWed(modify_value(w.getWed())); + modify_value(w->getWed()); break; case thu: - w.setThu(modify_value(w.getThu())); + modify_value(w->getThu()); break; case fri: - w.setFri(modify_value(w.getFri())); + modify_value(w->getFri()); break; } set_value_to_widget(); } -Day Welcome::modify_value(Day d) { +void Welcome::modify_value(Day *d) { SetDayDialog sdd(d, true, this); - int result = sdd.exec(); - if (result == QDialog::Accepted) { - return sdd.get_result(); - } - return d; + sdd.exec(); } Identifier Welcome::get_identifier(QString objectName) { diff --git a/sources/welcome.h b/sources/welcome.h index b7a9c02..344c306 100644 --- a/sources/welcome.h +++ b/sources/welcome.h @@ -28,7 +28,7 @@ class Welcome : public QDialog Q_OBJECT public: - explicit Welcome(Week tpl, QWidget *parent = nullptr); + explicit Welcome(Week *tpl, QWidget *parent = nullptr); ~Welcome(); Week get_result(); @@ -36,13 +36,13 @@ public: private: Ui::Welcome *ui; - Week w; + Week *w; QMap objectId; void init(); void set_value_to_widget(); Identifier get_identifier(QString objectName); - Day modify_value(Day); + void modify_value(Day*); public slots: void edit(); diff --git a/ui/mainwindow.ui b/ui/mainwindow.ui index 2c1671a..93d7875 100644 --- a/ui/mainwindow.ui +++ b/ui/mainwindow.ui @@ -41,7 +41,7 @@ - 190 + 230 9 20 81 @@ -54,9 +54,9 @@ - 209 + 249 19 - 151 + 155 62 @@ -94,7 +94,7 @@ font-size: 14px; - Retard + Retard (Total) @@ -118,7 +118,7 @@ color: white; 13 19 - 161 + 210 62 @@ -156,7 +156,7 @@ color: white; font-size: 14px; - Temps total + Temps total (Semaine) @@ -178,7 +178,7 @@ color: white; - 400 + 440 20 161 62 @@ -218,7 +218,7 @@ color: white; font-size: 14px; - Avance + Avance (Total) @@ -240,7 +240,7 @@ color: white; - 380 + 420 10 20 81 @@ -1570,10 +1570,10 @@ font-size: 22px; - 790 - 20 + 800 + 10 111 - 60 + 90 @@ -1633,6 +1633,16 @@ font-size: 22px; + + + + false + + + Aujourd'hui + + + @@ -1648,6 +1658,19 @@ font-size: 22px; Qt::Horizontal + + + + 570 + 530 + 91 + 31 + + + + Options + + layoutWidget line layoutWidget @@ -1658,6 +1681,7 @@ font-size: 22px; layoutWidget aboutButton line_27 + week_options_button diff --git a/ui/setdaydialog.ui b/ui/setdaydialog.ui index 5292c8e..63132bd 100644 --- a/ui/setdaydialog.ui +++ b/ui/setdaydialog.ui @@ -316,22 +316,5 @@ color: rgb(255, 255, 255); - - - pushButton - clicked() - SetDayDialog - accept() - - - 357 - 151 - - - 209 - 88 - - - - +