Skip to content

Commit

Permalink
refactor: create statusbar class
Browse files Browse the repository at this point in the history
  • Loading branch information
marcuspang committed Oct 17, 2024
1 parent 6d77b01 commit be66ce3
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 45 deletions.
10 changes: 6 additions & 4 deletions vscode-cairo/src/context.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import * as vscode from "vscode";
import { Config } from "./config";
import { RootLogOutputChannel } from "./logging";
import { StatusBar } from "./statusBar";

export class Context {
public static create(extensionContext: vscode.ExtensionContext): Context {
Expand All @@ -9,19 +10,20 @@ export class Context {
log: true,
}),
);
const statusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 100);

extensionContext.subscriptions.push(log);
extensionContext.subscriptions.push(statusBarItem);

return new Context(extensionContext, log, statusBarItem);
const context = new Context(extensionContext, log);
context.statusBar = new StatusBar(context);

return context;
}

public readonly config: Config = new Config();
public statusBar!: StatusBar;

private constructor(
public readonly extension: vscode.ExtensionContext,
public readonly log: RootLogOutputChannel,
public readonly statusBarItem: vscode.StatusBarItem,
) {}
}
3 changes: 1 addition & 2 deletions vscode-cairo/src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import * as vscode from "vscode";
import * as lc from "vscode-languageclient/node";
import { setupLanguageServer } from "./cairols";
import { Context } from "./context";
import { setupStatusBar } from "./statusBar";

let client: lc.LanguageClient | undefined;

Expand All @@ -17,7 +16,7 @@ export async function activate(extensionContext: vscode.ExtensionContext) {
}

if (ctx.config.get("showInStatusBar")) {
await setupStatusBar(ctx, client);
ctx.statusBar.setupStatusBar(client);
}
}

Expand Down
96 changes: 57 additions & 39 deletions vscode-cairo/src/statusBar.ts
Original file line number Diff line number Diff line change
@@ -1,53 +1,71 @@
import type { Context } from "./context";
import * as vscode from "vscode";
import { Context } from "./context";
import { Scarb } from "./scarb";
import * as lc from "vscode-languageclient/node";
import { Scarb } from "./scarb";

const CAIRO_STATUS_BAR_COMMAND = "cairo1.statusBar.clicked";

export async function setupStatusBar(ctx: Context, client?: lc.LanguageClient) {
ctx.extension.subscriptions.push(
vscode.workspace.onDidChangeConfiguration((e) => {
if (e.affectsConfiguration("cairo1.showInStatusBar")) {
updateStatusBar(ctx);
}
}),
);

ctx.extension.subscriptions.push(
vscode.commands.registerCommand(CAIRO_STATUS_BAR_COMMAND, () => {
if (client) {
client.outputChannel.show();
} else {
vscode.window.showWarningMessage("Cairo Language Server is not active");
}
}),
);
ctx.statusBarItem.command = CAIRO_STATUS_BAR_COMMAND;
export class StatusBar {
private statusBarItem: vscode.StatusBarItem;

updateStatusBar(ctx);
}
constructor(private readonly context: Context) {
this.statusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 100);
this.context.extension.subscriptions.push(this.statusBarItem);
}

public setupStatusBar(client?: lc.LanguageClient): void {
this.context.extension.subscriptions.push(
vscode.workspace.onDidChangeConfiguration((e) => {
if (e.affectsConfiguration("cairo1.showInStatusBar")) {
this.updateStatusBar();
}
}),
);

async function updateStatusBar(ctx: Context) {
const config = vscode.workspace.getConfiguration("cairo1");
const showInStatusBar = config.get<boolean>("showInStatusBar", true);
this.context.extension.subscriptions.push(
vscode.commands.registerCommand(CAIRO_STATUS_BAR_COMMAND, () => {
if (client) {
client.outputChannel.show();
} else {
vscode.window.showWarningMessage("Cairo Language Server is not active");
}
}),
);
this.statusBarItem.command = CAIRO_STATUS_BAR_COMMAND;

if (showInStatusBar) {
ctx.statusBarItem.text = "Cairo";
ctx.statusBarItem.tooltip = "Cairo Language";
this.updateStatusBar();
}

public async updateStatusBar(): Promise<void> {
const config = vscode.workspace.getConfiguration("cairo1");
const showInStatusBar = config.get<boolean>("showInStatusBar", true);

try {
const scarb = await Scarb.find(vscode.workspace.workspaceFolders?.[0], ctx);
if (scarb) {
const version = await scarb.getVersion(ctx);
ctx.statusBarItem.tooltip = `Cairo Language\n${version}`;
if (showInStatusBar) {
this.statusBarItem.text = "Cairo";
this.statusBarItem.tooltip = "Cairo Language";

try {
// TODO(mkaput): Support multi-root workspaces.
const scarb = await Scarb.find(vscode.workspace.workspaceFolders?.[0], this.context);
if (scarb) {
const version = await scarb.getVersion(this.context);
this.statusBarItem.tooltip = `Cairo Language\n${version}`;
}
} catch (error) {
this.context.log.error(`Error getting Scarb version: ${error}`);
}
} catch (error) {
ctx.log.error(`Error getting Scarb version: ${error}`);

this.statusBarItem.show();
} else {
this.statusBarItem.hide();
}
}

public showStatusBarItem(): void {
this.statusBarItem.show();
}

ctx.statusBarItem.show();
} else {
ctx.statusBarItem.hide();
public hideStatusBarItem(): void {
this.statusBarItem.hide();
}
}

0 comments on commit be66ce3

Please sign in to comment.