first commit
This commit is contained in:
commit
46f2a04d49
|
|
@ -0,0 +1,120 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<TargetFramework>net8.0-windows</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<UseWindowsForms>true</UseWindowsForms>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="ClosedXML" Version="0.105.0" />
|
||||
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="9.0.9" />
|
||||
<PackageReference Include="SQLitePCLRaw.bundle_e_sqlite3" Version="3.0.2" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Compile Update="view\MainForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
using Contime.controller;
|
||||
using Contime.data;
|
||||
using Contime.model;
|
||||
using Contime.view;
|
||||
|
||||
namespace Contime {
|
||||
internal static class Program {
|
||||
/// <summary>
|
||||
/// The main entry point for the application.
|
||||
/// </summary>
|
||||
[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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Binary file not shown.
Binary file not shown.
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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<TaskItem> GetAllTasks() {
|
||||
var tasks = new List<TaskItem>();
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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<TaskItem> Tasks { get; private set; } = new List<TaskItem>();
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
|
||||
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
|
||||
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
|
||||
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
|
||||
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\Kuro\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages</NuGetPackageFolders>
|
||||
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
|
||||
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.12.2</NuGetToolVersion>
|
||||
</PropertyGroup>
|
||||
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||
<SourceRoot Include="C:\Users\Kuro\.nuget\packages\" />
|
||||
<SourceRoot Include="C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages\" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||
<Import Project="$(NuGetPackageRoot)sourcegear.sqlite3\3.50.4.2\buildTransitive\net8.0\SourceGear.sqlite3.targets" Condition="Exists('$(NuGetPackageRoot)sourcegear.sqlite3\3.50.4.2\buildTransitive\net8.0\SourceGear.sqlite3.targets')" />
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
// <autogenerated />
|
||||
using System;
|
||||
using System.Reflection;
|
||||
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]
|
||||
Binary file not shown.
|
|
@ -0,0 +1,25 @@
|
|||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// 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.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
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.
|
||||
|
||||
|
|
@ -0,0 +1 @@
|
|||
3ffb2cae8cb0c711b7ff238181cd8317709c8def5cf5b95abdf892a8b042687d
|
||||
|
|
@ -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 =
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
// <auto-generated/>
|
||||
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;
|
||||
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
ce9ca6f57e5a580c63e6dad1260e62670a985e81c819da7a71f3e24ac9686263
|
||||
|
|
@ -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
|
||||
Binary file not shown.
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
|||
f93ff7ef04113edd31491ee76e0238a402857548278367ddc880aae59f35beb5
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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": []
|
||||
}
|
||||
|
|
@ -0,0 +1,267 @@
|
|||
namespace Contime.view {
|
||||
partial class MainForm {
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing) {
|
||||
if (disposing && (components != null)) {
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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<long> 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,120 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
Loading…
Reference in New Issue