Skip to content

Commit 50a1a3e

Browse files
authored
feat(vscode): add status bar items to start, stop and open server (#988)
1 parent c866823 commit 50a1a3e

9 files changed

+910
-1
lines changed
4.38 KB
Binary file not shown.

extensions/vscode/package.json

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,36 @@
9494
}
9595
]
9696
},
97+
"icons": {
98+
"dart-frog": {
99+
"description": "Dart Frog logo",
100+
"default": {
101+
"fontPath": "./assets/dart-frog.woff",
102+
"fontCharacter": "\\e900"
103+
}
104+
},
105+
"dart-frog-start": {
106+
"description": "Dart Frog logo with a start sign",
107+
"default": {
108+
"fontPath": "./assets/dart-frog.woff",
109+
"fontCharacter": "\\e901"
110+
}
111+
},
112+
"dart-frog-stop": {
113+
"description": "Dart Frog logo with a stop sign",
114+
"default": {
115+
"fontPath": "./assets/dart-frog.woff",
116+
"fontCharacter": "\\e902"
117+
}
118+
},
119+
"dart-frog-globe": {
120+
"description": "Dart Frog logo with a globe sign",
121+
"default": {
122+
"fontPath": "./assets/dart-frog.woff",
123+
"fontCharacter": "\\e903"
124+
}
125+
}
126+
},
97127
"configuration": {
98128
"properties": {
99129
"dart-frog.enableCodeLens": {

extensions/vscode/src/extension.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ import {
33
DebugOnRequestCodeLensProvider,
44
RunOnRequestCodeLensProvider,
55
} from "./code-lens";
6+
import {
7+
OpenApplicationStatusBarItem,
8+
StartStopApplicationStatusBarItem,
9+
} from "./status-bar";
610
import {
711
create,
812
debugDevServer,
@@ -73,8 +77,11 @@ export function activate(
7377
vscode.commands.registerCommand(
7478
"dart-frog.start-debug-dev-server",
7579
startDebugDevServer
76-
)
80+
),
81+
new StartStopApplicationStatusBarItem(),
82+
new OpenApplicationStatusBarItem()
7783
);
84+
7885
return context;
7986
}
8087

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import {
2+
Disposable,
3+
StatusBarAlignment,
4+
StatusBarItem,
5+
window,
6+
workspace,
7+
} from "vscode";
8+
import { resolveDartFrogProjectPathFromWorkspace } from "../utils";
9+
10+
/**
11+
* Wraps a status bar item so that is only visible when the current workspace
12+
* is a Dart Frog project.
13+
*
14+
* Should be used as a base class for other status bar items.
15+
*
16+
* @see {@link StatusBarItem}, for more information on status bar items.
17+
*/
18+
export abstract class DartFrogStatusBarItem implements Disposable {
19+
public readonly statusBarItem: StatusBarItem;
20+
21+
private onDidChangeWorkspaceFoldersDisposable: Disposable;
22+
private onDidChangeActiveTextEditorDisposable: Disposable;
23+
24+
constructor(alignment: StatusBarAlignment, priority: number) {
25+
this.statusBarItem = window.createStatusBarItem(alignment, priority);
26+
27+
this.onDidChangeWorkspaceFoldersDisposable =
28+
workspace.onDidChangeWorkspaceFolders(this.onChangeSetup.bind(this));
29+
this.onDidChangeActiveTextEditorDisposable =
30+
window.onDidChangeActiveTextEditor(this.onChangeSetup.bind(this));
31+
32+
this.onChangeSetup();
33+
}
34+
35+
public abstract update(): any;
36+
37+
private onChangeSetup(): void {
38+
const isDartFrogProject = resolveDartFrogProjectPathFromWorkspace();
39+
if (isDartFrogProject) {
40+
this.update();
41+
} else {
42+
this.statusBarItem.hide();
43+
}
44+
}
45+
46+
public dispose(): void {
47+
this.onDidChangeWorkspaceFoldersDisposable.dispose();
48+
this.onDidChangeActiveTextEditorDisposable.dispose();
49+
this.statusBarItem.dispose();
50+
}
51+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export * from "./dart-frog-status-bar-item";
2+
export * from "./open-application-status-bar-item";
3+
export * from "./start-stop-application-status-bar-item";
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import { Command, StatusBarAlignment, Uri } from "vscode";
2+
import {
3+
DartFrogApplicationRegistryEventEmitterTypes,
4+
DartFrogDaemon,
5+
} from "../daemon";
6+
import { DartFrogStatusBarItem } from "./dart-frog-status-bar-item";
7+
8+
export class OpenApplicationStatusBarItem extends DartFrogStatusBarItem {
9+
private updateFunction: () => void;
10+
11+
constructor() {
12+
super(StatusBarAlignment.Right, 10);
13+
14+
this.updateFunction = this.update.bind(this);
15+
16+
const daemon = DartFrogDaemon.instance;
17+
daemon.applicationRegistry.on(
18+
DartFrogApplicationRegistryEventEmitterTypes.add,
19+
this.updateFunction
20+
);
21+
daemon.applicationRegistry.on(
22+
DartFrogApplicationRegistryEventEmitterTypes.remove,
23+
this.updateFunction
24+
);
25+
}
26+
27+
public update(): void {
28+
const daemon = DartFrogDaemon.instance;
29+
const applications = daemon.applicationRegistry.all();
30+
if (applications.length === 0) {
31+
this.statusBarItem.hide();
32+
return;
33+
}
34+
35+
const application = applications[0];
36+
this.statusBarItem.text = `$(dart-frog-globe) localhost:${application.port}`;
37+
this.statusBarItem.tooltip = "Open application in browser";
38+
const openCommand: Command = {
39+
title: "Open application in browser",
40+
command: "vscode.open",
41+
arguments: [Uri.parse(application.address!)],
42+
};
43+
this.statusBarItem.command = openCommand;
44+
this.statusBarItem.show();
45+
}
46+
47+
public dispose(): void {
48+
const daemon = DartFrogDaemon.instance;
49+
daemon.applicationRegistry.off(
50+
DartFrogApplicationRegistryEventEmitterTypes.add,
51+
this.updateFunction
52+
);
53+
daemon.applicationRegistry.off(
54+
DartFrogApplicationRegistryEventEmitterTypes.remove,
55+
this.updateFunction
56+
);
57+
super.dispose();
58+
}
59+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import {
2+
DartFrogApplicationRegistryEventEmitterTypes,
3+
DartFrogDaemon,
4+
} from "../daemon";
5+
import { DartFrogStatusBarItem } from "./dart-frog-status-bar-item";
6+
import { StatusBarAlignment } from "vscode";
7+
8+
export class StartStopApplicationStatusBarItem extends DartFrogStatusBarItem {
9+
private updateFunction: () => void;
10+
11+
constructor() {
12+
super(StatusBarAlignment.Left, 10);
13+
14+
this.updateFunction = this.update.bind(this);
15+
16+
const daemon = DartFrogDaemon.instance;
17+
daemon.applicationRegistry.on(
18+
DartFrogApplicationRegistryEventEmitterTypes.add,
19+
this.updateFunction
20+
);
21+
daemon.applicationRegistry.on(
22+
DartFrogApplicationRegistryEventEmitterTypes.remove,
23+
this.updateFunction
24+
);
25+
}
26+
27+
public update(): void {
28+
const daemon = DartFrogDaemon.instance;
29+
const applications = daemon.applicationRegistry.all();
30+
31+
if (applications.length === 0) {
32+
this.statusBarItem.text = "$(dart-frog-start) Start Server";
33+
this.statusBarItem.tooltip = "Start development server";
34+
this.statusBarItem.command = "dart-frog.start-debug-dev-server";
35+
} else {
36+
this.statusBarItem.text = "$(dart-frog-stop) Stop Server";
37+
this.statusBarItem.tooltip = "Stop development server";
38+
this.statusBarItem.command = "dart-frog.stop-dev-server";
39+
}
40+
41+
this.statusBarItem.show();
42+
}
43+
44+
dispose() {
45+
const daemon = DartFrogDaemon.instance;
46+
daemon.applicationRegistry.off(
47+
DartFrogApplicationRegistryEventEmitterTypes.add,
48+
this.updateFunction
49+
);
50+
daemon.applicationRegistry.off(
51+
DartFrogApplicationRegistryEventEmitterTypes.remove,
52+
this.updateFunction
53+
);
54+
super.dispose();
55+
}
56+
}

0 commit comments

Comments
 (0)