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 нет), иначе
|
// viewport (через поллинг, т.к. события viewportchange в API нет), иначе
|
||||||
// canvas-space-точка "уплывает" на экране при смене зума/пана.
|
// canvas-space-точка "уплывает" на экране при смене зума/пана.
|
||||||
let dockedPosition: DockPosition | null = null
|
let dockedPosition: DockPosition | null = null
|
||||||
|
|
||||||
// Флаг "центр удерживает позицию при ресайзе". Центр НЕ док (не поллит за зумом/паном),
|
|
||||||
// но после one-shot центрирования ручной ресайз пересчитывает позицию и держит окно по
|
|
||||||
// центру (как раньше нравилось). Сбрасывается при нажатии любой другой dock-кнопки.
|
|
||||||
let centerLocked = false
|
|
||||||
|
|
||||||
// 9 позиций докинга: 4 угла + 4 края + центр.
|
// 9 позиций докинга: 4 угла + 4 края + центр.
|
||||||
type DockPosition =
|
type DockPosition =
|
||||||
| 'top-left' | 'top-center' | 'top-right'
|
| 'top-left' | 'top-center' | 'top-right'
|
||||||
@@ -222,9 +216,6 @@ export default function () {
|
|||||||
}
|
}
|
||||||
if (dockedPosition !== null) {
|
if (dockedPosition !== null) {
|
||||||
applyDock(dockedPosition, width, height, false)
|
applyDock(dockedPosition, width, height, false)
|
||||||
} else if (centerLocked) {
|
|
||||||
// Центр: позиция удерживается по центру при ресайзе (но не поллит за зумом/паном).
|
|
||||||
applyDock('center', width, height, false)
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -232,7 +223,6 @@ export default function () {
|
|||||||
// чтобы поллинг не переприжимал и RESIZE_WINDOW не ре-докал.
|
// чтобы поллинг не переприжимал и RESIZE_WINDOW не ре-докал.
|
||||||
on('UNDOCK', function () {
|
on('UNDOCK', function () {
|
||||||
dockedPosition = null
|
dockedPosition = null
|
||||||
centerLocked = false
|
|
||||||
lastBoundsKey = ''
|
lastBoundsKey = ''
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -246,14 +236,12 @@ export default function () {
|
|||||||
// к левому/верхнему краю вместо центра (баг relX=0 на top-center).
|
// к левому/верхнему краю вместо центра (баг relX=0 на top-center).
|
||||||
on('DOCK_WINDOW', function (payload: { position: DockPosition; width: number; height: number }) {
|
on('DOCK_WINDOW', function (payload: { position: DockPosition; width: number; height: number }) {
|
||||||
const { position } = payload
|
const { position } = payload
|
||||||
// Центр — это one-shot: применяем 50% по центру ОДИН раз, НЕ включаем поллинг
|
// Центр — это one-shot: применяем 50% по центру ОДИН раз, окно остаётся в покое
|
||||||
// (окно не "приклеено"), но включаем centerLocked — ручной ресайз держит центр.
|
// (НЕ приклеено, НЕ держит центр при ручном ресайзе/перемещении).
|
||||||
if (position === 'center') {
|
if (position === 'center') {
|
||||||
dockedPosition = null
|
dockedPosition = null
|
||||||
centerLocked = true
|
|
||||||
} else {
|
} else {
|
||||||
// Остальные позиции — удерживаем прижатым (поллинг пересчитывает при зуме/пане).
|
// Остальные позиции — удерживаем прижатым (поллинг пересчитывает при зуме/пане).
|
||||||
centerLocked = false
|
|
||||||
dockedPosition = position
|
dockedPosition = position
|
||||||
lastBoundsKey = '' // форсируем пересчёт на ближайшем тике
|
lastBoundsKey = '' // форсируем пересчёт на ближайшем тике
|
||||||
}
|
}
|
||||||
@@ -290,7 +278,6 @@ export default function () {
|
|||||||
figma.ui.resize(size.width, size.height)
|
figma.ui.resize(size.width, size.height)
|
||||||
// Выходим из дока: чистый клик = телепорт в угол без удержания.
|
// Выходим из дока: чистый клик = телепорт в угол без удержания.
|
||||||
dockedPosition = null
|
dockedPosition = null
|
||||||
centerLocked = false
|
|
||||||
lastBoundsKey = ''
|
lastBoundsKey = ''
|
||||||
lastSize = { width: size.width, height: size.height }
|
lastSize = { width: size.width, height: size.height }
|
||||||
// Прижимаем в угол от реального размера (computeDock для угла не меняет размер).
|
// Прижимаем в угол от реального размера (computeDock для угла не меняет размер).
|
||||||
|
|||||||
+1
-1
@@ -102,7 +102,7 @@ function Plugin () {
|
|||||||
emit('RESIZE_WINDOW', { width: w, height: h })
|
emit('RESIZE_WINDOW', { width: w, height: h })
|
||||||
// If resize pulled the window out of dock — stop holding dock state (so polling
|
// 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
|
// 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) {
|
if (exitingDockRef.current) {
|
||||||
exitingDockRef.current = false
|
exitingDockRef.current = false
|
||||||
dockedPosRef.current = null
|
dockedPosRef.current = null
|
||||||
|
|||||||
Reference in new issue
Block a user