|
|
@@ -1,8 +1,9 @@
|
|
|
<template>
|
|
|
<div class="scaleplate">
|
|
|
<!-- 显示/隐藏参考线 -->
|
|
|
- <div class="refer-line-img">
|
|
|
- <LuEye :size="16" />
|
|
|
+ <div class="refer-line-img" @click="state.showReferenceLine = !state.showReferenceLine">
|
|
|
+ <LuEye :size="16" v-if="state.showReferenceLine" />
|
|
|
+ <LuEyeOff :size="16" v-else />
|
|
|
</div>
|
|
|
<!-- 标尺 -->
|
|
|
<div
|
|
|
@@ -33,19 +34,20 @@
|
|
|
</div>
|
|
|
|
|
|
<!-- 参考线 -->
|
|
|
- <!-- <div
|
|
|
+ <div
|
|
|
class="refer-line"
|
|
|
- v-for="item in []"
|
|
|
- :key="item.key"
|
|
|
+ v-show="state.showReferenceLine"
|
|
|
+ v-for="item in getReferLines || []"
|
|
|
+ :key="item.id"
|
|
|
:style="{ left: item.x + 'px', top: item.y + 'px' }"
|
|
|
:class="item.type === 'horizontal' ? 'refer-line-h' : 'refer-line-v'"
|
|
|
- @dblclick=""
|
|
|
+ @dblclick="handleRemoveReferLine(item.id)"
|
|
|
>
|
|
|
- <UseDraggable @move="(position, event) => handleDragReferLine(position, event, item.key)">
|
|
|
+ <UseDraggable @move="(position, event) => handleDragReferLine(position, event, item.id)">
|
|
|
<span class="refer-line__txt">{{ item.value }}px</span>
|
|
|
<span class="refer-line__line"></span>
|
|
|
</UseDraggable>
|
|
|
- </div> -->
|
|
|
+ </div>
|
|
|
<!-- 临时参考线 -->
|
|
|
<div
|
|
|
class="refer-line virtual-refer-line"
|
|
|
@@ -65,16 +67,18 @@
|
|
|
<script setup lang="ts">
|
|
|
import type { Ref } from 'vue'
|
|
|
import type { StageState } from './type'
|
|
|
-import type { ReferenceLine } from '@/types/page'
|
|
|
+import type { Page, ReferenceLine } from '@/types/page'
|
|
|
|
|
|
-import { onMounted, ref, onBeforeUnmount, nextTick, watch, defineProps } from 'vue'
|
|
|
+import { onMounted, ref, onBeforeUnmount, nextTick, watch, defineProps, computed } from 'vue'
|
|
|
import { LuEye, LuEyeOff } from 'vue-icons-plus/lu'
|
|
|
import { UseDraggable } from '@vueuse/components'
|
|
|
import { drawScaleplate } from './utils'
|
|
|
import { useElementSize, useResizeObserver } from '@vueuse/core'
|
|
|
+import { v4 } from 'uuid'
|
|
|
|
|
|
const props = defineProps<{
|
|
|
state: StageState
|
|
|
+ page?: Page
|
|
|
}>()
|
|
|
|
|
|
const horizontalRef = ref<HTMLElement | null>(null)
|
|
|
@@ -82,8 +86,39 @@ const verticalRef = ref<HTMLElement | null>(null)
|
|
|
const scaleplateHorizontalRef = ref<HTMLCanvasElement | null>(null)
|
|
|
const scaleplateVerticalRef = ref<HTMLCanvasElement | null>(null)
|
|
|
|
|
|
-const { width: horizontalWidth, height: horizontalHeight } = useElementSize(horizontalRef)
|
|
|
-const { width: verticalWidth, height: verticalHeight } = useElementSize(verticalRef)
|
|
|
+const { width: horizontalWidth, height: _horizontalHeight } = useElementSize(horizontalRef)
|
|
|
+const { width: _verticalWidth, height: verticalHeight } = useElementSize(verticalRef)
|
|
|
+
|
|
|
+// 根据滚动和缩放,重新计算辅助线位置
|
|
|
+const getReferLines = computed(() => {
|
|
|
+ const state = props.state
|
|
|
+ const { scale, scrollX, scrollY, originX, originY } = state
|
|
|
+
|
|
|
+ return props.page?.referenceLine
|
|
|
+ ?.map((line) => {
|
|
|
+ let x = line.x || 0
|
|
|
+ let y = line.y || 0
|
|
|
+ if (line.type === 'horizontal') {
|
|
|
+ x = originX + line.value * scale - scrollX + 20
|
|
|
+ } else {
|
|
|
+ y = originY + line.value * scale - scrollY + 20
|
|
|
+ }
|
|
|
+
|
|
|
+ return {
|
|
|
+ ...line,
|
|
|
+ x,
|
|
|
+ y
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .filter((line) => {
|
|
|
+ // 过滤掉不在视口内的辅助线
|
|
|
+ if (line.type === 'horizontal') {
|
|
|
+ return line.x > 20 && line.x < state.viewportWidth
|
|
|
+ } else {
|
|
|
+ return line.y > 20 && line.y < state.viewportHeight
|
|
|
+ }
|
|
|
+ })
|
|
|
+})
|
|
|
|
|
|
/* 绘制标尺刻度 */
|
|
|
const handleDrawHScaleplate = async () => {
|
|
|
@@ -120,8 +155,8 @@ const handleDrawVScaleplate = async () => {
|
|
|
}
|
|
|
|
|
|
/* =============================== 参考线 ================================= */
|
|
|
-const virtualReferLine: Ref<ReferLine> = ref({
|
|
|
- key: '0',
|
|
|
+const virtualReferLine: Ref<ReferenceLine> = ref({
|
|
|
+ id: '0',
|
|
|
x: 0,
|
|
|
y: 0,
|
|
|
value: 0,
|
|
|
@@ -147,11 +182,23 @@ const handleMouseMoveHScaleplate = (e: MouseEvent, type: 'horizontal' | 'vertica
|
|
|
const handleAddReferLine = () => {
|
|
|
if (!virtualReferLine.value.type) return
|
|
|
|
|
|
- // todo
|
|
|
+ props.page?.referenceLine.push({
|
|
|
+ ...virtualReferLine.value,
|
|
|
+ id: v4()
|
|
|
+ })
|
|
|
}
|
|
|
+
|
|
|
+/* 删除参考线 */
|
|
|
+const handleRemoveReferLine = (id: string) => {
|
|
|
+ props.page?.referenceLine.splice(
|
|
|
+ props.page?.referenceLine.findIndex((item) => item.id === id),
|
|
|
+ 1
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
/* 拖拽参考线 */
|
|
|
-const handleDragReferLine = ({ x, y }: { x: number; y: number }, _: PointerEvent, key: string) => {
|
|
|
- const referLine: ReferenceLine | undefined = undefined // todo
|
|
|
+const handleDragReferLine = ({ x, y }: { x: number; y: number }, _: PointerEvent, id: string) => {
|
|
|
+ const referLine = props.page?.referenceLine.find((item) => item.id === id)
|
|
|
if (!referLine) return
|
|
|
|
|
|
const { scale, originX, originY, scrollX, scrollY } = props.state
|
|
|
@@ -170,8 +217,6 @@ const handleDragReferLine = ({ x, y }: { x: number; y: number }, _: PointerEvent
|
|
|
referLine.value = Math.round((lineY + offsetY - 20) / scale)
|
|
|
referLine.y = lineY
|
|
|
}
|
|
|
-
|
|
|
- // todo 更新参考线
|
|
|
}
|
|
|
/* ===============================参考线结束================================= */
|
|
|
|
|
|
@@ -235,7 +280,7 @@ useResizeObserver(verticalRef, handleDrawVScaleplate)
|
|
|
color: blur;
|
|
|
&-h {
|
|
|
width: 5px;
|
|
|
- height: 100%;
|
|
|
+ height: calc(100% - 16px);
|
|
|
.refer-line__line {
|
|
|
border-left: solid 1px red;
|
|
|
cursor: e-resize;
|
|
|
@@ -245,7 +290,7 @@ useResizeObserver(verticalRef, handleDrawVScaleplate)
|
|
|
}
|
|
|
}
|
|
|
&-v {
|
|
|
- width: 100%;
|
|
|
+ width: calc(100% - 16px);
|
|
|
height: 5px;
|
|
|
.refer-line__line {
|
|
|
border-top: solid 1px red;
|