From 2ef3cae6eb2ac0a3d1a3ce6f1623acd528406db3 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Wed, 6 Aug 2025 09:46:10 -0500 Subject: [PATCH] Working example with start cancel --- .vscode/launch.json | 3 ++- .vscode/tasks.json | 12 ++++++++++ package-lock.json | 18 +++++++++++++++ package.json | 15 +++++++++---- src/extension.ts | 54 ++++++++++++++++++++++++++++++++++++++++----- tsconfig.json | 3 ++- 6 files changed, 93 insertions(+), 12 deletions(-) create mode 100644 .vscode/tasks.json diff --git a/.vscode/launch.json b/.vscode/launch.json index a79b616..59c8ab3 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -7,7 +7,8 @@ "request": "launch", "runtimeExecutable": "${execPath}", "args": ["--extensionDevelopmentPath=${workspaceFolder}"], - "outFiles": ["${workspaceFolder}/out/**/*.js"] + "outFiles": ["${workspaceFolder}/out/**/*.js"], + "preLaunchTask": "npm: compile" } ] } diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..57648bc --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,12 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "npm: compile", + "type": "shell", + "command": "npm run compile", + "group": "build", + "problemMatcher": [] + } + ] +} diff --git a/package-lock.json b/package-lock.json index bf83263..8de33ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "speed-code", "version": "0.0.1", "devDependencies": { + "@types/node": "^24.2.0", "@types/vscode": "^1.70.0", "tslint": "^6.0.0", "typescript": "^5.0.0" @@ -41,6 +42,16 @@ "node": ">=6.9.0" } }, + "node_modules/@types/node": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.2.0.tgz", + "integrity": "sha512-3xyG3pMCq3oYCNg7/ZP+E1ooTaGB4cG8JWRsqqOYQdbWNY4zbaV0Ennrd7stjiJEFZCaybcIgpTjJWHRfBSIDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.10.0" + } + }, "node_modules/@types/vscode": { "version": "1.102.0", "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.102.0.tgz", @@ -497,6 +508,13 @@ "node": ">=14.17" } }, + "node_modules/undici-types": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", + "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", + "dev": true, + "license": "MIT" + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/package.json b/package.json index 0022a19..b0e4db5 100644 --- a/package.json +++ b/package.json @@ -6,13 +6,19 @@ "engines": { "vscode": "^1.70.0" }, - "activationEvents": [], + "activationEvents": [ + "onStartupFinished" + ], "main": "./out/extension.js", "contributes": { "commands": [ { "command": "speed-code.startSpeedRun", - "title": "Hello World" + "title": "Start Speed Run" + }, + { + "command": "speed-code.cancelSpeedRun", + "title": "Cancel Speed Run" } ] }, @@ -22,8 +28,9 @@ "watch": "tsc -watch -p ./" }, "devDependencies": { + "@types/node": "^24.2.0", "@types/vscode": "^1.70.0", - "typescript": "^5.0.0", - "tslint": "^6.0.0" + "tslint": "^6.0.0", + "typescript": "^5.0.0" } } diff --git a/src/extension.ts b/src/extension.ts index 92c0bb3..b36d0fe 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,11 +1,53 @@ import * as vscode from 'vscode'; -export function activate(context: vscode.ExtensionContext) { - const disposable = vscode.commands.registerCommand('speed-code.startSpeedRun', () => { - vscode.window.showInformationMessage('Hello World from My Extension!'); - }); +let resetTimer = () => {} - context.subscriptions.push(disposable); +export function activate(context: vscode.ExtensionContext) { + const statusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 100); + statusBarItem.tooltip = 'Speedrun timer'; + statusBarItem.text = "No active Speedrun"; + statusBarItem.show(); + + let timer: undefined | NodeJS.Timeout; + + resetTimer = () => { + if (timer) { + clearInterval(timer); + } + statusBarItem.text = "No active Speedrun"; + }; + + resetTimer(); + + context.subscriptions.push(vscode.commands.registerCommand('speed-code.startSpeedRun', () => { + const startTime = Date.now(); + timer = setInterval(() => { + const currentTime = Date.now(); + const timeSeconds = (currentTime - startTime) / 1000; + if (timeSeconds > 86400) { + const days = Math.floor(timeSeconds / 86400); + const hours = Math.floor(timeSeconds / 3600); + const minutes = Math.floor(timeSeconds / 60); + statusBarItem.text = `${days}:${hours - (days * 24)}:${minutes - (hours * 60)}:${(timeSeconds - (minutes * 60)).toFixed(3)}`; + } else if (timeSeconds >= 3600) { + const hours = Math.floor(timeSeconds / 3600); + const minutes = Math.floor(timeSeconds / 60); + statusBarItem.text = `${hours}:${minutes - (hours * 60)}:${(timeSeconds - (minutes * 60)).toFixed(3)}`; + } else if (timeSeconds >= 60) { + const minutes = Math.floor(timeSeconds / 60); + statusBarItem.text = `${minutes}:${(timeSeconds - (minutes * 60)).toFixed(3)}`; + } else { + statusBarItem.text = `${timeSeconds}`; + } + statusBarItem.color = '#fff'; + }, 10); + + vscode.window.showInformationMessage('Speedrun Started!'); + }), statusBarItem); + + context.subscriptions.push(vscode.commands.registerCommand('speed-code.cancelSpeedRun', resetTimer), statusBarItem); } -export function deactivate() {} +export function deactivate() { + resetTimer(); +} diff --git a/tsconfig.json b/tsconfig.json index dbafee9..b1a5a85 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,7 +7,8 @@ "rootDir": "src", "strict": true, "esModuleInterop": true, - "skipLibCheck": true + "skipLibCheck": true, + "types": ["node", "vscode"] }, "exclude": ["node_modules", ".vscode-test"] }