Skip to content

Commit

Permalink
Added server status information to the status bar. (#61)
Browse files Browse the repository at this point in the history
* Added server status information to the status bar.

* Improve and modularize status display

---------

Co-authored-by: Jens Haase <[email protected]>
  • Loading branch information
scztt and jenshaase authored Dec 10, 2024
1 parent a4f5157 commit 24ca253
Show file tree
Hide file tree
Showing 4 changed files with 136 additions and 1 deletion.
5 changes: 5 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,11 @@
"type": "boolean",
"default": true,
"description": "Use the workspace startup file (startup.scd) when starting sclang."
},
"supercollider.serverStatusString": {
"type": "string",
"default": "${icon} ${avgCPU}% ${peakCPU}% ${numUGens}u ${numSynths}s ${numGroups}s ${numSynthDefs}d",
"description": "Server status string to be displayed in the status bar. Server statistics can be included using keys formatted like ${keyname}. The available keys are: icon, avgCPU, peakCPU, numUGens, numSynths, numGroups, numSynthDefs"
}
}
}
Expand Down
121 changes: 121 additions & 0 deletions src/ServerStatusBar.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
import * as vscode from "vscode";

export type ServerStatusBarData = {
name?: string;
running: boolean;
unresponsive: boolean;
avgCPU: number;
peakCPU: number;
numUGens: number;
numSynths: number;
numGroups: number;
numSynthDefs: number;
};

export class ServerStatusBar {
private statusBarItem: vscode.StatusBarItem;

constructor() {
this.statusBarItem = vscode.window.createStatusBarItem(
vscode.StatusBarAlignment.Right,
100
);
this.statusBarItem.name = "SuperCollider server status";
this.statusBarItem.color = new vscode.ThemeColor("disabledForeground");
this.statusBarItem.show();
}

getStatusBarItem() {
return this.statusBarItem;
}

formatString(string: string, name, icon, avgCPUFormatted, peakCPUFormatted, numUGens, numSynths, numGroups, numSynthDefs): string {
string = string.replace("${name}", name)
string = string.replace("${icon}", icon)
string = string.replace("${avgCPU}", avgCPUFormatted);
string = string.replace("${peakCPU}", peakCPUFormatted);
string = string.replace("${numUGens}", numUGens.toString());
string = string.replace("${numSynths}", numSynths.toString());
string = string.replace("${numGroups}", numGroups.toString());
string = string.replace("${numSynthDefs}", numSynthDefs.toString());

return string
}

updateStatusBar(data: ServerStatusBarData) {
let {
name,
running,
unresponsive,
avgCPU,
peakCPU,
numUGens,
numSynths,
numGroups,
numSynthDefs,
} = data;

if (!running) {
unresponsive = false;
avgCPU = 0;
peakCPU = 0;
numUGens = 0;
numSynths = 0;
numGroups = 0;
numSynthDefs = 0;
}
const percentFormatter = Intl.NumberFormat(undefined, {
maximumFractionDigits: 2,
minimumFractionDigits: 2
});

const icon = unresponsive
? `$(warning)`
: running
? `$(play)`
: `$(primitive-square)`;

this.statusBarItem.color = unresponsive
? new vscode.ThemeColor("activityWarningBadge.foreground")
: running
? new vscode.ThemeColor("terminal.ansiGreen")
: new vscode.ThemeColor("disabledForeground");

this.statusBarItem.command = unresponsive
? "supercollider.internal.rebootServer"
: running
? null
: "supercollider.internal.bootServer";

this.statusBarItem.tooltip = unresponsive
? "Server is unresponsive. Click to restart."
: running
? "Server is running."
: "Server is not running. Click to start.";

const avgCPUFormatted = percentFormatter.format(avgCPU);
const peakCPUFormatted = percentFormatter.format(peakCPU);

const configuration = vscode.workspace.getConfiguration()

const statusString = this.formatString(
configuration.get<string>('supercollider.serverStatusString'),
name, icon, avgCPUFormatted, peakCPUFormatted, numUGens, numSynths, numGroups, numSynthDefs);

const tooltipString = this.formatString(
"**Status**: " + (running ? "`running`" : "`stopped`") + " \n" +
"---\n" +
"**Average CPU**: `${avgCPU}%` \n" +
"**Peak CPU**: `${peakCPU}%` \n" +
"---\n" +
"**Synths**: `${numSynths}` \n" +
"**Groups**: `${numGroups}` \n" +
"**UGens**: `${numUGens}` \n" +
"---\n" +
"**SynthDefs**: `${numSynthDefs}` \n",
name, icon, avgCPUFormatted, peakCPUFormatted, numUGens, numSynths, numGroups, numSynthDefs);

this.statusBarItem.text = statusString;
this.statusBarItem.tooltip = new vscode.MarkdownString(tooltipString);
}
}
9 changes: 9 additions & 0 deletions src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import * as help from './commands/help'
import { SuperColliderContext } from './context';
import * as defaults from './util/defaults'
import { getSclangPath } from './util/sclang';
import { ServerStatusBar } from './ServerStatusBar';
import { SuperColliderFormatter } from './providers/FormattingProvider';

export async function activate(context: vscode.ExtensionContext) {
Expand All @@ -17,6 +18,8 @@ export async function activate(context: vscode.ExtensionContext) {

let supercolliderContext: SuperColliderContext = null;

const serverStatusBar = new ServerStatusBar();

vscode.languages.registerDocumentDropEditProvider({ language: 'supercollider' }, {
provideDocumentDropEdits: (document: TextDocument, position: Position, dataTransfer: DataTransfer, token: CancellationToken) => {
let files = [];
Expand Down Expand Up @@ -57,6 +60,9 @@ export async function activate(context: vscode.ExtensionContext) {
supercolliderContext = new SuperColliderContext();
await supercolliderContext.activate(context.globalStoragePath, outputChannel, context.globalState);
help.activate(supercolliderContext);
supercolliderContext.client.onNotification('supercollider/serverStatus', (data) => {
serverStatusBar.updateStatusBar(data);
});
}
catch (error) {
outputChannel.append(error)
Expand Down Expand Up @@ -195,6 +201,9 @@ export async function activate(context: vscode.ExtensionContext) {
supercolliderContext.executeCommand('supercollider.internal.cmdPeriod')
}));

context.subscriptions.push(serverStatusBar.getStatusBarItem());
serverStatusBar.updateStatusBar({running: false, unresponsive: false, avgCPU: 0, peakCPU: 0, numUGens: 0, numSynths: 0, numGroups: 0, numSynthDefs: 0});

doActivate();

outputChannel.appendLine('SuperCollider extension activated');
Expand Down

0 comments on commit 24ca253

Please sign in to comment.