From 436a3513ab7cf67f137fc94897e2ecb9966de214 Mon Sep 17 00:00:00 2001 From: Kartik Raj Date: Wed, 20 Jul 2022 10:27:20 -0700 Subject: [PATCH] Use status bar to indicate whether selected Python interpreter is invalid --- src/client/interpreter/display/index.ts | 15 +++++++++++++-- src/test/interpreters/display.unit.test.ts | 6 ++++++ src/test/mocks/vsc/index.ts | 4 ++++ src/test/vscode-mock.ts | 1 + 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/client/interpreter/display/index.ts b/src/client/interpreter/display/index.ts index 27fb78389254..e16352ae3f20 100644 --- a/src/client/interpreter/display/index.ts +++ b/src/client/interpreter/display/index.ts @@ -1,5 +1,13 @@ import { inject, injectable } from 'inversify'; -import { Disposable, LanguageStatusItem, LanguageStatusSeverity, StatusBarAlignment, StatusBarItem, Uri } from 'vscode'; +import { + Disposable, + LanguageStatusItem, + LanguageStatusSeverity, + StatusBarAlignment, + StatusBarItem, + ThemeColor, + Uri, +} from 'vscode'; import { IExtensionSingleActivationService } from '../../activation/types'; import { IApplicationShell, IWorkspaceService } from '../../common/application/types'; import { Commands, PYTHON_LANGUAGE } from '../../common/constants'; @@ -133,6 +141,7 @@ export class InterpreterDisplay implements IInterpreterDisplay, IExtensionSingle } else { this.statusBar.tooltip = ''; this.statusBar.color = ''; + this.statusBar.backgroundColor = new ThemeColor('statusBarItem.warningBackground'); this.statusBar.text = `$(alert) ${InterpreterQuickPickList.browsePath.openButtonLabel}`; this.currentlySelectedInterpreterDisplay = undefined; } @@ -153,8 +162,10 @@ export class InterpreterDisplay implements IInterpreterDisplay, IExtensionSingle text = text.startsWith('Python') ? text.substring('Python'.length).trim() : text; this.languageStatus.text = text; this.currentlySelectedInterpreterDisplay = interpreter.detailedDisplayName; + this.languageStatus.severity = LanguageStatusSeverity.Information; } else { - this.languageStatus.text = '$(alert) No Interpreter Selected'; + this.languageStatus.severity = LanguageStatusSeverity.Warning; + this.languageStatus.text = `$(alert) ${InterpreterQuickPickList.browsePath.openButtonLabel}`; this.languageStatus.detail = undefined; this.currentlySelectedInterpreterDisplay = undefined; } diff --git a/src/test/interpreters/display.unit.test.ts b/src/test/interpreters/display.unit.test.ts index 2d7254afdb6f..63a3d2efa4b0 100644 --- a/src/test/interpreters/display.unit.test.ts +++ b/src/test/interpreters/display.unit.test.ts @@ -31,6 +31,7 @@ import { InterpreterDisplay } from '../../client/interpreter/display'; import { IServiceContainer } from '../../client/ioc/types'; import * as logging from '../../client/logging'; import { EnvironmentType, PythonEnvironment } from '../../client/pythonEnvironments/info'; +import { ThemeColor } from '../mocks/vsc'; const info: PythonEnvironment = { architecture: Architecture.Unknown, @@ -274,6 +275,11 @@ suite('Interpreters Display', () => { TypeMoq.Times.once(), ); } else { + statusBar.verify( + (s) => + (s.backgroundColor = TypeMoq.It.isValue(new ThemeColor('statusBarItem.warningBackground'))), + TypeMoq.Times.once(), + ); statusBar.verify((s) => (s.color = TypeMoq.It.isValue('')), TypeMoq.Times.once()); statusBar.verify( (s) => diff --git a/src/test/mocks/vsc/index.ts b/src/test/mocks/vsc/index.ts index a4484636d2b6..29449ca238e9 100644 --- a/src/test/mocks/vsc/index.ts +++ b/src/test/mocks/vsc/index.ts @@ -17,6 +17,10 @@ export function escapeCodicons(text: string): string { return text.replace(escapeCodiconsRegex, (match, escaped) => (escaped ? match : `\\${match}`)); } +export class ThemeColor { + constructor(public readonly id: string) {} +} + export enum ExtensionKind { /** * Extension runs where the UI runs. diff --git a/src/test/vscode-mock.ts b/src/test/vscode-mock.ts index b010ab7e2c26..2849976cfa22 100644 --- a/src/test/vscode-mock.ts +++ b/src/test/vscode-mock.ts @@ -62,6 +62,7 @@ export function initialize() { }; } +mockedVSCode.ThemeColor = vscodeMocks.ThemeColor; mockedVSCode.MarkdownString = vscodeMocks.MarkdownString; mockedVSCode.Hover = vscodeMocks.Hover; mockedVSCode.Disposable = vscodeMocks.Disposable as any;