21 Commits

Author SHA1 Message Date
Aurélie
8e11f3e210 Update Chronos.pro 2022-10-16 19:39:03 +02:00
Aurélie
9721350fb0 Create find_dependencies_linux.sh 2022-10-16 18:26:57 +02:00
Aurélie
689689f243 Update README.md 2022-10-16 18:25:48 +02:00
Aurélie Delhaie
fd4b766c4d Add support of leaves 2022-10-16 17:36:47 +02:00
Aurélie Delhaie
6a44c4afd9 Starting working on non working days 2022-10-16 14:49:10 +02:00
Aurélie Delhaie
63d1ca329f Move warning icon, move week number, add emoji 2022-10-13 21:41:07 +02:00
Aurélie Delhaie
1753a34957 Remove old qt config 2022-09-28 21:14:56 +02:00
Aurélie Delhaie
a6593a0151 Refresh GUI 2022-09-28 21:14:10 +02:00
Aurélie Delhaie
877fde22e0 License 2022-08-01 22:31:11 +02:00
Aurélie Delhaie
92d0c14df7 Week late and overtime 2022-04-09 20:01:10 +02:00
Aurélie Delhaie
deb49909d1 Fix 'approuve' button, add warning when break is not between day start and day end 2022-04-09 13:59:48 +02:00
Aurélie Delhaie
9bb56fe174 Pointer + time delta 2022-03-01 21:08:34 +01:00
Aurélie Delhaie
ffebb3c7d7 starting cloud save 2022-01-09 21:21:18 +01:00
Aurélie Delhaie
c49966b47c Windows icon on macOS 2021-10-25 23:32:14 +02:00
Aurélie Delhaie
e628ef9e94 Update Optimisation for Windows + Add Qt to AboutBox 2021-10-25 22:59:03 +02:00
Aurélie Delhaie
2b95b41257 update qmake file 2021-10-19 22:45:05 +02:00
Aurélie Delhaie
b07b7b69eb Version 2 // Add detailled breaks 2021-10-18 22:46:59 +02:00
Alexis Delhaie
102f720d29 fix 17h010 2020-11-04 20:11:16 +01:00
Alexis Delhaie
08dcecbee9 New interface theme, new icon 2020-10-02 21:29:14 +02:00
Alexis Delhaie
4308d9e93a Call to save updater, confirm final input of a day 2020-09-24 10:53:33 +02:00
Alexis Delhaie
257bc67f61 Main window frameless + Switching to MSVC2019 2020-08-28 14:47:21 +02:00
60 changed files with 4130 additions and 2088 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
*.pro.*

View File

@@ -1,18 +1,66 @@
QT += core gui QT += core gui
greaterThan(QT_MAJOR_VERSION, 5): QT += widgets
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++17 CONFIG += c++17
win32:VERSION = 2.3.0.0 # major.minor.patch.build
else:VERSION = 2.3.0 # major.minor.patch
DEFINES += APP_VERSION=\"\\\"$${VERSION}\\\"\"
# remove possible other optimization flags # remove possible other optimization flags
QMAKE_CXXFLAGS_RELEASE -= -O win32 {
QMAKE_CXXFLAGS_RELEASE -= -O1 message("Build for Windows")
QMAKE_CXXFLAGS_RELEASE -= -O2 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")
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
QMAKE_TARGET_COMPANY = "Aurelie Delhaie"
QMAKE_TARGET_PRODUCT = "Chronos"
QMAKE_TARGET_DESCRIPTION = "Chronos"
}
# add the desired -O3 if not present macx {
QMAKE_CXXFLAGS_RELEASE *= -O3 message("Build for macOS")
ICON = icon.icns
QMAKE_INFO_PLIST = Info.plist
QMAKE_CXXFLAGS_RELEASE -= -O
QMAKE_CXXFLAGS_RELEASE -= -O1
QMAKE_CXXFLAGS_RELEASE -= -O2
QMAKE_CXXFLAGS_RELEASE *= -O3
QMAKE_APPLE_DEVICE_ARCHS = x86_64 arm64
DEFINES += APP_OS=\"\\\"macOS\\\"\"
DEFINES += APP_OS_VERSION=\"\\\"$$system(uname -r)\\\"\"
DEFINES += APP_ARCH=\"\\\"universal\\\"\"
}
RC_ICONS = icon.ico linux-* {
message("Build for Linux")
DEFINES += APP_OS=\"\\\"$$system(cat /etc/issue | cut -d\' \' -f1)\\\"\"
DEFINES += APP_OS_VERSION=\"\\\"$$system(uname -r)\\\"\"
DEFINES += APP_ARCH=\"\\\"$$system(uname -m)\\\"\"
ARCH = $$system(uname -m)
equals(ARCH, aarch64) {
message("CPU Architecture : aarch64")
QMAKE_CXXFLAGS_RELEASE += -mtune=cortex-a72
}
equals(ARCH, amd64) {
message("CPU Architecture : amd64")
QMAKE_CXXFLAGS_RELEASE += -march=skylake
}
QMAKE_CXXFLAGS_RELEASE *= -O3
}
# The following define makes your compiler emit warnings if you use # The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings # any Qt feature that has been marked deprecated (the exact warnings
@@ -26,25 +74,42 @@ DEFINES += QT_DEPRECATED_WARNINGS
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \ SOURCES += \
sources/configurationmanager.cpp \
sources/configurationdialog.cpp \
sources/aboutbox.cpp \ sources/aboutbox.cpp \
sources/day.cpp \ sources/breakdialog.cpp \
sources/models/breakpoint.cpp \
sources/models/day.cpp \
sources/main.cpp \ sources/main.cpp \
sources/mainwindow.cpp \ sources/mainwindow.cpp \
sources/models/settings.cpp \
sources/setdaydialog.cpp \ sources/setdaydialog.cpp \
sources/tools.cpp \ sources/tools.cpp \
sources/week.cpp \ sources/models/week.cpp \
sources/welcome.cpp sources/weekoption.cpp \
sources/welcome.cpp \
sources/models/year.cpp
HEADERS += \ HEADERS += \
sources/configurationmanager.h \
sources/configurationdialog.h \
sources/aboutbox.h \ sources/aboutbox.h \
sources/day.h \ sources/breakdialog.h \
sources/models/breakpoint.h \
sources/models/day.h \
sources/mainwindow.h \ sources/mainwindow.h \
sources/models/settings.h \
sources/setdaydialog.h \ sources/setdaydialog.h \
sources/tools.h \ sources/tools.h \
sources/week.h \ sources/models/week.h \
sources/welcome.h sources/weekoption.h \
sources/welcome.h \
sources/models/year.h
FORMS += \ FORMS += \
ui/weekoption.ui \
ui/configurationdialog.ui \
ui/breakdialog.ui \
ui/aboutbox.ui \ ui/aboutbox.ui \
ui/mainwindow.ui \ ui/mainwindow.ui \
ui/setdaydialog.ui \ ui/setdaydialog.ui \

View File

@@ -1,340 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.12.4, 2020-08-10T22:47:23. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
<value type="QByteArray">{39b4df9e-fc10-428a-bc34-924198bd0973}</value>
</data>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="int">0</value>
</data>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
<valuemap type="QVariantMap">
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
<value type="QString" key="language">Cpp</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
</valuemap>
</valuemap>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
<value type="QString" key="language">QmlJS</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
</valuemap>
</valuemap>
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value>
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
<value type="int" key="EditorConfiguration.TabSize">8</value>
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.PluginSettings</variable>
<valuemap type="QVariantMap">
<valuelist type="QVariantList" key="ClangCodeModel.CustomCommandLineKey">
<value type="QString">-fno-delayed-template-parsing</value>
</valuelist>
<value type="bool" key="ClangCodeModel.UseGlobalConfig">true</value>
<value type="QString" key="ClangCodeModel.WarningConfigId">Builtin.Questionable</value>
<valuemap type="QVariantMap" key="ClangTools">
<value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
<value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value>
<value type="int" key="ClangTools.ParallelJobs">4</value>
<valuelist type="QVariantList" key="ClangTools.SelectedDirs"/>
<valuelist type="QVariantList" key="ClangTools.SelectedFiles"/>
<valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/>
<value type="bool" key="ClangTools.UseGlobalSettings">true</value>
</valuemap>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.15.0 MinGW 64-bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.15.0 MinGW 64-bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.5150.win64_mingw81_kit</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">1</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="bool">true</value>
<value type="int" key="EnableQmlDebugging">0</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:\Users\robof\OneDrive\Documents\build-Chronos-Desktop_Qt_5_15_0_MinGW_64_bit-Debug</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">C:/Users/robof/OneDrive/Documents/build-Chronos-Desktop_Qt_5_15_0_MinGW_64_bit-Debug</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
<value type="int" key="QtQuickCompiler">2</value>
<value type="int" key="SeparateDebugInfo">2</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
<value type="bool">true</value>
<value type="int" key="EnableQmlDebugging">2</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:\Users\robof\OneDrive\Documents\build-Chronos-Desktop_Qt_5_15_0_MinGW_64_bit-Release</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">C:/Users/robof/OneDrive/Documents/build-Chronos-Desktop_Qt_5_15_0_MinGW_64_bit-Release</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
<value type="int" key="QtQuickCompiler">0</value>
<value type="int" key="SeparateDebugInfo">2</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
<value type="bool">true</value>
<value type="int" key="EnableQmlDebugging">0</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:\Users\robof\OneDrive\Documents\build-Chronos-Desktop_Qt_5_15_0_MinGW_64_bit-Profile</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">C:/Users/robof/OneDrive/Documents/build-Chronos-Desktop_Qt_5_15_0_MinGW_64_bit-Profile</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
<value type="int" key="QtQuickCompiler">0</value>
<value type="int" key="SeparateDebugInfo">0</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
<valuelist type="QVariantList" key="Analyzer.Perf.Events">
<value type="QString">cpu-cycles</value>
</valuelist>
<valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/>
<value type="int" key="Analyzer.Perf.Frequency">250</value>
<valuelist type="QVariantList" key="Analyzer.Perf.RecordArguments">
<value type="QString">-e</value>
<value type="QString">cpu-cycles</value>
<value type="QString">--call-graph</value>
<value type="QString">dwarf,4096</value>
<value type="QString">-F</value>
<value type="QString">250</value>
</valuelist>
<value type="QString" key="Analyzer.Perf.SampleMode">-F</value>
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
<value type="int" key="Analyzer.Perf.StackSize">4096</value>
<value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
<value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
<value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
<value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
<value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value>
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
<value type="int">0</value>
<value type="int">1</value>
<value type="int">2</value>
<value type="int">3</value>
<value type="int">4</value>
<value type="int">5</value>
<value type="int">6</value>
<value type="int">7</value>
<value type="int">8</value>
<value type="int">9</value>
<value type="int">10</value>
<value type="int">11</value>
<value type="int">12</value>
<value type="int">13</value>
<value type="int">14</value>
</valuelist>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:C:/Users/robof/OneDrive/Documents/Chronos/Chronos.pro</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">C:/Users/robof/OneDrive/Documents/Chronos/Chronos.pro</value>
<value type="QString" key="RunConfiguration.Arguments"></value>
<value type="bool" key="RunConfiguration.Arguments.multi">false</value>
<value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
<value type="QString" key="RunConfiguration.WorkingDirectory"></value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">C:/Users/robof/OneDrive/Documents/build-Chronos-Desktop_Qt_5_15_0_MinGW_64_bit-Release</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.TargetCount</variable>
<value type="int">1</value>
</data>
<data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
<value type="int">22</value>
</data>
<data>
<variable>Version</variable>
<value type="int">22</value>
</data>
</qtcreator>

24
Info.plist Normal file
View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key>
<string>Chronos</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>com.aureliedelhaie.Chronos</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>LSMinimumSystemVersion</key>
<string>10.14</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>NSSupportsAutomaticGraphicsSwitching</key>
<true/>
<key>CFBundleIconFile</key>
<string>icon.icns</string>
</dict>
</plist>

7
LICENSE Normal file
View File

