Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/platform/layout/browser/zIndexRegistry.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { clearNode } from '../../../base/browser/dom.js';
7
import { createCSSRule, createStyleSheet } from '../../../base/browser/domStylesheets.js';
8
import { RunOnceScheduler } from '../../../base/common/async.js';
9
10
export enum ZIndex {
11
Base = 0,
12
Sash = 35,
13
SuggestWidget = 40,
14
Hover = 50,
15
DragImage = 1000,
16
MenubarMenuItemsHolder = 2000, // quick-input-widget
17
ContextView = 2500,
18
ModalDialog = 2600,
19
PaneDropOverlay = 10000
20
}
21
22
const ZIndexValues = Object.keys(ZIndex).filter(key => !isNaN(Number(key))).map(key => Number(key)).sort((a, b) => b - a);
23
function findBase(z: number) {
24
for (const zi of ZIndexValues) {
25
if (z >= zi) {
26
return zi;
27
}
28
}
29
30
return -1;
31
}
32
33
class ZIndexRegistry {
34
private styleSheet: HTMLStyleElement;
35
private zIndexMap: Map<string, number>;
36
private scheduler: RunOnceScheduler;
37
constructor() {
38
this.styleSheet = createStyleSheet();
39
this.zIndexMap = new Map<string, number>();
40
this.scheduler = new RunOnceScheduler(() => this.updateStyleElement(), 200);
41
}
42
43
registerZIndex(relativeLayer: ZIndex, z: number, name: string): string {
44
if (this.zIndexMap.get(name)) {
45
throw new Error(`z-index with name ${name} has already been registered.`);
46
}
47
48
const proposedZValue = relativeLayer + z;
49
if (findBase(proposedZValue) !== relativeLayer) {
50
throw new Error(`Relative layer: ${relativeLayer} + z-index: ${z} exceeds next layer ${proposedZValue}.`);
51
}
52
53
this.zIndexMap.set(name, proposedZValue);
54
this.scheduler.schedule();
55
return this.getVarName(name);
56
}
57
58
private getVarName(name: string): string {
59
return `--z-index-${name}`;
60
}
61
62
private updateStyleElement(): void {
63
clearNode(this.styleSheet);
64
let ruleBuilder = '';
65
this.zIndexMap.forEach((zIndex, name) => {
66
ruleBuilder += `${this.getVarName(name)}: ${zIndex};\n`;
67
});
68
createCSSRule(':root', ruleBuilder, this.styleSheet);
69
}
70
}
71
72
const zIndexRegistry = new ZIndexRegistry();
73
74
export function registerZIndex(relativeLayer: ZIndex, z: number, name: string): string {
75
return zIndexRegistry.registerZIndex(relativeLayer, z, name);
76
}
77
78