feat: center one-shot but keeps position on manual resize (centerLocked)

This commit is contained in:
Hermes Agent committed 2026-09-09 19:13:58 +02:00
1 parent ab6a2e879f
commit c0e2fe0358
1 file changed
+11 -1
+11 -1
View File
@@ -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)