simplify: dock detection via flag (dockedPosRef), drop size-based isEdgeDocked

This commit is contained in:
Hermes Agent committed 2026-09-10 16:01:42 +02:00
1 parent ccc38a0561
commit 7adbc11247
1 file changed
+5 -13
+5 -13
View File
@@ -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).