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 startY = e.clientY
|
||||
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) {
|
||||
if (!started) {
|
||||
const dx = ev.clientX - startX
|
||||
const dy = ev.clientY - startY
|
||||
if (Math.sqrt(dx * dx + dy * dy) < CLICK_THRESHOLD) return
|
||||
started = true
|
||||
startResize(ev, dir, 'none')
|
||||
// Считаем ресайз от исходной точки (до порога), а не от текущей (>порога).
|
||||
resizeRef.current.startX = startX
|
||||
resizeRef.current.startY = startY
|
||||
}
|
||||
if (started) return
|
||||
const dx = ev.clientX - startX
|
||||
const dy = ev.clientY - startY
|
||||
if (Math.sqrt(dx * dx + dy * dy) < CLICK_THRESHOLD) return
|
||||
started = true
|
||||
exitingDockRef.current = isCorner && docked
|
||||
startResize(ev, dir, fixed)
|
||||
// Считаем ресайз от исходной точки (до порога), а не от текущей (>порога).
|
||||
resizeRef.current.startX = startX
|
||||
resizeRef.current.startY = startY
|
||||
// Дальше drag ведёт глобальный onPointerMove (resizeRef.active уже true).
|
||||
}
|
||||
function up () {
|
||||
window.removeEventListener('pointermove', move)
|
||||
window.removeEventListener('pointerup', up)
|
||||
if (started) onPointerUpResize()
|
||||
else {
|
||||
// Чистый клик — поведение зависит от позиции ручки и состояния дока.
|
||||
if (isCornerPos(dockPos)) {
|
||||
if (dockedPosRef.current !== null) {
|
||||
// Окно в доке у края: клик по смежному углу = single-axis ресайз сжатой оси.
|
||||
// Сжатая ось: верх/низ-док (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)
|
||||
}
|
||||
if (started) {
|
||||
onPointerUpResize()
|
||||
} else {
|
||||
// Чистый клик — телепорт в позицию (угол или край). Для угла dockWindow очищает
|
||||
// dock-флаг, т.е. клик по углу в доке = выход в угол без ресайза (не "висит" в ресайзе).
|
||||
dockWindow(dockPos)
|
||||
}
|
||||
}
|
||||
window.addEventListener('pointermove', move)
|
||||
|
||||
Reference in new issue
Block a user