@@ -0,0 +1,7 @@
Copyright 2022 Aurélie Delhaie
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@@ -1 +1,10 @@
# Chronos # Chronos
## Install on Ubuntu
You need to install Qt 6 dependencies
```sh
sudo apt install libqt6widgets6 libqt6gui6 libqt6core5compat6 libqt6core5compat6 libqt6core6 libqt6dbus6
```
then download binary from the release section

View File

@@ -0,0 +1 @@
ldd $1 | awk '{print $1}' | sed 's/\..*//' | while read n; do apt-cache search ^$n | grep libqt6 | cut -f 1 -d '-' >> deps.txt; done

BIN
icon-1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
icon.icns Normal file

Binary file not shown.

BIN
icon.ico

Binary file not shown.

Before

Width:  |  Height:  |  Size: 131 KiB

After

Width:  |  Height:  |  Size: 125 KiB

View File

@@ -1,9 +1,9 @@
<RCC> <RCC>
<qresource prefix="/clock"> <qresource prefix="/clock">
<file>pictures/clock-8-128.png</file>
<file>pictures/sport.png</file>
<file>pictures/calendar.png</file>
<file>pictures/about.png</file> <file>pictures/about.png</file>
<file>pictures/banner.png</file> <file>pictures/banner.png</file>
<file>pictures/validate.png</file>
<file>pictures/warning.png</file>
<file>pictures/leave.png</file>
</qresource> </qresource>
</RCC> </RCC>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

BIN
pictures/leave.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

BIN
pictures/validate.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
pictures/warning.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

BIN
sources/.DS_Store vendored Normal file

Binary file not shown.

View File

@@ -6,9 +6,36 @@ AboutBox::AboutBox(QWidget *parent) :
ui(new Ui::AboutBox) ui(new Ui::AboutBox)
{ {
ui->setupUi(this); ui->setupUi(this);
this->setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint);
xmax = ui->frame->x() + ui->frame->width();
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(APP_OS, APP_OS_VERSION, APP_ARCH));
ui->versionLabel->setText(QString("Version: %1").arg(APP_VERSION));
} }
AboutBox::~AboutBox() AboutBox::~AboutBox()
{ {
delete ui; delete ui;
} }
void AboutBox::mousePressEvent(QMouseEvent *event) {
m_nMouseClick_X_Coordinate = event->position().rx();
m_nMouseClick_Y_Coordinate = event->position().ry();
}
void AboutBox::mouseMoveEvent(QMouseEvent *event) {
if (isWidgetIsTitleBar()) {
move(event->globalPosition().rx() - m_nMouseClick_X_Coordinate ,
event->globalPosition().ry() - m_nMouseClick_Y_Coordinate);
}
}
bool AboutBox::isWidgetIsTitleBar() {
return (m_nMouseClick_X_Coordinate >= xmin &&
m_nMouseClick_X_Coordinate < xmax &&
m_nMouseClick_Y_Coordinate >= ymin &&
m_nMouseClick_Y_Coordinate < ymax);
}

View File

@@ -2,7 +2,9 @@
#define ABOUTBOX_H #define ABOUTBOX_H
#include <QDialog> #include <QDialog>
#include <QMouseEvent>
#include <iostream> #include <iostream>
#include <QSysInfo>
namespace Ui { namespace Ui {
class AboutBox; class AboutBox;
@@ -18,6 +20,16 @@ public:
private: private:
Ui::AboutBox *ui; Ui::AboutBox *ui;
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
int m_nMouseClick_X_Coordinate;
int m_nMouseClick_Y_Coordinate;
int xmax;
int xmin;
int ymax;
int ymin;
inline bool isWidgetIsTitleBar();
}; };
#endif // ABOUTBOX_H #endif // ABOUTBOX_H

32
sources/breakdialog.cpp Normal file
View File

@@ -0,0 +1,32 @@
#include "breakdialog.h"
#include "ui_breakdialog.h"
BreakDialog::BreakDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::BreakDialog)
{
ui->setupUi(this);
connect(ui->startTime, &QTimeEdit::timeChanged, this, &BreakDialog::compute);
connect(ui->endTime, &QTimeEdit::timeChanged, this, &BreakDialog::compute);
}
BreakDialog::~BreakDialog()
{
delete ui;
}
BreakPoint BreakDialog::get_result()
{
return bp;
}
void BreakDialog::compute()
{
if (ui->endTime->time() < ui->startTime->time()) {
ui->endTime->setTime(ui->startTime->time());
}
bp.setStart(ui->startTime->time());
bp.setEnd(ui->endTime->time());
float minutes = bp.getDuration();
ui->totalTime->setText(QString("%1 minutes").arg(QString::number(minutes, 'g', 2)));
}

29
sources/breakdialog.h Normal file
View File

@@ -0,0 +1,29 @@
#ifndef BREAKDIALOG_H
#define BREAKDIALOG_H
#include <QDialog>
#include "models/breakpoint.h"
namespace Ui {
class BreakDialog;
}
class BreakDialog : public QDialog
{
Q_OBJECT
public:
explicit BreakDialog(QWidget *parent = nullptr);
~BreakDialog();
BreakPoint get_result();
private slots:
void compute();
private:
Ui::BreakDialog *ui;
BreakPoint bp;
};
#endif // BREAKDIALOG_H

View File

@@ -0,0 +1,32 @@
#include "configurationdialog.h"
#include "ui_configurationdialog.h"
ConfigurationDialog::ConfigurationDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::ConfigurationDialog)
{
ui->setupUi(this);
RefreshField();
}
ConfigurationDialog::~ConfigurationDialog()
{
delete ui;
}
void ConfigurationDialog::RefreshField()
{
Settings* s = mng.GetConfiguration();
ui->cloud_url->setText(s->GetCloudUrl());
ui->cloud_Email->setText(s->GetCloudEmail());
ui->cloud_password->setText(s->GetCloudPassword());
ui->cloud_agent->setText(s->GetCloudAgent());
ui->cloud_enable->setCheckState(s->GetCloudEnabled() ? Qt::CheckState::Checked : Qt::CheckState::Unchecked);
bool cloudDisabled = !s->GetCloudEnabled();
ui->cloud_url->setDisabled(cloudDisabled);
ui->cloud_Email->setDisabled(cloudDisabled);
ui->cloud_password->setDisabled(cloudDisabled);
ui->cloud_agent->setDisabled(cloudDisabled);
}

View File

@@ -0,0 +1,28 @@
#ifndef CONFIGURATIONDIALOG_H
#define CONFIGURATIONDIALOG_H
#include <QDialog>
#include "configurationmanager.h"
namespace Ui {
class ConfigurationDialog;
}
class ConfigurationDialog : public QDialog
{
Q_OBJECT
public:
explicit ConfigurationDialog(QWidget *parent = nullptr);
~ConfigurationDialog();
private:
Ui::ConfigurationDialog *ui;
ConfigurationManager mng;
void RefreshField();
};
#endif // CONFIGURATIONDIALOG_H

View File

@@ -0,0 +1,51 @@
#include "configurationmanager.h"
ConfigurationManager::ConfigurationManager()
{
if (QFile::exists(GetPath())) {
QFile* file = new QFile(GetPath());
file->open(QIODevice::ReadOnly);
auto json = QString(file->readAll());
file->close();
delete file;
QJsonObject obj = QJsonDocument::fromJson(json.toUtf8()).object();
this->s = Settings::FromJSON(obj);
} else {
this->s = new Settings();
Save();
}
}
ConfigurationManager::~ConfigurationManager()
{
delete s;
}
Settings *ConfigurationManager::GetConfiguration()
{
return s;
}
QString ConfigurationManager::GetPath() {
QString path = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
if (!QDir(path).exists()) {
QDir().mkpath(path);
}
path += "/";
if (!QDir(path).exists()) {
QDir().mkpath(path);
}
path += FILENAME;
return path;
}
void ConfigurationManager::Save() {
QJsonDocument doc(s->ToJSON());
QFile *f = new QFile(GetPath());
if (f->open(QIODevice::WriteOnly)) {
f->write(doc.toJson());
f->close();
}
delete f;
}

View File

@@ -0,0 +1,27 @@
#ifndef CONFIGURATIONMANAGER_H
#define CONFIGURATIONMANAGER_H
#define FILENAME "settings.json"
#include <QString>
#include <QDir>
#include <QStandardPaths>
#include <QJsonObject>
#include <QJsonDocument>
#include "models/settings.h"
class ConfigurationManager
{
private:
Settings *s;
QString GetPath();
void Save();
public:
ConfigurationManager();
~ConfigurationManager();
Settings* GetConfiguration();
};
#endif // CONFIGURATIONMANAGER_H

View File

@@ -1,66 +0,0 @@
#include "day.h"
Day::Day()
{
start = QTime(9, 0, 0, 0);
end = QTime(17, 15, 0, 0);
time_break = 45.0;
}
double Day::get_total() {
int sec = start.secsTo(end);
int minutes = sec / 60;
return (minutes - time_break) / 60;
}
void Day::set_start(QTime value)
{
start = value;
}
void Day::set_end(QTime value)
{
end = value;
}
void Day::set_time_break(double value)
{
time_break = value;
}
QTime Day::get_start()
{
return start;
}
QTime Day::get_end()
{
return end;
}
double Day::get_time_break()
{
return time_break;
}
QJsonObject Day::to_json()
{
QJsonObject obj{
{KEY_START, start.toString(Qt::DateFormat::ISODate)},
{KEY_END, end.toString(Qt::DateFormat::ISODate)},
{KEY_BREAK, time_break}
};
return obj;
}
Day Day::from_json(QJsonObject obj)
{
Day result;
result.start = QTime::fromString(obj[KEY_START].toString(), Qt::DateFormat::ISODate);
result.end = QTime::fromString(obj[KEY_END].toString(), Qt::DateFormat::ISODate);
result.time_break = obj[KEY_BREAK].toDouble();
return result;
}

View File

@@ -1,37 +0,0 @@
#ifndef DAY_H
#define DAY_H
#define KEY_START "start"
#define KEY_END "end"
#define KEY_BREAK "break"
#include <QTime>
#include <QJsonObject>
#include <math.h>
class Day
{
private:
QTime start;
QTime end;
double time_break;
public:
Day();
void set_start(QTime value);
void set_end(QTime value);
void set_time_break(double value);
QTime get_start();
QTime get_end();
double get_time_break();
QJsonObject to_json();
double get_total();
static Day from_json(QJsonObject);
};
#endif // DAY_H

View File

