|
|
|
|
@ -710,6 +710,20 @@ export class FloatPanelProvider {
|
|
|
|
|
return Math.round(value * dpr) / dpr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private listenPointerGesture(
|
|
|
|
|
element: HTMLElement | null,
|
|
|
|
|
onMove: (event: PointerEvent) => void,
|
|
|
|
|
onEnd: (event: PointerEvent) => void
|
|
|
|
|
): () => void {
|
|
|
|
|
const doc = this.soma.dom.getDocument(element);
|
|
|
|
|
const remove = [
|
|
|
|
|
this.soma.dom.listen(doc, 'pointermove', (event) => onMove(event as PointerEvent)),
|
|
|
|
|
this.soma.dom.listen(doc, 'pointerup', (event) => onEnd(event as PointerEvent)),
|
|
|
|
|
this.soma.dom.listen(doc, 'pointercancel', (event) => onEnd(event as PointerEvent))
|
|
|
|
|
];
|
|
|
|
|
return () => remove.forEach((dispose) => dispose());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ── Drag (move) ─────────────────────────────────────────────────────────
|
|
|
|
|
|
|
|
|
|
private dragCleanup: (() => void) | null = null;
|
|
|
|
|
@ -756,19 +770,11 @@ export class FloatPanelProvider {
|
|
|
|
|
// setProperty delegate, so the same-task timing is preserved.)
|
|
|
|
|
if (this.contentRef.current)
|
|
|
|
|
this.soma.dom.writeProperty(this.contentRef.current, 'will-change', 'translate');
|
|
|
|
|
const doc = this.soma.dom.getDocument(this.dragEl);
|
|
|
|
|
const move = this.soma.dom.listen(doc, 'pointermove', (ev) =>
|
|
|
|
|
this.onDragMove(ev as PointerEvent)
|
|
|
|
|
);
|
|
|
|
|
const up = this.soma.dom.listen(doc, 'pointerup', (ev) => this.endDrag(ev as PointerEvent));
|
|
|
|
|
const cancel = this.soma.dom.listen(doc, 'pointercancel', (ev) =>
|
|
|
|
|
this.endDrag(ev as PointerEvent)
|
|
|
|
|
this.dragCleanup = this.listenPointerGesture(
|
|
|
|
|
this.dragEl,
|
|
|
|
|
(event) => this.onDragMove(event),
|
|
|
|
|
(event) => this.endDrag(event)
|
|
|
|
|
);
|
|
|
|
|
this.dragCleanup = () => {
|
|
|
|
|
move();
|
|
|
|
|
up();
|
|
|
|
|
cancel();
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private onDragMove(e: PointerEvent): void {
|
|
|
|
|
@ -890,19 +896,11 @@ export class FloatPanelProvider {
|
|
|
|
|
this.resizing = true;
|
|
|
|
|
if (this.contentRef.current)
|
|
|
|
|
this.soma.dom.writeProperty(this.contentRef.current, 'will-change', 'translate');
|
|
|
|
|
const doc = this.soma.dom.getDocument(this.resizeEl);
|
|
|
|
|
const move = this.soma.dom.listen(doc, 'pointermove', (ev) =>
|
|
|
|
|
this.onResizeMove(ev as PointerEvent)
|
|
|
|
|
);
|
|
|
|
|
const up = this.soma.dom.listen(doc, 'pointerup', (ev) => this.endResize(ev as PointerEvent));
|
|
|
|
|
const cancel = this.soma.dom.listen(doc, 'pointercancel', (ev) =>
|
|
|
|
|
this.endResize(ev as PointerEvent)
|
|
|
|
|
this.resizeCleanup = this.listenPointerGesture(
|
|
|
|
|
this.resizeEl,
|
|
|
|
|
(event) => this.onResizeMove(event),
|
|
|
|
|
(event) => this.endResize(event)
|
|
|
|
|
);
|
|
|
|
|
this.resizeCleanup = () => {
|
|
|
|
|
move();
|
|
|
|
|
up();
|
|
|
|
|
cancel();
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private onResizeMove(e: PointerEvent): void {
|
|
|
|
|
|