fix: corner in dock only resizes on real drag, clean click = exit to corner
This commit is contained in:
1 parent
7adbc11247
commit
e916d1f2a6
1 file changed
+20
-35
+20
-35
@@ -130,47 +130,32 @@ function Plugin () {
|
|||||||
const startX = e.clientX
|
const startX = e.clientX
|
||||||
const startY = e.clientY
|
const startY = e.clientY
|
||||||
let started = false
|
let started = false
|
||||||
|
const isCorner = isCornerPos(dockPos)
|
||||||
|
const docked = dockedPosRef.current !== null
|
||||||
|
// Угол в доке: drag = single-axis ресайз сжатой оси (выход из дока). Обычный/не-док — просто ресайз.
|
||||||
|
const fixed = (isCorner && docked) ? (window.innerHeight <= 324 ? 'y' : 'x') : 'none'
|
||||||
function move (ev: PointerEvent) {
|
function move (ev: PointerEvent) {
|
||||||
if (!started) {
|
if (started) return
|
||||||
const dx = ev.clientX - startX
|
const dx = ev.clientX - startX
|
||||||
const dy = ev.clientY - startY
|
const dy = ev.clientY - startY
|
||||||
if (Math.sqrt(dx * dx + dy * dy) < CLICK_THRESHOLD) return
|
if (Math.sqrt(dx * dx + dy * dy) < CLICK_THRESHOLD) return
|
||||||
started = true
|
started = true
|
||||||
startResize(ev, dir, 'none')
|
exitingDockRef.current = isCorner && docked
|
||||||
// Считаем ресайз от исходной точки (до порога), а не от текущей (>порога).
|
startResize(ev, dir, fixed)
|
||||||
resizeRef.current.startX = startX
|
// Считаем ресайз от исходной точки (до порога), а не от текущей (>порога).
|
||||||
resizeRef.current.startY = startY
|
resizeRef.current.startX = startX
|
||||||
}
|
resizeRef.current.startY = startY
|
||||||
// Дальше drag ведёт глобальный onPointerMove (resizeRef.active уже true).
|
// Дальше drag ведёт глобальный onPointerMove (resizeRef.active уже true).
|
||||||
}
|
}
|
||||||
function up () {
|
function up () {
|
||||||
window.removeEventListener('pointermove', move)
|
window.removeEventListener('pointermove', move)
|
||||||
window.removeEventListener('pointerup', up)
|
window.removeEventListener('pointerup', up)
|
||||||
if (started) onPointerUpResize()
|
if (started) {
|
||||||
else {
|
onPointerUpResize()
|
||||||
// Чистый клик — поведение зависит от позиции ручки и состояния дока.
|
} else {
|
||||||
if (isCornerPos(dockPos)) {
|
// Чистый клик — телепорт в позицию (угол или край). Для угла dockWindow очищает
|
||||||
if (dockedPosRef.current !== null) {
|
// dock-флаг, т.е. клик по углу в доке = выход в угол без ресайза (не "висит" в ресайзе).
|
||||||
// Окно в доке у края: клик по смежному углу = single-axis ресайз сжатой оси.
|
dockWindow(dockPos)
|
||||||
// Сжатая ось: верх/низ-док (h сжата) → фикс Y (меняем ширину);
|
|
||||||
// лево/право-док (w сжата) → фикс X (меняем высоту).
|
|
||||||
const fixedAxis = window.innerHeight <= 320 + 4 ? 'y' : 'x'
|
|
||||||
exitingDockRef.current = true
|
|
||||||
startResize(e, dir, fixedAxis) // active=true + emit RESIZE_START (старт от точки клика)
|
|
||||||
// Финализатор на СЛЕДУЮЩИЙ pointerup (live-ресайз ведёт глобальный onPointerMove).
|
|
||||||
const finish = function () {
|
|
||||||
window.removeEventListener('pointerup', finish)
|
|
||||||
onPointerUpResize()
|
|
||||||
}
|
|
||||||
window.addEventListener('pointerup', finish)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// Не в доке: телепорт в угол.
|
|
||||||
dockWindow(dockPos)
|
|
||||||
} else {
|
|
||||||
// Краевая ручка: телепорт в край.
|
|
||||||
dockWindow(dockPos)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
window.addEventListener('pointermove', move)
|
window.addEventListener('pointermove', move)
|
||||||
|
|||||||
Reference in new issue
Block a user