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