@@ -11,6 +11,11 @@ MainWindow::MainWindow(QWidget *parent)
MainWindow::~MainWindow() MainWindow::~MainWindow()
{ {
delete week_template;
foreach (Year *y, years) {
delete y;
}
years.clear();
delete ui; delete ui;
} }
@@ -35,50 +40,65 @@ void MainWindow::init() {
objectId.insert(ui->fri_button->objectName(), Identifier::fri); objectId.insert(ui->fri_button->objectName(), Identifier::fri);
connect(ui->aboutButton, &QPushButton::clicked, this, &MainWindow::open_about); connect(ui->aboutButton, &QPushButton::clicked, this, &MainWindow::open_about);
connect(ui->template_settings_button, &QPushButton::clicked, this, &MainWindow::edit_template); 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->dateEdit, &QDateEdit::dateTimeChanged, this, &MainWindow::compute_week_number);
connect(ui->mon_button, &QPushButton::clicked, this, &MainWindow::edit); connect(ui->mon_button, &QPushButton::clicked, this, &MainWindow::edit);
connect(ui->tue_button, &QPushButton::clicked, this, &MainWindow::edit); connect(ui->tue_button, &QPushButton::clicked, this, &MainWindow::edit);
connect(ui->wed_button, &QPushButton::clicked, this, &MainWindow::edit); connect(ui->wed_button, &QPushButton::clicked, this, &MainWindow::edit);
connect(ui->thu_button, &QPushButton::clicked, this, &MainWindow::edit); connect(ui->thu_button, &QPushButton::clicked, this, &MainWindow::edit);
connect(ui->fri_button, &QPushButton::clicked, this, &MainWindow::edit); connect(ui->fri_button, &QPushButton::clicked, this, &MainWindow::edit);
todayWeekNumber = QDate::currentDate().weekNumber();
highlightDayOfWeek(); dayOfWeek = QDate::currentDate().dayOfWeek();
saveLoaded = false;
if (QFile::exists(get_save_file_path())) { if (QFile::exists(get_save_file_path())) {
open_save(); open_save();
} else { } else {
week_template = new Week();
Welcome w(week_template); Welcome w(week_template);
w.exec(); w.exec();
week_template = w.get_result(); saveLoaded = true;
}
if (saveLoaded) {
set_date_to_now();
compute_time();
} }
set_date_to_now();
compute_time();
} }
void MainWindow::highlightDayOfWeek() { void MainWindow::highlightDayOfWeek() {
int dayOfWeek = QDate::currentDate().dayOfWeek(); ui->monLabel->setText("Lundi");
switch (dayOfWeek) { ui->tueLabel->setText("Mardi");
case 1: { ui->wedLabel->setText("Mercredi");
ui->monLabel->setText(QString("> %1 <").arg(ui->monLabel->text())); ui->thuLabel->setText("Jeudi");
break; ui->friLabel->setText("Vendredi");
if (todayWeekNumber == current_week->getWeekNumber()) {
ui->today_button->setDisabled(true);
switch (dayOfWeek) {
case 1: {
ui->monLabel->setText(QString("%1 📆").arg(ui->monLabel->text()));
break;
}
case 2: {
ui->tueLabel->setText(QString("%1 📆").arg(ui->tueLabel->text()));
break;
}
case 3: {
ui->wedLabel->setText(QString("%1 📆").arg(ui->wedLabel->text()));
break;
}
case 4: {
ui->thuLabel->setText(QString("%1 📆").arg(ui->thuLabel->text()));
break;
}
case 5: {
ui->friLabel->setText(QString("%1 📆").arg(ui->friLabel->text()));
break;
}
default: break;
} }
case 2: { } else {
ui->tueLabel->setText(QString("> %1 <").arg(ui->tueLabel->text())); ui->today_button->setDisabled(false);
break;
}
case 3: {
ui->wedLabel->setText(QString("> %1 <").arg(ui->wedLabel->text()));
break;
}
case 4: {
ui->thuLabel->setText(QString("> %1 <").arg(ui->thuLabel->text()));
break;
}
case 5: {
ui->friLabel->setText(QString("> %1 <").arg(ui->friLabel->text()));
break;
}
default: break;
} }
} }
@@ -95,32 +115,33 @@ void MainWindow::open_save() {
delete file; delete file;
QJsonObject obj = QJsonDocument::fromJson(json.toUtf8()).object(); QJsonObject obj = QJsonDocument::fromJson(json.toUtf8()).object();
if (obj[KEY_SAVE_FILE_VERSION].toInt() == SAVE_FILE_VERSION) { if (obj[KEY_SAVE_FILE_VERSION] != SAVE_FILE_VERSION) {
week_template = Week::from_json(obj[KEY_TEMPLATE].toObject()); panic_dialog("Your save file version does not match the supported version."
QJsonArray arr = obj[KEY_WEEKS].toArray(); " Please update this file and restart the application");
for (QJsonValue val : arr) {
weeks[val.toObject()["weekNumber"].toInt()] = Week::from_json(val.toObject());
}
} else {
QMessageBox msgBox;
msgBox.setText("Le fichier de sauvegarde n'est pas à jour, "
"des changements ont été apporté a la structure du fichier lors de la dernière mise à jour");
msgBox.setInformativeText("Mettez à jour votre fichier de sauvegarde puis relancez l'application");
msgBox.setStandardButtons(QMessageBox::Ok);
msgBox.setDefaultButton(QMessageBox::Ok);
msgBox.exec();
QTimer::singleShot(0, this, &MainWindow::close);
} }
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;
}
saveLoaded = true;
}
void MainWindow::panic_dialog(QString text) {
QMessageBox::critical(this, tr("Chronos"), text,
QMessageBox::Ok, QMessageBox::Ok);
QTimer::singleShot(0, this, &MainWindow::close);
} }
void MainWindow::save_to_file() { void MainWindow::save_to_file() {
QJsonArray arr; QJsonArray arr;
for (Week w : weeks) { foreach (Year *y, years) {
arr.append(w.to_json()); arr.append(y->to_json());
} }
QJsonObject obj { QJsonObject obj {
{KEY_TEMPLATE, week_template.to_json()}, {KEY_TEMPLATE, week_template->to_json()},
{KEY_WEEKS, arr}, {KEY_YEARS, arr},
{KEY_SAVE_FILE_VERSION, SAVE_FILE_VERSION} {KEY_SAVE_FILE_VERSION, SAVE_FILE_VERSION}
}; };
QJsonDocument doc(obj); QJsonDocument doc(obj);
@@ -129,111 +150,129 @@ void MainWindow::save_to_file() {
f->write(doc.toJson()); f->write(doc.toJson());
f->close(); f->close();
} }
delete f;
} }
void MainWindow::compute_week_number(const QDateTime &dt) { void MainWindow::compute_week_number(const QDateTime &dt) {
int n = dt.date().weekNumber(); int n = dt.date().weekNumber();
int y = dt.date().year();
ui->label_semaine->setText(QString("Semaine : %1").arg(QString::number(n))); ui->label_semaine->setText(QString("Semaine : %1").arg(QString::number(n)));
QMapIterator<int, Week> it(weeks); if (years.contains(y)) {
bool working = true; current_year = years[y];
bool found = false; } else {
while (it.hasNext() && working) { Year *nYear = new Year(y);
Week w = it.next().value(); years[y] = nYear;
if (w.getWeekNumber() == n) { current_year = nYear;
current_week = w; save_to_file();
working = false;
found = true;
}
} }
if (!found) {
current_week = Week(week_template); if (current_year->hasWeek(n)) {
current_week.setWeekNumber(n); current_week = current_year->getWeek(n);
weeks.insert(n, current_week); } else {
current_week = new Week(week_template);
current_week->setWeekNumber(n);
current_year->addWeek(current_week);
save_to_file(); save_to_file();
} }
compute_time(); compute_time();
highlightDayOfWeek();
} }
void MainWindow::compute_time() { void MainWindow::compute_time() {
ui->mon_time_label->setText(Tools::double_to_string_time(current_week.getMon().get_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->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->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->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->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->total_time_label->setText(Tools::double_to_string_time(current_week->total()));
updateStartLabel(); updateLabels();
updateBreakLabel(); updateWeekTime();
updateEndLabel();
double late = 0.0; double late = 0.0;
double overtime = 0.0; double overtime = 0.0;
int todayWeekNumber = QDate::currentDate().weekNumber(); int todayWeekNumber = QDate::currentDate().weekNumber();
for (Week w : weeks) { QMapIterator i = current_year->iterator();
if (w.getWeekNumber() <= todayWeekNumber) { while (i.hasNext()) {
late += (week_template.total() - w.total()); Week *w = i.next().value();
overtime += (w.total() - week_template.total()); if (w->getWeekNumber() <= todayWeekNumber) {
late += (week_template->total() - w->total(week_template)) - w->getTimeDeltaInHours();
overtime += (w->total() - week_template->total(week_template)) + w->getTimeDeltaInHours();
} }
} }
late -= current_week->getTimeDeltaInHours();
overtime += - current_week->getTimeDeltaInHours();
ui->late_time_label->setText(Tools::double_to_string_time((late > 0.0) ? late : 0.0)); ui->late_time_label->setText(Tools::double_to_string_time((late > 0.0) ? late : 0.0));
ui->overtime_time_label->setText(Tools::double_to_string_time((overtime > 0.0) ? overtime : 0.0)); ui->overtime_time_label->setText(Tools::double_to_string_time((overtime > 0.0) ? overtime : 0.0));
} }
void MainWindow::updateStartLabel() { void MainWindow::updateWeekTime()
ui->monStartLabel->setText(current_week.getMon().get_start().toString("HH:mm")); {
ui->tueStartLabel->setText(current_week.getTue().get_start().toString("HH:mm")); double t = (current_week->total(week_template) + current_week->getTimeDeltaInHours()) - week_template->total();
ui->wedStartLabel->setText(current_week.getWed().get_start().toString("HH:mm")); if (t > 0) {
ui->thuStartLabel->setText(current_week.getThu().get_start().toString("HH:mm")); ui->overtime_time_label_week->setText(Tools::double_to_string_time(t));
ui->friStartLabel->setText(current_week.getFri().get_start().toString("HH:mm")); ui->late_time_label_week->setText("0h");
} else if(t < 0) {
ui->late_time_label_week->setText(Tools::double_to_string_time(-t));
ui->overtime_time_label_week->setText("0h");
} else {
ui->overtime_time_label_week->setText("0h");
ui->late_time_label_week->setText("0h");
}
} }
void MainWindow::updateBreakLabel() { void MainWindow::updateLabels() {
ui->monBreakLabel->setText(QString("%1 min.").arg(current_week.getMon().get_time_break())); updateDayLabels(ui->monStartLabel, ui->monEndLabel, ui->monBreakLabel, ui->mondayValidate, ui->mondayWarning, ui->mondayNotWorking, current_week->getMon());
ui->tueBreakLabel->setText(QString("%1 min.").arg(current_week.getTue().get_time_break())); updateDayLabels(ui->tueStartLabel, ui->tueEndLabel, ui->tueBreakLabel, ui->tuesdayValidate, ui->tuesdayWarning, ui->tuesdayNotWorking, current_week->getTue());
ui->wedBreakLabel->setText(QString("%1 min.").arg(current_week.getWed().get_time_break())); updateDayLabels(ui->wedStartLabel, ui->wedEndLabel, ui->wedBreakLabel, ui->wednesdayValidate, ui->wednesdayWarning, ui->wednesdayNotWorking, current_week->getWed());
ui->thuBreakLabel->setText(QString("%1 min.").arg(current_week.getThu().get_time_break())); updateDayLabels(ui->thuStartLabel, ui->thuEndLabel, ui->thuBreakLabel, ui->thurdayValidate, ui->thurdayWarning, ui->thurdayNotWorking, current_week->getThu());
ui->friBreakLabel->setText(QString("%1 min.").arg(current_week.getFri().get_time_break())); updateDayLabels(ui->friStartLabel, ui->friEndLabel, ui->friBreakLabel, ui->fridayValidate, ui->fridayWarning, ui->fridayNotWorking, current_week->getFri());
} }
void MainWindow::updateEndLabel() { void MainWindow::updateDayLabels(QLabel *start, QLabel *end, QLabel *breaks, QFrame *validate, QFrame *warning, QFrame *not_working, Day *d)
ui->monEndLabel->setText(current_week.getMon().get_end().toString("HH:mm")); {
ui->tueEndLabel->setText(current_week.getTue().get_end().toString("HH:mm")); not_working->setVisible(d->not_working());
ui->wedEndLabel->setText(current_week.getWed().get_end().toString("HH:mm")); if (!d->not_working()) {
ui->thuEndLabel->setText(current_week.getThu().get_end().toString("HH:mm")); start->setText(d->get_start().toString("HH:mm"));
ui->friEndLabel->setText(current_week.getFri().get_end().toString("HH:mm")); end->setText(d->get_end().toString("HH:mm"));
breaks->setText(QString("%1 min.").arg(d->get_time_break()));
validate->setVisible(d->get_validate());
warning->setVisible(d->has_warning());
} else {
start->setText("--:--");
end->setText("--:--");
breaks->setText("0 min.");
validate->setVisible(false);
warning->setVisible(false);
}
} }
void MainWindow::edit() { void MainWindow::edit() {
QString name = QObject::sender()->objectName(); QString name = QObject::sender()->objectName();
switch (get_identifier(name)) { switch (get_identifier(name)) {
case mon: case mon:
current_week.setMon(modify_value(current_week.getMon())); modify_value(current_week->getMon());
break; break;
case tue: case tue:
current_week.setTue(modify_value(current_week.getTue())); modify_value(current_week->getTue());
break; break;
case wed: case wed:
current_week.setWed(modify_value(current_week.getWed())); modify_value(current_week->getWed());
break; break;
case thu: case thu:
current_week.setThu(modify_value(current_week.getThu())); modify_value(current_week->getThu());
break; break;
case fri: case fri:
current_week.setFri(modify_value(current_week.getFri())); modify_value(current_week->getFri());
break; break;
} }
weeks[current_week.getWeekNumber()] = current_week;
save_to_file(); save_to_file();
compute_time(); compute_time();
} }
Day MainWindow::modify_value(Day d) { void MainWindow::modify_value(Day *d) {
SetDayDialog sdd(d, this); bool isNotValidable = (current_week->getWeekNumber() > todayWeekNumber);
int result = sdd.exec(); SetDayDialog sdd(d, isNotValidable, this);
if (result == QDialog::Accepted) { sdd.exec();
return sdd.get_result();
}
return d;
} }
Identifier MainWindow::get_identifier(QString objectName) { Identifier MainWindow::get_identifier(QString objectName) {
@@ -244,7 +283,6 @@ void MainWindow::edit_template() {
Welcome w(week_template); Welcome w(week_template);
int res = w.exec(); int res = w.exec();
if (res == QDialog::Accepted) { if (res == QDialog::Accepted) {
week_template = w.get_result();
save_to_file(); save_to_file();
compute_time(); compute_time();
} }
@@ -254,3 +292,14 @@ void MainWindow::open_about() {
AboutBox a(this); AboutBox a(this);
a.exec(); 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();
}
}

View File

@@ -2,11 +2,13 @@
#define MAINWINDOW_H #define MAINWINDOW_H
#define KEY_TEMPLATE "template" #define KEY_TEMPLATE "template"
#define KEY_WEEKS "weeks" #define KEY_YEARS "years"
#define SAVE_FILENAME "data.json" #define SAVE_FILENAME "data.json"
#define SAVE_FILE_VERSION 1 #define SAVE_FILE_VERSION 4
#define KEY_SAVE_FILE_VERSION "version" #define KEY_SAVE_FILE_VERSION "version"
#include <QMouseEvent>
#include <QGraphicsView>
#include <QJsonArray> #include <QJsonArray>
#include <QMainWindow> #include <QMainWindow>
#include <QDir> #include <QDir>
@@ -17,11 +19,14 @@
#include <QMapIterator> #include <QMapIterator>
#include <QMessageBox> #include <QMessageBox>
#include <QTimer> #include <QTimer>
#include <QProcess>
#include <QDir>
#include "week.h" #include "models/week.h"
#include "models/year.h"
#include "welcome.h" #include "welcome.h"
#include "tools.h"
#include "aboutbox.h" #include "aboutbox.h"
#include "weekoption.h"
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; } namespace Ui { class MainWindow; }
@@ -43,28 +48,34 @@ private:
void init(); void init();
void open_save(); void open_save();
void save_to_file(); void save_to_file();
void panic_dialog(QString text);
// UI Update // UI Update
void updateStartLabel(); void updateLabels();
void updateBreakLabel();
void updateEndLabel();
void highlightDayOfWeek(); void highlightDayOfWeek();
void updateWeekTime();
void updateDayLabels(QLabel *start, QLabel *end, QLabel *breaks, QFrame *validate, QFrame *warning, QFrame *not_working, Day *d);
QString get_save_file_path(); QString get_save_file_path();
Identifier get_identifier(QString objectName); Identifier get_identifier(QString objectName);
Day modify_value(Day); void modify_value(Day*);
Week week_template; Week* week_template;
Week current_week; Week* current_week;
QMap<int, Week> weeks; Year* current_year;
QMap<int, Year*> years;
QMap<QString, Identifier> objectId; QMap<QString, Identifier> objectId;
int todayWeekNumber;
int dayOfWeek;
bool saveLoaded;
public slots: private slots:
void compute_week_number(const QDateTime &dt); void compute_week_number(const QDateTime &dt);
void compute_time(); void compute_time();
void set_date_to_now(); void set_date_to_now();
void edit(); void edit();
void edit_template(); void edit_template();
void open_about(); void open_about();
void set_week_options();
}; };
#endif // MAINWINDOW_H #endif // MAINWINDOW_H

View File

@@ -0,0 +1,62 @@
#include "breakpoint.h"
BreakPoint::BreakPoint()
{
}
BreakPoint::BreakPoint(BreakPoint *old)
{
this->start = old->start;
this->end = old->end;
}
BreakPoint::BreakPoint(QTime start, QTime end)
{
this->start = start;
this->end = end;
}
QTime BreakPoint::getStart()
{
return start;
}
QTime BreakPoint::getEnd()
{
return end;
}
float BreakPoint::getDuration()
{
return start.secsTo(end) / 60;
}
void BreakPoint::setStart(QTime start)
{
this->start = start;
}
void BreakPoint::setEnd(QTime end)
{
this->end = end;
}
QJsonObject BreakPoint::to_json()
{
QJsonObject obj{
{"start", start.toString(Qt::DateFormat::ISODate)},
{"end", end.toString(Qt::DateFormat::ISODate)}
};
return obj;
}
BreakPoint* BreakPoint::from_json(QJsonObject obj)
{
BreakPoint *result = new BreakPoint();
result->start = QTime::fromString(obj["start"].toString(), Qt::DateFormat::ISODate);
result->end = QTime::fromString(obj["end"].toString(), Qt::DateFormat::ISODate);
return result;
}

View File

@@ -0,0 +1,30 @@
#ifndef BREAKPOINT_H
#define BREAKPOINT_H
#include <QTime>
#include <QJsonObject>
#include <cmath>
class BreakPoint
{
private:
QTime start;
QTime end;
public:
BreakPoint();
BreakPoint(BreakPoint*);
BreakPoint(QTime, QTime);
QTime getStart();
QTime getEnd();
float getDuration();
void setStart(QTime);
void setEnd(QTime);
QJsonObject to_json();
static BreakPoint* from_json(QJsonObject);
};
#endif // BREAKPOINT_H

163
sources/models/day.cpp Normal file
View File

@@ -0,0 +1,163 @@
#include "day.h"
Day::Day()
{
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;
notWorking = 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;
notWorking = false;
update(old);
}
Day::~Day()
{
foreach (BreakPoint *bp, breaks) {
delete bp;
}
breaks.clear();
}
float Day::get_total() {
if (notWorking) {
return 0.0;
}
int sec = start.secsTo(end);
int minutes = sec / 60;
float breakTime = get_time_break();
return (minutes - breakTime) / 60;
}
void Day::set_start(QTime value)
{
start = value;
}
void Day::set_end(QTime value)
{
end = value;
}
void Day::set_validate(bool value) {
validate = value;
}
void Day::set_not_working(bool value)
{
this->notWorking = value;
}
void Day::setBreaks(QVector<BreakPoint*> breaks)
{
this->breaks = breaks;
}
QTime Day::get_start()
{
return start;
}
QTime Day::get_end()
{
return end;
}
QVector<BreakPoint*> Day::getBreaks()
{
return breaks;
}
QJsonObject Day::to_json()
{
QJsonArray arr;
foreach (BreakPoint *bp, breaks) {
arr.append(bp->to_json());
}
QJsonObject obj{
{KEY_START, start.toString(Qt::DateFormat::ISODate)},
{KEY_END, end.toString(Qt::DateFormat::ISODate)},
{KEY_BREAKS, arr},
{KEY_VALIDATE, validate},
{KEY_NOT_WORKING, notWorking}
};
return obj;
}
bool Day::has_warning()
{
bool warning = false;
foreach (BreakPoint val, breaks) {
if (val.getStart() < start) {
warning = true;
}
if (val.getEnd() > end) {
warning = true;
}
}
return warning;
}
Day* Day::from_json(QJsonObject obj)
{
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(false);
result->notWorking = obj[KEY_NOT_WORKING].toBool(false);
result->breaks.clear();
QJsonArray arr = obj[KEY_BREAKS].toArray();
foreach (QJsonValue val, arr) {
result->breaks.append(BreakPoint::from_json(val.toObject()));
}
return result;
}
bool Day::get_validate() {
return validate;
}
bool Day::not_working()
{
return notWorking;
}
float Day::get_time_break()
{
float result = 0;
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;
this->notWorking = old->notWorking;
foreach (BreakPoint *bp, breaks) {
delete bp;
}
breaks.clear();
foreach (BreakPoint *bp, old->breaks) {
this->breaks.append(new BreakPoint(bp));
}
}

53
sources/models/day.h Normal file
View File

@@ -0,0 +1,53 @@
#ifndef DAY_H
#define DAY_H
#define KEY_START "start"
#define KEY_END "end"
#define KEY_BREAKS "breaks"
#define KEY_VALIDATE "validate"
#define KEY_NOT_WORKING "not_working"
#include <QTime>
#include <QJsonObject>
#include <QJsonArray>
#include <math.h>
#include "breakpoint.h"
class Day
{
private:
QTime start;
QTime end;
QVector<BreakPoint*> breaks;
bool validate;
bool notWorking;
public:
Day();
Day(Day*);
~Day();
void set_start(QTime value);
void set_end(QTime value);
void set_validate(bool);
void set_not_working(bool);
void setBreaks(QVector<BreakPoint*>);
QTime get_start();
QTime get_end();
QVector<BreakPoint*> getBreaks();
bool get_validate();
bool not_working();
float get_time_break();
void update(Day *);
QJsonObject to_json();
bool has_warning();
float get_total();
static Day* from_json(QJsonObject);
};
#endif // DAY_H

View File

@@ -0,0 +1,96 @@
#include "settings.h"
Settings::Settings()
{
this->cloudEnabled = false;
this->cloudEmail = "";
this->cloudPassword = "";
this->cloudUrl = "";
this->cloudAgent = DEFAULT_AGENT_KEY;
}
Settings* Settings::FromJSON(QJsonObject obj)
{
Settings *s = new Settings();
if (obj["cloud"].isObject())
{
QJsonObject cloud = obj["cloud"].toObject();
s->cloudEnabled = cloud["enabled"].toBool(false);
s->cloudUrl = cloud["url"].toString("");
s->cloudEmail = cloud["email"].toString("");
s->cloudPassword = cloud["password"].toString("");
s->cloudAgent = cloud["agent"].toString(DEFAULT_AGENT_KEY);
}
return s;
}
QJsonObject Settings::ToJSON()
{
QJsonObject s;
QJsonObject cloud;
cloud["enabled"] = this->cloudEnabled;
cloud["url"] = this->cloudUrl;
cloud["email"] = this->cloudEmail;
cloud["password"] = this->cloudPassword;
cloud["agent"] = this->cloudAgent;
s["cloud"] = cloud;
return s;
}
bool Settings::GetCloudEnabled()
{
return this->cloudEnabled;
}
QString Settings::GetCloudUrl()
{
return this->cloudUrl;
}
QString Settings::GetCloudEmail()
{
return this->cloudEmail;
}
QString Settings::GetCloudPassword()
{
return this->cloudPassword;
}
QString Settings::GetCloudAgent()
{
return this->cloudAgent;
}
QString Settings::GetCloudAgentDefault()
{
return DEFAULT_AGENT;
}
void Settings::SetCloudEnabled(bool enabled)
{
this->cloudEnabled = enabled;
}
void Settings::SetCloudUrl(QString url)
{
this->cloudUrl = url;
}
void Settings::SetCloudEmail(QString email)
{
this->cloudEmail = email;
}
void Settings::SetCloudPassword(QString password)
{
this->cloudPassword = password;
}
void Settings::SetCloudAgent(QString agent)
{
this->cloudAgent = agent;
}

43
sources/models/settings.h Normal file
View File

@@ -0,0 +1,43 @@
#ifndef SETTINGS_H
#define SETTINGS_H
#ifdef _WIN32
#define DEFAULT_AGENT "cagent.exe"
#else
#define DEFAULT_AGENT "cagent"
#endif
#define DEFAULT_AGENT_KEY "<default>"
#include <QString>
#include <QJsonObject>
class Settings
{
private:
bool cloudEnabled;
QString cloudUrl;
QString cloudEmail;
QString cloudPassword;
QString cloudAgent;
public:
Settings();
static Settings* FromJSON(QJsonObject obj);
QJsonObject ToJSON();
bool GetCloudEnabled();
QString GetCloudUrl();
QString GetCloudEmail();
QString GetCloudPassword();
QString GetCloudAgent();
QString GetCloudAgentDefault();
void SetCloudEnabled(bool enabled);
void SetCloudUrl(QString url);
void SetCloudEmail(QString email);
void SetCloudPassword(QString password);
void SetCloudAgent(QString agent);
};
#endif // SETTINGS_H

167
sources/models/week.cpp Normal file
View File

@@ -0,0 +1,167 @@
#include "week.h"
Week::Week()
{
mon = new Day();
tue = new Day();
wed = new Day();
thu = new Day();
fri = new Day();
time_delta = 0;
week_number = 0;
}
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()},
{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();
}
double Week::total(Week *wtemplate)
{
double t = 0.0;
if (mon->not_working()) {
t += wtemplate->mon->get_total();
} else {
t += mon->get_total();
}
if (tue->not_working()) {
t += wtemplate->tue->get_total();
} else {
t += tue->get_total();
}
if (wed->not_working()) {
t += wtemplate->wed->get_total();
} else {
t += wed->get_total();
}
if (thu->not_working()) {
t += wtemplate->thu->get_total();
} else {
t += thu->get_total();
}
if (fri->not_working()) {
t += wtemplate->fri->get_total();
} else {
t += fri->get_total();
}
return t;
}
Day* Week::getMon() {
return mon;
}
Day* Week::getTue() {
return tue;
}
Day* Week::getWed() {
return wed;
}
Day* Week::getThu() {
return thu;
}
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;
}
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) {
tue = value;
}
void Week::setWed(Day* value) {
wed = value;
}
void Week::setThu(Day* value) {
thu = value;
}
void Week::setFri(Day* value) {
fri = value;
}
void Week::setWeekNumber(int value) {
week_number = value;
}
void Week::setTimeDelta(int value)
{
time_delta = value;
}

