diff --git a/.vscode/launch.json b/.vscode/launch.json index 9f5b364..6f7a0fb 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -23,10 +23,15 @@ "request": "launch", "name": "Tauri Production Debug", "cargo": { - "args": ["build", "--release", "--manifest-path=./src-tauri/Cargo.toml"] + "args": [ + "build", + "--release", + "--manifest-path=./src-tauri/Cargo.toml" + ] }, // task for the `beforeBuildCommand` if used, must be configured in `.vscode/tasks.json` "preLaunchTask": "ui:build" - } + }, ] - } \ No newline at end of file + } + \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json index ed1ada8..a8e2133 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -3,30 +3,43 @@ // for the documentation about the tasks.json format "version": "2.0.0", "tasks": [ + { + "label": "tauri:dev", + "type": "shell", + "command": "cargo", + "problemMatcher": [], + "args": [ + "tauri", + "dev" + ], + "icon": { + "id": "run" + }, + }, { "label": "ui:dev", "type": "shell", - // `dev` keeps running in the background - // ideally you should also configure a `problemMatcher` - // see https://code.visualstudio.com/docs/editor/tasks#_can-a-background-task-be-used-as-a-prelaunchtask-in-launchjson "isBackground": true, - // change this to your `beforeDevCommand`: "command": "npm", - "args": ["run", "dev"] + "problemMatcher": [], + "args": [ + "run", + "dev", + "--", + "--clearScreen", + "false" + ] }, { "label": "ui:build", + "group": "build", "type": "shell", - // change this to your `beforeBuildCommand`: "command": "npm", - "args": ["run", "build"], - }, - { - "label": "full:dev", - "type": "shell", - "isBackground": true, - "command": "cargo", - "args": ["tauri", "dev"] + "problemMatcher": [], + "args": [ + "run", + "build" + ] } - ] - } \ No newline at end of file + ], + } diff --git a/README.md b/README.md index c4a8ae9..ad2b1df 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,14 @@ A basic timer for my broken brain. +## Acknowledgements + +- Potato icon from https://github.com/googlefonts/noto-emoji + +## Forking + +I'm developing this for myself, and have limited goals. + ## License Copyright (C) 2022 ModZero diff --git a/index.html b/index.html index b5b1252..a027cd0 100644 --- a/index.html +++ b/index.html @@ -2,9 +2,9 @@ - + - Vite + Svelte + TS + Ziemniak
diff --git a/package-lock.json b/package-lock.json index f598173..6cb4be3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,6 +7,7 @@ "": { "name": "ziemniak", "version": "0.0.0", + "license": "AGPL-3.0-or-later", "dependencies": { "@tauri-apps/api": "^1.0.2" }, @@ -14,6 +15,8 @@ "@sveltejs/vite-plugin-svelte": "^1.0.1", "@tauri-apps/cli": "^1.0.5", "@tsconfig/svelte": "^3.0.0", + "@types/luxon": "^3.0.0", + "luxon": "^3.0.1", "svelte": "^3.49.0", "svelte-check": "^2.8.0", "svelte-preprocess": "^4.10.7", @@ -313,6 +316,12 @@ "integrity": "sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg==", "dev": true }, + "node_modules/@types/luxon": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.0.0.tgz", + "integrity": "sha512-Lx+EZoJxUKw4dp8uei9XiUVNlgkYmax5+ovqt6Xf3LzJOnWhlfJw/jLBmqfGVwOP/pDr4HT8bI1WtxK0IChMLw==", + "dev": true + }, "node_modules/@types/node": { "version": "18.6.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.1.tgz", @@ -1045,6 +1054,15 @@ "node": ">=6" } }, + "node_modules/luxon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.0.1.tgz", + "integrity": "sha512-hF3kv0e5gwHQZKz4wtm4c+inDtyc7elkanAsBq+fundaCdUBNJB1dHEGUZIM6SfSBUlbVFduPwEtNjFK8wLtcw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/magic-string": { "version": "0.26.2", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", @@ -1789,6 +1807,12 @@ "integrity": "sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg==", "dev": true }, + "@types/luxon": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.0.0.tgz", + "integrity": "sha512-Lx+EZoJxUKw4dp8uei9XiUVNlgkYmax5+ovqt6Xf3LzJOnWhlfJw/jLBmqfGVwOP/pDr4HT8bI1WtxK0IChMLw==", + "dev": true + }, "@types/node": { "version": "18.6.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.1.tgz", @@ -2245,6 +2269,12 @@ "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "dev": true }, + "luxon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.0.1.tgz", + "integrity": "sha512-hF3kv0e5gwHQZKz4wtm4c+inDtyc7elkanAsBq+fundaCdUBNJB1dHEGUZIM6SfSBUlbVFduPwEtNjFK8wLtcw==", + "dev": true + }, "magic-string": { "version": "0.26.2", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", diff --git a/package.json b/package.json index fcb3f3d..cb846e5 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,8 @@ "@sveltejs/vite-plugin-svelte": "^1.0.1", "@tauri-apps/cli": "^1.0.5", "@tsconfig/svelte": "^3.0.0", + "@types/luxon": "^3.0.0", + "luxon": "^3.0.1", "svelte": "^3.49.0", "svelte-check": "^2.8.0", "svelte-preprocess": "^4.10.7", @@ -25,4 +27,4 @@ "dependencies": { "@tauri-apps/api": "^1.0.2" } -} \ No newline at end of file +} diff --git a/public/potato.svg b/public/potato.svg new file mode 100644 index 0000000..e1cfedb --- /dev/null +++ b/public/potato.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/vite.svg b/public/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 64bc60c..0295798 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -263,6 +263,19 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chrono" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +dependencies = [ + "libc", + "num-integer", + "num-traits", + "serde", + "winapi", +] + [[package]] name = "cocoa" version = "0.24.0" @@ -3130,6 +3143,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd6469f4314d5f1ffec476e05f17cc9a78bc7a27a6a857842170bdf8d6f98d2f" dependencies = [ "getrandom 0.2.7", + "rand 0.8.5", + "serde", ] [[package]] @@ -3707,8 +3722,11 @@ checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" name = "ziemniak" version = "0.1.0" dependencies = [ + "chrono", "serde", "serde_json", "tauri", "tauri-build", + "tokio", + "uuid 1.1.2", ] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 0361143..a2a4391 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -15,9 +15,12 @@ rust-version = "1.57" tauri-build = { version = "1.0.4", features = [] } [dependencies] -serde_json = "1.0" serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" tauri = { version = "1.0.5", features = ["api-all"] } +chrono = { version = "0.4.19", default-features = false, features = [ "std", "clock", "serde" ] } +tokio = { version = "1.19", features = [ "rt", "rt-multi-thread", "sync", "fs", "io-util", "time" ] } +uuid = { version = "1.1.2", features = [ "v4", "fast-rng", "serde" ] } [features] # by default Tauri runs in production mode diff --git a/src-tauri/icons/128x128.png b/src-tauri/icons/128x128.png index 6be5e50..f91e974 100644 Binary files a/src-tauri/icons/128x128.png and b/src-tauri/icons/128x128.png differ diff --git a/src-tauri/icons/128x128@2x.png b/src-tauri/icons/128x128@2x.png index e81bece..ef7c7e4 100644 Binary files a/src-tauri/icons/128x128@2x.png and b/src-tauri/icons/128x128@2x.png differ diff --git a/src-tauri/icons/32x32.png b/src-tauri/icons/32x32.png index a437dd5..964341b 100644 Binary files a/src-tauri/icons/32x32.png and b/src-tauri/icons/32x32.png differ diff --git a/src-tauri/icons/Square107x107Logo.png b/src-tauri/icons/Square107x107Logo.png index 0ca4f27..804dff2 100644 Binary files a/src-tauri/icons/Square107x107Logo.png and b/src-tauri/icons/Square107x107Logo.png differ diff --git a/src-tauri/icons/Square142x142Logo.png b/src-tauri/icons/Square142x142Logo.png index b81f820..5c3a366 100644 Binary files a/src-tauri/icons/Square142x142Logo.png and b/src-tauri/icons/Square142x142Logo.png differ diff --git a/src-tauri/icons/Square150x150Logo.png b/src-tauri/icons/Square150x150Logo.png index 624c7bf..143f20e 100644 Binary files a/src-tauri/icons/Square150x150Logo.png and b/src-tauri/icons/Square150x150Logo.png differ diff --git a/src-tauri/icons/Square284x284Logo.png b/src-tauri/icons/Square284x284Logo.png index c021d2b..7e0db74 100644 Binary files a/src-tauri/icons/Square284x284Logo.png and b/src-tauri/icons/Square284x284Logo.png differ diff --git a/src-tauri/icons/Square30x30Logo.png b/src-tauri/icons/Square30x30Logo.png index 6219700..071cbe0 100644 Binary files a/src-tauri/icons/Square30x30Logo.png and b/src-tauri/icons/Square30x30Logo.png differ diff --git a/src-tauri/icons/Square310x310Logo.png b/src-tauri/icons/Square310x310Logo.png index f9bc048..e9b5f9a 100644 Binary files a/src-tauri/icons/Square310x310Logo.png and b/src-tauri/icons/Square310x310Logo.png differ diff --git a/src-tauri/icons/Square44x44Logo.png b/src-tauri/icons/Square44x44Logo.png index d5fbfb2..0b54254 100644 Binary files a/src-tauri/icons/Square44x44Logo.png and b/src-tauri/icons/Square44x44Logo.png differ diff --git a/src-tauri/icons/Square71x71Logo.png b/src-tauri/icons/Square71x71Logo.png index 63440d7..dfb61ec 100644 Binary files a/src-tauri/icons/Square71x71Logo.png and b/src-tauri/icons/Square71x71Logo.png differ diff --git a/src-tauri/icons/Square89x89Logo.png b/src-tauri/icons/Square89x89Logo.png index f3f705a..1cc5c18 100644 Binary files a/src-tauri/icons/Square89x89Logo.png and b/src-tauri/icons/Square89x89Logo.png differ diff --git a/src-tauri/icons/StoreLogo.png b/src-tauri/icons/StoreLogo.png index 4556388..c3e2770 100644 Binary files a/src-tauri/icons/StoreLogo.png and b/src-tauri/icons/StoreLogo.png differ diff --git a/src-tauri/icons/icon.icns b/src-tauri/icons/icon.icns index 87f09b4..7775675 100644 Binary files a/src-tauri/icons/icon.icns and b/src-tauri/icons/icon.icns differ diff --git a/src-tauri/icons/icon.ico b/src-tauri/icons/icon.ico index b3636e4..1eab178 100644 Binary files a/src-tauri/icons/icon.ico and b/src-tauri/icons/icon.ico differ diff --git a/src-tauri/icons/icon.png b/src-tauri/icons/icon.png index e1cd261..3822240 100644 Binary files a/src-tauri/icons/icon.png and b/src-tauri/icons/icon.png differ diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 96af599..81c767e 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -1,16 +1,84 @@ #![cfg_attr( - all(not(debug_assertions), target_os = "windows"), - windows_subsystem = "windows" + all(not(debug_assertions), target_os = "windows"), + windows_subsystem = "windows" )] +use std::time::{Duration, Instant}; + +use chrono::{DateTime, FixedOffset, Local}; +use tauri::{async_runtime::spawn, Window}; +use tokio::time::interval; +use uuid::Uuid; + +#[derive(Clone, Default, serde::Serialize)] +struct Timer { + id: Uuid, + started: Option>, + duration: Duration, + elapsed: Option, + message: String, +} + +impl Timer { + fn new(message: &str, duration: Duration) -> Self { + return Self { + id: Uuid::new_v4(), + duration: duration, + message: message.to_string(), + ..Default::default() + }; + } + + fn complete(self: &Self) -> bool { + return self.elapsed.map_or(false, |e| e >= self.duration); + } + + async fn run(self: &mut Self, window: Window) { + self.started = Some(Local::now().into()); + let mut elapsed = Duration::from_secs(0); + self.elapsed = Some(elapsed); + let mut last_checked = Instant::now(); + + let mut interval = interval(Duration::from_secs(1) / 60); + loop { + interval.tick().await; + let now = Instant::now(); + let duration = now - last_checked; + + elapsed = elapsed + duration; + self.elapsed = Some(elapsed); + + if self.complete() { + break; + } + + if let Err(_) = window.emit("timer-tick", self.clone()) { + break; + } + last_checked = now; + } + + window + .emit("timer-done", self.clone()) + .expect("Our window went away?"); + } +} + #[tauri::command] -fn greet(name: &str) -> String { - format!("Hello, {}!", name) +fn start_timer(window: Window, duration: Duration, message: &str) -> Uuid { + let mut timer = Timer::new(message, duration); + let timer_id = timer.id.clone(); + + spawn(async move { + timer.run(window).await; + }); + + timer_id } fn main() { - tauri::Builder::default() - .invoke_handler(tauri::generate_handler![greet]) - .run(tauri::generate_context!()) - .expect("error while running tauri application"); + tauri::Builder::default() + .invoke_handler(tauri::generate_handler![start_timer]) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); } diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 74b569e..9bcfcd0 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -16,8 +16,8 @@ }, "bundle": { "active": true, - "category": "DeveloperTool", - "copyright": "", + "category": "Lifestyle", + "copyright": "2022 ModZero", "deb": { "depends": [] }, @@ -29,8 +29,8 @@ "icons/icon.icns", "icons/icon.ico" ], - "identifier": "com.tauri.dev", - "longDescription": "", + "identifier": "xyz.modzero.ziemniak", + "longDescription": "A bit more flexible interval timer", "macOS": { "entitlements": null, "exceptionDomain": "", diff --git a/src/App.svelte b/src/App.svelte index d061fbd..a0b5234 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -1,5 +1,26 @@
@@ -7,5 +28,5 @@ Fire after - +
diff --git a/src/assets/potato.svg b/src/assets/potato.svg new file mode 100644 index 0000000..e1cfedb --- /dev/null +++ b/src/assets/potato.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svelte.svg b/src/assets/svelte.svg deleted file mode 100644 index c5e0848..0000000 --- a/src/assets/svelte.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/lib/Counter.svelte b/src/lib/Counter.svelte deleted file mode 100644 index 0b98585..0000000 --- a/src/lib/Counter.svelte +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/src/main.ts b/src/main.ts index 3dc6ae5..5c1f795 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,8 +1,6 @@ import './app.css' import App from './App.svelte' -import { invoke } from '@tauri-apps/api' - const app = new App({ target: document.getElementById('app') }) diff --git a/vite.config.ts b/vite.config.ts index 401b4d4..c356f41 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -3,5 +3,8 @@ import { svelte } from '@sveltejs/vite-plugin-svelte' // https://vitejs.dev/config/ export default defineConfig({ - plugins: [svelte()] + plugins: [svelte()], + build: { + write: true + } })