diff --git a/src/main.ts b/src/main.ts index afd48ba..dbc6338 100644 --- a/src/main.ts +++ b/src/main.ts @@ -14,6 +14,11 @@ export default function () { // canvas-space-точка "уплывает" на экране при смене зума/пана. let dockedPosition: DockPosition | null = null + // Флаг "центр удерживает позицию при ресайзе". Центр НЕ док (не поллит за зумом/паном), + // но после one-shot центрирования ручной ресайз пересчитывает позицию и держит окно по + // центру (как раньше нравилось). Сбрасывается при нажатии любой другой dock-кнопки. + let centerLocked = false + // 9 позиций докинга: 4 угла + 4 края + центр. type DockPosition = | 'top-left' | 'top-center' | 'top-right' @@ -130,6 +135,9 @@ export default function () { if (isLeftRight) dockEdgeSize = width else if (isTopBottom) dockEdgeSize = height applyDock(dockedPosition, width, height) + } else if (centerLocked) { + // Центр: позиция удерживается по центру при ресайзе (но не поллит за зумом/паном). + applyDock('center', width, height) } }) @@ -137,13 +145,15 @@ export default function () { on('DOCK_WINDOW', function (payload: { position: DockPosition; width: number; height: number }) { const { position, width, height } = payload // Центр — это one-shot: применяем 50% по центру ОДИН раз, НЕ включаем поллинг - // (окно не "приклеено", ручной ресайз/драг работают свободно после). + // (окно не "приклеено"), но включаем centerLocked — ручной ресайз держит центр. if (position === 'center') { dockedPosition = null + centerLocked = true applyDock('center', width, height) return } // Остальные позиции — удерживаем прижатым (поллинг пересчитывает при зуме/пане). + centerLocked = false dockedPosition = position lastBoundsKey = '' // форсируем пересчёт на ближайшем тике applyDock(position, width, height)