55
sources/models/week.h Normal file
View File

@@ -0,0 +1,55 @@
#ifndef WEEK_H
#define WEEK_H
#define MONDAY "monday"
#define TUESDAY "tuesday"
#define WEDNESDAY "wednesday"
#define THURDAY "thurday"
#define FRIDAY "friday"
#define TIME_DELTA "timeDelta"
#define WEEK_NUMBER "weekNumber"
#include <QJsonObject>
#include "day.h"
class Week
{
public:
Week();
Week(Week*);
~Week();
double total();
double total(Week *wtemplate);
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();
void update(Week *);
int getWeekNumber();
int getTimeDelta();
float getTimeDeltaInHours();
static Week* from_json(QJsonObject);
QJsonObject to_json();
private:
Day* mon;
Day* tue;
Day* wed;
Day* thu;
Day* fri;
int time_delta;
int week_number;
};
#endif // WEEK_H

77
sources/models/year.cpp Normal file
View File

@@ -0,0 +1,77 @@
#include "year.h"
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 *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;
}
return result;
}
QJsonObject Year::to_json()
{
QJsonObject obj;
QJsonArray arr;
foreach (Week *w, weeks) {
arr.append(w->to_json());
}
obj[KEY_NUMBER] = number;
obj[KEY_WEEKS] = arr;
return obj;
}
Week *Year::getWeek(int weekNumber)
{
return weeks[weekNumber];
}
bool Year::hasWeek(int weekNumber)
{
return weeks.contains(weekNumber);
}
QMapIterator<int, Week *> Year::iterator()
{
QMapIterator i(weeks);
return i;
}
int Year::getNumber()
{
return number;
}
void Year::addWeek(Week* w)
{
weeks[w->getWeekNumber()] = w;
}

