vscode/src/vs/workbench/services/themes/common/workbenchThemeService.ts

216 lines
8.4 KiB
TypeScript

/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { refineServiceDecorator } from 'vs/platform/instantiation/common/instantiation';
import { Event } from 'vs/base/common/event';
import { Color } from 'vs/base/common/color';
import { IColorTheme, IThemeService, IFileIconTheme } from 'vs/platform/theme/common/themeService';
import { ConfigurationTarget } from 'vs/platform/configuration/common/configuration';
import { isBoolean, isString } from 'vs/base/common/types';
export const IWorkbenchThemeService = refineServiceDecorator<IThemeService, IWorkbenchThemeService>(IThemeService);
export const VS_LIGHT_THEME = 'vs';
export const VS_DARK_THEME = 'vs-dark';
export const VS_HC_THEME = 'hc-black';
export const HC_THEME_ID = 'Default High Contrast';
export const THEME_SCOPE_OPEN_PAREN = '[';
export const THEME_SCOPE_CLOSE_PAREN = ']';
export const THEME_SCOPE_WILDCARD = '*';
export const themeScopeRegex = /\[(.+?)\]/g;
export enum ThemeSettings {
COLOR_THEME = 'workbench.colorTheme',
FILE_ICON_THEME = 'workbench.iconTheme',
PRODUCT_ICON_THEME = 'workbench.productIconTheme',
COLOR_CUSTOMIZATIONS = 'workbench.colorCustomizations',
TOKEN_COLOR_CUSTOMIZATIONS = 'editor.tokenColorCustomizations',
SEMANTIC_TOKEN_COLOR_CUSTOMIZATIONS = 'editor.semanticTokenColorCustomizations',
PREFERRED_DARK_THEME = 'workbench.preferredDarkColorTheme',
PREFERRED_LIGHT_THEME = 'workbench.preferredLightColorTheme',
PREFERRED_HC_THEME = 'workbench.preferredHighContrastColorTheme',
DETECT_COLOR_SCHEME = 'window.autoDetectColorScheme',
DETECT_HC = 'window.autoDetectHighContrast'
}
export interface IWorkbenchTheme {
readonly id: string;
readonly label: string;
readonly extensionData?: ExtensionData;
readonly description?: string;
readonly settingsId: string | null;
}
export interface IWorkbenchColorTheme extends IWorkbenchTheme, IColorTheme {
readonly settingsId: string;
readonly tokenColors: ITextMateThemingRule[];
}
export interface IColorMap {
[id: string]: Color;
}
export interface IWorkbenchFileIconTheme extends IWorkbenchTheme, IFileIconTheme {
}
export interface IWorkbenchProductIconTheme extends IWorkbenchTheme {
readonly settingsId: string;
}
export type ThemeSettingTarget = ConfigurationTarget | undefined | 'auto' | 'preview';
export interface IWorkbenchThemeService extends IThemeService {
readonly _serviceBrand: undefined;
setColorTheme(themeId: string | undefined | IWorkbenchColorTheme, settingsTarget: ThemeSettingTarget): Promise<IWorkbenchColorTheme | null>;
getColorTheme(): IWorkbenchColorTheme;
getColorThemes(): Promise<IWorkbenchColorTheme[]>;
getMarketplaceColorThemes(publisher: string, name: string, version: string): Promise<IWorkbenchColorTheme[]>;
onDidColorThemeChange: Event<IWorkbenchColorTheme>;
setFileIconTheme(iconThemeId: string | undefined | IWorkbenchFileIconTheme, settingsTarget: ThemeSettingTarget): Promise<IWorkbenchFileIconTheme>;
getFileIconTheme(): IWorkbenchFileIconTheme;
getFileIconThemes(): Promise<IWorkbenchFileIconTheme[]>;
getMarketplaceFileIconThemes(publisher: string, name: string, version: string): Promise<IWorkbenchFileIconTheme[]>;
onDidFileIconThemeChange: Event<IWorkbenchFileIconTheme>;
setProductIconTheme(iconThemeId: string | undefined | IWorkbenchProductIconTheme, settingsTarget: ThemeSettingTarget): Promise<IWorkbenchProductIconTheme>;
getProductIconTheme(): IWorkbenchProductIconTheme;
getProductIconThemes(): Promise<IWorkbenchProductIconTheme[]>;
getMarketplaceProductIconThemes(publisher: string, name: string, version: string): Promise<IWorkbenchProductIconTheme[]>;
onDidProductIconThemeChange: Event<IWorkbenchProductIconTheme>;
}
export interface IThemeScopedColorCustomizations {
[colorId: string]: string;
}
export interface IColorCustomizations {
[colorIdOrThemeScope: string]: IThemeScopedColorCustomizations | string;
}
export interface IThemeScopedTokenColorCustomizations {
[groupId: string]: ITextMateThemingRule[] | ITokenColorizationSetting | boolean | string | undefined;
comments?: string | ITokenColorizationSetting;
strings?: string | ITokenColorizationSetting;
numbers?: string | ITokenColorizationSetting;
keywords?: string | ITokenColorizationSetting;
types?: string | ITokenColorizationSetting;
functions?: string | ITokenColorizationSetting;
variables?: string | ITokenColorizationSetting;
textMateRules?: ITextMateThemingRule[];
semanticHighlighting?: boolean; // deprecated, use ISemanticTokenColorCustomizations.enabled instead
}
export interface ITokenColorCustomizations {
[groupIdOrThemeScope: string]: IThemeScopedTokenColorCustomizations | ITextMateThemingRule[] | ITokenColorizationSetting | boolean | string | undefined;
comments?: string | ITokenColorizationSetting;
strings?: string | ITokenColorizationSetting;
numbers?: string | ITokenColorizationSetting;
keywords?: string | ITokenColorizationSetting;
types?: string | ITokenColorizationSetting;
functions?: string | ITokenColorizationSetting;
variables?: string | ITokenColorizationSetting;
textMateRules?: ITextMateThemingRule[];
semanticHighlighting?: boolean; // deprecated, use ISemanticTokenColorCustomizations.enabled instead
}
export interface IThemeScopedSemanticTokenColorCustomizations {
[styleRule: string]: ISemanticTokenRules | boolean | undefined;
enabled?: boolean;
rules?: ISemanticTokenRules;
}
export interface ISemanticTokenColorCustomizations {
[styleRuleOrThemeScope: string]: IThemeScopedSemanticTokenColorCustomizations | ISemanticTokenRules | boolean | undefined;
enabled?: boolean;
rules?: ISemanticTokenRules;
}
export interface IThemeScopedExperimentalSemanticTokenColorCustomizations {
[themeScope: string]: ISemanticTokenRules | undefined;
}
export interface IExperimentalSemanticTokenColorCustomizations {
[styleRuleOrThemeScope: string]: IThemeScopedExperimentalSemanticTokenColorCustomizations | ISemanticTokenRules | undefined;
}
export type IThemeScopedCustomizations =
IThemeScopedColorCustomizations
| IThemeScopedTokenColorCustomizations
| IThemeScopedExperimentalSemanticTokenColorCustomizations
| IThemeScopedSemanticTokenColorCustomizations;
export type IThemeScopableCustomizations =
IColorCustomizations
| ITokenColorCustomizations
| IExperimentalSemanticTokenColorCustomizations
| ISemanticTokenColorCustomizations;
export interface ISemanticTokenRules {
[selector: string]: string | ISemanticTokenColorizationSetting | undefined;
}
export interface ITextMateThemingRule {
name?: string;
scope?: string | string[];
settings: ITokenColorizationSetting;
}
export interface ITokenColorizationSetting {
foreground?: string;
background?: string;
fontStyle?: string; /* [italic|underline|bold] */
}
export interface ISemanticTokenColorizationSetting {
foreground?: string;
fontStyle?: string; /* [italic|underline|bold] */
bold?: boolean;
underline?: boolean;
italic?: boolean;
}
export interface ExtensionVersion {
publisher: string;
name: string;
version: string;
}
export interface ExtensionData {
extensionId: string;
extensionPublisher: string;
extensionName: string;
extensionIsBuiltin: boolean;
}
export namespace ExtensionData {
export function toJSONObject(d: ExtensionData | undefined): any {
return d && { _extensionId: d.extensionId, _extensionIsBuiltin: d.extensionIsBuiltin, _extensionName: d.extensionName, _extensionPublisher: d.extensionPublisher };
}
export function fromJSONObject(o: any): ExtensionData | undefined {
if (o && isString(o._extensionId) && isBoolean(o._extensionIsBuiltin) && isString(o._extensionName) && isString(o._extensionPublisher)) {
return { extensionId: o._extensionId, extensionIsBuiltin: o._extensionIsBuiltin, extensionName: o._extensionName, extensionPublisher: o._extensionPublisher };
}
return undefined;
}
export function fromName(publisher: string, name: string, isBuiltin = false) : ExtensionData {
return { extensionPublisher: publisher, extensionId: `${publisher}.${name}`, extensionName: name, extensionIsBuiltin: isBuiltin };
}
}
export interface IThemeExtensionPoint {
id: string;
label?: string;
description?: string;
path: string;
uiTheme?: typeof VS_LIGHT_THEME | typeof VS_DARK_THEME | typeof VS_HC_THEME;
_watch: boolean; // unsupported options to watch location
}