Skip to content

Commit 01ffb79

Browse files
committed
Add focus timeout configuration: Implement focus timeout setting to control tracking behavior when VS Code loses focus, enhancing user control over time tracking.
1 parent df55059 commit 01ffb79

4 files changed

Lines changed: 44 additions & 9 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ Simple Coding Time Tracker is a powerful extension for Visual Studio Code that h
2525
- **Configurable Settings**:
2626
- Save Interval: Customize how often your coding time data is saved (default: 5 seconds)
2727
- Inactivity Timeout: Set how long to wait before stopping the timer when no activity is detected (default: 5 minutes)
28+
- Focus Timeout: Set how long to continue tracking after VS Code loses focus (default: 60 seconds)
2829

2930
## Installation
3031

package.json

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,15 @@
2424
"type": "number",
2525
"default": 5,
2626
"description": "Interval in seconds to save the current coding session"
27-
},
28-
"simpleCodingTimeTracker.inactivityTimeout": {
27+
}, "simpleCodingTimeTracker.inactivityTimeout": {
2928
"type": "number",
3029
"default": 300,
3130
"description": "Time in seconds of inactivity before tracking stops (default: 300 seconds = 5 minutes)"
31+
},
32+
"simpleCodingTimeTracker.focusTimeout": {
33+
"type": "number",
34+
"default": 60,
35+
"description": "Time in seconds to continue tracking after VS Code loses focus (default: 60 seconds)"
3236
}
3337
}
3438
},

src/extension.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,15 @@ export function activate(context: vscode.ExtensionContext) {
1717
})
1818
);
1919

20+
// Register configuration change listener
21+
context.subscriptions.push(
22+
vscode.workspace.onDidChangeConfiguration(e => {
23+
if (e.affectsConfiguration('simpleCodingTimeTracker')) {
24+
timeTracker.updateConfiguration();
25+
}
26+
})
27+
);
28+
2029
// Register the existing command
2130
let disposable = vscode.commands.registerCommand('simpleCodingTimeTracker.showSummary', () => {
2231
summaryView.show();

src/timeTracker.ts

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,16 @@ export class TimeTracker implements vscode.Disposable {
77
private currentProject: string = '';
88
private database: Database;
99
private updateInterval: NodeJS.Timeout | null = null;
10-
private saveInterval: NodeJS.Timeout | null = null;
11-
private saveIntervalSeconds: number;
10+
private saveInterval: NodeJS.Timeout | null = null; private saveIntervalSeconds: number = 5;
1211
private lastCursorActivity: number = Date.now();
1312
private cursorInactivityTimeout: NodeJS.Timeout | null = null;
14-
private inactivityTimeoutSeconds: number;
13+
private inactivityTimeoutSeconds: number = 300;
14+
private focusTimeoutHandle: NodeJS.Timeout | null = null;
15+
private focusTimeoutSeconds: number = 60;
1516

1617
constructor(database: Database) {
1718
this.database = database;
18-
const config = vscode.workspace.getConfiguration('simpleCodingTimeTracker');
19-
this.saveIntervalSeconds = config.get('saveInterval', 5);
20-
this.inactivityTimeoutSeconds = config.get('inactivityTimeout', 300); // Default 5 minutes in seconds
19+
this.updateConfiguration();
2120

2221
// Track cursor movements
2322
vscode.window.onDidChangeTextEditorSelection(() => {
@@ -61,11 +60,33 @@ export class TimeTracker implements vscode.Disposable {
6160
// Track when VS Code window gains focus
6261
vscode.window.onDidChangeWindowState((e) => {
6362
if (e.focused) {
64-
this.updateCursorActivity();
63+
// Clear any pending timeout when focus returns
64+
if (this.focusTimeoutHandle) {
65+
clearTimeout(this.focusTimeoutHandle);
66+
this.focusTimeoutHandle = null;
67+
}
68+
this.startTracking();
69+
} else {
70+
// Set timeout when focus is lost
71+
if (this.focusTimeoutHandle) {
72+
clearTimeout(this.focusTimeoutHandle);
73+
}
74+
this.focusTimeoutHandle = setTimeout(() => {
75+
if (this.isTracking) {
76+
this.stopTracking();
77+
}
78+
}, this.focusTimeoutSeconds * 1000);
6579
}
6680
});
6781
}
6882

83+
public updateConfiguration() {
84+
const config = vscode.workspace.getConfiguration('simpleCodingTimeTracker');
85+
this.saveIntervalSeconds = config.get('saveInterval', 5);
86+
this.inactivityTimeoutSeconds = config.get('inactivityTimeout', 300); // Default 5 minutes in seconds
87+
this.focusTimeoutSeconds = config.get('focusTimeout', 60);
88+
}
89+
6990
private setupCursorTracking() {
7091
if (this.cursorInactivityTimeout) {
7192
clearTimeout(this.cursorInactivityTimeout);

0 commit comments

Comments
 (0)