|
@@ -1,137 +1,141 @@
|
|
<template>
|
|
<template>
|
|
<div
|
|
<div
|
|
- class="cover-layout"
|
|
|
|
- @mousedown="downHandler"
|
|
|
|
- @touchstart="downHandler"
|
|
|
|
- :class="{ move: move }"
|
|
|
|
- :style="style"
|
|
|
|
- v-show="style"
|
|
|
|
- ref="dom"
|
|
|
|
|
|
+ class="cover-layout"
|
|
|
|
+ @mousedown="downHandler"
|
|
|
|
+ @touchstart="downHandler"
|
|
|
|
+ :class="{ move: move }"
|
|
|
|
+ :style="style"
|
|
|
|
+ v-show="style"
|
|
|
|
+ ref="dom"
|
|
>
|
|
>
|
|
<slot />
|
|
<slot />
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</template>
|
|
|
|
|
|
<script setup lang="ts">
|
|
<script setup lang="ts">
|
|
-import {computed, onMounted, onUnmounted, ref, watch, watchEffect} from 'vue'
|
|
|
|
-import {Pos, Pos3D} from '@/sdk'
|
|
|
|
-import {customMap, useSDK} from '@/hook'
|
|
|
|
-import { getPostionByTarget} from '@/components/base/utils'
|
|
|
|
|
|
+import { computed, onMounted, onUnmounted, ref, watch, watchEffect } from "vue";
|
|
|
|
+import { Pos, Pos3D } from "@/sdk";
|
|
|
|
+import { customMap, useSDK } from "@/hook";
|
|
|
|
+import { getPostionByTarget } from "@/components/base/utils";
|
|
|
|
|
|
const props = defineProps<{
|
|
const props = defineProps<{
|
|
- pos: Pos3D,
|
|
|
|
- focus: boolean
|
|
|
|
-}>()
|
|
|
|
|
|
+ pos: Pos3D;
|
|
|
|
+ focus: boolean;
|
|
|
|
+}>();
|
|
const emit = defineEmits<{
|
|
const emit = defineEmits<{
|
|
- (m: 'changePos', pos: Pos3D): void
|
|
|
|
- (m: 'focus'): void
|
|
|
|
- (m: 'blur'): void
|
|
|
|
-}>()
|
|
|
|
-const sdk = useSDK()
|
|
|
|
-const dom = ref<HTMLElement>()
|
|
|
|
|
|
+ (m: "changePos", pos: Pos3D): void;
|
|
|
|
+ (m: "focus"): void;
|
|
|
|
+ (m: "blur"): void;
|
|
|
|
+}>();
|
|
|
|
+const sdk = useSDK();
|
|
|
|
+const dom = ref<HTMLElement>();
|
|
|
|
|
|
-const screen = ref<Pos>(null)
|
|
|
|
|
|
+const screen = ref<Pos>(null);
|
|
const style = computed(
|
|
const style = computed(
|
|
() =>
|
|
() =>
|
|
screen.value && {
|
|
screen.value && {
|
|
- left: screen.value.x + 'px',
|
|
|
|
- top: screen.value.y + 'px'
|
|
|
|
|
|
+ left: screen.value.x + "px",
|
|
|
|
+ top: screen.value.y + "px",
|
|
}
|
|
}
|
|
-)
|
|
|
|
|
|
+);
|
|
const updatePos = () => {
|
|
const updatePos = () => {
|
|
if (props.pos) {
|
|
if (props.pos) {
|
|
- const data = sdk.scene.getScreenByPoint(props.pos)
|
|
|
|
- screen.value = data.trueSide ? data.pos : null
|
|
|
|
|
|
+ const data = sdk.scene.getScreenByPoint(props.pos);
|
|
|
|
+ screen.value = data.trueSide ? data.pos : null;
|
|
}
|
|
}
|
|
-}
|
|
|
|
|
|
+};
|
|
|
|
|
|
-sdk.scene.on('posChange', updatePos)
|
|
|
|
-watch(props, updatePos)
|
|
|
|
-updatePos()
|
|
|
|
|
|
+sdk.scene.on("posChange", updatePos);
|
|
|
|
+watch(props, updatePos);
|
|
|
|
+updatePos();
|
|
|
|
|
|
-const move = ref(false)
|
|
|
|
|
|
+const move = ref(false);
|
|
const downHandler = (sev: MouseEvent | TouchEvent) => {
|
|
const downHandler = (sev: MouseEvent | TouchEvent) => {
|
|
- const start = new Date().getTime()
|
|
|
|
- const el = sev.target as HTMLElement
|
|
|
|
- const mountEl = document.documentElement
|
|
|
|
|
|
+ const start = new Date().getTime();
|
|
|
|
+ const el = sev.target as HTMLElement;
|
|
|
|
+ const mountEl = document.documentElement;
|
|
const preset = {
|
|
const preset = {
|
|
x: el.offsetWidth / 2,
|
|
x: el.offsetWidth / 2,
|
|
- y: el.offsetHeight
|
|
|
|
- }
|
|
|
|
|
|
+ y: el.offsetHeight,
|
|
|
|
+ };
|
|
if (sev instanceof TouchEvent) {
|
|
if (sev instanceof TouchEvent) {
|
|
const pos = getPostionByTarget(el, document.querySelector("#app") as HTMLElement);
|
|
const pos = getPostionByTarget(el, document.querySelector("#app") as HTMLElement);
|
|
- preset.x = preset.x - (sev.touches[0].pageX - (pos.x - preset.x))
|
|
|
|
- preset.y = preset.y - (sev.touches[0].pageY - (pos.y - preset.y))
|
|
|
|
|
|
+ preset.x = preset.x - (sev.touches[0].pageX - (pos.x - preset.x));
|
|
|
|
+ preset.y = preset.y - (sev.touches[0].pageY - (pos.y - preset.y));
|
|
} else {
|
|
} else {
|
|
- preset.x -= sev.offsetX
|
|
|
|
- preset.y -= sev.offsetY
|
|
|
|
|
|
+ preset.x -= sev.offsetX;
|
|
|
|
+ preset.y -= sev.offsetY;
|
|
}
|
|
}
|
|
|
|
|
|
const moveHandler = (ev: MouseEvent | TouchEvent) => {
|
|
const moveHandler = (ev: MouseEvent | TouchEvent) => {
|
|
if (!move.value) {
|
|
if (!move.value) {
|
|
- move.value = true
|
|
|
|
- customMap.magnifier = true
|
|
|
|
|
|
+ move.value = true;
|
|
|
|
+ customMap.magnifier = true;
|
|
}
|
|
}
|
|
const pos = sdk.scene.getPointByScreen({
|
|
const pos = sdk.scene.getPointByScreen({
|
|
x: (ev instanceof TouchEvent ? ev.touches[0].pageX : ev.pageX) + preset.x,
|
|
x: (ev instanceof TouchEvent ? ev.touches[0].pageX : ev.pageX) + preset.x,
|
|
y: (ev instanceof TouchEvent ? ev.touches[0].pageY : ev.pageY) + preset.y,
|
|
y: (ev instanceof TouchEvent ? ev.touches[0].pageY : ev.pageY) + preset.y,
|
|
- inDrag: true
|
|
|
|
- })
|
|
|
|
|
|
+ inDrag: true,
|
|
|
|
+ });
|
|
if (pos?.position) {
|
|
if (pos?.position) {
|
|
- emit('changePos', pos.position);
|
|
|
|
|
|
+ emit("changePos", pos.position);
|
|
}
|
|
}
|
|
- }
|
|
|
|
|
|
+ };
|
|
const upHandler = (ev: MouseEvent) => {
|
|
const upHandler = (ev: MouseEvent) => {
|
|
- mountEl.removeEventListener('mousemove', moveHandler)
|
|
|
|
- mountEl.removeEventListener('mouseup', upHandler)
|
|
|
|
- mountEl.removeEventListener('touchmove', moveHandler)
|
|
|
|
- mountEl.removeEventListener('touchend', upHandler)
|
|
|
|
|
|
+ mountEl.removeEventListener("mousemove", moveHandler);
|
|
|
|
+ mountEl.removeEventListener("mouseup", upHandler);
|
|
|
|
+ mountEl.removeEventListener("touchmove", moveHandler);
|
|
|
|
+ mountEl.removeEventListener("touchend", upHandler);
|
|
if (move.value) {
|
|
if (move.value) {
|
|
- move.value = false
|
|
|
|
- customMap.magnifier = false
|
|
|
|
- console.log("关闭放大镜")
|
|
|
|
|
|
+ move.value = false;
|
|
|
|
+ customMap.magnifier = false;
|
|
|
|
+ console.log("关闭放大镜");
|
|
}
|
|
}
|
|
if (new Date().getTime() - start < 300) {
|
|
if (new Date().getTime() - start < 300) {
|
|
- emit("focus")
|
|
|
|
|
|
+ emit("focus");
|
|
}
|
|
}
|
|
- }
|
|
|
|
-
|
|
|
|
- mountEl.addEventListener('mousemove', moveHandler)
|
|
|
|
- mountEl.addEventListener('mouseup', upHandler)
|
|
|
|
- mountEl.addEventListener('touchmove', moveHandler)
|
|
|
|
- mountEl.addEventListener('touchend', upHandler)
|
|
|
|
- sev.preventDefault()
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
|
|
+ };
|
|
|
|
|
|
|
|
+ mountEl.addEventListener("mousemove", moveHandler);
|
|
|
|
+ mountEl.addEventListener("mouseup", upHandler);
|
|
|
|
+ mountEl.addEventListener("touchmove", moveHandler);
|
|
|
|
+ mountEl.addEventListener("touchend", upHandler);
|
|
|
|
+ sev.preventDefault();
|
|
|
|
+};
|
|
|
|
|
|
const clickHandler = (ev) => {
|
|
const clickHandler = (ev) => {
|
|
- if (dom.value && !dom.value.contains(ev.target as HTMLElement) && ev.target !== dom.value) {
|
|
|
|
- emit("blur")
|
|
|
|
|
|
+ if (
|
|
|
|
+ dom.value &&
|
|
|
|
+ !dom.value.contains(ev.target as HTMLElement) &&
|
|
|
|
+ ev.target !== dom.value
|
|
|
|
+ ) {
|
|
|
|
+ emit("blur");
|
|
}
|
|
}
|
|
-}
|
|
|
|
|
|
+};
|
|
|
|
|
|
watchEffect((onCleanup) => {
|
|
watchEffect((onCleanup) => {
|
|
if (props.focus) {
|
|
if (props.focus) {
|
|
- console.log("载入点击")
|
|
|
|
- document.documentElement.addEventListener("touchstart", clickHandler, { passive: true })
|
|
|
|
|
|
+ console.log("载入点击");
|
|
|
|
+ document.documentElement.addEventListener("touchstart", clickHandler, {
|
|
|
|
+ passive: true,
|
|
|
|
+ });
|
|
onCleanup(() => {
|
|
onCleanup(() => {
|
|
- console.log("清除载入点击")
|
|
|
|
- document.documentElement.removeEventListener("touchstart", clickHandler)
|
|
|
|
- })
|
|
|
|
|
|
+ console.log("清除载入点击");
|
|
|
|
+ document.documentElement.removeEventListener("touchstart", clickHandler);
|
|
|
|
+ });
|
|
}
|
|
}
|
|
-})
|
|
|
|
|
|
+});
|
|
|
|
|
|
onUnmounted(() => {
|
|
onUnmounted(() => {
|
|
- emit("blur")
|
|
|
|
-})
|
|
|
|
|
|
+ emit("blur");
|
|
|
|
+});
|
|
</script>
|
|
</script>
|
|
|
|
|
|
<style scoped lang="scss">
|
|
<style scoped lang="scss">
|
|
.cover-layout {
|
|
.cover-layout {
|
|
position: absolute;
|
|
position: absolute;
|
|
z-index: 1;
|
|
z-index: 1;
|
|
- transform: translate(-50%, -50%);
|
|
|
|
|
|
+ transform: translate(-50%, -100%);
|
|
cursor: move;
|
|
cursor: move;
|
|
}
|
|
}
|
|
|
|
|