From 9bb56fe1742f2c146a38f3ae50d784e519df1144 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lie=20Delhaie?= Date: Tue, 1 Mar 2022 21:08:34 +0100 Subject: [PATCH] Pointer + time delta --- Chronos.pro | 30 ++++++- Chronos.pro.user | 80 +++++++++---------- icon-1.png | Bin 0 -> 27293 bytes sources/aboutbox.cpp | 4 +- sources/aboutbox.h | 2 - sources/mainwindow.cpp | 135 +++++++++++++++++--------------- sources/mainwindow.h | 14 ++-- sources/models/breakpoint.cpp | 14 +++- sources/models/breakpoint.h | 3 +- sources/models/day.cpp | 62 +++++++++++---- sources/models/day.h | 11 ++- sources/models/week.cpp | 108 ++++++++++++++++++------- sources/models/week.h | 40 ++++++---- sources/models/year.cpp | 54 +++++++++---- sources/models/year.h | 15 ++-- sources/setdaydialog.cpp | 47 ++++++----- sources/setdaydialog.h | 10 +-- sources/weekoption.cpp | 27 +++++++ sources/weekoption.h | 30 +++++++ sources/weekoption.ui | 143 ++++++++++++++++++++++++++++++++++ sources/welcome.cpp | 32 ++++---- sources/welcome.h | 6 +- ui/mainwindow.ui | 48 +++++++++--- ui/setdaydialog.ui | 19 +---- 24 files changed, 652 insertions(+), 282 deletions(-) create mode 100644 icon-1.png create mode 100644 sources/weekoption.cpp create mode 100644 sources/weekoption.h create mode 100644 sources/weekoption.ui 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 0000000000000000000000000000000000000000..e69d51203178cbcfce61760c0eeee584164cd26c GIT binary patch literal 27293 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 L=&9$cS%>^DY$i7t literal 0 HcmV?d00001 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 - - - - +