mirror of
https://github.com/mathuo/dockview
synced 2025-02-02 06:25:44 +00:00
bug: render mode z-index fixes
This commit is contained in:
parent
5b9dbdf57e
commit
f765dd52fc
@ -1,4 +1,4 @@
|
|||||||
import { getElementsByTagName } from '../dom';
|
import { disableIframePointEvents, getElementsByTagName } from '../dom';
|
||||||
import { addDisposableListener, Emitter } from '../events';
|
import { addDisposableListener, Emitter } from '../events';
|
||||||
import {
|
import {
|
||||||
CompositeDisposable,
|
CompositeDisposable,
|
||||||
@ -40,23 +40,14 @@ export abstract class DragHandler extends CompositeDisposable {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const iframes = [
|
const iframes = disableIframePointEvents();
|
||||||
...getElementsByTagName('iframe'),
|
|
||||||
...getElementsByTagName('webview'),
|
|
||||||
];
|
|
||||||
|
|
||||||
this.pointerEventsDisposable.value = {
|
this.pointerEventsDisposable.value = {
|
||||||
dispose: () => {
|
dispose: () => {
|
||||||
for (const iframe of iframes) {
|
iframes.release();
|
||||||
iframe.style.pointerEvents = 'auto';
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
for (const iframe of iframes) {
|
|
||||||
iframe.style.pointerEvents = 'none';
|
|
||||||
}
|
|
||||||
|
|
||||||
this.el.classList.add('dv-dragged');
|
this.el.classList.add('dv-dragged');
|
||||||
setTimeout(() => this.el.classList.remove('dv-dragged'), 0);
|
setTimeout(() => this.el.classList.remove('dv-dragged'), 0);
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
z-index: 997;
|
z-index: 997;
|
||||||
|
|
||||||
&.dv-bring-to-front {
|
&.dv-bring-to-front {
|
||||||
z-index: 998;
|
z-index: 999;
|
||||||
}
|
}
|
||||||
|
|
||||||
border: 1px solid var(--dv-tab-divider-color);
|
border: 1px solid var(--dv-tab-divider-color);
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
import {
|
import {
|
||||||
|
applyOnlyToThisElement,
|
||||||
|
disableIframePointEvents,
|
||||||
getElementsByTagName,
|
getElementsByTagName,
|
||||||
quasiDefaultPrevented,
|
quasiDefaultPrevented,
|
||||||
toggleClass,
|
toggleClass,
|
||||||
@ -13,20 +15,7 @@ import { CompositeDisposable, MutableDisposable } from '../lifecycle';
|
|||||||
import { clamp } from '../math';
|
import { clamp } from '../math';
|
||||||
import { AnchoredBox } from '../types';
|
import { AnchoredBox } from '../types';
|
||||||
|
|
||||||
const bringElementToFront = (() => {
|
const bringElementToFront = applyOnlyToThisElement('dv-bring-to-front');
|
||||||
let previous: HTMLElement | null = null;
|
|
||||||
|
|
||||||
function pushToTop(element: HTMLElement) {
|
|
||||||
if (previous !== element && previous !== null) {
|
|
||||||
toggleClass(previous, 'dv-bring-to-front', false);
|
|
||||||
}
|
|
||||||
|
|
||||||
toggleClass(element, 'dv-bring-to-front', true);
|
|
||||||
previous = element;
|
|
||||||
}
|
|
||||||
|
|
||||||
return pushToTop;
|
|
||||||
})();
|
|
||||||
|
|
||||||
export class Overlay extends CompositeDisposable {
|
export class Overlay extends CompositeDisposable {
|
||||||
private _element: HTMLElement = document.createElement('div');
|
private _element: HTMLElement = document.createElement('div');
|
||||||
@ -88,6 +77,10 @@ export class Overlay extends CompositeDisposable {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bringToFront(): void {
|
||||||
|
bringElementToFront.update(this._element);
|
||||||
|
}
|
||||||
|
|
||||||
setBounds(bounds: Partial<AnchoredBox> = {}): void {
|
setBounds(bounds: Partial<AnchoredBox> = {}): void {
|
||||||
if (typeof bounds.height === 'number') {
|
if (typeof bounds.height === 'number') {
|
||||||
this._element.style.height = `${bounds.height}px`;
|
this._element.style.height = `${bounds.height}px`;
|
||||||
@ -207,21 +200,12 @@ export class Overlay extends CompositeDisposable {
|
|||||||
const track = () => {
|
const track = () => {
|
||||||
let offset: { x: number; y: number } | null = null;
|
let offset: { x: number; y: number } | null = null;
|
||||||
|
|
||||||
const iframes = [
|
const iframes = disableIframePointEvents();
|
||||||
...getElementsByTagName('iframe'),
|
|
||||||
...getElementsByTagName('webview'),
|
|
||||||
];
|
|
||||||
|
|
||||||
for (const iframe of iframes) {
|
|
||||||
iframe.style.pointerEvents = 'none';
|
|
||||||
}
|
|
||||||
|
|
||||||
move.value = new CompositeDisposable(
|
move.value = new CompositeDisposable(
|
||||||
{
|
{
|
||||||
dispose: () => {
|
dispose: () => {
|
||||||
for (const iframe of iframes) {
|
iframes.release();
|
||||||
iframe.style.pointerEvents = 'auto';
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
addDisposableWindowListener(window, 'mousemove', (e) => {
|
addDisposableWindowListener(window, 'mousemove', (e) => {
|
||||||
@ -362,13 +346,13 @@ export class Overlay extends CompositeDisposable {
|
|||||||
this.options.content,
|
this.options.content,
|
||||||
'mousedown',
|
'mousedown',
|
||||||
() => {
|
() => {
|
||||||
bringElementToFront(this._element);
|
bringElementToFront.update(this._element);
|
||||||
},
|
},
|
||||||
true
|
true
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
bringElementToFront(this._element);
|
bringElementToFront.update(this._element);
|
||||||
|
|
||||||
if (options.inDragMode) {
|
if (options.inDragMode) {
|
||||||
track();
|
track();
|
||||||
@ -404,14 +388,7 @@ export class Overlay extends CompositeDisposable {
|
|||||||
originalWidth: number;
|
originalWidth: number;
|
||||||
} | null = null;
|
} | null = null;
|
||||||
|
|
||||||
const iframes = [
|
const iframes = disableIframePointEvents();
|
||||||
...getElementsByTagName('iframe'),
|
|
||||||
...getElementsByTagName('webview'),
|
|
||||||
];
|
|
||||||
|
|
||||||
for (const iframe of iframes) {
|
|
||||||
iframe.style.pointerEvents = 'none';
|
|
||||||
}
|
|
||||||
|
|
||||||
move.value = new CompositeDisposable(
|
move.value = new CompositeDisposable(
|
||||||
addDisposableWindowListener(window, 'mousemove', (e) => {
|
addDisposableWindowListener(window, 'mousemove', (e) => {
|
||||||
@ -582,9 +559,7 @@ export class Overlay extends CompositeDisposable {
|
|||||||
}),
|
}),
|
||||||
{
|
{
|
||||||
dispose: () => {
|
dispose: () => {
|
||||||
for (const iframe of iframes) {
|
iframes.release();
|
||||||
iframe.style.pointerEvents = 'auto';
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
addDisposableWindowListener(window, 'mouseup', () => {
|
addDisposableWindowListener(window, 'mouseup', () => {
|
||||||
|
@ -3,7 +3,12 @@ import {
|
|||||||
IDisposable,
|
IDisposable,
|
||||||
MutableDisposable,
|
MutableDisposable,
|
||||||
} from '../../../lifecycle';
|
} from '../../../lifecycle';
|
||||||
import { Emitter, Event } from '../../../events';
|
import {
|
||||||
|
addDisposableListener,
|
||||||
|
addDisposableWindowListener,
|
||||||
|
Emitter,
|
||||||
|
Event,
|
||||||
|
} from '../../../events';
|
||||||
import { trackFocus } from '../../../dom';
|
import { trackFocus } from '../../../dom';
|
||||||
import { IDockviewPanel } from '../../dockviewPanel';
|
import { IDockviewPanel } from '../../dockviewPanel';
|
||||||
import { DockviewComponent } from '../../dockviewComponent';
|
import { DockviewComponent } from '../../dockviewComponent';
|
||||||
|
@ -42,7 +42,7 @@ export class VoidContainer extends CompositeDisposable {
|
|||||||
this.addDisposables(
|
this.addDisposables(
|
||||||
this._onDrop,
|
this._onDrop,
|
||||||
this._onDragStart,
|
this._onDragStart,
|
||||||
addDisposableListener(this._element, 'click', () => {
|
addDisposableListener(this._element, 'pointerdown', () => {
|
||||||
this.accessor.doSetGroupActive(this.group);
|
this.accessor.doSetGroupActive(this.group);
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
@ -927,10 +927,17 @@ export class DockviewComponent
|
|||||||
overlay
|
overlay
|
||||||
);
|
);
|
||||||
|
|
||||||
const disposable = watchElementResize(group.element, (entry) => {
|
const disposable = new CompositeDisposable(
|
||||||
|
group.api.onDidActiveChange((event) => {
|
||||||
|
if (event.isActive) {
|
||||||
|
overlay.bringToFront();
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
watchElementResize(group.element, (entry) => {
|
||||||
const { width, height } = entry.contentRect;
|
const { width, height } = entry.contentRect;
|
||||||
group.layout(width, height); // let the group know it's size is changing so it can fire events to the panel
|
group.layout(width, height); // let the group know it's size is changing so it can fire events to the panel
|
||||||
});
|
})
|
||||||
|
);
|
||||||
|
|
||||||
floatingGroupPanel.addDisposables(
|
floatingGroupPanel.addDisposables(
|
||||||
overlay.onDidChange(() => {
|
overlay.onDidChange(() => {
|
||||||
|
@ -257,3 +257,42 @@ export function isInDocument(element: Element): boolean {
|
|||||||
export function addTestId(element: HTMLElement, id: string): void {
|
export function addTestId(element: HTMLElement, id: string): void {
|
||||||
element.setAttribute('data-testid', id);
|
element.setAttribute('data-testid', id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function disableIframePointEvents() {
|
||||||
|
const iframes = [
|
||||||
|
...getElementsByTagName('iframe'),
|
||||||
|
...getElementsByTagName('webview'),
|
||||||
|
];
|
||||||
|
const original = new Map<HTMLElement, string>();
|
||||||
|
|
||||||
|
for (const iframe of iframes) {
|
||||||
|
original.set(iframe, iframe.style.pointerEvents);
|
||||||
|
iframe.style.pointerEvents = 'none';
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
release: () => {
|
||||||
|
for (const iframe of iframes) {
|
||||||
|
iframe.style.pointerEvents = original.get(iframe) ?? 'auto';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function applyOnlyToThisElement(className: string): {
|
||||||
|
update: (element: HTMLElement) => void;
|
||||||
|
} {
|
||||||
|
let previous: WeakRef<HTMLElement> | null;
|
||||||
|
|
||||||
|
return {
|
||||||
|
update: (element: HTMLElement): void => {
|
||||||
|
const ref = previous?.deref();
|
||||||
|
if (ref !== element && ref !== undefined) {
|
||||||
|
toggleClass(ref, className, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
toggleClass(element, className, true);
|
||||||
|
previous = new WeakRef(element);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
@ -4,7 +4,11 @@
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
|
|
||||||
&.dv-render-overlay-float {
|
&.dv-render-overlay-float {
|
||||||
z-index: 999;
|
z-index: 998;
|
||||||
|
|
||||||
|
&.dv-render-overlay-active {
|
||||||
|
z-index: 1000;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
import { DragAndDropObserver } from './dnd/dnd';
|
import { DragAndDropObserver } from './dnd/dnd';
|
||||||
import { Droptarget } from './dnd/droptarget';
|
import { Droptarget } from './dnd/droptarget';
|
||||||
import { getDomNodePagePosition, toggleClass } from './dom';
|
import {
|
||||||
|
applyOnlyToThisElement,
|
||||||
|
getDomNodePagePosition,
|
||||||
|
toggleClass,
|
||||||
|
} from './dom';
|
||||||
import { CompositeDisposable, Disposable, IDisposable } from './lifecycle';
|
import { CompositeDisposable, Disposable, IDisposable } from './lifecycle';
|
||||||
import { IDockviewPanel } from './dockview/dockviewPanel';
|
import { IDockviewPanel } from './dockview/dockviewPanel';
|
||||||
|
|
||||||
@ -17,6 +21,8 @@ function createFocusableElement(): HTMLDivElement {
|
|||||||
return element;
|
return element;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const bringElementToFront = applyOnlyToThisElement('dv-active');
|
||||||
|
|
||||||
export class OverlayRenderContainer extends CompositeDisposable {
|
export class OverlayRenderContainer extends CompositeDisposable {
|
||||||
private readonly map: Record<
|
private readonly map: Record<
|
||||||
string,
|
string,
|
||||||
@ -148,6 +154,16 @@ export class OverlayRenderContainer extends CompositeDisposable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
resize();
|
resize();
|
||||||
|
}),
|
||||||
|
panel.api.onDidActiveGroupChange(() => {
|
||||||
|
// toggleClass(
|
||||||
|
// focusContainer,
|
||||||
|
// 'dv-active',
|
||||||
|
// panel.api.isGroupActive
|
||||||
|
// );
|
||||||
|
if (panel.api.isGroupActive) {
|
||||||
|
bringElementToFront.update(focusContainer);
|
||||||
|
}
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@ import {
|
|||||||
addClasses,
|
addClasses,
|
||||||
toggleClass,
|
toggleClass,
|
||||||
getElementsByTagName,
|
getElementsByTagName,
|
||||||
|
disableIframePointEvents,
|
||||||
} from '../dom';
|
} from '../dom';
|
||||||
import { Event, Emitter } from '../events';
|
import { Event, Emitter } from '../events';
|
||||||
import { pushToStart, pushToEnd, firstIndex } from '../array';
|
import { pushToStart, pushToEnd, firstIndex } from '../array';
|
||||||
@ -437,14 +438,7 @@ export class Splitview {
|
|||||||
item.enabled = false;
|
item.enabled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const iframes = [
|
const iframes = disableIframePointEvents();
|
||||||
...getElementsByTagName('iframe'),
|
|
||||||
...getElementsByTagName('webview'),
|
|
||||||
];
|
|
||||||
|
|
||||||
for (const iframe of iframes) {
|
|
||||||
iframe.style.pointerEvents = 'none';
|
|
||||||
}
|
|
||||||
|
|
||||||
const start =
|
const start =
|
||||||
this._orientation === Orientation.HORIZONTAL
|
this._orientation === Orientation.HORIZONTAL
|
||||||
@ -553,9 +547,7 @@ export class Splitview {
|
|||||||
item.enabled = true;
|
item.enabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const iframe of iframes) {
|
iframes.release();
|
||||||
iframe.style.pointerEvents = 'auto';
|
|
||||||
}
|
|
||||||
|
|
||||||
this.saveProportions();
|
this.saveProportions();
|
||||||
|
|
||||||
|
@ -20,6 +20,8 @@
|
|||||||
"ES2017.String",
|
"ES2017.String",
|
||||||
"ES2018.Promise",
|
"ES2018.Promise",
|
||||||
"ES2019",
|
"ES2019",
|
||||||
|
"ES2020",
|
||||||
|
"ES2021",
|
||||||
"DOM"
|
"DOM"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user