simplify: dock detection via flag (dockedPosRef), drop size-based isEdgeDocked
This commit is contained in:
1 parent
ccc38a0561
commit
7adbc11247
1 file changed
+5
-13
+5
-13
@@ -56,8 +56,6 @@ function Plugin () {
|
||||
const dockedPosRef = useRef<DockPosition | null>(null)
|
||||
// Флаг: ресайз выводит окно из дока (на отпускании не ре-докать, очистить dock-состояние).
|
||||
const exitingDockRef = useRef(false)
|
||||
// Та же величина, что DOCK_EDGE_SIZE в main.ts — признак "сжатая ось дока".
|
||||
const DOCK_EDGE = 320
|
||||
const [windowInfo, setWindowInfo] = useState<{
|
||||
x: number; y: number; width: number; height: number
|
||||
zoom: number
|
||||
@@ -117,20 +115,14 @@ function Plugin () {
|
||||
// - смещение курсора > CLICK_THRESHOLD px → ресайз (startResize + live drag через глобальный onPointerMove)
|
||||
// - иначе (чистый клик) → зависит от позиции:
|
||||
// * угол (top-left/right, bottom-left/right):
|
||||
// - окно НЕ в доке у края → телепорт в угол (dockWindow)
|
||||
// - окно В ДОКЕ у края (одна ось сжата до DOCK_EDGE) → старт single-axis live-ресайза
|
||||
// сжатой оси (окно "выезжает" в угол, выход из дока), dir = угол, fixedAxis = сжатая ось
|
||||
// - окно НЕ в доке у края (dockedPosRef == null) → телепорт в угол (dockWindow)
|
||||
// - окно В ДОКЕ у края → старт single-axis live-ресайза сжатой оси
|
||||
// (окно "выезжает" в угол, выход из дока), dir = угол, fixedAxis = сжатая ось
|
||||
// * край (top/bottom-center, center-left/right) → телепорт в край (dockWindow)
|
||||
// Центр НЕ входит в периметр — только кнопкой.
|
||||
const CLICK_THRESHOLD = 4
|
||||
const isCornerPos = (p: DockPosition) =>
|
||||
p === 'top-left' || p === 'top-right' || p === 'bottom-left' || p === 'bottom-right'
|
||||
// Окно "в доке у края" = одна ось сжата до DOCK_EDGE, другая существенно больше.
|
||||
function isEdgeDocked () {
|
||||
const w = window.innerWidth
|
||||
const h = window.innerHeight
|
||||
return (w <= DOCK_EDGE + 4 && h > DOCK_EDGE + 4) || (h <= DOCK_EDGE + 4 && w > DOCK_EDGE + 4)
|
||||
}
|
||||
|
||||
function onHandleDown (e: PointerEvent, dir: string, dockPos: DockPosition) {
|
||||
e.preventDefault()
|
||||
@@ -158,11 +150,11 @@ function Plugin () {
|
||||
else {
|
||||
// Чистый клик — поведение зависит от позиции ручки и состояния дока.
|
||||
if (isCornerPos(dockPos)) {
|
||||
if (isEdgeDocked()) {
|
||||
if (dockedPosRef.current !== null) {
|
||||
// Окно в доке у края: клик по смежному углу = single-axis ресайз сжатой оси.
|
||||
// Сжатая ось: верх/низ-док (h сжата) → фикс Y (меняем ширину);
|
||||
// лево/право-док (w сжата) → фикс X (меняем высоту).
|
||||
const fixedAxis = window.innerHeight <= DOCK_EDGE + 4 ? 'y' : 'x'
|
||||
const fixedAxis = window.innerHeight <= 320 + 4 ? 'y' : 'x'
|
||||
exitingDockRef.current = true
|
||||
startResize(e, dir, fixedAxis) // active=true + emit RESIZE_START (старт от точки клика)
|
||||
// Финализатор на СЛЕДУЮЩИЙ pointerup (live-ресайз ведёт глобальный onPointerMove).
|
||||
|
||||
Reference in new issue
Block a user