37
sources/models/year.h Normal file
View File

@@ -0,0 +1,37 @@
#ifndef YEAR_H
#define YEAR_H
#define KEY_NUMBER "number"
#define KEY_WEEKS "weeks"
#include <QJsonObject>
#include <QJsonArray>
#include <QMouseEvent>
#include <QMapIterator>
#include "week.h"
class Year
{
private:
int number;
QMap<int, Week*> weeks;
public:
Year();
Year(Year*);
~Year();
Year(int number);
static Year* from_json(QJsonObject);
QJsonObject to_json();
Week *getWeek(int);
bool hasWeek(int);
QMapIterator<int, Week*> iterator();
int getNumber();
void addWeek(Week* w);
};
#endif // YEAR_H

View File

@@ -1,37 +1,114 @@
#include "setdaydialog.h" #include "setdaydialog.h"
#include "ui_setdaydialog.h" #include "ui_setdaydialog.h"
SetDayDialog::SetDayDialog(Day d, QWidget *parent) : SetDayDialog::SetDayDialog(Day *d, bool isNotValidable, QWidget *parent) :
QDialog(parent), QDialog(parent),
ui(new Ui::SetDayDialog) ui(new Ui::SetDayDialog)
{ {
ui->setupUi(this); ui->setupUi(this);
copy = new Day(d);
ui->validateButton->setEnabled(!isNotValidable);
ui->validateButton->setVisible(!isNotValidable);
this->d = d; this->d = d;
init(); init();
} }
SetDayDialog::~SetDayDialog() SetDayDialog::~SetDayDialog()
{ {
delete copy;
delete ui; delete ui;
} }
void SetDayDialog::init() { void SetDayDialog::init() {
ui->start_edit->setTime(d.get_start()); ui->start_edit->setTime(copy->get_start());
ui->end_edit->setTime(d.get_end()); ui->end_edit->setTime(copy->get_end());
ui->break_edit->setValue(d.get_time_break()); ui->notWorkingCheckbox->setCheckState((copy->not_working()) ? Qt::CheckState::Checked : Qt::CheckState::Unchecked);
lockControls(copy->not_working());
updateBreakList();
connect(ui->start_edit, &QTimeEdit::timeChanged, this, &SetDayDialog::compute_time); connect(ui->start_edit, &QTimeEdit::timeChanged, this, &SetDayDialog::compute_time);
connect(ui->end_edit, &QTimeEdit::timeChanged, this, &SetDayDialog::compute_time); connect(ui->end_edit, &QTimeEdit::timeChanged, this, &SetDayDialog::compute_time);
connect(ui->break_edit, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged), this, &SetDayDialog::compute_time); connect(ui->validateButton, &QPushButton::clicked, this, &SetDayDialog::validate_and_accept);
ui->total_label->setText(Tools::double_to_string_time(d.get_total())); 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);
connect(ui->notWorkingCheckbox, &QCheckBox::stateChanged, this, &SetDayDialog::change_not_working);
ui->total_label->setText(Tools::double_to_string_time(d->get_total()));
}
void SetDayDialog::updateBreakList()
{
ui->breakList->clear();
foreach (BreakPoint *bp, copy->getBreaks()) {
ui->breakList->addItem(QString("%1 -> %2").arg(bp->getStart().toString("hh:mm"), bp->getEnd().toString("hh:mm")));
}
}
void SetDayDialog::lockControls(bool lock)
{
ui->addBreakButton->setDisabled(lock);
ui->start_edit->setDisabled(lock);
ui->end_edit->setDisabled(lock);
ui->breakList->setDisabled(lock);
if (ui->breakList->currentRow() != -1) {
ui->removeBreakButton->setDisabled(lock);
}
} }
void SetDayDialog::compute_time() { void SetDayDialog::compute_time() {
d.set_start(ui->start_edit->time()); copy->set_validate(false);
d.set_end(ui->end_edit->time()); copy->set_start(ui->start_edit->time());
d.set_time_break(ui->break_edit->value()); copy->set_end(ui->end_edit->time());
ui->total_label->setText(Tools::double_to_string_time(d.get_total())); ui->total_label->setText(Tools::double_to_string_time(copy->get_total()));
} }
Day SetDayDialog::get_result() { void SetDayDialog::accept()
return d; {
d->update(copy);
QDialog::accept();
}
void SetDayDialog::validate_and_accept() {
copy->set_validate(!copy->not_working());
this->accept();
}
void SetDayDialog::add_break_point()
{
BreakDialog bd(this);
int result = bd.exec();
if (result == QDialog::Accepted) {
BreakPoint bp = bd.get_result();
auto breaks = copy->getBreaks();
breaks.append(new BreakPoint(bp));
copy->setBreaks(breaks);
updateBreakList();
compute_time();
}
}
void SetDayDialog::remove_break_point()
{
int i = ui->breakList->currentRow();
if (i > -1) {
auto breaks = copy->getBreaks();
BreakPoint *bp = breaks.at(i);
breaks.removeAt(i);
delete bp;
copy->setBreaks(breaks);
updateBreakList();
compute_time();
}
}
void SetDayDialog::break_selected(int i)
{
ui->removeBreakButton->setEnabled(i > -1);
}
void SetDayDialog::change_not_working(int state)
{
copy->set_not_working(state != 0);
lockControls(copy->not_working());
compute_time();
} }

View File

@@ -2,9 +2,12 @@
#define SETDAYDIALOG_H #define SETDAYDIALOG_H
#include <QDialog> #include <QDialog>
#include <QMouseEvent>
#include "day.h" #include "models/day.h"
#include "tools.h" #include "tools.h"
#include "breakdialog.h"
#include "models/breakpoint.h"
namespace Ui { namespace Ui {
class SetDayDialog; class SetDayDialog;
@@ -15,20 +18,27 @@ class SetDayDialog : public QDialog
Q_OBJECT Q_OBJECT
public: public:
explicit SetDayDialog(Day d, QWidget *parent = nullptr); explicit SetDayDialog(Day *d, bool isNotValidable, QWidget *parent = nullptr);
~SetDayDialog(); ~SetDayDialog();
Day get_result(); private slots:
public slots:
void compute_time(); void compute_time();
void validate_and_accept();
void accept();
void add_break_point();
void remove_break_point();
void break_selected(int);
void change_not_working(int);
private: private:
Ui::SetDayDialog *ui; Ui::SetDayDialog *ui;
Day d; Day *copy;
Day *d;
void init(); void init();
void updateBreakList();
void lockControls(bool);
}; };
#endif // SETDAYDIALOG_H #endif // SETDAYDIALOG_H

View File

@@ -2,13 +2,12 @@
QString Tools::double_to_string_time(double value) { QString Tools::double_to_string_time(double value) {
const int h = floor(value); const int h = floor(value);
value -= h; int m = round((value - h) * 60);
value = value * 60; if (m == 0) {
if (value == 0.0) {
return QString("%1h").arg(QString::number(h)); return QString("%1h").arg(QString::number(h));
} else if (value < 10.0) { } else if (m < 10) {
return QString("%1h0%2").arg(QString::number(h), QString::number(round(value))); return QString("%1h0%2").arg(QString::number(h), QString::number(m));
} }
return QString("%1h%2").arg(QString::number(h), QString::number(round(value))); return QString("%1h%2").arg(QString::number(h), QString::number(m));
} }

View File

@@ -1,86 +0,0 @@
#include "week.h"
Week::Week()
{
mon = Day();
tue = Day();
wed = Day();
thu = Day();
fri = Day();
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();
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()},
{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();
}
Day Week::getMon() {
return mon;
}
Day Week::getTue() {
return tue;
}
Day Week::getWed() {
return wed;
}
Day Week::getThu() {
return thu;
}
Day Week::getFri() {
return fri;
}
int Week::getWeekNumber() {
return week_number;
}
void Week::setMon(Day value) {
mon = value;
}
void Week::setTue(Day value) {
tue = value;
}
void Week::setWed(Day value) {
wed = value;
}
void Week::setThu(Day value) {
thu = value;
}
void Week::setFri(Day value) {
fri = value;
}
void Week::setWeekNumber(int value) {
week_number = value;
}

View File

@@ -1,46 +0,0 @@
#ifndef WEEK_H
#define WEEK_H
#define MONDAY "monday"
#define TUESDAY "tuesday"
#define WEDNESDAY "wednesday"
#define THURDAY "thurday"
#define FRIDAY "friday"
#define WEEK_NUMBER "weekNumber"
#include <QJsonObject>
#include "day.h"
class Week
{
public:
Week();
double total();
void setMon(Day);
void setTue(Day);
void setWed(Day);
void setThu(Day);
void setFri(Day);
void setWeekNumber(int);
Day getMon();
Day getTue();
Day getWed();
Day getThu();
Day getFri();
int getWeekNumber();
static Week from_json(QJsonObject);
QJsonObject to_json();
private:
Day mon;
Day tue;
Day wed;
Day thu;
Day fri;
int week_number;
};
#endif // WEEK_H

