Skip to content

Commit a7be394

Browse files
committed
New drag mechanism
1 parent 0a01587 commit a7be394

File tree

2 files changed

+64
-6
lines changed

2 files changed

+64
-6
lines changed

src/mapml.css

+4
Original file line numberDiff line numberDiff line change
@@ -354,3 +354,7 @@ summary {
354354
.leaflet-container .leaflet-control-container {
355355
visibility: unset!important;
356356
}
357+
358+
.mapml-drag-active {
359+
cursor: row-resize;
360+
}

src/mapml/layers/MapLayer.js

+60-6
Original file line numberDiff line numberDiff line change
@@ -524,15 +524,69 @@ export var MapMLLayer = L.Layer.extend({
524524
opacity.value = this._container.style.opacity || '1.0';
525525

526526
fieldset.setAttribute("aria-grabbed", "false");
527-
fieldset.draggable = true;
528-
fieldset.classList.add("leaflet-grab");
527+
//fieldset.draggable = true;
529528

530529
fieldset.onmousedown = (e) => {
531-
e.target.closest("fieldset").draggable = e.target.tagName.toLowerCase() !== "input";
530+
e.preventDefault();
531+
if(e.target.tagName.toLowerCase() === "input") return;
532+
let control = fieldset,
533+
controls = fieldset.parentNode,
534+
moving = false, yPos = e.clientY;
535+
536+
document.body.onmousemove = (moveEvent) => {
537+
moveEvent.preventDefault();
538+
539+
// Fixes flickering by only moving element when there is enough space
540+
let offset = Math.abs(yPos - moveEvent.clientY);
541+
moving = Math.abs(offset) > 5 || moving;
542+
543+
if(controls && !moving ||
544+
controls.getBoundingClientRect().top > control.getBoundingClientRect().top ||
545+
controls.getBoundingClientRect().bottom < control.getBoundingClientRect().bottom) return;
546+
547+
let x = moveEvent.clientX, y = moveEvent.clientY,
548+
elementAt = root.elementFromPoint(x, y),
549+
swapControl = !elementAt || !elementAt.closest("fieldset") ? control : elementAt.closest("fieldset");
550+
551+
swapControl = offset <= swapControl.offsetHeight ? control : swapControl;
552+
553+
control.querySelector("summary").classList.add("mapml-drag-active");
554+
control.setAttribute("aria-grabbed", 'true');
555+
control.setAttribute("aria-dropeffect", "move");
556+
if(swapControl && controls === swapControl.parentNode){
557+
swapControl = swapControl !== control.nextSibling? swapControl : swapControl.nextSibling;
558+
if(control !== swapControl) yPos = moveEvent.clientY;
559+
controls.insertBefore(control, swapControl);
560+
}
561+
};
562+
563+
document.body.onmouseup = () => {
564+
control.querySelector("summary").classList.remove("mapml-drag-active");
565+
control.setAttribute("aria-grabbed", "false");
566+
control.removeAttribute("aria-dropeffect");
567+
let controlsElems = controls.children,
568+
layers = map.getPane("overlayPane").children,
569+
zIndex = 1;
570+
for(let c of controlsElems){
571+
let layerEl = c.querySelector("span").layer._layerEl;
572+
layerEl.setAttribute("data-moving","");
573+
viewer.insertAdjacentElement("beforeend", layerEl);
574+
layerEl.removeAttribute("data-moving");
575+
576+
for (let layer of layers){
577+
if(c.querySelector("span").layer._container == layer){
578+
layer.style["z-index"] = zIndex;
579+
zIndex++;
580+
}
581+
}
582+
}
583+
document.body.onmousemove = document.body.onmouseup = null;
584+
};
532585
};
533586

534-
fieldset.onmouseup = (e) => {
535-
e.target.closest("fieldset").draggable = true;
587+
//old version of dragging
588+
/* fieldset.onmouseup = (e) => {
589+
//e.target.closest("fieldset").draggable = true;
536590
};
537591
538592
fieldset.ondrag = (e) => {
@@ -578,7 +632,7 @@ export var MapMLLayer = L.Layer.extend({
578632
}
579633
}
580634
}
581-
};
635+
}; */
582636

583637
L.DomEvent.on(opacity,'change', this._changeOpacity, this);
584638

0 commit comments

Comments
 (0)