|
@@ -0,0 +1,102 @@
|
|
|
+import { onMounted, onUnmounted, ref, watchEffect } from "vue";
|
|
|
+
|
|
|
+export function dragSplitPane() {
|
|
|
+ let pos = { y: 0 };
|
|
|
+ const dragSpliter = ref((null as unknown) as HTMLDivElement);
|
|
|
+ let topPercent = ref(30);
|
|
|
+
|
|
|
+ const mouseDownHandler = function (e: MouseEvent) {
|
|
|
+ // console.log(e);
|
|
|
+ if (e.target !== dragSpliter.value) return;
|
|
|
+ e.preventDefault();
|
|
|
+ pos = {
|
|
|
+ // Get the current mouse position
|
|
|
+ y: e.clientY,
|
|
|
+ };
|
|
|
+ // topPercent.value = 100 * e.offsetTop / e.target.parentElement.style.height;
|
|
|
+ if (dragSpliter.value) {
|
|
|
+ // dragSpliter.value.style.cursor = "row-resize";
|
|
|
+ // console.log("add");
|
|
|
+
|
|
|
+ document.addEventListener("mousemove", mouseMoveHandler);
|
|
|
+ document.addEventListener("mouseup", mouseUpHandler);
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ };
|
|
|
+
|
|
|
+ const mouseMoveHandler = function (e: MouseEvent) {
|
|
|
+ e.preventDefault();
|
|
|
+ const dy = e.clientY - pos.y;
|
|
|
+
|
|
|
+ // // Scroll the element
|
|
|
+ // // dragSpliter.value.style.marginTop =
|
|
|
+ // // (parseFloat(dragSpliter.value.style.marginTop) || 0) + dy + "px";
|
|
|
+ dragSpliter.value.style.marginTop = dy + "px";
|
|
|
+ // console.log(dragSpliter.value.style.marginTop);
|
|
|
+ const target = e.target as HTMLElement;
|
|
|
+ const parent = target.parentElement;
|
|
|
+ // console.log(getComputedStyle(e.target.parentElement).height);
|
|
|
+ // console.log({
|
|
|
+ // offsetTop: target.offsetTop,
|
|
|
+ // dy: dy,
|
|
|
+ // movementY: e.movementY,
|
|
|
+ // });
|
|
|
+ // if (parent)
|
|
|
+ // topPercent.value =
|
|
|
+ // (100 * target.offsetTop) / parseFloat(getComputedStyle(parent).height);
|
|
|
+ // console.log("topPercent", topPercent.value);
|
|
|
+ return false;
|
|
|
+ };
|
|
|
+
|
|
|
+ const mouseUpHandler = function (e: MouseEvent) {
|
|
|
+ const dy = e.clientY - pos.y;
|
|
|
+
|
|
|
+ // Scroll the element
|
|
|
+ // dragSpliter.value.style.marginTop =
|
|
|
+ // (parseFloat(dragSpliter.value.style.marginTop) || 0) + dy + "px";
|
|
|
+ // dragSpliter.value.style.marginTop = dy + "px";
|
|
|
+ // console.log(dragSpliter.value.style.marginTop);
|
|
|
+ const target = e.target as HTMLElement;
|
|
|
+ const parent = target.parentElement;
|
|
|
+ // console.log(getComputedStyle(e.target.parentElement).height);
|
|
|
+ // console.log("offsetTop", target.offsetTop);
|
|
|
+ // TODO: 暂时不知道为啥有 140
|
|
|
+ if (parent)
|
|
|
+ topPercent.value =
|
|
|
+ (100 * (target.offsetTop - 140)) /
|
|
|
+ parseFloat(getComputedStyle(parent).height);
|
|
|
+ // console.log({
|
|
|
+ // topPercent: topPercent.value,
|
|
|
+ // "parseFloat(getComputedStyle(parent).height)": parseFloat(
|
|
|
+ // getComputedStyle(parent).height
|
|
|
+ // ),
|
|
|
+ // "target.offsetTop": target.offsetTop,
|
|
|
+ // });
|
|
|
+
|
|
|
+ // console.log("removed");
|
|
|
+ if (dragSpliter.value) {
|
|
|
+ document.removeEventListener("mousemove", mouseMoveHandler);
|
|
|
+ document.removeEventListener("mouseup", mouseUpHandler);
|
|
|
+ // dragSpliter.value.style.cursor = "auto";
|
|
|
+ dragSpliter.value.style.marginTop = "0";
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ onMounted(() => {
|
|
|
+ watchEffect(() => {
|
|
|
+ if (dragSpliter.value) {
|
|
|
+ // console.log("watchEffect");
|
|
|
+ document.addEventListener("mousedown", mouseDownHandler);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+ onUnmounted(() => {
|
|
|
+ if (dragSpliter.value) {
|
|
|
+ document.removeEventListener("mousedown", mouseDownHandler);
|
|
|
+ document.removeEventListener("mousemove", mouseMoveHandler);
|
|
|
+ document.removeEventListener("mouseup", mouseUpHandler);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ return { dragSpliter, topPercent };
|
|
|
+}
|