fix: center is pure one-shot (no centerLocked); resize no longer snaps to center
This commit is contained in:
1 parent
153ff2ae27
commit
bb0b01cabc
2 files changed
+3
-16
No files matched your search
+2
-15
@@ -13,12 +13,6 @@ export default function () {
|
||||
// viewport (через поллинг, т.к. события viewportchange в API нет), иначе
|
||||
// canvas-space-точка "уплывает" на экране при смене зума/пана.
|
||||
let dockedPosition: DockPosition | null = null
|
||||
|
||||
// Флаг "центр удерживает позицию при ресайзе". Центр НЕ док (не поллит за зумом/паном),
|
||||
// но после one-shot центрирования ручной ресайз пересчитывает позицию и держит окно по
|
||||
// центру (как раньше нравилось). Сбрасывается при нажатии любой другой dock-кнопки.
|
||||
let centerLocked = false
|
||||
|
||||
// 9 позиций докинга: 4 угла + 4 края + центр.
|
||||
type DockPosition =
|
||||
| 'top-left' | 'top-center' | 'top-right'
|
||||
@@ -222,9 +216,6 @@ export default function () {
|
||||
}
|
||||
if (dockedPosition !== null) {
|
||||
applyDock(dockedPosition, width, height, false)
|
||||
} else if (centerLocked) {
|
||||
// Центр: позиция удерживается по центру при ресайзе (но не поллит за зумом/паном).
|
||||
applyDock('center', width, height, false)
|
||||
}
|
||||
})
|
||||
|
||||
@@ -232,7 +223,6 @@ export default function () {
|
||||
// чтобы поллинг не переприжимал и RESIZE_WINDOW не ре-докал.
|
||||
on('UNDOCK', function () {
|
||||
dockedPosition = null
|
||||
centerLocked = false
|
||||
lastBoundsKey = ''
|
||||
})
|
||||
|
||||
@@ -246,14 +236,12 @@ export default function () {
|
||||
// к левому/верхнему краю вместо центра (баг relX=0 на top-center).
|
||||
on('DOCK_WINDOW', function (payload: { position: DockPosition; width: number; height: number }) {
|
||||
const { position } = payload
|
||||
// Центр — это one-shot: применяем 50% по центру ОДИН раз, НЕ включаем поллинг
|
||||
// (окно не "приклеено"), но включаем centerLocked — ручной ресайз держит центр.
|
||||
// Центр — это one-shot: применяем 50% по центру ОДИН раз, окно остаётся в покое
|
||||
// (НЕ приклеено, НЕ держит центр при ручном ресайзе/перемещении).
|
||||
if (position === 'center') {
|
||||
dockedPosition = null
|
||||
centerLocked = true
|
||||
} else {
|
||||
// Остальные позиции — удерживаем прижатым (поллинг пересчитывает при зуме/пане).
|
||||
centerLocked = false
|
||||
dockedPosition = position
|
||||
lastBoundsKey = '' // форсируем пересчёт на ближайшем тике
|
||||
}
|
||||
@@ -290,7 +278,6 @@ export default function () {
|
||||
figma.ui.resize(size.width, size.height)
|
||||
// Выходим из дока: чистый клик = телепорт в угол без удержания.
|
||||
dockedPosition = null
|
||||
centerLocked = false
|
||||
lastBoundsKey = ''
|
||||
lastSize = { width: size.width, height: size.height }
|
||||
// Прижимаем в угол от реального размера (computeDock для угла не меняет размер).
|
||||
|
||||
+1
-1
@@ -102,7 +102,7 @@ function Plugin () {
|
||||
emit('RESIZE_WINDOW', { width: w, height: h })
|
||||
// If resize pulled the window out of dock — stop holding dock state (so polling
|
||||
// does not re-pin and RESIZE_WINDOW does not re-dock). A normal (non-dock) resize
|
||||
// holds centerLocked/dock itself via applyDock in main.
|
||||
// holds the dock state itself via applyDock in main.
|
||||
if (exitingDockRef.current) {
|
||||
exitingDockRef.current = false
|
||||
dockedPosRef.current = null
|
||||
|
||||
Reference in new issue
Block a user