diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index c7c0cfd3131..9d9f9c57f48 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -2829,7 +2829,11 @@ declare module 'vscode' { interface LanguageStatusItem { selector: DocumentSelector; - detail: string; + + text: string; + detail: string; // tooltip! + // command: string | Command | undefined; + severity: LanguageStatusSeverity; dispose(): void; } diff --git a/src/vs/workbench/api/common/extHostLanguages.ts b/src/vs/workbench/api/common/extHostLanguages.ts index 1dc9f2d0067..cf2ced19fe0 100644 --- a/src/vs/workbench/api/common/extHostLanguages.ts +++ b/src/vs/workbench/api/common/extHostLanguages.ts @@ -87,6 +87,7 @@ export class ExtHostLanguages { this._proxy.$setLanguageStatus(handle, { source: extension.displayName ?? extension.name, selector: data.selector, + text: data.text, message: data.detail, severity: data.severity === LanguageStatusSeverity.Error ? Severity.Error : data.severity === LanguageStatusSeverity.Warning ? Severity.Warning : Severity.Info }); @@ -101,6 +102,13 @@ export class ExtHostLanguages { data.selector = value; updateAsync(); }, + get text() { + return data.text; + }, + set text(value) { + data.text = value; + updateAsync(); + }, get detail() { return data.detail; }, diff --git a/src/vs/workbench/contrib/languageStatus/browser/languageStatus.contribution.ts b/src/vs/workbench/contrib/languageStatus/browser/languageStatus.contribution.ts index 58c40fc853b..5baf1a039a9 100644 --- a/src/vs/workbench/contrib/languageStatus/browser/languageStatus.contribution.ts +++ b/src/vs/workbench/contrib/languageStatus/browser/languageStatus.contribution.ts @@ -14,7 +14,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { Registry } from 'vs/platform/registry/common/platform'; import { ThemeColor, themeColorFromId } from 'vs/platform/theme/common/themeService'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions, IWorkbenchContribution } from 'vs/workbench/common/contributions'; -import { STATUS_BAR_WARNING_ITEM_BACKGROUND, STATUS_BAR_WARNING_ITEM_FOREGROUND } from 'vs/workbench/common/theme'; +import { STATUS_BAR_ERROR_ITEM_BACKGROUND, STATUS_BAR_ERROR_ITEM_FOREGROUND, STATUS_BAR_WARNING_ITEM_BACKGROUND, STATUS_BAR_WARNING_ITEM_FOREGROUND } from 'vs/workbench/common/theme'; import { LanguageStatusDetailsWidget } from 'vs/workbench/contrib/languageStatus/browser/languageStatusList'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ILanguageStatus, ILanguageStatusService } from 'vs/workbench/services/languageStatus/common/languageStatusService'; @@ -71,10 +71,11 @@ class EditorStatusContribution implements IWorkbenchContribution { let backgroundColor: ThemeColor | undefined; let color: ThemeColor | undefined; if (first.severity === Severity.Error) { + backgroundColor = themeColorFromId(STATUS_BAR_ERROR_ITEM_BACKGROUND); + color = themeColorFromId(STATUS_BAR_ERROR_ITEM_FOREGROUND); + } else if (first.severity === Severity.Warning) { backgroundColor = themeColorFromId(STATUS_BAR_WARNING_ITEM_BACKGROUND); color = themeColorFromId(STATUS_BAR_WARNING_ITEM_FOREGROUND); - } else if (first.severity === Severity.Warning) { - color = themeColorFromId(STATUS_BAR_WARNING_ITEM_BACKGROUND); } const props: IStatusbarEntry = { diff --git a/src/vs/workbench/contrib/languageStatus/browser/languageStatusList.ts b/src/vs/workbench/contrib/languageStatus/browser/languageStatusList.ts index 336f115a83d..e2fbb7a0a48 100644 --- a/src/vs/workbench/contrib/languageStatus/browser/languageStatusList.ts +++ b/src/vs/workbench/contrib/languageStatus/browser/languageStatusList.ts @@ -12,50 +12,80 @@ import { ILayoutService } from 'vs/platform/layout/browser/layoutService'; import { WorkbenchList } from 'vs/platform/list/browser/listService'; import { NOTIFICATIONS_BACKGROUND, NOTIFICATIONS_BORDER } from 'vs/workbench/common/theme'; import { ILanguageStatus } from 'vs/workbench/services/languageStatus/common/languageStatusService'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { IThemeService, ThemeIcon } from 'vs/platform/theme/common/themeService'; import { widgetShadow } from 'vs/platform/theme/common/colorRegistry'; import { parseLinkedText } from 'vs/base/common/linkedText'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { Link } from 'vs/platform/opener/browser/link'; import { renderLabelWithIcons } from 'vs/base/browser/ui/iconLabel/iconLabels'; import { DisposableStore } from 'vs/base/common/lifecycle'; +import { ToolBar } from 'vs/base/browser/ui/toolbar/toolbar'; +import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; +import { Action } from 'vs/base/common/actions'; +import { Codicon } from 'vs/base/common/codicons'; +// import Severity from 'vs/base/common/severity'; class LanguageStatusTemplate { - readonly firstLine: HTMLDivElement; - readonly secondLine: HTMLDivElement; + readonly text: HTMLDivElement; + readonly toolbar: ToolBar; constructor( readonly container: HTMLElement, - @IOpenerService private readonly _openerService: IOpenerService + @IContextMenuService contextMenuService: IContextMenuService, + @IOpenerService private readonly _openerService: IOpenerService, ) { container.classList.add('status-element'); - this.firstLine = document.createElement('div'); - this.secondLine = document.createElement('div'); - this.secondLine.classList.add('detail'); - container.appendChild(this.firstLine); - container.appendChild(this.secondLine); + this.text = document.createElement('div'); + container.appendChild(this.text); + + const toolbarContainer = document.createElement('div'); + container.appendChild(toolbarContainer); + + this.toolbar = new ToolBar(toolbarContainer, contextMenuService, {}); } dispose() { - + this.toolbar.dispose(); } set(element: ILanguageStatus): void { // message // source - dom.clearNode(this.firstLine); + dom.clearNode(this.text); + + // switch (element.severity) { + // case Severity.Error: + // dom.append(this.text, ...renderLabelWithIcons('$(error)')); + // break; + // case Severity.Warning: + // dom.append(this.text, ...renderLabelWithIcons('$(warning)')); + // break; + // case Severity.Info: + // default: + // dom.append(this.text, ...renderLabelWithIcons('$(info)')); + // break; + // } + for (let node of parseLinkedText(element.message).nodes) { if (typeof node === 'string') { const parts = renderLabelWithIcons(node); - dom.append(this.firstLine, ...parts); + dom.append(this.text, ...parts); } else { - dom.append(this.firstLine, new Link(node, undefined, this._openerService).el); + dom.append(this.text, new Link(node, undefined, this._openerService).el); } } - dom.reset(this.secondLine, element.source); + this.toolbar.setActions([new Action( + 'dd', + localize('label.pin', 'Pin'), + ThemeIcon.asClassName(Codicon.pin), + true, + () => { + console.log(element); + } + )]); } } @@ -68,7 +98,7 @@ class Renderer implements IListRenderer // delegate getHeight(element: ILanguageStatus): number { - return 56; + return 42; } getTemplateId(element: ILanguageStatus): string { return Renderer.templateId; @@ -158,7 +188,7 @@ export class LanguageStatusDetailsWidget { } layout() { - const width = Math.max(200, this._layoutService.dimension.width * 0.6); + const width = Math.min(460, Math.max(200, this._layoutService.dimension.width * 0.6)); this._container.style.width = `${width}px`; this._list.layout(); } diff --git a/src/vs/workbench/contrib/languageStatus/browser/media/languageStatus.css b/src/vs/workbench/contrib/languageStatus/browser/media/languageStatus.css index 5888810413e..b3a4baf0505 100644 --- a/src/vs/workbench/contrib/languageStatus/browser/media/languageStatus.css +++ b/src/vs/workbench/contrib/languageStatus/browser/media/languageStatus.css @@ -4,17 +4,15 @@ *--------------------------------------------------------------------------------------------*/ .monaco-workbench .language-status { - margin: 8px; + margin: 7px; cursor: default; box-shadow: var(--code-widget-shadow) 0 0 8px 2px; } .monaco-workbench .language-status .list-container .status-element { padding: 10px 5px; -} - -.monaco-workbench .language-status .list-container .status-element div.detail { - font-size: smaller; + display: flex; + justify-content: space-between; } .monaco-workbench .language-status .list-container .monaco-list-row[data-last-element="false"].status-element { diff --git a/src/vs/workbench/services/languageStatus/common/languageStatusService.ts b/src/vs/workbench/services/languageStatus/common/languageStatusService.ts index 9cdb7202b97..6a709fb59c0 100644 --- a/src/vs/workbench/services/languageStatus/common/languageStatusService.ts +++ b/src/vs/workbench/services/languageStatus/common/languageStatusService.ts @@ -17,6 +17,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' export interface ILanguageStatus { selector: LanguageSelector, severity: Severity; + text: string; message: string; source: string; }