commit 46f2a04d4954662972480acc3469a29314abbf09 Author: Kuro Date: Sun Oct 12 23:47:06 2025 +0200 first commit diff --git a/.resx b/.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Contime.csproj b/Contime.csproj new file mode 100644 index 0000000..228d5ea --- /dev/null +++ b/Contime.csproj @@ -0,0 +1,17 @@ + + + + WinExe + net8.0-windows + enable + true + enable + + + + + + + + + \ No newline at end of file diff --git a/Contime.csproj.user b/Contime.csproj.user new file mode 100644 index 0000000..0d365b3 --- /dev/null +++ b/Contime.csproj.user @@ -0,0 +1,8 @@ + + + + + Form + + + \ No newline at end of file diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..2c23d48 --- /dev/null +++ b/Program.cs @@ -0,0 +1,38 @@ +using Contime.controller; +using Contime.data; +using Contime.model; +using Contime.view; + +namespace Contime { + internal static class Program { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() { + // --- FIX: Initialize the SQLite provider --- + SQLitePCL.Batteries.Init(); + + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + + // --- Dependency Injection Setup --- + // 1. Create the DataAccess layer + var dataAccess = new DataAccess("contime.db"); + dataAccess.InitializeDatabase(); + + // 2. Create the Model + var model = new TimeTrackerModel(dataAccess); + + // 3. Create the View + var view = new MainForm(); + + // 4. Create the Controller + var controller = new TimeTrackerController(model, view); + + // 5. Run the application + Application.Run(view); + } + } +} + diff --git a/bin/Debug/net8.0-windows/ClosedXML.Parser.dll b/bin/Debug/net8.0-windows/ClosedXML.Parser.dll new file mode 100644 index 0000000..52ce71a Binary files /dev/null and b/bin/Debug/net8.0-windows/ClosedXML.Parser.dll differ diff --git a/bin/Debug/net8.0-windows/ClosedXML.dll b/bin/Debug/net8.0-windows/ClosedXML.dll new file mode 100644 index 0000000..b50347b Binary files /dev/null and b/bin/Debug/net8.0-windows/ClosedXML.dll differ diff --git a/bin/Debug/net8.0-windows/Contime.deps.json b/bin/Debug/net8.0-windows/Contime.deps.json new file mode 100644 index 0000000..6fd6097 --- /dev/null +++ b/bin/Debug/net8.0-windows/Contime.deps.json @@ -0,0 +1,420 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v8.0", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v8.0": { + "Contime/1.0.0": { + "dependencies": { + "ClosedXML": "0.105.0", + "Microsoft.Data.Sqlite.Core": "9.0.9", + "SQLitePCLRaw.bundle_e_sqlite3": "3.0.2" + }, + "runtime": { + "Contime.dll": {} + } + }, + "ClosedXML/0.105.0": { + "dependencies": { + "ClosedXML.Parser": "2.0.0", + "DocumentFormat.OpenXml": "3.1.1", + "ExcelNumberFormat": "1.1.0", + "RBush.Signed": "4.0.0", + "SixLabors.Fonts": "1.0.0" + }, + "runtime": { + "lib/netstandard2.1/ClosedXML.dll": { + "assemblyVersion": "0.105.0.0", + "fileVersion": "0.105.0.0" + } + } + }, + "ClosedXML.Parser/2.0.0": { + "runtime": { + "lib/netstandard2.1/ClosedXML.Parser.dll": { + "assemblyVersion": "1.0.0.0", + "fileVersion": "1.0.0.0" + } + } + }, + "DocumentFormat.OpenXml/3.1.1": { + "dependencies": { + "DocumentFormat.OpenXml.Framework": "3.1.1" + }, + "runtime": { + "lib/net8.0/DocumentFormat.OpenXml.dll": { + "assemblyVersion": "3.1.1.0", + "fileVersion": "3.1.1.0" + } + } + }, + "DocumentFormat.OpenXml.Framework/3.1.1": { + "dependencies": { + "System.IO.Packaging": "8.0.1" + }, + "runtime": { + "lib/net8.0/DocumentFormat.OpenXml.Framework.dll": { + "assemblyVersion": "3.1.1.0", + "fileVersion": "3.1.1.0" + } + } + }, + "ExcelNumberFormat/1.1.0": { + "runtime": { + "lib/netstandard2.0/ExcelNumberFormat.dll": { + "assemblyVersion": "1.1.0.0", + "fileVersion": "1.1.0.0" + } + } + }, + "Microsoft.Data.Sqlite.Core/9.0.9": { + "dependencies": { + "SQLitePCLRaw.core": "3.0.2" + }, + "runtime": { + "lib/net8.0/Microsoft.Data.Sqlite.dll": { + "assemblyVersion": "9.0.9.0", + "fileVersion": "9.0.925.41909" + } + } + }, + "RBush.Signed/4.0.0": { + "runtime": { + "lib/net8.0/RBush.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.0.0.0" + } + } + }, + "SixLabors.Fonts/1.0.0": { + "runtime": { + "lib/netcoreapp3.1/SixLabors.Fonts.dll": { + "assemblyVersion": "1.0.0.0", + "fileVersion": "1.0.0.0" + } + } + }, + "SourceGear.sqlite3/3.50.4.2": { + "runtimeTargets": { + "runtimes/android-arm/native/libe_sqlite3.so": { + "rid": "android-arm", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/android-arm64/native/libe_sqlite3.so": { + "rid": "android-arm64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/android-x64/native/libe_sqlite3.so": { + "rid": "android-x64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/android-x86/native/libe_sqlite3.so": { + "rid": "android-x86", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/browser-wasm/nativeassets/net8.0/e_sqlite3.a": { + "rid": "browser-wasm", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/ios-arm/native/e_sqlite3.a": { + "rid": "ios-arm", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/ios-arm64/native/e_sqlite3.a": { + "rid": "ios-arm64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/iossimulator-arm64/native/e_sqlite3.a": { + "rid": "iossimulator-arm64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/iossimulator-x64/native/e_sqlite3.a": { + "rid": "iossimulator-x64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/iossimulator-x86/native/e_sqlite3.a": { + "rid": "iossimulator-x86", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/linux-arm/native/libe_sqlite3.so": { + "rid": "linux-arm", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/linux-arm64/native/libe_sqlite3.so": { + "rid": "linux-arm64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/linux-armel/native/libe_sqlite3.so": { + "rid": "linux-armel", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/linux-mips64/native/libe_sqlite3.so": { + "rid": "linux-mips64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/linux-musl-arm/native/libe_sqlite3.so": { + "rid": "linux-musl-arm", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/linux-musl-arm64/native/libe_sqlite3.so": { + "rid": "linux-musl-arm64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/linux-musl-riscv64/native/libe_sqlite3.so": { + "rid": "linux-musl-riscv64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/linux-musl-s390x/native/libe_sqlite3.so": { + "rid": "linux-musl-s390x", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/linux-musl-x64/native/libe_sqlite3.so": { + "rid": "linux-musl-x64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/linux-ppc64le/native/libe_sqlite3.so": { + "rid": "linux-ppc64le", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/linux-riscv64/native/libe_sqlite3.so": { + "rid": "linux-riscv64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/linux-s390x/native/libe_sqlite3.so": { + "rid": "linux-s390x", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/linux-x64/native/libe_sqlite3.so": { + "rid": "linux-x64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/linux-x86/native/libe_sqlite3.so": { + "rid": "linux-x86", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/maccatalyst-arm64/native/libe_sqlite3.dylib": { + "rid": "maccatalyst-arm64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/maccatalyst-x64/native/libe_sqlite3.dylib": { + "rid": "maccatalyst-x64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/osx-arm64/native/libe_sqlite3.dylib": { + "rid": "osx-arm64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/osx-x64/native/libe_sqlite3.dylib": { + "rid": "osx-x64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/win-arm64/native/e_sqlite3.dll": { + "rid": "win-arm64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/win-x64/native/e_sqlite3.dll": { + "rid": "win-x64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/win-x86/native/e_sqlite3.dll": { + "rid": "win-x86", + "assetType": "native", + "fileVersion": "0.0.0.0" + } + } + }, + "SQLitePCLRaw.bundle_e_sqlite3/3.0.2": { + "dependencies": { + "SQLitePCLRaw.config.e_sqlite3": "3.0.2", + "SourceGear.sqlite3": "3.50.4.2" + } + }, + "SQLitePCLRaw.config.e_sqlite3/3.0.2": { + "dependencies": { + "SQLitePCLRaw.provider.e_sqlite3": "3.0.2" + }, + "runtime": { + "lib/net8.0/SQLitePCLRaw.batteries_v2.dll": { + "assemblyVersion": "3.0.2.2801", + "fileVersion": "3.0.2.2801" + } + } + }, + "SQLitePCLRaw.core/3.0.2": { + "dependencies": { + "System.Memory": "4.6.3" + }, + "runtime": { + "lib/netstandard2.0/SQLitePCLRaw.core.dll": { + "assemblyVersion": "3.0.2.2801", + "fileVersion": "3.0.2.2801" + } + } + }, + "SQLitePCLRaw.provider.e_sqlite3/3.0.2": { + "dependencies": { + "SQLitePCLRaw.core": "3.0.2" + }, + "runtime": { + "lib/net8.0-windows7.0/SQLitePCLRaw.provider.e_sqlite3.dll": { + "assemblyVersion": "3.0.2.2801", + "fileVersion": "3.0.2.2801" + } + } + }, + "System.IO.Packaging/8.0.1": { + "runtime": { + "lib/net8.0/System.IO.Packaging.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.1024.46610" + } + } + }, + "System.Memory/4.6.3": {} + } + }, + "libraries": { + "Contime/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "ClosedXML/0.105.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-U0hAdnYyPvF7TqHMFloxrS7pmozab79tFFF4c/bgPtqeelUs7ILpUd3r3c7C0a/DXsUZb3k1n4Pf7Q2LMyMQOg==", + "path": "closedxml/0.105.0", + "hashPath": "closedxml.0.105.0.nupkg.sha512" + }, + "ClosedXML.Parser/2.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ngTqjYreDYNytG1W5d3ewHsw0ukmmrgV7EKnS4/40rXoYZGt07jrBvo+N+GxT49rcageUMUiprV0jYT4nwVBHQ==", + "path": "closedxml.parser/2.0.0", + "hashPath": "closedxml.parser.2.0.0.nupkg.sha512" + }, + "DocumentFormat.OpenXml/3.1.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-2z9QBzeTLNNKWM9SaOSDMegfQk/7hDuElOsmF77pKZMkFRP/GHA/W/4yOAQD9kn15N/FsFxHn3QVYkatuZghiA==", + "path": "documentformat.openxml/3.1.1", + "hashPath": "documentformat.openxml.3.1.1.nupkg.sha512" + }, + "DocumentFormat.OpenXml.Framework/3.1.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-6APEp/ElZV58S/4v8mf4Ke3ONEDORs64MqdD64Z7wWpcHANB9oovQsGIwtqjnKihulOj7T0a6IxHIHOfMqKOng==", + "path": "documentformat.openxml.framework/3.1.1", + "hashPath": "documentformat.openxml.framework.3.1.1.nupkg.sha512" + }, + "ExcelNumberFormat/1.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-R3BVHPs9O+RkExbZYTGT0+9HLbi8ZrNij1Yziyw6znd3J7P3uoIR07uwTLGOogtz1p6+0sna66eBoXu7tBiVQA==", + "path": "excelnumberformat/1.1.0", + "hashPath": "excelnumberformat.1.1.0.nupkg.sha512" + }, + "Microsoft.Data.Sqlite.Core/9.0.9": { + "type": "package", + "serviceable": true, + "sha512": "sha512-DjxZRueHp0qvZxhvW+H1IWYkSofZI8Chg710KYJjNP/6S4q3rt97pvR8AHOompkSwaN92VLKz5uw01iUt85cMg==", + "path": "microsoft.data.sqlite.core/9.0.9", + "hashPath": "microsoft.data.sqlite.core.9.0.9.nupkg.sha512" + }, + "RBush.Signed/4.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-aP5KQxL5RnFNGW1f0euYVBfCatkLw5iEzMRJcXKq8LWWP4Cp3+qoSq1tDDL2vvJ2rM0ychmVMa2VaEKLS6uX4w==", + "path": "rbush.signed/4.0.0", + "hashPath": "rbush.signed.4.0.0.nupkg.sha512" + }, + "SixLabors.Fonts/1.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-LFQsCZlV0xlUyXAOMUo5kkSl+8zAQXXbbdwWchtk0B4o7zotZhQsQOcJUELGHdfPfm/xDAsz6hONAuV25bJaAg==", + "path": "sixlabors.fonts/1.0.0", + "hashPath": "sixlabors.fonts.1.0.0.nupkg.sha512" + }, + "SourceGear.sqlite3/3.50.4.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-eV9HwQ88WyoU+reGVxJz1SwME9NbYnl9h2LOY15j0LGdXN4JkTJDk8JRRg/yNgt00O3Cn5/qnska10FEZNoU5g==", + "path": "sourcegear.sqlite3/3.50.4.2", + "hashPath": "sourcegear.sqlite3.3.50.4.2.nupkg.sha512" + }, + "SQLitePCLRaw.bundle_e_sqlite3/3.0.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-nzPPFpELY9U1scLvQpA1k1GIgR9ror83DCPmirT2/i5NCPdTBfhTDA6MZqFZonGDayye5mUQRQLOVyEiJNYr0g==", + "path": "sqlitepclraw.bundle_e_sqlite3/3.0.2", + "hashPath": "sqlitepclraw.bundle_e_sqlite3.3.0.2.nupkg.sha512" + }, + "SQLitePCLRaw.config.e_sqlite3/3.0.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-QPHR1Axs8YCCapb0TnmT7PxY9DX3sg4I4T9HOSKeFBiT5l482mjrOIxuyt+xOCwEQ2Enq5h0tgDOXMnJi+i0sw==", + "path": "sqlitepclraw.config.e_sqlite3/3.0.2", + "hashPath": "sqlitepclraw.config.e_sqlite3.3.0.2.nupkg.sha512" + }, + "SQLitePCLRaw.core/3.0.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-tnbRf0muOOSJK1RLCfyYK13jynFScgL4xMj7yC3oy8lrrGKXTKmOoWjfdV+cFfBRdppm4qST31hvp8ihgIgvMQ==", + "path": "sqlitepclraw.core/3.0.2", + "hashPath": "sqlitepclraw.core.3.0.2.nupkg.sha512" + }, + "SQLitePCLRaw.provider.e_sqlite3/3.0.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-RQIliDp47mQxGYNcBB6W+ezHbegkImrSZVTuWjQCSTTl3pQ37Q3rALkkkdTAMEmcIz71PEOCqNZMp7lXCnVqEQ==", + "path": "sqlitepclraw.provider.e_sqlite3/3.0.2", + "hashPath": "sqlitepclraw.provider.e_sqlite3.3.0.2.nupkg.sha512" + }, + "System.IO.Packaging/8.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-KYkIOAvPexQOLDxPO2g0BVoWInnQhPpkFzRqvNrNrMhVT6kqhVr0zEb6KCHlptLFukxnZrjuMVAnxK7pOGUYrw==", + "path": "system.io.packaging/8.0.1", + "hashPath": "system.io.packaging.8.0.1.nupkg.sha512" + }, + "System.Memory/4.6.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-qdcDOgnFZY40+Q9876JUHnlHu7bosOHX8XISRoH94fwk6hgaeQGSgfZd8srWRZNt5bV9ZW2TljcegDNxsf+96A==", + "path": "system.memory/4.6.3", + "hashPath": "system.memory.4.6.3.nupkg.sha512" + } + } +} \ No newline at end of file diff --git a/bin/Debug/net8.0-windows/Contime.dll b/bin/Debug/net8.0-windows/Contime.dll new file mode 100644 index 0000000..d2160ef Binary files /dev/null and b/bin/Debug/net8.0-windows/Contime.dll differ diff --git a/bin/Debug/net8.0-windows/Contime.exe b/bin/Debug/net8.0-windows/Contime.exe new file mode 100644 index 0000000..21fcf6d Binary files /dev/null and b/bin/Debug/net8.0-windows/Contime.exe differ diff --git a/bin/Debug/net8.0-windows/Contime.pdb b/bin/Debug/net8.0-windows/Contime.pdb new file mode 100644 index 0000000..af1dd8a Binary files /dev/null and b/bin/Debug/net8.0-windows/Contime.pdb differ diff --git a/bin/Debug/net8.0-windows/Contime.runtimeconfig.json b/bin/Debug/net8.0-windows/Contime.runtimeconfig.json new file mode 100644 index 0000000..b2dedf3 --- /dev/null +++ b/bin/Debug/net8.0-windows/Contime.runtimeconfig.json @@ -0,0 +1,19 @@ +{ + "runtimeOptions": { + "tfm": "net8.0", + "frameworks": [ + { + "name": "Microsoft.NETCore.App", + "version": "8.0.0" + }, + { + "name": "Microsoft.WindowsDesktop.App", + "version": "8.0.0" + } + ], + "configProperties": { + "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": true, + "CSWINRT_USE_WINDOWS_UI_XAML_PROJECTIONS": false + } + } +} \ No newline at end of file diff --git a/bin/Debug/net8.0-windows/DocumentFormat.OpenXml.Framework.dll b/bin/Debug/net8.0-windows/DocumentFormat.OpenXml.Framework.dll new file mode 100644 index 0000000..895c615 Binary files /dev/null and b/bin/Debug/net8.0-windows/DocumentFormat.OpenXml.Framework.dll differ diff --git a/bin/Debug/net8.0-windows/DocumentFormat.OpenXml.dll b/bin/Debug/net8.0-windows/DocumentFormat.OpenXml.dll new file mode 100644 index 0000000..dbc29d1 Binary files /dev/null and b/bin/Debug/net8.0-windows/DocumentFormat.OpenXml.dll differ diff --git a/bin/Debug/net8.0-windows/ExcelNumberFormat.dll b/bin/Debug/net8.0-windows/ExcelNumberFormat.dll new file mode 100644 index 0000000..aaf7bf8 Binary files /dev/null and b/bin/Debug/net8.0-windows/ExcelNumberFormat.dll differ diff --git a/bin/Debug/net8.0-windows/Microsoft.Data.Sqlite.dll b/bin/Debug/net8.0-windows/Microsoft.Data.Sqlite.dll new file mode 100644 index 0000000..64e0448 Binary files /dev/null and b/bin/Debug/net8.0-windows/Microsoft.Data.Sqlite.dll differ diff --git a/bin/Debug/net8.0-windows/RBush.dll b/bin/Debug/net8.0-windows/RBush.dll new file mode 100644 index 0000000..c1cec38 Binary files /dev/null and b/bin/Debug/net8.0-windows/RBush.dll differ diff --git a/bin/Debug/net8.0-windows/SQLitePCLRaw.batteries_v2.dll b/bin/Debug/net8.0-windows/SQLitePCLRaw.batteries_v2.dll new file mode 100644 index 0000000..481dbec Binary files /dev/null and b/bin/Debug/net8.0-windows/SQLitePCLRaw.batteries_v2.dll differ diff --git a/bin/Debug/net8.0-windows/SQLitePCLRaw.core.dll b/bin/Debug/net8.0-windows/SQLitePCLRaw.core.dll new file mode 100644 index 0000000..6a5c6c7 Binary files /dev/null and b/bin/Debug/net8.0-windows/SQLitePCLRaw.core.dll differ diff --git a/bin/Debug/net8.0-windows/SQLitePCLRaw.provider.e_sqlite3.dll b/bin/Debug/net8.0-windows/SQLitePCLRaw.provider.e_sqlite3.dll new file mode 100644 index 0000000..baaf297 Binary files /dev/null and b/bin/Debug/net8.0-windows/SQLitePCLRaw.provider.e_sqlite3.dll differ diff --git a/bin/Debug/net8.0-windows/SixLabors.Fonts.dll b/bin/Debug/net8.0-windows/SixLabors.Fonts.dll new file mode 100644 index 0000000..281d8a7 Binary files /dev/null and b/bin/Debug/net8.0-windows/SixLabors.Fonts.dll differ diff --git a/bin/Debug/net8.0-windows/System.IO.Packaging.dll b/bin/Debug/net8.0-windows/System.IO.Packaging.dll new file mode 100644 index 0000000..eb95db7 Binary files /dev/null and b/bin/Debug/net8.0-windows/System.IO.Packaging.dll differ diff --git a/bin/Debug/net8.0-windows/contime.db b/bin/Debug/net8.0-windows/contime.db new file mode 100644 index 0000000..7b38fa8 Binary files /dev/null and b/bin/Debug/net8.0-windows/contime.db differ diff --git a/bin/Debug/net8.0-windows/runtimes/android-arm/native/libe_sqlite3.so b/bin/Debug/net8.0-windows/runtimes/android-arm/native/libe_sqlite3.so new file mode 100644 index 0000000..6370c59 Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/android-arm/native/libe_sqlite3.so differ diff --git a/bin/Debug/net8.0-windows/runtimes/android-arm64/native/libe_sqlite3.so b/bin/Debug/net8.0-windows/runtimes/android-arm64/native/libe_sqlite3.so new file mode 100644 index 0000000..1cfccac Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/android-arm64/native/libe_sqlite3.so differ diff --git a/bin/Debug/net8.0-windows/runtimes/android-x64/native/libe_sqlite3.so b/bin/Debug/net8.0-windows/runtimes/android-x64/native/libe_sqlite3.so new file mode 100644 index 0000000..2f18403 Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/android-x64/native/libe_sqlite3.so differ diff --git a/bin/Debug/net8.0-windows/runtimes/android-x86/native/libe_sqlite3.so b/bin/Debug/net8.0-windows/runtimes/android-x86/native/libe_sqlite3.so new file mode 100644 index 0000000..97fd549 Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/android-x86/native/libe_sqlite3.so differ diff --git a/bin/Debug/net8.0-windows/runtimes/browser-wasm/nativeassets/net8.0/e_sqlite3.a b/bin/Debug/net8.0-windows/runtimes/browser-wasm/nativeassets/net8.0/e_sqlite3.a new file mode 100644 index 0000000..09061ad Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/browser-wasm/nativeassets/net8.0/e_sqlite3.a differ diff --git a/bin/Debug/net8.0-windows/runtimes/ios-arm/native/e_sqlite3.a b/bin/Debug/net8.0-windows/runtimes/ios-arm/native/e_sqlite3.a new file mode 100644 index 0000000..51b1cad Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/ios-arm/native/e_sqlite3.a differ diff --git a/bin/Debug/net8.0-windows/runtimes/ios-arm64/native/e_sqlite3.a b/bin/Debug/net8.0-windows/runtimes/ios-arm64/native/e_sqlite3.a new file mode 100644 index 0000000..51b1cad Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/ios-arm64/native/e_sqlite3.a differ diff --git a/bin/Debug/net8.0-windows/runtimes/iossimulator-arm64/native/e_sqlite3.a b/bin/Debug/net8.0-windows/runtimes/iossimulator-arm64/native/e_sqlite3.a new file mode 100644 index 0000000..aa53d66 Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/iossimulator-arm64/native/e_sqlite3.a differ diff --git a/bin/Debug/net8.0-windows/runtimes/iossimulator-x64/native/e_sqlite3.a b/bin/Debug/net8.0-windows/runtimes/iossimulator-x64/native/e_sqlite3.a new file mode 100644 index 0000000..aa53d66 Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/iossimulator-x64/native/e_sqlite3.a differ diff --git a/bin/Debug/net8.0-windows/runtimes/iossimulator-x86/native/e_sqlite3.a b/bin/Debug/net8.0-windows/runtimes/iossimulator-x86/native/e_sqlite3.a new file mode 100644 index 0000000..aa53d66 Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/iossimulator-x86/native/e_sqlite3.a differ diff --git a/bin/Debug/net8.0-windows/runtimes/linux-arm/native/libe_sqlite3.so b/bin/Debug/net8.0-windows/runtimes/linux-arm/native/libe_sqlite3.so new file mode 100644 index 0000000..2778c03 Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/linux-arm/native/libe_sqlite3.so differ diff --git a/bin/Debug/net8.0-windows/runtimes/linux-arm64/native/libe_sqlite3.so b/bin/Debug/net8.0-windows/runtimes/linux-arm64/native/libe_sqlite3.so new file mode 100644 index 0000000..83cab46 Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/linux-arm64/native/libe_sqlite3.so differ diff --git a/bin/Debug/net8.0-windows/runtimes/linux-armel/native/libe_sqlite3.so b/bin/Debug/net8.0-windows/runtimes/linux-armel/native/libe_sqlite3.so new file mode 100644 index 0000000..a01fad9 Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/linux-armel/native/libe_sqlite3.so differ diff --git a/bin/Debug/net8.0-windows/runtimes/linux-mips64/native/libe_sqlite3.so b/bin/Debug/net8.0-windows/runtimes/linux-mips64/native/libe_sqlite3.so new file mode 100644 index 0000000..7191502 Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/linux-mips64/native/libe_sqlite3.so differ diff --git a/bin/Debug/net8.0-windows/runtimes/linux-musl-arm/native/libe_sqlite3.so b/bin/Debug/net8.0-windows/runtimes/linux-musl-arm/native/libe_sqlite3.so new file mode 100644 index 0000000..4452087 Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/linux-musl-arm/native/libe_sqlite3.so differ diff --git a/bin/Debug/net8.0-windows/runtimes/linux-musl-arm64/native/libe_sqlite3.so b/bin/Debug/net8.0-windows/runtimes/linux-musl-arm64/native/libe_sqlite3.so new file mode 100644 index 0000000..6875af7 Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/linux-musl-arm64/native/libe_sqlite3.so differ diff --git a/bin/Debug/net8.0-windows/runtimes/linux-musl-riscv64/native/libe_sqlite3.so b/bin/Debug/net8.0-windows/runtimes/linux-musl-riscv64/native/libe_sqlite3.so new file mode 100644 index 0000000..a032aee Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/linux-musl-riscv64/native/libe_sqlite3.so differ diff --git a/bin/Debug/net8.0-windows/runtimes/linux-musl-s390x/native/libe_sqlite3.so b/bin/Debug/net8.0-windows/runtimes/linux-musl-s390x/native/libe_sqlite3.so new file mode 100644 index 0000000..342b524 Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/linux-musl-s390x/native/libe_sqlite3.so differ diff --git a/bin/Debug/net8.0-windows/runtimes/linux-musl-x64/native/libe_sqlite3.so b/bin/Debug/net8.0-windows/runtimes/linux-musl-x64/native/libe_sqlite3.so new file mode 100644 index 0000000..a85b651 Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/linux-musl-x64/native/libe_sqlite3.so differ diff --git a/bin/Debug/net8.0-windows/runtimes/linux-ppc64le/native/libe_sqlite3.so b/bin/Debug/net8.0-windows/runtimes/linux-ppc64le/native/libe_sqlite3.so new file mode 100644 index 0000000..1f9cf78 Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/linux-ppc64le/native/libe_sqlite3.so differ diff --git a/bin/Debug/net8.0-windows/runtimes/linux-riscv64/native/libe_sqlite3.so b/bin/Debug/net8.0-windows/runtimes/linux-riscv64/native/libe_sqlite3.so new file mode 100644 index 0000000..c39e670 Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/linux-riscv64/native/libe_sqlite3.so differ diff --git a/bin/Debug/net8.0-windows/runtimes/linux-s390x/native/libe_sqlite3.so b/bin/Debug/net8.0-windows/runtimes/linux-s390x/native/libe_sqlite3.so new file mode 100644 index 0000000..54bb877 Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/linux-s390x/native/libe_sqlite3.so differ diff --git a/bin/Debug/net8.0-windows/runtimes/linux-x64/native/libe_sqlite3.so b/bin/Debug/net8.0-windows/runtimes/linux-x64/native/libe_sqlite3.so new file mode 100644 index 0000000..5188a09 Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/linux-x64/native/libe_sqlite3.so differ diff --git a/bin/Debug/net8.0-windows/runtimes/linux-x86/native/libe_sqlite3.so b/bin/Debug/net8.0-windows/runtimes/linux-x86/native/libe_sqlite3.so new file mode 100644 index 0000000..62196fe Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/linux-x86/native/libe_sqlite3.so differ diff --git a/bin/Debug/net8.0-windows/runtimes/maccatalyst-arm64/native/libe_sqlite3.dylib b/bin/Debug/net8.0-windows/runtimes/maccatalyst-arm64/native/libe_sqlite3.dylib new file mode 100644 index 0000000..fd6a577 Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/maccatalyst-arm64/native/libe_sqlite3.dylib differ diff --git a/bin/Debug/net8.0-windows/runtimes/maccatalyst-x64/native/libe_sqlite3.dylib b/bin/Debug/net8.0-windows/runtimes/maccatalyst-x64/native/libe_sqlite3.dylib new file mode 100644 index 0000000..f47b761 Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/maccatalyst-x64/native/libe_sqlite3.dylib differ diff --git a/bin/Debug/net8.0-windows/runtimes/osx-arm64/native/libe_sqlite3.dylib b/bin/Debug/net8.0-windows/runtimes/osx-arm64/native/libe_sqlite3.dylib new file mode 100644 index 0000000..ebfb2c9 Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/osx-arm64/native/libe_sqlite3.dylib differ diff --git a/bin/Debug/net8.0-windows/runtimes/osx-x64/native/libe_sqlite3.dylib b/bin/Debug/net8.0-windows/runtimes/osx-x64/native/libe_sqlite3.dylib new file mode 100644 index 0000000..a992577 Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/osx-x64/native/libe_sqlite3.dylib differ diff --git a/bin/Debug/net8.0-windows/runtimes/win-arm64/native/e_sqlite3.dll b/bin/Debug/net8.0-windows/runtimes/win-arm64/native/e_sqlite3.dll new file mode 100644 index 0000000..f5a8bfa Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/win-arm64/native/e_sqlite3.dll differ diff --git a/bin/Debug/net8.0-windows/runtimes/win-x64/native/e_sqlite3.dll b/bin/Debug/net8.0-windows/runtimes/win-x64/native/e_sqlite3.dll new file mode 100644 index 0000000..cb07b7e Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/win-x64/native/e_sqlite3.dll differ diff --git a/bin/Debug/net8.0-windows/runtimes/win-x86/native/e_sqlite3.dll b/bin/Debug/net8.0-windows/runtimes/win-x86/native/e_sqlite3.dll new file mode 100644 index 0000000..c310fd2 Binary files /dev/null and b/bin/Debug/net8.0-windows/runtimes/win-x86/native/e_sqlite3.dll differ diff --git a/controller/TimeTrackerController.cs b/controller/TimeTrackerController.cs new file mode 100644 index 0000000..a240864 --- /dev/null +++ b/controller/TimeTrackerController.cs @@ -0,0 +1,111 @@ +using Contime.data; +using Contime.model; +using Contime.view; + +namespace Contime.controller { + public class TimeTrackerController { + private readonly TimeTrackerModel _model; + private readonly MainForm _view; + private readonly System.Windows.Forms.Timer _timer; + + private const int IDLE_NOTIFICATION_MINUTES = 15; + private const int ACTIVE_TASK_NOTIFICATION_MINUTES = 60; + + private bool _idleNotificationSent = false; + private bool _activeTaskNotificationSent = false; + + public TimeTrackerController(TimeTrackerModel model, MainForm view) { + _model = model; + _view = view; + + // Subscribe to model and view events + _model.StateChanged += OnModelStateChanged; + _model.MajorStateChanged += OnModelMajorStateChanged; + + _view.WorkdayStartStopClicked += () => _model.StartStopWorkday(); + _view.TaskStartStopClicked += () => _model.StartStopTask(); + _view.GoOutOfContextClicked += () => _model.SwitchContext(); + _view.ToggleTaskStatusClicked += () => _model.ToggleSelectedTaskStatus(); + _view.AddTaskClicked += () => _model.AddTask(_view.NewTaskName); + _view.TaskSelected += (taskId) => _model.SelectTask(taskId); + _view.SaveContextClicked += () => _model.OutOfContextReason = _view.ContextText; + _view.ExportClicked += OnExportClicked; + + // Setup the main timer + _timer = new System.Windows.Forms.Timer { Interval = 1000 }; + _timer.Tick += OnTimerTick; + + // Initial UI update + _view.UpdateView(_model); + } + + private void OnTimerTick(object sender, EventArgs e) { + if (_model.CurrentState == TimeTrackerModel.AppState.Idle) { + _timer.Stop(); + return; + } + + _view.UpdateTimersAndState(_model); + CheckNotifications(); + } + + private void OnModelStateChanged() { + if (_model.CurrentState != TimeTrackerModel.AppState.Idle && !_timer.Enabled) { + _timer.Start(); + } + _view.UpdateTimersAndState(_model); + + // Reset notification flags on state change + _idleNotificationSent = false; + _activeTaskNotificationSent = false; + } + + private void OnModelMajorStateChanged() { + // A major state change might require starting the timer (e.g., starting the workday) + if (_model.CurrentState != TimeTrackerModel.AppState.Idle && !_timer.Enabled) { + _timer.Start(); + } + + // This event is for when the task list needs a full refresh + _view.UpdateView(_model); + } + + private void CheckNotifications() { + // Notification for being idle (workday active, no task) + if (_model.CurrentState == TimeTrackerModel.AppState.WorkdayActive && + _model.IdleTime.TotalMinutes >= IDLE_NOTIFICATION_MINUTES && + !_idleNotificationSent) { + _view.ShowNotification("Task Reminder", "You've been idle for over 15 minutes. Remember to select a task."); + _idleNotificationSent = true; + } + + // Notification for a long-running task + if (_model.CurrentState == TimeTrackerModel.AppState.TaskActive && + _model.ActiveTaskTime.TotalMinutes >= ACTIVE_TASK_NOTIFICATION_MINUTES && + !_activeTaskNotificationSent) { + _view.ShowNotification("Task Check-in", $"The current task has been running for over an hour. Still on it?"); + _activeTaskNotificationSent = true; + } + } + + private void OnExportClicked() { + using (var sfd = new SaveFileDialog()) { + sfd.Filter = "Excel Workbook|*.xlsx"; + sfd.ValidateNames = true; + sfd.FileName = $"Contime_Report_{DateTime.Now:yyyy-MM-dd}.xlsx"; + + if (sfd.ShowDialog() == DialogResult.OK) { + try { + var exporter = new ExcelExporter(_model.DataAccess); + exporter.Export(sfd.FileName); + _view.ShowNotification("Export Successful", $"Report saved to {sfd.FileName}"); + } + catch (Exception ex) { + MessageBox.Show($"An error occurred during export: {ex.Message}", "Export Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + } + } +} + diff --git a/data/DataAccess.cs b/data/DataAccess.cs new file mode 100644 index 0000000..c8e916c --- /dev/null +++ b/data/DataAccess.cs @@ -0,0 +1,231 @@ +using Contime.model; +using Microsoft.Data.Sqlite; +using System.Globalization; + +namespace Contime.data { + public class DataAccess { + private readonly string _connectionString; + + public DataAccess(string dbFileName = "contime.db") { + _connectionString = $"Data Source={dbFileName}"; + } + + public void InitializeDatabase() { + using (var connection = new SqliteConnection(_connectionString)) { + connection.Open(); + var command = connection.CreateCommand(); + command.CommandText = @" + CREATE TABLE IF NOT EXISTS workdays ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + workday_date TEXT NOT NULL UNIQUE + ); + + CREATE TABLE IF NOT EXISTS tasks ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + description TEXT NOT NULL, + created_date TEXT NOT NULL, + completed_date TEXT, + status TEXT NOT NULL CHECK(status IN ('open', 'closed')) + ); + + CREATE TABLE IF NOT EXISTS task_times ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + task_id INTEGER NOT NULL, + workday_id INTEGER NOT NULL, + start_time TEXT NOT NULL, + end_time TEXT, + FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE, + FOREIGN KEY (workday_id) REFERENCES workdays(id) ON DELETE CASCADE + ); + "; + command.ExecuteNonQuery(); + } + } + + public long GetOrCreateWorkday(DateTime date) { + using (var connection = new SqliteConnection(_connectionString)) { + connection.Open(); + var selectCmd = connection.CreateCommand(); + selectCmd.CommandText = "SELECT id FROM workdays WHERE workday_date = $date"; + selectCmd.Parameters.AddWithValue("$date", date.ToString("yyyy-MM-dd")); + var result = selectCmd.ExecuteScalar(); + + if (result != null) { + return (long)result; + } + else { + var insertCmd = connection.CreateCommand(); + insertCmd.CommandText = "INSERT INTO workdays (workday_date) VALUES ($date); SELECT last_insert_rowid();"; + insertCmd.Parameters.AddWithValue("$date", date.ToString("yyyy-MM-dd")); + return (long)insertCmd.ExecuteScalar(); + } + } + } + + public List GetAllTasks() { + var tasks = new List(); + using (var connection = new SqliteConnection(_connectionString)) { + connection.Open(); + var command = connection.CreateCommand(); + command.CommandText = @" + SELECT t.id, t.description, t.status, + COALESCE(SUM(CAST((julianday(tt.end_time) - julianday(tt.start_time)) * 86400 AS INTEGER)), 0) + FROM tasks t + LEFT JOIN task_times tt ON t.id = tt.task_id AND tt.end_time IS NOT NULL + GROUP BY t.id, t.description, t.status + ORDER BY t.created_date DESC"; + + using (var reader = command.ExecuteReader()) { + while (reader.Read()) { + var taskItem = new TaskItem( + id: reader.GetInt64(0), + name: reader.GetString(1), + status: reader.GetString(2), + elapsedTime: TimeSpan.FromSeconds(reader.GetInt32(3)) + ); + tasks.Add(taskItem); + } + } + } + return tasks; + } + + public void AddTask(string description) { + using (var connection = new SqliteConnection(_connectionString)) { + connection.Open(); + var command = connection.CreateCommand(); + command.CommandText = "INSERT INTO tasks (description, created_date, status) VALUES ($desc, $date, 'open')"; + command.Parameters.AddWithValue("$desc", description); + command.Parameters.AddWithValue("$date", DateTime.UtcNow.ToString("o")); + command.ExecuteNonQuery(); + } + } + + public void UpdateTaskStatus(long taskId, string status, bool isCompletion) { + using (var connection = new SqliteConnection(_connectionString)) { + connection.Open(); + var command = connection.CreateCommand(); + command.CommandText = isCompletion + ? "UPDATE tasks SET status = $status, completed_date = $date WHERE id = $id" + : "UPDATE tasks SET status = $status, completed_date = NULL WHERE id = $id"; + + command.Parameters.AddWithValue("$status", status); + command.Parameters.AddWithValue("$id", taskId); + if (isCompletion) command.Parameters.AddWithValue("$date", DateTime.UtcNow.ToString("o")); + command.ExecuteNonQuery(); + } + } + + public long StartTaskTime(long taskId, long workdayId) { + using (var connection = new SqliteConnection(_connectionString)) { + connection.Open(); + var command = connection.CreateCommand(); + command.CommandText = "INSERT INTO task_times (task_id, workday_id, start_time) VALUES ($taskId, $workdayId, $startTime); SELECT last_insert_rowid();"; + command.Parameters.AddWithValue("$taskId", taskId); + command.Parameters.AddWithValue("$workdayId", workdayId); + command.Parameters.AddWithValue("$startTime", DateTime.UtcNow.ToString("o")); + return (long)command.ExecuteScalar(); + } + } + + public void EndTaskTime(long taskTimeId) { + using (var connection = new SqliteConnection(_connectionString)) { + connection.Open(); + var command = connection.CreateCommand(); + command.CommandText = "UPDATE task_times SET end_time = $endTime WHERE id = $id"; + command.Parameters.AddWithValue("$endTime", DateTime.UtcNow.ToString("o")); + command.Parameters.AddWithValue("$id", taskTimeId); + command.ExecuteNonQuery(); + } + } + + public TimeSpan GetTotalTimeForDate(DateTime date) { + long totalSeconds = 0; + using (var connection = new SqliteConnection(_connectionString)) { + connection.Open(); + var command = connection.CreateCommand(); + command.CommandText = @" + SELECT start_time, end_time FROM task_times + WHERE end_time IS NOT NULL"; + + using (var reader = command.ExecuteReader()) { + while (reader.Read()) { + var start = DateTime.Parse(reader.GetString(0), CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind).ToLocalTime(); + var end = DateTime.Parse(reader.GetString(1), CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind).ToLocalTime(); + + if (start.Date == date.Date) { + var effectiveEnd = (end.Date > start.Date) ? start.Date.AddDays(1) : end; + totalSeconds += (long)(effectiveEnd - start).TotalSeconds; + } + } + } + } + return TimeSpan.FromSeconds(totalSeconds); + } + + public TimeSpan GetTotalTimeForCurrentWeek() { + long totalSeconds = 0; + var today = DateTime.Today; + // Sunday is 0, so we adjust to make Monday the start of the week (1) + int diff = (7 + (int)today.DayOfWeek - (int)DayOfWeek.Monday) % 7; + var startOfWeek = today.AddDays(-1 * diff).Date; + var endOfWeek = startOfWeek.AddDays(6); + + using (var connection = new SqliteConnection(_connectionString)) { + connection.Open(); + var command = connection.CreateCommand(); + command.CommandText = @" + SELECT start_time, end_time FROM task_times + WHERE end_time IS NOT NULL"; + + using (var reader = command.ExecuteReader()) { + while (reader.Read()) { + var start = DateTime.Parse(reader.GetString(0), CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind).ToLocalTime(); + var end = DateTime.Parse(reader.GetString(1), CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind).ToLocalTime(); + + if (start.Date >= startOfWeek && start.Date <= endOfWeek) { + totalSeconds += (long)(end - start).TotalSeconds; + } + } + } + } + return TimeSpan.FromSeconds(totalSeconds); + } + + public List<(DateTime Date, string TaskName, TimeSpan Duration)> GetAllTimeEntriesForExport() { + var entries = new List<(DateTime Date, string TaskName, TimeSpan Duration)>(); + using (var connection = new SqliteConnection(_connectionString)) { + connection.Open(); + var command = connection.CreateCommand(); + command.CommandText = @" + SELECT t.description, tt.start_time, tt.end_time + FROM task_times tt + JOIN tasks t ON tt.task_id = t.id + WHERE tt.end_time IS NOT NULL + ORDER BY tt.start_time"; + + using (var reader = command.ExecuteReader()) { + while (reader.Read()) { + var taskName = reader.GetString(0); + var startTime = DateTime.Parse(reader.GetString(1), CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind).ToLocalTime(); + var endTime = DateTime.Parse(reader.GetString(2), CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind).ToLocalTime(); + + var currentDate = startTime.Date; + while (currentDate <= endTime.Date) { + var startOfThisDay = (currentDate == startTime.Date) ? startTime : currentDate; + var endOfThisDay = (currentDate == endTime.Date) ? endTime : currentDate.AddDays(1).AddTicks(-1); + + var durationThisDay = endOfThisDay - startOfThisDay; + + entries.Add((currentDate, taskName, durationThisDay)); + + currentDate = currentDate.AddDays(1); + } + } + } + } + return entries; + } + } +} + diff --git a/data/ExcelExporter.cs b/data/ExcelExporter.cs new file mode 100644 index 0000000..19eb14a --- /dev/null +++ b/data/ExcelExporter.cs @@ -0,0 +1,64 @@ +using ClosedXML.Excel; +using System.Data; +using System.Globalization; + +namespace Contime.data { + public class ExcelExporter { + private readonly DataAccess _dataAccess; + + public ExcelExporter(DataAccess dataAccess) { + _dataAccess = dataAccess; + } + + public void Export(string filePath) { + var allTimeEntries = _dataAccess.GetAllTimeEntriesForExport(); + if (!allTimeEntries.Any()) { + // Handle case with no data + return; + } + + using (var workbook = new XLWorkbook()) { + var groupedByWeek = allTimeEntries + .GroupBy(entry => GetIso8601WeekOfYear(entry.Date)) + .OrderBy(g => g.Key); + + foreach (var weekGroup in groupedByWeek) { + var weekNumber = weekGroup.Key; + var worksheet = workbook.Worksheets.Add($"KW {weekNumber}"); + + // --- Header --- + worksheet.Cell("A1").Value = "Date"; + worksheet.Cell("B1").Value = "Task Description"; + worksheet.Cell("C1").Value = "Duration (hh:mm:ss)"; + var headerRange = worksheet.Range("A1:C1"); + headerRange.Style.Font.Bold = true; + headerRange.Style.Fill.BackgroundColor = XLColor.LightGray; + + int currentRow = 2; + var groupedByDay = weekGroup.GroupBy(entry => entry.Date.Date).OrderBy(g => g.Key); + + foreach (var dayGroup in groupedByDay) { + foreach (var entry in dayGroup) { + worksheet.Cell(currentRow, 1).Value = entry.Date.ToString("yyyy-MM-dd"); + worksheet.Cell(currentRow, 2).Value = entry.TaskName; + worksheet.Cell(currentRow, 3).Value = entry.Duration.ToString(@"hh\:mm\:ss"); + currentRow++; + } + } + + worksheet.Columns().AdjustToContents(); + } + + workbook.SaveAs(filePath); + } + } + + private static int GetIso8601WeekOfYear(DateTime time) { + DayOfWeek day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time); + if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday) { + time = time.AddDays(3); + } + return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); + } + } +} diff --git a/model/TaskItem.cs b/model/TaskItem.cs new file mode 100644 index 0000000..72c435f --- /dev/null +++ b/model/TaskItem.cs @@ -0,0 +1,15 @@ +namespace Contime.model { + public class TaskItem { + public long Id { get; } + public string Name { get; } + public string Status { get; } + public TimeSpan ElapsedTime { get; } + + public TaskItem(long id, string name, string status, TimeSpan elapsedTime) { + Id = id; + Name = name; + Status = status; + ElapsedTime = elapsedTime; + } + } +} \ No newline at end of file diff --git a/model/TimeTrackerModel.cs b/model/TimeTrackerModel.cs new file mode 100644 index 0000000..3c6d9e0 --- /dev/null +++ b/model/TimeTrackerModel.cs @@ -0,0 +1,143 @@ +using Contime.data; +using System.Diagnostics; + +namespace Contime.model { + public class TimeTrackerModel { + // --- Public State & Data --- + public enum AppState { Idle, WorkdayActive, TaskActive, OutOfContext } + public AppState CurrentState { get; private set; } = AppState.Idle; + public List Tasks { get; private set; } = new List(); + public TaskItem SelectedTask { get; private set; } + public string OutOfContextReason { get; set; } = ""; + public DataAccess DataAccess => _dataAccess; + + // --- Public Read-only Timer Properties --- + public TimeSpan WorkdayTime => _workdayStopwatch.Elapsed; + public TimeSpan ActiveTaskTime => _activeTaskStopwatch.Elapsed; + public TimeSpan IdleTime => _idleStopwatch.Elapsed; + public TimeSpan SelectedTaskTotalTime => SelectedTask?.ElapsedTime ?? TimeSpan.Zero; + public TimeSpan DayTotal { get; private set; } = TimeSpan.Zero; + public TimeSpan WeekTotal { get; private set; } = TimeSpan.Zero; + + + // --- Events --- + public event Action StateChanged; // For high-frequency updates (timers) + public event Action MajorStateChanged; // For low-frequency updates (task list) + + // --- Private Fields --- + private readonly DataAccess _dataAccess; + private readonly Stopwatch _workdayStopwatch = new Stopwatch(); + private readonly Stopwatch _activeTaskStopwatch = new Stopwatch(); + private readonly Stopwatch _idleStopwatch = new Stopwatch(); + private long _currentWorkdayId; + private long _currentTaskTimeId; + + public TimeTrackerModel(DataAccess dataAccess) { + _dataAccess = dataAccess; + ReloadAllData(); // Initial load + } + + private void ReloadAllData() { + long? selectedTaskId = SelectedTask?.Id; + + Tasks = _dataAccess.GetAllTasks(); + DayTotal = _dataAccess.GetTotalTimeForDate(DateTime.Today); + WeekTotal = _dataAccess.GetTotalTimeForCurrentWeek(); + + if (selectedTaskId.HasValue) { + SelectedTask = Tasks.FirstOrDefault(t => t.Id == selectedTaskId.Value); + } + + MajorStateChanged?.Invoke(); + } + + // --- Public Methods (State Changers) --- + + public void StartStopWorkday() { + if (CurrentState == AppState.Idle) { + _currentWorkdayId = _dataAccess.GetOrCreateWorkday(DateTime.Today); + CurrentState = AppState.WorkdayActive; + _workdayStopwatch.Restart(); + _idleStopwatch.Restart(); + } + else { + if (CurrentState == AppState.TaskActive) StopTask(); + CurrentState = AppState.Idle; + _workdayStopwatch.Stop(); + _idleStopwatch.Stop(); + SelectedTask = null; + } + ReloadAllData(); + } + + public void SelectTask(long taskId) { + if (SelectedTask?.Id == taskId) return; // Prevent re-selection loop + + SelectedTask = taskId == -1 ? null : Tasks.FirstOrDefault(t => t.Id == taskId); + + // A selection change is a major state change that affects buttons + MajorStateChanged?.Invoke(); + } + + public void StartStopTask() { + if (CurrentState == AppState.TaskActive) // Stopping + { + StopTask(); + } + else if (CurrentState == AppState.WorkdayActive && SelectedTask != null && SelectedTask.Status == "open") // Starting + { + _currentTaskTimeId = _dataAccess.StartTaskTime(SelectedTask.Id, _currentWorkdayId); + CurrentState = AppState.TaskActive; + _activeTaskStopwatch.Restart(); + _idleStopwatch.Stop(); + _idleStopwatch.Reset(); + } + ReloadAllData(); + } + + public void SwitchContext() { + if (CurrentState == AppState.OutOfContext) // Returning + { + CurrentState = _currentTaskTimeId > 0 ? AppState.TaskActive : AppState.WorkdayActive; + _workdayStopwatch.Start(); + if (CurrentState == AppState.TaskActive) _activeTaskStopwatch.Start(); + else _idleStopwatch.Start(); + } + else if (CurrentState != AppState.Idle) // Going + { + _workdayStopwatch.Stop(); + if (CurrentState == AppState.TaskActive) _activeTaskStopwatch.Stop(); + if (CurrentState == AppState.WorkdayActive) _idleStopwatch.Stop(); + CurrentState = AppState.OutOfContext; + } + StateChanged?.Invoke(); + } + + public void AddTask(string name) { + if (string.IsNullOrWhiteSpace(name)) return; + _dataAccess.AddTask(name); + ReloadAllData(); + } + + public void ToggleSelectedTaskStatus() { + if (SelectedTask == null || CurrentState == AppState.TaskActive) return; + + string newStatus = SelectedTask.Status == "open" ? "closed" : "open"; + _dataAccess.UpdateTaskStatus(SelectedTask.Id, newStatus, newStatus == "closed"); + ReloadAllData(); + } + + private void StopTask() { + if (!_activeTaskStopwatch.IsRunning) return; + + _dataAccess.EndTaskTime(_currentTaskTimeId); + _currentTaskTimeId = 0; + + CurrentState = AppState.WorkdayActive; + _activeTaskStopwatch.Stop(); + _activeTaskStopwatch.Reset(); + _idleStopwatch.Restart(); + } + } +} + diff --git a/obj/Contime.csproj.nuget.dgspec.json b/obj/Contime.csproj.nuget.dgspec.json new file mode 100644 index 0000000..8880fca --- /dev/null +++ b/obj/Contime.csproj.nuget.dgspec.json @@ -0,0 +1,108 @@ +{ + "format": 1, + "restore": { + "C:\\Users\\Kuro\\source\\repos\\Contime\\Contime\\Contime.csproj": {} + }, + "projects": { + "C:\\Users\\Kuro\\source\\repos\\Contime\\Contime\\Contime.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Kuro\\source\\repos\\Contime\\Contime\\Contime.csproj", + "projectName": "Contime", + "projectPath": "C:\\Users\\Kuro\\source\\repos\\Contime\\Contime\\Contime.csproj", + "packagesPath": "C:\\Users\\Kuro\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Kuro\\source\\repos\\Contime\\Contime\\obj\\", + "projectStyle": "PackageReference", + "fallbackFolders": [ + "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" + ], + "configFilePaths": [ + "C:\\Users\\Kuro\\AppData\\Roaming\\NuGet\\NuGet.Config", + "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", + "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" + ], + "originalTargetFrameworks": [ + "net8.0-windows" + ], + "sources": { + "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "9.0.100" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "ClosedXML": { + "target": "Package", + "version": "[0.105.0, )" + }, + "Microsoft.Data.Sqlite.Core": { + "target": "Package", + "version": "[9.0.9, )" + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "target": "Package", + "version": "[3.0.2, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Ref", + "version": "[8.0.20, 8.0.20]" + }, + { + "name": "Microsoft.NETCore.App.Host.win-x64", + "version": "[8.0.20, 8.0.20]" + }, + { + "name": "Microsoft.NETCore.App.Ref", + "version": "[8.0.20, 8.0.20]" + }, + { + "name": "Microsoft.WindowsDesktop.App.Ref", + "version": "[8.0.20, 8.0.20]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App.WindowsForms": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.110/PortableRuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/obj/Contime.csproj.nuget.g.props b/obj/Contime.csproj.nuget.g.props new file mode 100644 index 0000000..dbe8e54 --- /dev/null +++ b/obj/Contime.csproj.nuget.g.props @@ -0,0 +1,16 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\Kuro\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages + PackageReference + 6.12.2 + + + + + + \ No newline at end of file diff --git a/obj/Contime.csproj.nuget.g.targets b/obj/Contime.csproj.nuget.g.targets new file mode 100644 index 0000000..fa4ad07 --- /dev/null +++ b/obj/Contime.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/obj/Debug/net8.0-windows/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/obj/Debug/net8.0-windows/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs new file mode 100644 index 0000000..2217181 --- /dev/null +++ b/obj/Debug/net8.0-windows/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")] diff --git a/obj/Debug/net8.0-windows/Contime..resources b/obj/Debug/net8.0-windows/Contime..resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/net8.0-windows/Contime..resources differ diff --git a/obj/Debug/net8.0-windows/Contime.AssemblyInfo.cs b/obj/Debug/net8.0-windows/Contime.AssemblyInfo.cs new file mode 100644 index 0000000..1271105 --- /dev/null +++ b/obj/Debug/net8.0-windows/Contime.AssemblyInfo.cs @@ -0,0 +1,25 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("Contime")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("Contime")] +[assembly: System.Reflection.AssemblyTitleAttribute("Contime")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/obj/Debug/net8.0-windows/Contime.AssemblyInfoInputs.cache b/obj/Debug/net8.0-windows/Contime.AssemblyInfoInputs.cache new file mode 100644 index 0000000..f3430ac --- /dev/null +++ b/obj/Debug/net8.0-windows/Contime.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +3ffb2cae8cb0c711b7ff238181cd8317709c8def5cf5b95abdf892a8b042687d diff --git a/obj/Debug/net8.0-windows/Contime.GeneratedMSBuildEditorConfig.editorconfig b/obj/Debug/net8.0-windows/Contime.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..786f461 --- /dev/null +++ b/obj/Debug/net8.0-windows/Contime.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,22 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +build_property.TargetFramework = net8.0-windows +build_property.TargetPlatformMinVersion = 7.0 +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property.EnforceExtendedAnalyzerRules = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = Contime +build_property.ProjectDir = C:\Users\Kuro\source\repos\Contime\Contime\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/obj/Debug/net8.0-windows/Contime.GlobalUsings.g.cs b/obj/Debug/net8.0-windows/Contime.GlobalUsings.g.cs new file mode 100644 index 0000000..84bbb89 --- /dev/null +++ b/obj/Debug/net8.0-windows/Contime.GlobalUsings.g.cs @@ -0,0 +1,10 @@ +// +global using global::System; +global using global::System.Collections.Generic; +global using global::System.Drawing; +global using global::System.IO; +global using global::System.Linq; +global using global::System.Net.Http; +global using global::System.Threading; +global using global::System.Threading.Tasks; +global using global::System.Windows.Forms; diff --git a/obj/Debug/net8.0-windows/Contime.assets.cache b/obj/Debug/net8.0-windows/Contime.assets.cache new file mode 100644 index 0000000..bb9f774 Binary files /dev/null and b/obj/Debug/net8.0-windows/Contime.assets.cache differ diff --git a/obj/Debug/net8.0-windows/Contime.csproj.AssemblyReference.cache b/obj/Debug/net8.0-windows/Contime.csproj.AssemblyReference.cache new file mode 100644 index 0000000..e830c3e Binary files /dev/null and b/obj/Debug/net8.0-windows/Contime.csproj.AssemblyReference.cache differ diff --git a/obj/Debug/net8.0-windows/Contime.csproj.BuildWithSkipAnalyzers b/obj/Debug/net8.0-windows/Contime.csproj.BuildWithSkipAnalyzers new file mode 100644 index 0000000..e69de29 diff --git a/obj/Debug/net8.0-windows/Contime.csproj.CoreCompileInputs.cache b/obj/Debug/net8.0-windows/Contime.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..56e513d --- /dev/null +++ b/obj/Debug/net8.0-windows/Contime.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +ce9ca6f57e5a580c63e6dad1260e62670a985e81c819da7a71f3e24ac9686263 diff --git a/obj/Debug/net8.0-windows/Contime.csproj.FileListAbsolute.txt b/obj/Debug/net8.0-windows/Contime.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..80b6781 --- /dev/null +++ b/obj/Debug/net8.0-windows/Contime.csproj.FileListAbsolute.txt @@ -0,0 +1,62 @@ +C:\Users\Kuro\source\repos\Contime\Contime\obj\Debug\net8.0-windows\Contime..resources +C:\Users\Kuro\source\repos\Contime\Contime\obj\Debug\net8.0-windows\Contime.csproj.GenerateResource.cache +C:\Users\Kuro\source\repos\Contime\Contime\obj\Debug\net8.0-windows\Contime.GeneratedMSBuildEditorConfig.editorconfig +C:\Users\Kuro\source\repos\Contime\Contime\obj\Debug\net8.0-windows\Contime.AssemblyInfoInputs.cache +C:\Users\Kuro\source\repos\Contime\Contime\obj\Debug\net8.0-windows\Contime.AssemblyInfo.cs +C:\Users\Kuro\source\repos\Contime\Contime\obj\Debug\net8.0-windows\Contime.csproj.CoreCompileInputs.cache +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\Contime.exe +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\Contime.deps.json +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\Contime.runtimeconfig.json +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\Contime.dll +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\Contime.pdb +C:\Users\Kuro\source\repos\Contime\Contime\obj\Debug\net8.0-windows\Contime.dll +C:\Users\Kuro\source\repos\Contime\Contime\obj\Debug\net8.0-windows\refint\Contime.dll +C:\Users\Kuro\source\repos\Contime\Contime\obj\Debug\net8.0-windows\Contime.pdb +C:\Users\Kuro\source\repos\Contime\Contime\obj\Debug\net8.0-windows\Contime.genruntimeconfig.cache +C:\Users\Kuro\source\repos\Contime\Contime\obj\Debug\net8.0-windows\ref\Contime.dll +C:\Users\Kuro\source\repos\Contime\Contime\obj\Debug\net8.0-windows\Contime.csproj.AssemblyReference.cache +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\Microsoft.Data.Sqlite.dll +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\SQLitePCLRaw.core.dll +C:\Users\Kuro\source\repos\Contime\Contime\obj\Debug\net8.0-windows\Contime.view.MainForm.resources +C:\Users\Kuro\source\repos\Contime\Contime\obj\Debug\net8.0-windows\Contime.csproj.Up2Date +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\SQLitePCLRaw.batteries_v2.dll +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\SQLitePCLRaw.provider.e_sqlite3.dll +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\android-arm\native\libe_sqlite3.so +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\android-arm64\native\libe_sqlite3.so +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\android-x64\native\libe_sqlite3.so +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\android-x86\native\libe_sqlite3.so +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\browser-wasm\nativeassets\net8.0\e_sqlite3.a +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\ios-arm\native\e_sqlite3.a +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\ios-arm64\native\e_sqlite3.a +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\iossimulator-arm64\native\e_sqlite3.a +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\iossimulator-x64\native\e_sqlite3.a +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\iossimulator-x86\native\e_sqlite3.a +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\linux-arm\native\libe_sqlite3.so +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\linux-arm64\native\libe_sqlite3.so +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\linux-armel\native\libe_sqlite3.so +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\linux-mips64\native\libe_sqlite3.so +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\linux-musl-arm\native\libe_sqlite3.so +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\linux-musl-arm64\native\libe_sqlite3.so +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\linux-musl-riscv64\native\libe_sqlite3.so +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\linux-musl-s390x\native\libe_sqlite3.so +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\linux-musl-x64\native\libe_sqlite3.so +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\linux-ppc64le\native\libe_sqlite3.so +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\linux-riscv64\native\libe_sqlite3.so +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\linux-s390x\native\libe_sqlite3.so +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\linux-x64\native\libe_sqlite3.so +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\linux-x86\native\libe_sqlite3.so +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\maccatalyst-arm64\native\libe_sqlite3.dylib +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\maccatalyst-x64\native\libe_sqlite3.dylib +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\osx-arm64\native\libe_sqlite3.dylib +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\osx-x64\native\libe_sqlite3.dylib +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\win-arm64\native\e_sqlite3.dll +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\win-x64\native\e_sqlite3.dll +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\runtimes\win-x86\native\e_sqlite3.dll +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\ClosedXML.dll +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\ClosedXML.Parser.dll +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\DocumentFormat.OpenXml.dll +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\DocumentFormat.OpenXml.Framework.dll +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\ExcelNumberFormat.dll +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\RBush.dll +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\SixLabors.Fonts.dll +C:\Users\Kuro\source\repos\Contime\Contime\bin\Debug\net8.0-windows\System.IO.Packaging.dll diff --git a/obj/Debug/net8.0-windows/Contime.csproj.GenerateResource.cache b/obj/Debug/net8.0-windows/Contime.csproj.GenerateResource.cache new file mode 100644 index 0000000..0db2091 Binary files /dev/null and b/obj/Debug/net8.0-windows/Contime.csproj.GenerateResource.cache differ diff --git a/obj/Debug/net8.0-windows/Contime.csproj.Up2Date b/obj/Debug/net8.0-windows/Contime.csproj.Up2Date new file mode 100644 index 0000000..e69de29 diff --git a/obj/Debug/net8.0-windows/Contime.designer.deps.json b/obj/Debug/net8.0-windows/Contime.designer.deps.json new file mode 100644 index 0000000..895816e --- /dev/null +++ b/obj/Debug/net8.0-windows/Contime.designer.deps.json @@ -0,0 +1,57 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v8.0", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v8.0": { + "Microsoft.Data.Sqlite.Core/9.0.9": { + "dependencies": { + "SQLitePCLRaw.core": "2.1.10" + }, + "runtime": { + "lib/net8.0/Microsoft.Data.Sqlite.dll": { + "assemblyVersion": "9.0.9.0", + "fileVersion": "9.0.925.41909" + } + } + }, + "SQLitePCLRaw.core/2.1.10": { + "dependencies": { + "System.Memory": "4.5.3" + }, + "runtime": { + "lib/netstandard2.0/SQLitePCLRaw.core.dll": { + "assemblyVersion": "2.1.10.2445", + "fileVersion": "2.1.10.2445" + } + } + }, + "System.Memory/4.5.3": {} + } + }, + "libraries": { + "Microsoft.Data.Sqlite.Core/9.0.9": { + "type": "package", + "serviceable": true, + "sha512": "sha512-DjxZRueHp0qvZxhvW+H1IWYkSofZI8Chg710KYJjNP/6S4q3rt97pvR8AHOompkSwaN92VLKz5uw01iUt85cMg==", + "path": "microsoft.data.sqlite.core/9.0.9", + "hashPath": "microsoft.data.sqlite.core.9.0.9.nupkg.sha512" + }, + "SQLitePCLRaw.core/2.1.10": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Ii8JCbC7oiVclaE/mbDEK000EFIJ+ShRPwAvvV89GOZhQ+ZLtlnSWl6ksCNMKu/VGXA4Nfi2B7LhN/QFN9oBcw==", + "path": "sqlitepclraw.core/2.1.10", + "hashPath": "sqlitepclraw.core.2.1.10.nupkg.sha512" + }, + "System.Memory/4.5.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA==", + "path": "system.memory/4.5.3", + "hashPath": "system.memory.4.5.3.nupkg.sha512" + } + } +} \ No newline at end of file diff --git a/obj/Debug/net8.0-windows/Contime.designer.runtimeconfig.json b/obj/Debug/net8.0-windows/Contime.designer.runtimeconfig.json new file mode 100644 index 0000000..36dbf5a --- /dev/null +++ b/obj/Debug/net8.0-windows/Contime.designer.runtimeconfig.json @@ -0,0 +1,25 @@ +{ + "runtimeOptions": { + "tfm": "net8.0", + "frameworks": [ + { + "name": "Microsoft.NETCore.App", + "version": "8.0.0" + }, + { + "name": "Microsoft.WindowsDesktop.App", + "version": "8.0.0" + } + ], + "additionalProbingPaths": [ + "C:\\Users\\Kuro\\.dotnet\\store\\|arch|\\|tfm|", + "C:\\Users\\Kuro\\.nuget\\packages", + "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" + ], + "configProperties": { + "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": true, + "CSWINRT_USE_WINDOWS_UI_XAML_PROJECTIONS": false, + "Microsoft.NETCore.DotNetHostPolicy.SetAppPaths": true + } + } +} \ No newline at end of file diff --git a/obj/Debug/net8.0-windows/Contime.dll b/obj/Debug/net8.0-windows/Contime.dll new file mode 100644 index 0000000..d2160ef Binary files /dev/null and b/obj/Debug/net8.0-windows/Contime.dll differ diff --git a/obj/Debug/net8.0-windows/Contime.genruntimeconfig.cache b/obj/Debug/net8.0-windows/Contime.genruntimeconfig.cache new file mode 100644 index 0000000..88ca131 --- /dev/null +++ b/obj/Debug/net8.0-windows/Contime.genruntimeconfig.cache @@ -0,0 +1 @@ +f93ff7ef04113edd31491ee76e0238a402857548278367ddc880aae59f35beb5 diff --git a/obj/Debug/net8.0-windows/Contime.pdb b/obj/Debug/net8.0-windows/Contime.pdb new file mode 100644 index 0000000..af1dd8a Binary files /dev/null and b/obj/Debug/net8.0-windows/Contime.pdb differ diff --git a/obj/Debug/net8.0-windows/Contime.view.MainForm.resources b/obj/Debug/net8.0-windows/Contime.view.MainForm.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/obj/Debug/net8.0-windows/Contime.view.MainForm.resources differ diff --git a/obj/Debug/net8.0-windows/apphost.exe b/obj/Debug/net8.0-windows/apphost.exe new file mode 100644 index 0000000..21fcf6d Binary files /dev/null and b/obj/Debug/net8.0-windows/apphost.exe differ diff --git a/obj/Debug/net8.0-windows/ref/Contime.dll b/obj/Debug/net8.0-windows/ref/Contime.dll new file mode 100644 index 0000000..66569bf Binary files /dev/null and b/obj/Debug/net8.0-windows/ref/Contime.dll differ diff --git a/obj/Debug/net8.0-windows/refint/Contime.dll b/obj/Debug/net8.0-windows/refint/Contime.dll new file mode 100644 index 0000000..66569bf Binary files /dev/null and b/obj/Debug/net8.0-windows/refint/Contime.dll differ diff --git a/obj/project.assets.json b/obj/project.assets.json new file mode 100644 index 0000000..5e0d38e --- /dev/null +++ b/obj/project.assets.json @@ -0,0 +1,761 @@ +{ + "version": 3, + "targets": { + "net8.0-windows7.0": { + "ClosedXML/0.105.0": { + "type": "package", + "dependencies": { + "ClosedXML.Parser": "2.0.0", + "DocumentFormat.OpenXml": "[3.1.1, 4.0.0)", + "ExcelNumberFormat": "1.1.0", + "RBush.Signed": "4.0.0", + "SixLabors.Fonts": "1.0.0" + }, + "compile": { + "lib/netstandard2.1/ClosedXML.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/netstandard2.1/ClosedXML.dll": { + "related": ".pdb;.xml" + } + } + }, + "ClosedXML.Parser/2.0.0": { + "type": "package", + "compile": { + "lib/netstandard2.1/ClosedXML.Parser.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.1/ClosedXML.Parser.dll": { + "related": ".xml" + } + } + }, + "DocumentFormat.OpenXml/3.1.1": { + "type": "package", + "dependencies": { + "DocumentFormat.OpenXml.Framework": "3.1.1" + }, + "compile": { + "lib/net8.0/DocumentFormat.OpenXml.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/DocumentFormat.OpenXml.dll": { + "related": ".xml" + } + } + }, + "DocumentFormat.OpenXml.Framework/3.1.1": { + "type": "package", + "dependencies": { + "System.IO.Packaging": "8.0.1" + }, + "compile": { + "lib/net8.0/DocumentFormat.OpenXml.Framework.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/DocumentFormat.OpenXml.Framework.dll": { + "related": ".xml" + } + } + }, + "ExcelNumberFormat/1.1.0": { + "type": "package", + "compile": { + "lib/netstandard2.0/ExcelNumberFormat.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/ExcelNumberFormat.dll": { + "related": ".xml" + } + } + }, + "Microsoft.Data.Sqlite.Core/9.0.9": { + "type": "package", + "dependencies": { + "SQLitePCLRaw.core": "2.1.10" + }, + "compile": { + "lib/net8.0/Microsoft.Data.Sqlite.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.Data.Sqlite.dll": { + "related": ".xml" + } + } + }, + "RBush.Signed/4.0.0": { + "type": "package", + "compile": { + "lib/net8.0/RBush.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/RBush.dll": { + "related": ".xml" + } + } + }, + "SixLabors.Fonts/1.0.0": { + "type": "package", + "compile": { + "lib/netcoreapp3.1/SixLabors.Fonts.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netcoreapp3.1/SixLabors.Fonts.dll": { + "related": ".xml" + } + } + }, + "SourceGear.sqlite3/3.50.4.2": { + "type": "package", + "compile": { + "lib/netstandard2.0/_._": {} + }, + "runtime": { + "lib/netstandard2.0/_._": {} + }, + "build": { + "buildTransitive/net8.0/SourceGear.sqlite3.targets": {} + }, + "runtimeTargets": { + "runtimes/android-arm/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "android-arm" + }, + "runtimes/android-arm64/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "android-arm64" + }, + "runtimes/android-x64/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "android-x64" + }, + "runtimes/android-x86/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "android-x86" + }, + "runtimes/browser-wasm/nativeassets/net8.0/e_sqlite3.a": { + "assetType": "native", + "rid": "browser-wasm" + }, + "runtimes/ios-arm/native/e_sqlite3.a": { + "assetType": "native", + "rid": "ios-arm" + }, + "runtimes/ios-arm64/native/e_sqlite3.a": { + "assetType": "native", + "rid": "ios-arm64" + }, + "runtimes/iossimulator-arm64/native/e_sqlite3.a": { + "assetType": "native", + "rid": "iossimulator-arm64" + }, + "runtimes/iossimulator-x64/native/e_sqlite3.a": { + "assetType": "native", + "rid": "iossimulator-x64" + }, + "runtimes/iossimulator-x86/native/e_sqlite3.a": { + "assetType": "native", + "rid": "iossimulator-x86" + }, + "runtimes/linux-arm/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-arm" + }, + "runtimes/linux-arm64/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-arm64" + }, + "runtimes/linux-armel/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-armel" + }, + "runtimes/linux-mips64/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-mips64" + }, + "runtimes/linux-musl-arm/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-musl-arm" + }, + "runtimes/linux-musl-arm64/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-musl-arm64" + }, + "runtimes/linux-musl-riscv64/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-musl-riscv64" + }, + "runtimes/linux-musl-s390x/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-musl-s390x" + }, + "runtimes/linux-musl-x64/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-musl-x64" + }, + "runtimes/linux-ppc64le/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-ppc64le" + }, + "runtimes/linux-riscv64/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-riscv64" + }, + "runtimes/linux-s390x/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-s390x" + }, + "runtimes/linux-x64/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-x64" + }, + "runtimes/linux-x86/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-x86" + }, + "runtimes/maccatalyst-arm64/native/libe_sqlite3.dylib": { + "assetType": "native", + "rid": "maccatalyst-arm64" + }, + "runtimes/maccatalyst-x64/native/libe_sqlite3.dylib": { + "assetType": "native", + "rid": "maccatalyst-x64" + }, + "runtimes/osx-arm64/native/libe_sqlite3.dylib": { + "assetType": "native", + "rid": "osx-arm64" + }, + "runtimes/osx-x64/native/libe_sqlite3.dylib": { + "assetType": "native", + "rid": "osx-x64" + }, + "runtimes/win-arm64/native/e_sqlite3.dll": { + "assetType": "native", + "rid": "win-arm64" + }, + "runtimes/win-x64/native/e_sqlite3.dll": { + "assetType": "native", + "rid": "win-x64" + }, + "runtimes/win-x86/native/e_sqlite3.dll": { + "assetType": "native", + "rid": "win-x86" + } + } + }, + "SQLitePCLRaw.bundle_e_sqlite3/3.0.2": { + "type": "package", + "dependencies": { + "SQLitePCLRaw.config.e_sqlite3": "3.0.2", + "SourceGear.sqlite3": "3.50.4.2" + } + }, + "SQLitePCLRaw.config.e_sqlite3/3.0.2": { + "type": "package", + "dependencies": { + "SQLitePCLRaw.provider.e_sqlite3": "3.0.2" + }, + "compile": { + "lib/net8.0/SQLitePCLRaw.batteries_v2.dll": {} + }, + "runtime": { + "lib/net8.0/SQLitePCLRaw.batteries_v2.dll": {} + } + }, + "SQLitePCLRaw.core/3.0.2": { + "type": "package", + "dependencies": { + "System.Memory": "4.6.3" + }, + "compile": { + "lib/netstandard2.0/SQLitePCLRaw.core.dll": {} + }, + "runtime": { + "lib/netstandard2.0/SQLitePCLRaw.core.dll": {} + } + }, + "SQLitePCLRaw.provider.e_sqlite3/3.0.2": { + "type": "package", + "dependencies": { + "SQLitePCLRaw.core": "3.0.2" + }, + "compile": { + "lib/net8.0-windows7.0/SQLitePCLRaw.provider.e_sqlite3.dll": {} + }, + "runtime": { + "lib/net8.0-windows7.0/SQLitePCLRaw.provider.e_sqlite3.dll": {} + } + }, + "System.IO.Packaging/8.0.1": { + "type": "package", + "compile": { + "lib/net8.0/System.IO.Packaging.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/System.IO.Packaging.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "System.Memory/4.6.3": { + "type": "package", + "compile": { + "lib/netcoreapp2.1/_._": {} + }, + "runtime": { + "lib/netcoreapp2.1/_._": {} + } + } + } + }, + "libraries": { + "ClosedXML/0.105.0": { + "sha512": "U0hAdnYyPvF7TqHMFloxrS7pmozab79tFFF4c/bgPtqeelUs7ILpUd3r3c7C0a/DXsUZb3k1n4Pf7Q2LMyMQOg==", + "type": "package", + "path": "closedxml/0.105.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "closedxml.0.105.0.nupkg.sha512", + "closedxml.nuspec", + "lib/netstandard2.0/ClosedXML.dll", + "lib/netstandard2.0/ClosedXML.pdb", + "lib/netstandard2.0/ClosedXML.xml", + "lib/netstandard2.1/ClosedXML.dll", + "lib/netstandard2.1/ClosedXML.pdb", + "lib/netstandard2.1/ClosedXML.xml", + "nuget-logo.png" + ] + }, + "ClosedXML.Parser/2.0.0": { + "sha512": "ngTqjYreDYNytG1W5d3ewHsw0ukmmrgV7EKnS4/40rXoYZGt07jrBvo+N+GxT49rcageUMUiprV0jYT4nwVBHQ==", + "type": "package", + "path": "closedxml.parser/2.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "closedxml.parser.2.0.0.nupkg.sha512", + "closedxml.parser.nuspec", + "lib/netstandard2.0/ClosedXML.Parser.dll", + "lib/netstandard2.0/ClosedXML.Parser.xml", + "lib/netstandard2.1/ClosedXML.Parser.dll", + "lib/netstandard2.1/ClosedXML.Parser.xml" + ] + }, + "DocumentFormat.OpenXml/3.1.1": { + "sha512": "2z9QBzeTLNNKWM9SaOSDMegfQk/7hDuElOsmF77pKZMkFRP/GHA/W/4yOAQD9kn15N/FsFxHn3QVYkatuZghiA==", + "type": "package", + "path": "documentformat.openxml/3.1.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "documentformat.openxml.3.1.1.nupkg.sha512", + "documentformat.openxml.nuspec", + "icon.png", + "lib/net35/DocumentFormat.OpenXml.dll", + "lib/net35/DocumentFormat.OpenXml.xml", + "lib/net40/DocumentFormat.OpenXml.dll", + "lib/net40/DocumentFormat.OpenXml.xml", + "lib/net46/DocumentFormat.OpenXml.dll", + "lib/net46/DocumentFormat.OpenXml.xml", + "lib/net8.0/DocumentFormat.OpenXml.dll", + "lib/net8.0/DocumentFormat.OpenXml.xml", + "lib/netstandard2.0/DocumentFormat.OpenXml.dll", + "lib/netstandard2.0/DocumentFormat.OpenXml.xml" + ] + }, + "DocumentFormat.OpenXml.Framework/3.1.1": { + "sha512": "6APEp/ElZV58S/4v8mf4Ke3ONEDORs64MqdD64Z7wWpcHANB9oovQsGIwtqjnKihulOj7T0a6IxHIHOfMqKOng==", + "type": "package", + "path": "documentformat.openxml.framework/3.1.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "documentformat.openxml.framework.3.1.1.nupkg.sha512", + "documentformat.openxml.framework.nuspec", + "icon.png", + "lib/net35/DocumentFormat.OpenXml.Framework.dll", + "lib/net35/DocumentFormat.OpenXml.Framework.xml", + "lib/net40/DocumentFormat.OpenXml.Framework.dll", + "lib/net40/DocumentFormat.OpenXml.Framework.xml", + "lib/net46/DocumentFormat.OpenXml.Framework.dll", + "lib/net46/DocumentFormat.OpenXml.Framework.xml", + "lib/net6.0/DocumentFormat.OpenXml.Framework.dll", + "lib/net6.0/DocumentFormat.OpenXml.Framework.xml", + "lib/net8.0/DocumentFormat.OpenXml.Framework.dll", + "lib/net8.0/DocumentFormat.OpenXml.Framework.xml", + "lib/netstandard2.0/DocumentFormat.OpenXml.Framework.dll", + "lib/netstandard2.0/DocumentFormat.OpenXml.Framework.xml" + ] + }, + "ExcelNumberFormat/1.1.0": { + "sha512": "R3BVHPs9O+RkExbZYTGT0+9HLbi8ZrNij1Yziyw6znd3J7P3uoIR07uwTLGOogtz1p6+0sna66eBoXu7tBiVQA==", + "type": "package", + "path": "excelnumberformat/1.1.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "excelnumberformat.1.1.0.nupkg.sha512", + "excelnumberformat.nuspec", + "icon.png", + "lib/net20/ExcelNumberFormat.dll", + "lib/net20/ExcelNumberFormat.xml", + "lib/netstandard1.0/ExcelNumberFormat.dll", + "lib/netstandard1.0/ExcelNumberFormat.xml", + "lib/netstandard2.0/ExcelNumberFormat.dll", + "lib/netstandard2.0/ExcelNumberFormat.xml" + ] + }, + "Microsoft.Data.Sqlite.Core/9.0.9": { + "sha512": "DjxZRueHp0qvZxhvW+H1IWYkSofZI8Chg710KYJjNP/6S4q3rt97pvR8AHOompkSwaN92VLKz5uw01iUt85cMg==", + "type": "package", + "path": "microsoft.data.sqlite.core/9.0.9", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "PACKAGE.md", + "lib/net6.0/Microsoft.Data.Sqlite.dll", + "lib/net6.0/Microsoft.Data.Sqlite.xml", + "lib/net8.0/Microsoft.Data.Sqlite.dll", + "lib/net8.0/Microsoft.Data.Sqlite.xml", + "lib/netstandard2.0/Microsoft.Data.Sqlite.dll", + "lib/netstandard2.0/Microsoft.Data.Sqlite.xml", + "microsoft.data.sqlite.core.9.0.9.nupkg.sha512", + "microsoft.data.sqlite.core.nuspec" + ] + }, + "RBush.Signed/4.0.0": { + "sha512": "aP5KQxL5RnFNGW1f0euYVBfCatkLw5iEzMRJcXKq8LWWP4Cp3+qoSq1tDDL2vvJ2rM0ychmVMa2VaEKLS6uX4w==", + "type": "package", + "path": "rbush.signed/4.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net47/RBush.dll", + "lib/net47/RBush.xml", + "lib/net8.0/RBush.dll", + "lib/net8.0/RBush.xml", + "lib/netstandard2.0/RBush.dll", + "lib/netstandard2.0/RBush.xml", + "rbush.signed.4.0.0.nupkg.sha512", + "rbush.signed.nuspec", + "readme.md" + ] + }, + "SixLabors.Fonts/1.0.0": { + "sha512": "LFQsCZlV0xlUyXAOMUo5kkSl+8zAQXXbbdwWchtk0B4o7zotZhQsQOcJUELGHdfPfm/xDAsz6hONAuV25bJaAg==", + "type": "package", + "path": "sixlabors.fonts/1.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/netcoreapp3.1/SixLabors.Fonts.dll", + "lib/netcoreapp3.1/SixLabors.Fonts.xml", + "lib/netstandard2.0/SixLabors.Fonts.dll", + "lib/netstandard2.0/SixLabors.Fonts.xml", + "lib/netstandard2.1/SixLabors.Fonts.dll", + "lib/netstandard2.1/SixLabors.Fonts.xml", + "sixlabors.fonts.1.0.0.nupkg.sha512", + "sixlabors.fonts.128.png", + "sixlabors.fonts.nuspec" + ] + }, + "SourceGear.sqlite3/3.50.4.2": { + "sha512": "eV9HwQ88WyoU+reGVxJz1SwME9NbYnl9h2LOY15j0LGdXN4JkTJDk8JRRg/yNgt00O3Cn5/qnska10FEZNoU5g==", + "type": "package", + "path": "sourcegear.sqlite3/3.50.4.2", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "build/net471/SourceGear.sqlite3.props", + "build/net471/SourceGear.sqlite3.targets", + "buildTransitive/net471/SourceGear.sqlite3.props", + "buildTransitive/net471/SourceGear.sqlite3.targets", + "buildTransitive/net8.0/SourceGear.sqlite3.targets", + "buildTransitive/net9.0/SourceGear.sqlite3.targets", + "lib/net471/_._", + "lib/netstandard2.0/_._", + "runtimes/android-arm/native/libe_sqlite3.so", + "runtimes/android-arm64/native/libe_sqlite3.so", + "runtimes/android-x64/native/libe_sqlite3.so", + "runtimes/android-x86/native/libe_sqlite3.so", + "runtimes/browser-wasm/nativeassets/net8.0/e_sqlite3.a", + "runtimes/browser-wasm/nativeassets/net9.0/e_sqlite3.a", + "runtimes/ios-arm/native/e_sqlite3.a", + "runtimes/ios-arm64/native/e_sqlite3.a", + "runtimes/iossimulator-arm64/native/e_sqlite3.a", + "runtimes/iossimulator-x64/native/e_sqlite3.a", + "runtimes/iossimulator-x86/native/e_sqlite3.a", + "runtimes/linux-arm/native/libe_sqlite3.so", + "runtimes/linux-arm64/native/libe_sqlite3.so", + "runtimes/linux-armel/native/libe_sqlite3.so", + "runtimes/linux-mips64/native/libe_sqlite3.so", + "runtimes/linux-musl-arm/native/libe_sqlite3.so", + "runtimes/linux-musl-arm64/native/libe_sqlite3.so", + "runtimes/linux-musl-riscv64/native/libe_sqlite3.so", + "runtimes/linux-musl-s390x/native/libe_sqlite3.so", + "runtimes/linux-musl-x64/native/libe_sqlite3.so", + "runtimes/linux-ppc64le/native/libe_sqlite3.so", + "runtimes/linux-riscv64/native/libe_sqlite3.so", + "runtimes/linux-s390x/native/libe_sqlite3.so", + "runtimes/linux-x64/native/libe_sqlite3.so", + "runtimes/linux-x86/native/libe_sqlite3.so", + "runtimes/maccatalyst-arm64/native/libe_sqlite3.dylib", + "runtimes/maccatalyst-x64/native/libe_sqlite3.dylib", + "runtimes/osx-arm64/native/libe_sqlite3.dylib", + "runtimes/osx-x64/native/libe_sqlite3.dylib", + "runtimes/win-arm64/native/e_sqlite3.dll", + "runtimes/win-x64/native/e_sqlite3.dll", + "runtimes/win-x86/native/e_sqlite3.dll", + "sourcegear.sqlite3.3.50.4.2.nupkg.sha512", + "sourcegear.sqlite3.nuspec" + ] + }, + "SQLitePCLRaw.bundle_e_sqlite3/3.0.2": { + "sha512": "nzPPFpELY9U1scLvQpA1k1GIgR9ror83DCPmirT2/i5NCPdTBfhTDA6MZqFZonGDayye5mUQRQLOVyEiJNYr0g==", + "type": "package", + "path": "sqlitepclraw.bundle_e_sqlite3/3.0.2", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "sqlitepclraw.bundle_e_sqlite3.3.0.2.nupkg.sha512", + "sqlitepclraw.bundle_e_sqlite3.nuspec" + ] + }, + "SQLitePCLRaw.config.e_sqlite3/3.0.2": { + "sha512": "QPHR1Axs8YCCapb0TnmT7PxY9DX3sg4I4T9HOSKeFBiT5l482mjrOIxuyt+xOCwEQ2Enq5h0tgDOXMnJi+i0sw==", + "type": "package", + "path": "sqlitepclraw.config.e_sqlite3/3.0.2", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "lib/net471/SQLitePCLRaw.batteries_v2.dll", + "lib/net8.0-ios18.0/SQLitePCLRaw.batteries_v2.dll", + "lib/net8.0-maccatalyst18.0/SQLitePCLRaw.batteries_v2.dll", + "lib/net8.0-tvos18.0/SQLitePCLRaw.batteries_v2.dll", + "lib/net8.0/SQLitePCLRaw.batteries_v2.dll", + "lib/netstandard2.0/SQLitePCLRaw.batteries_v2.dll", + "sqlitepclraw.config.e_sqlite3.3.0.2.nupkg.sha512", + "sqlitepclraw.config.e_sqlite3.nuspec" + ] + }, + "SQLitePCLRaw.core/3.0.2": { + "sha512": "tnbRf0muOOSJK1RLCfyYK13jynFScgL4xMj7yC3oy8lrrGKXTKmOoWjfdV+cFfBRdppm4qST31hvp8ihgIgvMQ==", + "type": "package", + "path": "sqlitepclraw.core/3.0.2", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "lib/netstandard2.0/SQLitePCLRaw.core.dll", + "sqlitepclraw.core.3.0.2.nupkg.sha512", + "sqlitepclraw.core.nuspec" + ] + }, + "SQLitePCLRaw.provider.e_sqlite3/3.0.2": { + "sha512": "RQIliDp47mQxGYNcBB6W+ezHbegkImrSZVTuWjQCSTTl3pQ37Q3rALkkkdTAMEmcIz71PEOCqNZMp7lXCnVqEQ==", + "type": "package", + "path": "sqlitepclraw.provider.e_sqlite3/3.0.2", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net471/SQLitePCLRaw.provider.e_sqlite3.dll", + "lib/net8.0-windows7.0/SQLitePCLRaw.provider.e_sqlite3.dll", + "lib/net8.0/SQLitePCLRaw.provider.e_sqlite3.dll", + "lib/netstandard2.0/SQLitePCLRaw.provider.e_sqlite3.dll", + "sqlitepclraw.provider.e_sqlite3.3.0.2.nupkg.sha512", + "sqlitepclraw.provider.e_sqlite3.nuspec" + ] + }, + "System.IO.Packaging/8.0.1": { + "sha512": "KYkIOAvPexQOLDxPO2g0BVoWInnQhPpkFzRqvNrNrMhVT6kqhVr0zEb6KCHlptLFukxnZrjuMVAnxK7pOGUYrw==", + "type": "package", + "path": "system.io.packaging/8.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.IO.Packaging.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.IO.Packaging.targets", + "lib/net462/System.IO.Packaging.dll", + "lib/net462/System.IO.Packaging.xml", + "lib/net6.0/System.IO.Packaging.dll", + "lib/net6.0/System.IO.Packaging.xml", + "lib/net7.0/System.IO.Packaging.dll", + "lib/net7.0/System.IO.Packaging.xml", + "lib/net8.0/System.IO.Packaging.dll", + "lib/net8.0/System.IO.Packaging.xml", + "lib/netstandard2.0/System.IO.Packaging.dll", + "lib/netstandard2.0/System.IO.Packaging.xml", + "system.io.packaging.8.0.1.nupkg.sha512", + "system.io.packaging.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Memory/4.6.3": { + "sha512": "qdcDOgnFZY40+Q9876JUHnlHu7bosOHX8XISRoH94fwk6hgaeQGSgfZd8srWRZNt5bV9ZW2TljcegDNxsf+96A==", + "type": "package", + "path": "system.memory/4.6.3", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "PACKAGE.md", + "buildTransitive/net461/System.Memory.targets", + "buildTransitive/net462/_._", + "lib/net462/System.Memory.dll", + "lib/net462/System.Memory.xml", + "lib/netcoreapp2.1/_._", + "lib/netstandard2.0/System.Memory.dll", + "lib/netstandard2.0/System.Memory.xml", + "lib/netstandard2.1/_._", + "system.memory.4.6.3.nupkg.sha512", + "system.memory.nuspec" + ] + } + }, + "projectFileDependencyGroups": { + "net8.0-windows7.0": [ + "ClosedXML >= 0.105.0", + "Microsoft.Data.Sqlite.Core >= 9.0.9", + "SQLitePCLRaw.bundle_e_sqlite3 >= 3.0.2" + ] + }, + "packageFolders": { + "C:\\Users\\Kuro\\.nuget\\packages\\": {}, + "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "C:\\Users\\Kuro\\source\\repos\\Contime\\Contime\\Contime.csproj", + "projectName": "Contime", + "projectPath": "C:\\Users\\Kuro\\source\\repos\\Contime\\Contime\\Contime.csproj", + "packagesPath": "C:\\Users\\Kuro\\.nuget\\packages\\", + "outputPath": "C:\\Users\\Kuro\\source\\repos\\Contime\\Contime\\obj\\", + "projectStyle": "PackageReference", + "fallbackFolders": [ + "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" + ], + "configFilePaths": [ + "C:\\Users\\Kuro\\AppData\\Roaming\\NuGet\\NuGet.Config", + "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", + "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" + ], + "originalTargetFrameworks": [ + "net8.0-windows" + ], + "sources": { + "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "9.0.100" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "ClosedXML": { + "target": "Package", + "version": "[0.105.0, )" + }, + "Microsoft.Data.Sqlite.Core": { + "target": "Package", + "version": "[9.0.9, )" + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "target": "Package", + "version": "[3.0.2, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Ref", + "version": "[8.0.20, 8.0.20]" + }, + { + "name": "Microsoft.NETCore.App.Host.win-x64", + "version": "[8.0.20, 8.0.20]" + }, + { + "name": "Microsoft.NETCore.App.Ref", + "version": "[8.0.20, 8.0.20]" + }, + { + "name": "Microsoft.WindowsDesktop.App.Ref", + "version": "[8.0.20, 8.0.20]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App.WindowsForms": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.110/PortableRuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/obj/project.nuget.cache b/obj/project.nuget.cache new file mode 100644 index 0000000..93a47cd --- /dev/null +++ b/obj/project.nuget.cache @@ -0,0 +1,28 @@ +{ + "version": 2, + "dgSpecHash": "jfRWXIbDBG0=", + "success": true, + "projectFilePath": "C:\\Users\\Kuro\\source\\repos\\Contime\\Contime\\Contime.csproj", + "expectedPackageFiles": [ + "C:\\Users\\Kuro\\.nuget\\packages\\closedxml\\0.105.0\\closedxml.0.105.0.nupkg.sha512", + "C:\\Users\\Kuro\\.nuget\\packages\\closedxml.parser\\2.0.0\\closedxml.parser.2.0.0.nupkg.sha512", + "C:\\Users\\Kuro\\.nuget\\packages\\documentformat.openxml\\3.1.1\\documentformat.openxml.3.1.1.nupkg.sha512", + "C:\\Users\\Kuro\\.nuget\\packages\\documentformat.openxml.framework\\3.1.1\\documentformat.openxml.framework.3.1.1.nupkg.sha512", + "C:\\Users\\Kuro\\.nuget\\packages\\excelnumberformat\\1.1.0\\excelnumberformat.1.1.0.nupkg.sha512", + "C:\\Users\\Kuro\\.nuget\\packages\\microsoft.data.sqlite.core\\9.0.9\\microsoft.data.sqlite.core.9.0.9.nupkg.sha512", + "C:\\Users\\Kuro\\.nuget\\packages\\rbush.signed\\4.0.0\\rbush.signed.4.0.0.nupkg.sha512", + "C:\\Users\\Kuro\\.nuget\\packages\\sixlabors.fonts\\1.0.0\\sixlabors.fonts.1.0.0.nupkg.sha512", + "C:\\Users\\Kuro\\.nuget\\packages\\sourcegear.sqlite3\\3.50.4.2\\sourcegear.sqlite3.3.50.4.2.nupkg.sha512", + "C:\\Users\\Kuro\\.nuget\\packages\\sqlitepclraw.bundle_e_sqlite3\\3.0.2\\sqlitepclraw.bundle_e_sqlite3.3.0.2.nupkg.sha512", + "C:\\Users\\Kuro\\.nuget\\packages\\sqlitepclraw.config.e_sqlite3\\3.0.2\\sqlitepclraw.config.e_sqlite3.3.0.2.nupkg.sha512", + "C:\\Users\\Kuro\\.nuget\\packages\\sqlitepclraw.core\\3.0.2\\sqlitepclraw.core.3.0.2.nupkg.sha512", + "C:\\Users\\Kuro\\.nuget\\packages\\sqlitepclraw.provider.e_sqlite3\\3.0.2\\sqlitepclraw.provider.e_sqlite3.3.0.2.nupkg.sha512", + "C:\\Users\\Kuro\\.nuget\\packages\\system.io.packaging\\8.0.1\\system.io.packaging.8.0.1.nupkg.sha512", + "C:\\Users\\Kuro\\.nuget\\packages\\system.memory\\4.6.3\\system.memory.4.6.3.nupkg.sha512", + "C:\\Users\\Kuro\\.nuget\\packages\\microsoft.windowsdesktop.app.ref\\8.0.20\\microsoft.windowsdesktop.app.ref.8.0.20.nupkg.sha512", + "C:\\Users\\Kuro\\.nuget\\packages\\microsoft.netcore.app.ref\\8.0.20\\microsoft.netcore.app.ref.8.0.20.nupkg.sha512", + "C:\\Users\\Kuro\\.nuget\\packages\\microsoft.aspnetcore.app.ref\\8.0.20\\microsoft.aspnetcore.app.ref.8.0.20.nupkg.sha512", + "C:\\Users\\Kuro\\.nuget\\packages\\microsoft.netcore.app.host.win-x64\\8.0.20\\microsoft.netcore.app.host.win-x64.8.0.20.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/view/MainForm.Designer.cs b/view/MainForm.Designer.cs new file mode 100644 index 0000000..1ff17a0 --- /dev/null +++ b/view/MainForm.Designer.cs @@ -0,0 +1,267 @@ +namespace Contime.view { + partial class MainForm { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); + this.SuspendLayout(); + // + // MainForm + // + this.Text = "Contime - Your Contextual Timer"; + this.Size = new System.Drawing.Size(550, 700); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.MaximizeBox = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(45)))), ((int)(((byte)(45)))), ((int)(((byte)(48))))); + this.ForeColor = System.Drawing.Color.White; + this.Font = new System.Drawing.Font("Segoe UI", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + + // --- Controls --- + this.lblStatus = new System.Windows.Forms.Label(); + this.lblWorkdayTimer = new System.Windows.Forms.Label(); + this.lblTaskTimer = new System.Windows.Forms.Label(); + this.lblSelectedTaskHeader = new System.Windows.Forms.Label(); + this.lblSelectedTask = new System.Windows.Forms.Label(); + this.lblSelectedTaskTotalTime = new System.Windows.Forms.Label(); + this.btnWorkdayStartStop = new System.Windows.Forms.Button(); + this.btnTaskStartStop = new System.Windows.Forms.Button(); + this.btnGoOutOfContext = new System.Windows.Forms.Button(); + this.btnToggleTaskStatus = new System.Windows.Forms.Button(); + this.grpCreateTask = new System.Windows.Forms.GroupBox(); + this.txtNewTask = new System.Windows.Forms.TextBox(); + this.btnAddTask = new System.Windows.Forms.Button(); + this.lstTasks = new System.Windows.Forms.ListView(); + this.txtContext = new System.Windows.Forms.TextBox(); + this.btnSaveContext = new System.Windows.Forms.Button(); + this.grpSummary = new System.Windows.Forms.GroupBox(); + this.lblDayTotal = new System.Windows.Forms.Label(); + this.lblWeekTotal = new System.Windows.Forms.Label(); + this.btnExport = new System.Windows.Forms.Button(); + this.notifyIcon = new System.Windows.Forms.NotifyIcon(this.components); + + + // --- Column 1: Workday Controls --- + var lblStatusHeader = new System.Windows.Forms.Label { Text = "Current Status", Location = new System.Drawing.Point(20, 20), AutoSize = true }; + this.Controls.Add(lblStatusHeader); + lblStatus.Text = "Idle"; + lblStatus.Location = new System.Drawing.Point(20, 45); + lblStatus.AutoSize = true; + lblStatus.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Bold); + this.Controls.Add(lblStatus); + + var lblWorkdayTimerHeader = new System.Windows.Forms.Label { Text = "Workday Timer", Location = new System.Drawing.Point(20, 90), AutoSize = true }; + this.Controls.Add(lblWorkdayTimerHeader); + lblWorkdayTimer.Text = "00:00:00"; + lblWorkdayTimer.Location = new System.Drawing.Point(20, 115); + lblWorkdayTimer.AutoSize = true; + lblWorkdayTimer.Font = new System.Drawing.Font("Consolas", 18F, System.Drawing.FontStyle.Bold); + this.Controls.Add(lblWorkdayTimer); + + btnWorkdayStartStop.Text = "Start Workday"; + btnWorkdayStartStop.Location = new System.Drawing.Point(20, 160); + btnWorkdayStartStop.Size = new System.Drawing.Size(240, 30); + btnWorkdayStartStop.BackColor = System.Drawing.Color.FromArgb(0, 122, 204); + btnWorkdayStartStop.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + btnWorkdayStartStop.FlatAppearance.BorderSize = 0; + btnWorkdayStartStop.Click += (s, e) => WorkdayStartStopClicked?.Invoke(); + this.Controls.Add(btnWorkdayStartStop); + + btnGoOutOfContext.Text = "Go Out of Context"; + btnGoOutOfContext.Location = new System.Drawing.Point(20, 200); + btnGoOutOfContext.Size = new System.Drawing.Size(240, 30); + btnGoOutOfContext.BackColor = System.Drawing.Color.FromArgb(80, 80, 80); + btnGoOutOfContext.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + btnGoOutOfContext.Enabled = false; + btnGoOutOfContext.FlatAppearance.BorderSize = 0; + btnGoOutOfContext.Click += (s, e) => GoOutOfContextClicked?.Invoke(); + this.Controls.Add(btnGoOutOfContext); + + // --- Column 2: Task Controls --- + lblSelectedTaskHeader.Text = "Selected Task"; + lblSelectedTaskHeader.Location = new System.Drawing.Point(280, 20); + lblSelectedTaskHeader.AutoSize = true; + this.Controls.Add(lblSelectedTaskHeader); + + lblSelectedTask.Text = "None"; + lblSelectedTask.Location = new System.Drawing.Point(280, 45); + lblSelectedTask.Size = new System.Drawing.Size(240, 20); + lblSelectedTask.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Bold); + lblSelectedTask.ForeColor = System.Drawing.Color.LightSkyBlue; + this.Controls.Add(lblSelectedTask); + + var lblTaskTimerHeader = new System.Windows.Forms.Label { Text = "Task Timer", Location = new System.Drawing.Point(280, 90), AutoSize = true }; + this.Controls.Add(lblTaskTimerHeader); + lblTaskTimer.Text = "00:00:00"; + lblTaskTimer.Location = new System.Drawing.Point(280, 115); + lblTaskTimer.AutoSize = true; + lblTaskTimer.Font = new System.Drawing.Font("Consolas", 18F, System.Drawing.FontStyle.Bold); + this.Controls.Add(lblTaskTimer); + + var lblSelectedTaskTotalTimeHeader = new System.Windows.Forms.Label { Text = "Total Task Time", Location = new System.Drawing.Point(280, 145), AutoSize = true, Font = new System.Drawing.Font("Segoe UI", 8F) }; + this.Controls.Add(lblSelectedTaskTotalTimeHeader); + lblSelectedTaskTotalTime.Text = "00:00:00"; + lblSelectedTaskTotalTime.Location = new System.Drawing.Point(400, 145); + lblSelectedTaskTotalTime.AutoSize = true; + lblSelectedTaskTotalTime.Font = new System.Drawing.Font("Consolas", 10F); + this.Controls.Add(lblSelectedTaskTotalTime); + + + btnTaskStartStop.Text = "Start Task"; + btnTaskStartStop.Location = new System.Drawing.Point(280, 160); + btnTaskStartStop.Size = new System.Drawing.Size(240, 30); + btnTaskStartStop.BackColor = System.Drawing.Color.FromArgb(40, 167, 69); + btnTaskStartStop.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + btnTaskStartStop.Enabled = false; + btnTaskStartStop.FlatAppearance.BorderSize = 0; + btnTaskStartStop.Click += (s, e) => TaskStartStopClicked?.Invoke(); + this.Controls.Add(btnTaskStartStop); + + btnToggleTaskStatus.Text = "Mark as Finished"; + btnToggleTaskStatus.Location = new System.Drawing.Point(280, 200); + btnToggleTaskStatus.Size = new System.Drawing.Size(240, 30); + btnToggleTaskStatus.BackColor = System.Drawing.Color.FromArgb(80, 80, 80); + btnToggleTaskStatus.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + btnToggleTaskStatus.Enabled = false; + btnToggleTaskStatus.FlatAppearance.BorderSize = 0; + btnToggleTaskStatus.Click += (s, e) => ToggleTaskStatusClicked?.Invoke(); + this.Controls.Add(btnToggleTaskStatus); + + // --- Task List --- + lstTasks.Location = new System.Drawing.Point(20, 245); + lstTasks.Size = new System.Drawing.Size(500, 200); + lstTasks.View = System.Windows.Forms.View.Details; + lstTasks.BackColor = System.Drawing.Color.FromArgb(30, 30, 30); + lstTasks.ForeColor = System.Drawing.Color.White; + lstTasks.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + lstTasks.FullRowSelect = true; + lstTasks.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + lstTasks.MultiSelect = false; + lstTasks.HideSelection = false; + lstTasks.Columns.Add("Task", 240, System.Windows.Forms.HorizontalAlignment.Left); + lstTasks.Columns.Add("Total Time", 120, System.Windows.Forms.HorizontalAlignment.Left); + lstTasks.Columns.Add("Status", 120, System.Windows.Forms.HorizontalAlignment.Left); + lstTasks.SelectedIndexChanged += new System.EventHandler(this.LstTasks_SelectedIndexChanged); + lstTasks.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.LstTasks_MouseDoubleClick); + this.Controls.Add(lstTasks); + + // --- Create Task --- + grpCreateTask.Text = "Create Task"; + grpCreateTask.Location = new System.Drawing.Point(20, 455); + grpCreateTask.Size = new System.Drawing.Size(500, 70); + grpCreateTask.ForeColor = System.Drawing.Color.White; + this.Controls.Add(grpCreateTask); + + txtNewTask.Location = new System.Drawing.Point(15, 30); + txtNewTask.Size = new System.Drawing.Size(350, 25); + txtNewTask.TextChanged += (s, e) => { btnAddTask.Enabled = !string.IsNullOrWhiteSpace(txtNewTask.Text); }; + grpCreateTask.Controls.Add(txtNewTask); + + btnAddTask.Text = "Add Task"; + btnAddTask.Location = new System.Drawing.Point(375, 29); + btnAddTask.Size = new System.Drawing.Size(110, 27); + btnAddTask.BackColor = System.Drawing.Color.FromArgb(80, 80, 80); + btnAddTask.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + btnAddTask.FlatAppearance.BorderSize = 0; + btnAddTask.Click += (s, e) => { AddTaskClicked?.Invoke(); txtNewTask.Clear(); }; + grpCreateTask.Controls.Add(btnAddTask); + + // --- Summary and Export --- + grpSummary.Text = "Summary"; + grpSummary.Location = new System.Drawing.Point(20, 535); + grpSummary.Size = new System.Drawing.Size(500, 110); + grpSummary.ForeColor = System.Drawing.Color.White; + this.Controls.Add(grpSummary); + + lblDayTotal.Text = "Today: 00:00:00"; + lblDayTotal.Location = new System.Drawing.Point(15, 30); + lblDayTotal.AutoSize = true; + lblDayTotal.Font = new System.Drawing.Font("Segoe UI", 10F); + grpSummary.Controls.Add(lblDayTotal); + + lblWeekTotal.Text = "This Week: 00:00:00"; + lblWeekTotal.Location = new System.Drawing.Point(15, 60); + lblWeekTotal.AutoSize = true; + lblWeekTotal.Font = new System.Drawing.Font("Segoe UI", 10F); + grpSummary.Controls.Add(lblWeekTotal); + + btnExport.Text = "Export to Excel"; + btnExport.Location = new System.Drawing.Point(320, 40); + btnExport.Size = new System.Drawing.Size(165, 40); + btnExport.BackColor = System.Drawing.Color.FromArgb(10, 100, 10); + btnExport.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + btnExport.FlatAppearance.BorderSize = 0; + btnExport.Click += new System.EventHandler(this.BtnExport_Click); + grpSummary.Controls.Add(btnExport); + + // --- Context Input (Hidden by default) --- + txtContext.Location = new System.Drawing.Point(20, 650); // Moved down + txtContext.Size = new System.Drawing.Size(390, 25); + txtContext.Visible = false; + this.Controls.Add(txtContext); + btnSaveContext.Text = "Save Context"; + btnSaveContext.Location = new System.Drawing.Point(420, 649); // Moved down + btnSaveContext.Size = new System.Drawing.Size(100, 27); + btnSaveContext.BackColor = System.Drawing.Color.FromArgb(80, 80, 80); + btnSaveContext.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + btnSaveContext.Visible = false; + btnSaveContext.FlatAppearance.BorderSize = 0; + btnSaveContext.Click += (s, e) => SaveContextClicked?.Invoke(); + this.Controls.Add(btnSaveContext); + + // --- Notify Icon --- + this.notifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.notifyIcon.Text = "Contime"; + this.notifyIcon.Visible = true; + + this.ResumeLayout(false); + this.PerformLayout(); + } + + #endregion + + private System.Windows.Forms.Label lblStatus; + private System.Windows.Forms.Label lblWorkdayTimer; + private System.Windows.Forms.Label lblTaskTimer; + private System.Windows.Forms.Label lblSelectedTaskHeader; + private System.Windows.Forms.Label lblSelectedTask; + private System.Windows.Forms.Label lblSelectedTaskTotalTime; + private System.Windows.Forms.Button btnWorkdayStartStop; + private System.Windows.Forms.Button btnTaskStartStop; + private System.Windows.Forms.Button btnGoOutOfContext; + private System.Windows.Forms.Button btnToggleTaskStatus; + private System.Windows.Forms.GroupBox grpCreateTask; + private System.Windows.Forms.TextBox txtNewTask; + private System.Windows.Forms.Button btnAddTask; + private System.Windows.Forms.ListView lstTasks; + private System.Windows.Forms.TextBox txtContext; + private System.Windows.Forms.Button btnSaveContext; + private System.Windows.Forms.GroupBox grpSummary; + private System.Windows.Forms.Label lblDayTotal; + private System.Windows.Forms.Label lblWeekTotal; + private System.Windows.Forms.Button btnExport; + private System.Windows.Forms.NotifyIcon notifyIcon; + } +} + diff --git a/view/MainForm.cs b/view/MainForm.cs new file mode 100644 index 0000000..8f26868 --- /dev/null +++ b/view/MainForm.cs @@ -0,0 +1,145 @@ +using Contime.model; + +namespace Contime.view { + public partial class MainForm : Form { + // --- Events for the Controller --- + public event Action WorkdayStartStopClicked; + public event Action TaskStartStopClicked; + public event Action GoOutOfContextClicked; + public event Action ToggleTaskStatusClicked; + public event Action AddTaskClicked; + public event Action TaskSelected; + public event Action SaveContextClicked; + public event Action ExportClicked; + + // --- Properties for the Controller --- + public string NewTaskName => txtNewTask.Text; + public string ContextText { get => txtContext.Text; set => txtContext.Text = value; } + + public MainForm() { + InitializeComponent(); + } + + // Handles full UI redraws, especially for the task list and summary data + public void UpdateView(TimeTrackerModel model) { + this.SuspendLayout(); + + UpdateTaskList(model); + UpdateSummaryStats(model); + UpdateTimersAndState(model); // Also call the lighter update to ensure consistency + + this.ResumeLayout(); + } + + // Handles high-frequency updates (timers, button states) + public void UpdateTimersAndState(TimeTrackerModel model) { + lblWorkdayTimer.Text = model.WorkdayTime.ToString(@"hh\:mm\:ss"); + lblTaskTimer.Text = model.ActiveTaskTime.ToString(@"hh\:mm\:ss"); + lblSelectedTaskTotalTime.Text = model.SelectedTaskTotalTime.ToString(@"hh\:mm\:ss"); + + lblStatus.Text = GetStatusText(model.CurrentState); + lblStatus.ForeColor = GetStatusColor(model.CurrentState); + + lblSelectedTask.Text = model.SelectedTask?.Name ?? "None"; + + // --- Update Button States and Text --- + btnWorkdayStartStop.Text = (model.CurrentState == TimeTrackerModel.AppState.Idle) ? "Start Workday" : "Stop Workday"; + btnWorkdayStartStop.BackColor = (model.CurrentState == TimeTrackerModel.AppState.Idle) ? Color.FromArgb(0, 122, 204) : Color.FromArgb(192, 0, 0); + + btnGoOutOfContext.Enabled = model.CurrentState != TimeTrackerModel.AppState.Idle; + btnGoOutOfContext.Text = (model.CurrentState == TimeTrackerModel.AppState.OutOfContext) ? "Return to Work" : "Go Out of Context"; + + bool taskIsSelectedAndOpen = model.SelectedTask != null && model.SelectedTask.Status == "open"; + bool canStartTask = model.CurrentState == TimeTrackerModel.AppState.WorkdayActive && taskIsSelectedAndOpen; + btnTaskStartStop.Enabled = canStartTask || model.CurrentState == TimeTrackerModel.AppState.TaskActive; + btnTaskStartStop.Text = (model.CurrentState == TimeTrackerModel.AppState.TaskActive) ? "Stop Task" : "Start Task"; + btnTaskStartStop.BackColor = (model.CurrentState == TimeTrackerModel.AppState.TaskActive) ? Color.FromArgb(220, 53, 69) : Color.FromArgb(40, 167, 69); + + btnToggleTaskStatus.Enabled = model.SelectedTask != null && model.CurrentState != TimeTrackerModel.AppState.TaskActive; + btnToggleTaskStatus.Text = model.SelectedTask?.Status == "open" ? "Mark as Finished" : "Re-open Task"; + + lstTasks.Enabled = model.CurrentState != TimeTrackerModel.AppState.TaskActive; + + // Show or hide the 'Out of Context' input fields + bool outOfContext = model.CurrentState == TimeTrackerModel.AppState.OutOfContext; + txtContext.Visible = outOfContext; + btnSaveContext.Visible = outOfContext; + if (outOfContext) ContextText = model.OutOfContextReason; + } + + private void UpdateSummaryStats(TimeTrackerModel model) { + lblDayTotal.Text = $"Today: {model.DayTotal:hh\\:mm\\:ss}"; + lblWeekTotal.Text = $"This Week: {model.WeekTotal:hh\\:mm\\:ss}"; + } + + private void LstTasks_SelectedIndexChanged(object sender, EventArgs e) { + if (lstTasks.SelectedItems.Count > 0) + TaskSelected?.Invoke((long)lstTasks.SelectedItems[0].Tag); + else + TaskSelected?.Invoke(-1); + } + + private void LstTasks_MouseDoubleClick(object sender, MouseEventArgs e) { + if (lstTasks.SelectedItems.Count == 1) { + var selectedItem = lstTasks.SelectedItems[0]; + string taskName = selectedItem.SubItems[0].Text; + string totalTime = selectedItem.SubItems[1].Text; + string status = selectedItem.SubItems[2].Text; + + string message = $"Task: {taskName}\nTotal Time: {totalTime}\nStatus: {status}"; + MessageBox.Show(message, "Task Details", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + + private void UpdateTaskList(TimeTrackerModel model) { + lstTasks.SelectedIndexChanged -= LstTasks_SelectedIndexChanged; // Unsubscribe to prevent feedback loop + + long? selectedTaskId = model.SelectedTask?.Id; + lstTasks.Items.Clear(); + + foreach (var task in model.Tasks) { + var item = new ListViewItem(new[] { task.Name, task.ElapsedTime.ToString(@"hh\:mm\:ss"), task.Status }) { + Tag = task.Id, + ForeColor = task.Status == "closed" ? Color.Gray : Color.White + }; + lstTasks.Items.Add(item); + if (task.Id == selectedTaskId) { + item.Selected = true; + } + } + + lstTasks.SelectedIndexChanged += LstTasks_SelectedIndexChanged; // Re-subscribe + } + + private string GetStatusText(TimeTrackerModel.AppState state) { + switch (state) { + case TimeTrackerModel.AppState.Idle: return "Idle"; + case TimeTrackerModel.AppState.WorkdayActive: return "Workday Active"; + case TimeTrackerModel.AppState.TaskActive: return "Task in Progress"; + case TimeTrackerModel.AppState.OutOfContext: return "Out of Context"; + default: return "Unknown"; + } + } + + private Color GetStatusColor(TimeTrackerModel.AppState state) { + switch (state) { + case TimeTrackerModel.AppState.Idle: return Color.White; + case TimeTrackerModel.AppState.WorkdayActive: return Color.LightSkyBlue; + case TimeTrackerModel.AppState.TaskActive: return Color.LightGreen; + case TimeTrackerModel.AppState.OutOfContext: return Color.Orange; + default: return Color.White; + } + } + + public void ShowNotification(string title, string message) { + notifyIcon.BalloonTipTitle = title; + notifyIcon.BalloonTipText = message; + notifyIcon.ShowBalloonTip(3000); + } + + private void BtnExport_Click(object sender, EventArgs e) { + ExportClicked?.Invoke(); + } + } +} + diff --git a/view/MainForm.resx b/view/MainForm.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/view/MainForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file