import { injectable } from 'inversify'; import { ColorDefinition, ColorRegistry, Color, ThemeService } from '@gedit/theme'; import { Color as MonacoColor, RGBA, HSLA } from '../common/color'; import { MonacoColorRegistry } from '../common/monaco-color-registry'; import { MonacoThemeRegistry } from './monaco-theme-registry'; import { Disposable } from '@gedit/utils'; @injectable() export class MonacoThemeColorRegistry extends ColorRegistry { *getColors(): IterableIterator { for (const { id } of this.monacoColorRegistry.getColors()) { yield id; } } protected monacoThemeRegistry = MonacoThemeRegistry.SINGLETON; readonly monacoColorRegistry = MonacoColorRegistry.getColorRegistry(); getCurrentColor(id: string): string | undefined { const currentTheme = ThemeService.get().getCurrentTheme(); const color = this.monacoColorRegistry.resolveDefaultColor(id, this.monacoThemeRegistry.getColorTheme(currentTheme.type)); if (color) { return color.toString(); } } doRegister(definition: ColorDefinition): Disposable { let defaults: MonacoColorRegistry.ColorDefaults; if (definition.defaults) { defaults = {}; defaults.dark = this.toColor(definition.defaults.dark); defaults.light = this.toColor(definition.defaults.light); defaults.hc = this.toColor(definition.defaults.hc); } const identifier = this.monacoColorRegistry.registerColor(definition.id, defaults!, definition.description); return Disposable.create(() => this.monacoColorRegistry.deregisterColor(identifier)); } protected toColor(value: Color | undefined): MonacoColorRegistry.ColorValue | undefined { if (!value || typeof value === 'string') { return value; } if ('kind' in value) { return MonacoColorRegistry[value.kind](value.v, value.f); } else if ('r' in value) { const { r, g, b, a } = value; return new MonacoColor(new RGBA(r, g, b, a)); } else { const { h, s, l, a } = value; return new MonacoColor(new HSLA(h, s, l, a)); } } }