46
sources/weekoption.cpp Normal file
View File

@@ -0,0 +1,46 @@
#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);
compute();
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;
compute();
}
void WeekOption::compute()
{
int m = this->time_delta;
int h = 0;
while (m > 59) {
h++;
m -= 60;
}
QString minutes = "";
if (m >= 10) {
minutes = QString::number(m, 'g', 2);
} else {
minutes = QString("0%1").arg(QString::number(m, 'g', 2));
}
ui->total_label->setText(QString("%1h%2").arg(QString::number(h, 'g', 2), minutes));
}

33
sources/weekoption.h Normal file
View File

@@ -0,0 +1,33 @@
#ifndef WEEKOPTION_H
#define WEEKOPTION_H
#include <QDialog>
#include "models/week.h"
#include "tools.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;
void compute();
int time_delta;
};
#endif // WEEKOPTION_H

View File

@@ -1,7 +1,7 @@
#include "welcome.h" #include "welcome.h"
#include "ui_welcome.h" #include "ui_welcome.h"
Welcome::Welcome(Week wtemplate, QWidget *parent) : Welcome::Welcome(Week *wtemplate, QWidget *parent) :
QDialog(parent), QDialog(parent),
ui(new Ui::Welcome) ui(new Ui::Welcome)
{ {
@@ -34,43 +34,39 @@ Week Welcome::get_result() {
} }
void Welcome::set_value_to_widget() { void Welcome::set_value_to_widget() {
ui->mon_time_label->setText(Tools::double_to_string_time(w.getMon().get_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->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->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->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->fri_time_label->setText(Tools::double_to_string_time(w->getFri()->get_total()));
ui->total->setText(Tools::double_to_string_time(w.total())); ui->total->setText(Tools::double_to_string_time(w->total()));
} }
void Welcome::edit() { void Welcome::edit() {
QString name = QObject::sender()->objectName(); QString name = QObject::sender()->objectName();
switch (get_identifier(name)) { switch (get_identifier(name)) {
case mon: case mon:
w.setMon(modify_value(w.getMon())); modify_value(w->getMon());
break; break;
case tue: case tue:
w.setTue(modify_value(w.getTue())); modify_value(w->getTue());
break; break;
case wed: case wed:
w.setWed(modify_value(w.getWed())); modify_value(w->getWed());
break; break;
case thu: case thu:
w.setThu(modify_value(w.getThu())); modify_value(w->getThu());
break; break;
case fri: case fri:
w.setFri(modify_value(w.getFri())); modify_value(w->getFri());
break; break;
} }
set_value_to_widget(); set_value_to_widget();
} }
Day Welcome::modify_value(Day d) { void Welcome::modify_value(Day *d) {
SetDayDialog sdd(d, this); SetDayDialog sdd(d, true, this);
int result = sdd.exec(); sdd.exec();
if (result == QDialog::Accepted) {
return sdd.get_result();
}
return d;
} }
Identifier Welcome::get_identifier(QString objectName) { Identifier Welcome::get_identifier(QString objectName) {

View File

@@ -3,10 +3,11 @@
#include <QDialog> #include <QDialog>
#include <QDoubleSpinBox> #include <QDoubleSpinBox>
#include <QMouseEvent>
#include <math.h> #include <math.h>
#include "week.h" #include "models/week.h"
#include "day.h" #include "models/day.h"
#include "tools.h" #include "tools.h"
#include "setdaydialog.h" #include "setdaydialog.h"
@@ -27,7 +28,7 @@ class Welcome : public QDialog
Q_OBJECT Q_OBJECT
public: public:
explicit Welcome(Week tpl, QWidget *parent = nullptr); explicit Welcome(Week *tpl, QWidget *parent = nullptr);
~Welcome(); ~Welcome();
Week get_result(); Week get_result();
@@ -35,13 +36,13 @@ public:
private: private:
Ui::Welcome *ui; Ui::Welcome *ui;
Week w; Week *w;
QMap<QString, Identifier> objectId; QMap<QString, Identifier> objectId;
void init(); void init();
void set_value_to_widget(); void set_value_to_widget();
Identifier get_identifier(QString objectName); Identifier get_identifier(QString objectName);
Day modify_value(Day); void modify_value(Day*);
public slots: public slots:
void edit(); void edit();

View File

@@ -52,18 +52,45 @@ QPushButton::default{
border-top-color: transparent; border-top-color: transparent;
border-right-color: transparent; border-right-color: transparent;
border-left-color: transparent; border-left-color: transparent;
border-bottom-color: #04b97f; border-bottom-color: rgba(204, 22, 0, 255);
border-width: 1px; border-width: 1px;
color: #a9b7c6; color: #a9b7c6;
padding: 2px; padding: 2px;
background-color: #1e1d23; background-color: #1e1d23;
} }
QPushButton#closeButton, QPushButton#minimizeButton{
color: white;
padding: 2px;
background-color: transparent;
border: none;
font-size: 11px;
}
QPushButton#closeButton::default, QFrame#titleBar QPushButton#minimizeButton::default{
color: white;
padding: 2px;
background-color: transparent;
border: none;
font-size: 11px;
}
QPushButton#closeButton:hover{
color: white;
padding-bottom: 2px;
background-color: #eb4034;
}
QPushButton#closeButton:pressed{
color: white;
padding-bottom: 1px;
background-color: #b83228;
}
QToolButton { QToolButton {
border-style: solid; border-style: solid;
border-top-color: transparent; border-top-color: transparent;
border-right-color: transparent; border-right-color: transparent;
border-left-color: transparent; border-left-color: transparent;
border-bottom-color: #04b97f; border-bottom-color: rgba(204, 22, 0, 255);
border-bottom-width: 1px; border-bottom-width: 1px;
border-style: solid; border-style: solid;
color: #a9b7c6; color: #a9b7c6;
@@ -75,7 +102,7 @@ QToolButton:hover{
border-top-color: transparent; border-top-color: transparent;
border-right-color: transparent; border-right-color: transparent;
border-left-color: transparent; border-left-color: transparent;
border-bottom-color: #37efba; border-bottom-color: rgba(204, 22, 0, 255);
border-bottom-width: 2px; border-bottom-width: 2px;
border-style: solid; border-style: solid;
color: #FFFFFF; color: #FFFFFF;
@@ -87,7 +114,7 @@ QPushButton:hover{
border-top-color: transparent; border-top-color: transparent;
border-right-color: transparent; border-right-color: transparent;
border-left-color: transparent; border-left-color: transparent;
border-bottom-color: #37efba; border-bottom-color: rgba(204, 22, 0, 255);
border-bottom-width: 1px; border-bottom-width: 1px;
border-style: solid; border-style: solid;
color: #FFFFFF; color: #FFFFFF;
@@ -99,10 +126,10 @@ QPushButton:pressed{
border-top-color: transparent; border-top-color: transparent;
border-right-color: transparent; border-right-color: transparent;
border-left-color: transparent; border-left-color: transparent;
border-bottom-color: #37efba; border-bottom-color: rgba(204, 22, 0, 255);
border-bottom-width: 2px; border-bottom-width: 2px;
border-style: solid; border-style: solid;
color: #37efba; color: rgba(204, 22, 0, 255);
padding-bottom: 1px; padding-bottom: 1px;
background-color: #1e1d23; background-color: #1e1d23;
} }
@@ -144,7 +171,7 @@ QProgressBar {
background-color:#1e1d23; background-color:#1e1d23;
} }
QProgressBar::chunk { QProgressBar::chunk {
background-color: #04b97f; background-color: rgba(204, 22, 0, 255);
border-radius: 5px; border-radius: 5px;
} }
QMenuBar { QMenuBar {
@@ -165,7 +192,7 @@ QMenu::item:selected {
border-style: solid; border-style: solid;
border-top-color: transparent; border-top-color: transparent;
border-right-color: transparent; border-right-color: transparent;
border-left-color: #04b97f; border-left-color: rgba(204, 22, 0, 255);
border-bottom-color: transparent; border-bottom-color: transparent;
border-left-width: 2px; border-left-width: 2px;
color: #FFFFFF; color: #FFFFFF;
@@ -222,7 +249,7 @@ QTabBar::tab:selected, QTabBar::tab:last:selected, QTabBar::tab:hover {
border-top-color: transparent; border-top-color: transparent;
border-right-color: transparent; border-right-color: transparent;
border-left-color: transparent; border-left-color: transparent;
border-bottom-color: #04b97f; border-bottom-color: rgba(204, 22, 0, 255);
border-bottom-width: 2px; border-bottom-width: 2px;
border-style: solid; border-style: solid;
color: #FFFFFF; color: #FFFFFF;
@@ -258,9 +285,9 @@ QCheckBox::indicator:checked {
width: 10px; width: 10px;
border-style:solid; border-style:solid;
border-width: 1px; border-width: 1px;
border-color: #04b97f; border-color: rgba(204, 22, 0, 255);
color: #a9b7c6; color: #a9b7c6;
background-color: #04b97f; background-color: rgba(204, 22, 0, 255);
} }
QCheckBox::indicator:unchecked { QCheckBox::indicator:unchecked {
@@ -268,7 +295,7 @@ QCheckBox::indicator:unchecked {
width: 10px; width: 10px;
border-style:solid; border-style:solid;
border-width: 1px; border-width: 1px;
border-color: #04b97f; border-color: rgba(204, 22, 0, 255);
color: #a9b7c6; color: #a9b7c6;
background-color: transparent; background-color: transparent;
} }
@@ -283,9 +310,9 @@ QRadioButton::indicator:checked {
border-style:solid; border-style:solid;
border-radius:5px; border-radius:5px;
border-width: 1px; border-width: 1px;
border-color: #04b97f; border-color: rgba(204, 22, 0, 255);
color: #a9b7c6; color: #a9b7c6;
background-color: #04b97f; background-color: rgba(204, 22, 0, 255);
} }
QRadioButton::indicator:!checked { QRadioButton::indicator:!checked {
height: 10px; height: 10px;
@@ -293,7 +320,7 @@ QRadioButton::indicator:!checked {
border-style:solid; border-style:solid;
border-radius:5px; border-radius:5px;
border-width: 1px; border-width: 1px;
border-color: #04b97f; border-color: rgba(204, 22, 0, 255);
color: #a9b7c6; color: #a9b7c6;
background-color: transparent; background-color: transparent;
} }
@@ -361,11 +388,11 @@ QScrollArea {
} }
QSlider::groove:horizontal { QSlider::groove:horizontal {
height: 5px; height: 5px;
background: #04b97f; background: rgba(204, 22, 0, 255);
} }
QSlider::groove:vertical { QSlider::groove:vertical {
width: 5px; width: 5px;
background: #04b97f; background: rgba(204, 22, 0, 255);
} }
QSlider::handle:horizontal { QSlider::handle:horizontal {
background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #b4b4b4, stop:1 #8f8f8f); background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #b4b4b4, stop:1 #8f8f8f);
@@ -388,8 +415,8 @@ QSlider::add-page:vertical {
background: white; background: white;
} }
QSlider::sub-page:horizontal { QSlider::sub-page:horizontal {
background: #04b97f; background: rgba(204, 22, 0, 255);
} }
QSlider::sub-page:vertical { QSlider::sub-page:vertical {
background: #04b97f; background: rgba(204, 22, 0, 255);
} }

BIN
ui/.DS_Store vendored Normal file

Binary file not shown.

View File

@@ -62,137 +62,197 @@
<enum>QFrame::Raised</enum> <enum>QFrame::Raised</enum>
</property> </property>
</widget> </widget>
<widget class="QLabel" name="label"> <widget class="QPushButton" name="closeButton">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>30</x> <x>665</x>
<y>150</y> <y>0</y>
<width>551</width> <width>41</width>
<height>21</height> <height>21</height>
</rect> </rect>
</property> </property>
<property name="styleSheet">
<string notr="true">font-size: 12px;</string>
</property>
<property name="text"> <property name="text">
<string>Author: Alexis Delhaie</string> <string>X</string>
</property> </property>
</widget> <property name="flat">
<widget class="QLabel" name="label_2">
<property name="geometry">
<rect>
<x>30</x>
<y>190</y>
<width>551</width>
<height>21</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">font-size: 12px;</string>
</property>
<property name="text">
<string>Version: 1.0.0 (Beta 3)</string>
</property>
</widget>
<widget class="QLabel" name="label_3">
<property name="geometry">
<rect>
<x>30</x>
<y>230</y>
<width>541</width>
<height>21</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">font-size: 12px;</string>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Made with Qt 5.15.0 MinGW 64bit (C++17) (&lt;a href=&quot;https://github.com/alexlegarnd/Chronos&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;Source Github&lt;/span&gt;&lt;/a&gt;)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
<widget class="QTextEdit" name="textEdit">
<property name="geometry">
<rect>
<x>390</x>
<y>160</y>
<width>301</width>
<height>181</height>
</rect>
</property>
<property name="accessibleDescription">
<string notr="true"/>
</property>
<property name="undoRedoEnabled">
<bool>false</bool>
</property>
<property name="readOnly">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="html"> </widget>
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt; <widget class="Line" name="window_border_left">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>2</width>
<height>381</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">border: none;
background-color: rgba(204, 22, 0, 255);</string>
</property>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
<widget class="Line" name="window_border_right">
<property name="geometry">
<rect>
<x>705</x>
<y>0</y>
<width>2</width>
<height>381</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">border: none;
background-color: rgba(217, 0, 112, 255);</string>
</property>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
<widget class="Line" name="window_border_bottom">
<property name="geometry">
<rect>
<x>0</x>
<y>379</y>
<width>707</width>
<height>2</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">border: none;
background-color: qlineargradient(spread:pad, x1:0, y1:1, x2:1, y2:1, stop:0 rgba(204, 22, 0, 255), stop:1 rgba(217, 0, 112, 255));</string>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
<widget class="QTabWidget" name="tabWidget">
<property name="geometry">
<rect>
<x>20</x>
<y>120</y>
<width>671</width>
<height>241</height>
</rect>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab">
<attribute name="title">
<string>Information</string>
</attribute>
<widget class="QWidget" name="layoutWidget">
<property name="geometry">
<rect>
<x>10</x>
<y>0</y>
<width>714</width>
<height>211</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label">
<property name="styleSheet">
<string notr="true">font-size: 12px;</string>
</property>
<property name="text">
<string>Author: Aurélie Delhaie</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="versionLabel">
<property name="styleSheet">
<string notr="true">font-size: 12px;</string>
</property>
<property name="text">
<string>Version: ...</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="systemLabel">
<property name="styleSheet">
<string notr="true">font-size: 12px;</string>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;...&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
<widget class="QWidget" name="tab_2">
<attribute name="title">
<string>Third party</string>
</attribute>
<widget class="QTextEdit" name="textEdit">
<property name="geometry">
<rect>
<x>8</x>
<y>10</y>
<width>651</width>
<height>191</height>
</rect>
</property>
<property name="accessibleDescription">
<string notr="true"/>
</property>
<property name="styleSheet">
<string notr="true">font-size: 12px;</string>
</property>
<property name="undoRedoEnabled">
<bool>false</bool>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
<property name="html">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt; &lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; } p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:7.5pt; font-weight:400; font-style:normal;&quot;&gt; &lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'.AppleSystemUIFont'; font-size:12px; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Application icon: Alexis Delhaie (me)&lt;/span&gt;&lt;/p&gt; &lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:12px;&quot;&gt;Qt 6.2.0 : https://www.qt.io/download-open-source&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;About box banner: Alexis Delhaie (me)&lt;/span&gt;&lt;/p&gt; &lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:10pt;&quot;&gt;Clock image: iconsdb, Iconic (MIT License)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Clock image: iconsdb, Iconic (MIT License)&lt;/span&gt;&lt;/p&gt; &lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:10pt;&quot;&gt;Running image: Icons made by &lt;/span&gt;&lt;a href=&quot;https://www.flaticon.com/authors/freepik&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;Freepik&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:10pt;&quot;&gt; from &lt;/span&gt;&lt;a href=&quot;https://www.flaticon.com/&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;www.flaticon.com&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Running image: Icons made by &lt;/span&gt;&lt;a href=&quot;https://www.flaticon.com/authors/freepik&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;Freepik&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt; from &lt;/span&gt;&lt;a href=&quot;https://www.flaticon.com/&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;www.flaticon.com&lt;/span&gt;&lt;/a&gt;&lt;/p&gt; &lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:10pt;&quot;&gt;Calendar image: Icons made by &lt;/span&gt;&lt;a href=&quot;https://www.flaticon.com/authors/freepik&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;Freepik&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:10pt;&quot;&gt; from &lt;/span&gt;&lt;a href=&quot;https://www.flaticon.com/&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;www.flaticon.com&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;&lt;br /&gt;&lt;/p&gt; </property>
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Calendar image: Icons made by &lt;/span&gt;&lt;a href=&quot;https://www.flaticon.com/authors/freepik&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;Freepik&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt; from &lt;/span&gt;&lt;a href=&quot;https://www.flaticon.com/&quot;&gt;&lt;span style=&quot; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;www.flaticon.com&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> </widget>
</property> </widget>
</widget>
<widget class="QLabel" name="label_4">
<property name="geometry">
<rect>
<x>393</x>
<y>130</y>
<width>211</width>
<height>21</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">font-size: 12px;</string>
</property>
<property name="text">
<string>Third party:</string>
</property>
</widget>
<widget class="QLabel" name="label_5">
<property name="geometry">
<rect>
<x>30</x>
<y>270</y>
<width>541</width>
<height>21</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">font-size: 12px;</string>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Installer made with Delphi 10.3 Community (&lt;a href=&quot;https://github.com/alexlegarnd/chronos-installer&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;Source Github&lt;/span&gt;&lt;/a&gt;)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
<widget class="QLabel" name="label_6">
<property name="geometry">
<rect>
<x>30</x>
<y>310</y>
<width>541</width>
<height>21</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">font-size: 12px;</string>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Installer Bootstrap made with Python 3 (&lt;a href=&quot;https://github.com/alexlegarnd/chronos-installer-bootstrap&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;Source Github&lt;/span&gt;&lt;/a&gt;)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget> </widget>
<zorder>tabWidget</zorder>
<zorder>window_border_left</zorder>
<zorder>window_border_right</zorder>
<zorder>window_border_bottom</zorder>
<zorder>frame</zorder>
<zorder>closeButton</zorder>
</widget> </widget>
<resources/> <resources/>
<connections/> <connections>
<connection>
<sender>closeButton</sender>
<signal>clicked()</signal>
<receiver>AboutBox</receiver>
<slot>close()</slot>
<hints>
<hint type="sourcelabel">
<x>685</x>
<y>10</y>
</hint>
<hint type="destinationlabel">
<x>353</x>
<y>190</y>
</hint>
</hints>
</connection>
</connections>
</ui> </ui>

208
ui/breakdialog.ui Normal file
View File

@@ -0,0 +1,208 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>BreakDialog</class>
<widget class="QDialog" name="BreakDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>319</width>
<height>187</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>319</width>
<height>187</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>319</width>
<height>187</height>
</size>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<widget class="QPushButton" name="validateButton">
<property name="geometry">
<rect>
<x>190</x>
<y>128</y>
<width>113</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>Ajouter</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
<property name="default">
<bool>true</bool>
</property>
</widget>
<widget class="QTimeEdit" name="startTime">
<property name="geometry">
<rect>
<x>180</x>
<y>16</y>
<width>118</width>
<height>31</height>
</rect>
</property>
<property name="frame">
<bool>true</bool>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="buttonSymbols">
<enum>QAbstractSpinBox::NoButtons</enum>
</property>
<property name="correctionMode">
<enum>QAbstractSpinBox::CorrectToNearestValue</enum>
</property>
</widget>
<widget class="QTimeEdit" name="endTime">
<property name="geometry">
<rect>
<x>180</x>
<y>66</y>
<width>118</width>
<height>31</height>
</rect>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="buttonSymbols">
<enum>QAbstractSpinBox::NoButtons</enum>
</property>
<property name="correctionMode">
<enum>QAbstractSpinBox::CorrectToNearestValue</enum>
</property>
</widget>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>31</x>
<y>21</y>
<width>141</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>Début de la pause</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="QLabel" name="label_2">
<property name="geometry">
<rect>
<x>31</x>
<y>70</y>
<width>141</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>Fin de la pause</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="QLabel" name="label_3">
<property name="geometry">
<rect>
<x>20</x>
<y>127</y>
<width>60</width>
<height>16</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Temps</string>
</property>
</widget>
<widget class="QLabel" name="totalTime">
<property name="geometry">
<rect>
<x>22</x>
<y>143</y>
<width>151</width>
<height>31</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>24</pointsize>
</font>
</property>
<property name="text">
<string>0 minutes</string>
</property>
</widget>
<widget class="QPushButton" name="cancelButton">
<property name="geometry">
<rect>
<x>190</x>
<y>156</y>
<width>113</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>Annuler</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
</widget>
</widget>
<resources/>
<connections>
<connection>
<sender>validateButton</sender>
<signal>clicked()</signal>
<receiver>BreakDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>246</x>
<y>160</y>
</hint>
<hint type="destinationlabel">
<x>159</x>
<y>93</y>
</hint>
</hints>
</connection>
<connection>
<sender>cancelButton</sender>
<signal>clicked()</signal>
<receiver>BreakDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>246</x>
<y>166</y>
</hint>
<hint type="destinationlabel">
<x>159</x>
<y>93</y>
</hint>
</hints>
</connection>
</connections>
</ui>

221
ui/configurationdialog.ui Normal file
View File

@@ -0,0 +1,221 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ConfigurationDialog</class>
<widget class="QDialog" name="ConfigurationDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>269</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>400</width>
<height>269</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>400</width>
<height>269</height>
</size>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>10</x>
<y>20</y>
<width>141</width>
<height>16</height>
</rect>
</property>
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Sauvegarde Cloud</string>
</property>
</widget>
<widget class="Line" name="line">
<property name="geometry">
<rect>
<x>140</x>
<y>24</y>
<width>251</width>
<height>20</height>
</rect>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
<widget class="QLineEdit" name="cloud_url">
<property name="enabled">
<bool>false</bool>
</property>
<property name="geometry">
<rect>
<x>164</x>
<y>86</y>
<width>221</width>
<height>21</height>
</rect>
</property>
</widget>
<widget class="QLabel" name="label_2">
<property name="geometry">
<rect>
<x>13</x>
<y>87</y>
<width>101</width>
<height>20</height>
</rect>
</property>
<property name="text">
<string>Serveur</string>
</property>
</widget>
<widget class="QCheckBox" name="cloud_enable">
<property name="geometry">
<rect>
<x>10</x>
<y>50</y>
<width>371</width>
<height>20</height>
</rect>
</property>
<property name="text">
<string>Utiliser la sauvegarde en ligne</string>
</property>
</widget>
<widget class="QLineEdit" name="cloud_Email">
<property name="enabled">
<bool>false</bool>
</property>
<property name="geometry">
<rect>
<x>164</x>
<y>118</y>
<width>221</width>
<height>21</height>
</rect>
</property>
</widget>
<widget class="QLabel" name="label_3">
<property name="geometry">
<rect>
<x>13</x>
<y>119</y>
<width>101</width>
<height>20</height>
</rect>
</property>
<property name="text">
<string>Email</string>
</property>
</widget>
<widget class="QLineEdit" name="cloud_password">
<property name="enabled">
<bool>false</bool>
</property>
<property name="geometry">
<rect>
<x>164</x>
<y>150</y>
<width>221</width>
<height>21</height>
</rect>
</property>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
<widget class="QLabel" name="label_4">
<property name="geometry">
<rect>
<x>13</x>
<y>151</y>
<width>101</width>
<height>20</height>
</rect>
</property>
<property name="text">
<string>Mot de passe</string>
</property>
</widget>
<widget class="QLineEdit" name="cloud_agent">
<property name="enabled">
<bool>false</bool>
</property>
<property name="geometry">
<rect>
<x>164</x>
<y>183</y>
<width>171</width>
<height>21</height>
</rect>
</property>
<property name="inputMask">
<string/>
</property>
<property name="text">
<string>&lt;default&gt;</string>
</property>
<property name="echoMode">
<enum>QLineEdit::Normal</enum>
</property>
</widget>
<widget class="QLabel" name="label_5">
<property name="geometry">
<rect>
<x>13</x>
<y>184</y>
<width>151</width>
<height>20</height>
</rect>
</property>
<property name="text">
<string>Agent de sauvegarde</string>
</property>
</widget>
<widget class="QPushButton" name="cloud_agent_btn">
<property name="enabled">
<bool>false</bool>
</property>
<property name="geometry">
<rect>
<x>339</x>
<y>178</y>
<width>51</width>
<height>32</height>
</rect>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
<widget class="QPushButton" name="close">
<property name="geometry">
<rect>
<x>280</x>
<y>230</y>
<width>113</width>
<height>32</height>
</rect>
</property>
<property name="text">
<string>Fermer</string>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>

File diff suppressed because it is too large Load Diff

View File

@@ -10,19 +10,19 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>419</width> <width>419</width>
<height>177</height> <height>447</height>
</rect> </rect>
</property> </property>
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>419</width> <width>419</width>
<height>177</height> <height>447</height>
</size> </size>
</property> </property>
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>419</width> <width>419</width>
<height>177</height> <height>447</height>
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@@ -34,22 +34,31 @@
<widget class="QPushButton" name="pushButton"> <widget class="QPushButton" name="pushButton">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>320</x> <x>10</x>
<y>140</y> <y>410</y>
<width>75</width> <width>191</width>
<height>23</height> <height>23</height>
</rect> </rect>
</property> </property>
<property name="styleSheet">
<string notr="true">font-size: 12px</string>
</property>
<property name="text"> <property name="text">
<string>Valider</string> <string>Valider</string>
</property> </property>
<property name="autoDefault">
<bool>false</bool>
</property>
<property name="default">
<bool>true</bool>
</property>
</widget> </widget>
<widget class="QTimeEdit" name="start_edit"> <widget class="QTimeEdit" name="start_edit">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>40</x> <x>210</x>
<y>49</y> <y>16</y>
<width>91</width> <width>191</width>
<height>31</height> <height>31</height>
</rect> </rect>
</property> </property>
@@ -59,6 +68,9 @@
<property name="buttonSymbols"> <property name="buttonSymbols">
<enum>QAbstractSpinBox::NoButtons</enum> <enum>QAbstractSpinBox::NoButtons</enum>
</property> </property>
<property name="correctionMode">
<enum>QAbstractSpinBox::CorrectToNearestValue</enum>
</property>
<property name="time"> <property name="time">
<time> <time>
<hour>9</hour> <hour>9</hour>
@@ -70,9 +82,9 @@
<widget class="QTimeEdit" name="end_edit"> <widget class="QTimeEdit" name="end_edit">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>300</x> <x>210</x>
<y>49</y> <y>310</y>
<width>91</width> <width>191</width>
<height>31</height> <height>31</height>
</rect> </rect>
</property> </property>
@@ -82,6 +94,9 @@
<property name="buttonSymbols"> <property name="buttonSymbols">
<enum>QAbstractSpinBox::NoButtons</enum> <enum>QAbstractSpinBox::NoButtons</enum>
</property> </property>
<property name="correctionMode">
<enum>QAbstractSpinBox::CorrectToNearestValue</enum>
</property>
<property name="time"> <property name="time">
<time> <time>
<hour>17</hour> <hour>17</hour>
@@ -90,47 +105,63 @@
</time> </time>
</property> </property>
</widget> </widget>
<widget class="QDoubleSpinBox" name="break_edit">
<property name="geometry">
<rect>
<x>170</x>
<y>49</y>
<width>91</width>
<height>31</height>
</rect>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="buttonSymbols">
<enum>QAbstractSpinBox::NoButtons</enum>
</property>
<property name="value">
<double>0.450000000000000</double>
</property>
</widget>
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>40</x> <x>10</x>
<y>9</y> <y>16</y>
<width>91</width> <width>181</width>
<height>31</height> <height>31</height>
</rect> </rect>
</property> </property>
<property name="text"> <property name="text">
<string>Arrivé</string> <string>Arrivée au bureau</string>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignCenter</set> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="QLabel" name="label_3">
<property name="geometry">
<rect>
<x>10</x>
<y>310</y>
<width>181</width>
<height>31</height>
</rect>
</property>
<property name="text">
<string>Fin de journée</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="QPushButton" name="validateButton">
<property name="geometry">
<rect>
<x>220</x>
<y>410</y>
<width>191</width>
<height>23</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">font-size: 12px</string>
</property>
<property name="text">
<string>Approuver</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property> </property>
</widget> </widget>
<widget class="QLabel" name="label_2"> <widget class="QLabel" name="label_2">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>170</x> <x>10</x>
<y>9</y> <y>150</y>
<width>91</width> <width>181</width>
<height>31</height> <height>31</height>
</rect> </rect>
</property> </property>
@@ -138,105 +169,136 @@
<string>Pause</string> <string>Pause</string>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignCenter</set> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property> </property>
</widget> </widget>
<widget class="QLabel" name="label_3"> <widget class="QPushButton" name="addBreakButton">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>300</x> <x>360</x>
<y>9</y> <y>270</y>
<width>91</width> <width>41</width>
<height>31</height> <height>21</height>
</rect> </rect>
</property> </property>
<property name="text"> <property name="text">
<string>Départ</string> <string>+</string>
</property> </property>
<property name="alignment"> <property name="autoDefault">
<set>Qt::AlignCenter</set> <bool>false</bool>
</property> </property>
</widget> </widget>
<widget class="QWidget" name="layoutWidget"> <widget class="QPushButton" name="removeBreakButton">
<property name="enabled">
<bool>false</bool>
</property>
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>40</x> <x>320</x>
<y>103</y> <y>270</y>
<width>141</width> <width>41</width>
<height>61</height> <height>20</height>
</rect> </rect>
</property> </property>
<layout class="QHBoxLayout" name="horizontalLayout"> <property name="text">
<item> <string>-</string>
<widget class="QFrame" name="frame"> </property>
<property name="minimumSize"> <property name="autoDefault">
<size> <bool>false</bool>
<width>59</width> </property>
<height>59</height> </widget>
</size> <widget class="Line" name="line">
</property> <property name="geometry">
<property name="maximumSize"> <rect>
<size> <x>0</x>
<width>59</width> <y>380</y>
<height>59</height> <width>421</width>
</size> <height>20</height>
</property> </rect>
<property name="styleSheet"> </property>
<string notr="true">border-image: url(:/clock/pictures/clock-8-128.png) 0 0 0 0 stretch stretch;</string> <property name="orientation">
</property> <enum>Qt::Horizontal</enum>
<property name="frameShape"> </property>
<enum>QFrame::StyledPanel</enum> </widget>
</property> <widget class="QListWidget" name="breakList">
<property name="frameShadow"> <property name="geometry">
<enum>QFrame::Raised</enum> <rect>
</property> <x>210</x>
</widget> <y>60</y>
</item> <width>191</width>
<item> <height>201</height>
<layout class="QVBoxLayout" name="verticalLayout"> </rect>
<item> </property>
<widget class="QLabel" name="label_4"> <property name="styleSheet">
<property name="styleSheet"> <string notr="true">background-color: rgba(0, 0, 0, 0);
<string notr="true">font-size: 14px;</string> color: rgb(255, 255, 255);</string>
</property> </property>
<property name="text"> <property name="frameShape">
<string>Temps total</string> <enum>QFrame::Panel</enum>
</property> </property>
</widget> <property name="frameShadow">
</item> <enum>QFrame::Plain</enum>
<item> </property>
<widget class="QLabel" name="total_label"> <property name="autoScroll">
<property name="styleSheet"> <bool>false</bool>
<string notr="true">font-size: 28px; </property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="showDropIndicator" stdset="0">
<bool>false</bool>
</property>
<property name="defaultDropAction">
<enum>Qt::IgnoreAction</enum>
</property>
</widget>
<widget class="QLabel" name="label_4">
<property name="geometry">
<rect>
<x>10</x>
<y>370</y>
<width>91</width>
<height>19</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">font-size: 14px;</string>
</property>
<property name="text">
<string>Temps total</string>
</property>
</widget>
<widget class="QLabel" name="total_label">
<property name="geometry">
<rect>
<x>100</x>
<y>360</y>
<width>101</width>
<height>31</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">font-size: 28px;
color: white;</string> color: white;</string>
</property> </property>
<property name="text"> <property name="text">
<string>0h</string> <string>0h</string>
</property> </property>
</widget> </widget>
</item> <widget class="QCheckBox" name="notWorkingCheckbox">
</layout> <property name="geometry">
</item> <rect>
</layout> <x>210</x>
<y>350</y>
<width>191</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>Jour non travaillé</string>
</property>
</widget> </widget>
</widget> </widget>
<resources/> <resources/>
<connections> <connections/>
<connection>
<sender>pushButton</sender>
<signal>clicked()</signal>
<receiver>SetDayDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>357</x>
<y>151</y>
</hint>
<hint type="destinationlabel">
<x>209</x>
<y>88</y>
</hint>
</hints>
</connection>
</connections>
</ui> </ui>

161
ui/weekoption.ui Normal file
View File

@@ -0,0 +1,161 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>WeekOption</class>
<widget class="QDialog" name="WeekOption">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>372</width>
<height>159</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>372</width>
<height>159</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>372</width>
<height>159</height>
</size>
</property>
<property name="windowTitle">
<string>Options</string>
</property>
<widget class="QSpinBox" name="time_delta_spinbox">
<property name="geometry">
<rect>
<x>260</x>
<y>40</y>
<width>101</width>
<height>27</height>
</rect>
</property>
<property name="suffix">
<string> min</string>
</property>
<property name="minimum">
<number>-1000000</number>
</property>
<property name="maximum">
<number>1000000</number>
</property>
</widget>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>111</width>
<height>18</height>
</rect>
</property>
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Réalignement</string>
</property>
</widget>
<widget class="QLabel" name="label_2">
<property name="geometry">
<rect>
<x>10</x>
<y>44</y>
<width>161</width>
<height>18</height>
</rect>
</property>
<property name="text">
<string>Delta (en minutes)</string>
</property>
</widget>
<widget class="QPushButton" name="validate_button">
<property name="geometry">
<rect>
<x>270</x>
<y>120</y>
<width>88</width>
<height>26</height>
</rect>
</property>
<property name="text">
<string>Valider</string>
</property>
</widget>
<widget class="Line" name="line">
<property name="geometry">
<rect>
<x>172</x>
<y>52</y>
<width>81</width>
<height>20</height>
</rect>
</property>
<property name="lineWidth">
<number>0</number>
</property>
<property name="midLineWidth">
<number>1</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
<widget class="Line" name="line_2">
<property name="geometry">
<rect>
<x>130</x>
<y>16</y>
<width>231</width>
<height>20</height>
</rect>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
<widget class="QLabel" name="total_label">
<property name="geometry">
<rect>
<x>10</x>
<y>107</y>
<width>152</width>
<height>41</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">font-size: 28px;
color: white;</string>
</property>
<property name="text">
<string>0h</string>
</property>
</widget>
</widget>
<resources/>
<connections>
<connection>
<sender>validate_button</sender>
<signal>clicked()</signal>
<receiver>WeekOption</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>313</x>
<y>132</y>
</hint>
<hint type="destinationlabel">
<x>185</x>
<y>79</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@@ -42,10 +42,10 @@
<widget class="QWidget" name="layoutWidget"> <widget class="QWidget" name="layoutWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>30</x> <x>25</x>
<y>20</y> <y>37</y>
<width>261</width> <width>261</width>
<height>201</height> <height>202</height>
</rect> </rect>
</property> </property>
<property name="font"> <property name="font">
@@ -304,8 +304,8 @@
<widget class="QWidget" name="layoutWidget"> <widget class="QWidget" name="layoutWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>300</x> <x>295</x>
<y>60</y> <y>77</y>
<width>201</width> <width>201</width>
<height>103</height> <height>103</height>
</rect> </rect>