Path: blob/main/src/vs/platform/layout/browser/zIndexRegistry.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { clearNode } from '../../../base/browser/dom.js';6import { createCSSRule, createStyleSheet } from '../../../base/browser/domStylesheets.js';7import { RunOnceScheduler } from '../../../base/common/async.js';89export enum ZIndex {10Base = 0,11Sash = 35,12SuggestWidget = 40,13Hover = 50,14DragImage = 1000,15MenubarMenuItemsHolder = 2000, // quick-input-widget16ContextView = 2500,17ModalDialog = 2600,18PaneDropOverlay = 1000019}2021const ZIndexValues = Object.keys(ZIndex).filter(key => !isNaN(Number(key))).map(key => Number(key)).sort((a, b) => b - a);22function findBase(z: number) {23for (const zi of ZIndexValues) {24if (z >= zi) {25return zi;26}27}2829return -1;30}3132class ZIndexRegistry {33private styleSheet: HTMLStyleElement;34private zIndexMap: Map<string, number>;35private scheduler: RunOnceScheduler;36constructor() {37this.styleSheet = createStyleSheet();38this.zIndexMap = new Map<string, number>();39this.scheduler = new RunOnceScheduler(() => this.updateStyleElement(), 200);40}4142registerZIndex(relativeLayer: ZIndex, z: number, name: string): string {43if (this.zIndexMap.get(name)) {44throw new Error(`z-index with name ${name} has already been registered.`);45}4647const proposedZValue = relativeLayer + z;48if (findBase(proposedZValue) !== relativeLayer) {49throw new Error(`Relative layer: ${relativeLayer} + z-index: ${z} exceeds next layer ${proposedZValue}.`);50}5152this.zIndexMap.set(name, proposedZValue);53this.scheduler.schedule();54return this.getVarName(name);55}5657private getVarName(name: string): string {58return `--z-index-${name}`;59}6061private updateStyleElement(): void {62clearNode(this.styleSheet);63let ruleBuilder = '';64this.zIndexMap.forEach((zIndex, name) => {65ruleBuilder += `${this.getVarName(name)}: ${zIndex};\n`;66});67createCSSRule(':root', ruleBuilder, this.styleSheet);68}69}7071const zIndexRegistry = new ZIndexRegistry();7273export function registerZIndex(relativeLayer: ZIndex, z: number, name: string): string {74return zIndexRegistry.registerZIndex(relativeLayer, z, name);75}767778