diff --git a/src/assets/icons/dc/hide.svg b/src/assets/icons/dc/hide.svg new file mode 100644 index 0000000..e991e7e --- /dev/null +++ b/src/assets/icons/dc/hide.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/delete.svg b/src/assets/icons/delete.svg index 29b0e11..3d7f8e2 100644 --- a/src/assets/icons/delete.svg +++ b/src/assets/icons/delete.svg @@ -1,4 +1,5 @@ + diff --git a/src/components/Canvas/DepthCanvas/components/header-tools.vue b/src/components/Canvas/DepthCanvas/components/header-tools.vue index d8ab35f..172dce0 100644 --- a/src/components/Canvas/DepthCanvas/components/header-tools.vue +++ b/src/components/Canvas/DepthCanvas/components/header-tools.vue @@ -24,7 +24,7 @@ diff --git a/src/components/Canvas/DepthCanvas/components/tools/my-select.vue b/src/components/Canvas/DepthCanvas/components/tools/my-select.vue deleted file mode 100644 index ccfc13c..0000000 --- a/src/components/Canvas/DepthCanvas/components/tools/my-select.vue +++ /dev/null @@ -1,52 +0,0 @@ - - - - diff --git a/src/components/Canvas/DepthCanvas/components/tools/my-textarea.vue b/src/components/Canvas/DepthCanvas/components/tools/my-textarea.vue deleted file mode 100644 index a8d146d..0000000 --- a/src/components/Canvas/DepthCanvas/components/tools/my-textarea.vue +++ /dev/null @@ -1,86 +0,0 @@ - - - - - diff --git a/src/components/Canvas/DepthCanvas/components/tools/offset-tool.vue b/src/components/Canvas/DepthCanvas/components/tools/offset-tool.vue deleted file mode 100644 index 5732251..0000000 --- a/src/components/Canvas/DepthCanvas/components/tools/offset-tool.vue +++ /dev/null @@ -1,217 +0,0 @@ - - - - - diff --git a/src/components/Canvas/DepthCanvas/components/tools/pixel-ratio-selection.vue b/src/components/Canvas/DepthCanvas/components/tools/pixel-ratio-selection.vue deleted file mode 100644 index c182c83..0000000 --- a/src/components/Canvas/DepthCanvas/components/tools/pixel-ratio-selection.vue +++ /dev/null @@ -1,69 +0,0 @@ - - - - - diff --git a/src/components/Canvas/DepthCanvas/components/tools/slider.vue b/src/components/Canvas/DepthCanvas/components/tools/slider.vue deleted file mode 100644 index eff883f..0000000 --- a/src/components/Canvas/DepthCanvas/components/tools/slider.vue +++ /dev/null @@ -1,172 +0,0 @@ - - - - - diff --git a/src/components/Canvas/DepthCanvas/components/tools/upload-file.vue b/src/components/Canvas/DepthCanvas/components/tools/upload-file.vue deleted file mode 100644 index b4396e0..0000000 --- a/src/components/Canvas/DepthCanvas/components/tools/upload-file.vue +++ /dev/null @@ -1,108 +0,0 @@ - - - - - diff --git a/src/components/Canvas/DepthCanvas/depth-canvas.vue b/src/components/Canvas/DepthCanvas/depth-canvas.vue index f17f9ce..4a8c5bd 100644 --- a/src/components/Canvas/DepthCanvas/depth-canvas.vue +++ b/src/components/Canvas/DepthCanvas/depth-canvas.vue @@ -5,8 +5,13 @@ - - + + @@ -22,10 +27,10 @@ // 管理器 import { StateManager } from './manager/StateManager' + import { LayerManager } from './manager/LayerManager' import { EventManager } from './manager/EventManager' - import { FlowManager } from './manager/FlowManager' - import { NodeManager } from './manager/NodeManager' - import { ToolManager, TOOLS } from './manager/ToolManager' + import { CanvasManager } from './manager/CanvasManager' + import { ToolManager } from './manager/ToolManager' const canvasContainerRef = ref(null) const canvasRef = ref(null) @@ -41,77 +46,59 @@ const stateManager = new StateManager({}) provide('stateManager', stateManager) + // 画布管理器 + const canvasManager = new CanvasManager({ stateManager }) + stateManager.setManager({ canvasManager, canvasRef }) + provide('canvasManager', canvasManager) + + // 图层管理器 + const layerManager = new LayerManager({ stateManager, canvasManager }) + stateManager.setManager({ layerManager }) + provide('layerManager', layerManager) + // 事件管理器 const eventManager = new EventManager({ stateManager }) stateManager.setManager({ eventManager }) provide('eventManager', eventManager) - // 流程管理器 - const flowManager = new FlowManager({ stateManager }) - stateManager.setManager({ flowManager }) - provide('flowManager', flowManager) - - // 节点管理器 - const nodeManager = new NodeManager({ stateManager }) - stateManager.setManager({ nodeManager }) - provide('nodeManager', nodeManager) - // 工具管理器 - const toolManager = new ToolManager({ stateManager }) + const toolManager = new ToolManager({ stateManager, canvasManager }) stateManager.setManager({ toolManager }) provide('toolManager', toolManager) - const initCanvas = () => { - console.log('OverallCanvas: initCanvas') - const canvasViewWidth = canvasContainerRef.value.clientWidth - const canvasViewHeight = canvasContainerRef.value.clientHeight - const canvasWidth = 750 - const canvasHeight = 600 - const canvas = new fabric.Canvas(canvasRef.value, { - selection: true, - width: canvasViewWidth, - height: canvasViewHeight, - imageSmoothingEnabled: true, // 启用图像平滑 - 抗锯齿 - imageSmoothingQuality: 'high', // 设置高质量图像平滑 - preserveObjectStacking: true, - enableRetinaScaling: true, - stopContextMenu: true, - fireRightClick: true, - backgroundColor: '#fff' - }) - canvas.clipPath = new fabric.Rect({ - left: 0, - top: 0, - width: canvasWidth, - height: canvasHeight - }) - // 画布居中 - const canvasX = canvasViewWidth / 2 - canvasWidth / 2 - const canvasY = canvasViewHeight / 2 - canvasHeight / 2 - canvas.viewportTransform = [1, 0, 0, 1, canvasX, canvasY] - // 创建矩形 - const rect = new fabric.Rect({ - left: 20, - top: 20, - width: 100, - height: 100, - fill: '#f00' - }) - canvas.add(rect) - //创建圆形 - const circle = new fabric.Circle({ - left: 200, - top: 200, - radius: 50, - fill: '#0f0' - }) - canvas.add(circle) - } + + const observer = ref(null) onMounted(() => { - initCanvas() + canvasManager.initCanvas({ + canvasRef, + canvasViewWidth: canvasContainerRef.value.clientWidth, + canvasViewHeight: canvasContainerRef.value.clientHeight, + canvasWidth: 750, + canvasHeight: 600 + }) + + const trailingTimeout = ref(null) + observer.value = new ResizeObserver((entries) => { + clearTimeout(trailingTimeout.value) + trailingTimeout.value = setTimeout(async () => { + handleWindowResize() + }, 100) + }) + observer.value.observe(canvasContainerRef.value) }) onBeforeMount(() => { // eventManager.removeEvents() // 移除事件 }) + async function handleWindowResize() { + console.log('==========画布窗口大小变化==========') + canvasManager.setCanvasViewSize({ + canvasViewWidth: canvasContainerRef.value.clientWidth, + canvasViewHeight: canvasContainerRef.value.clientHeight + }) + canvasManager.resetZoom() + } + const exportCanvas = () => { + console.log(canvasManager.getBitObjects()) + } \ No newline at end of file diff --git a/src/views/home/components/Input.vue b/src/views/home/components/Input.vue index 6ae30eb..0640ebd 100644 --- a/src/views/home/components/Input.vue +++ b/src/views/home/components/Input.vue @@ -2,41 +2,26 @@
-
- +
-
-
+
{{ $t('Input.placeholder') }}
{{ $t('Input.trendingReport') }}
+
@@ -222,7 +208,7 @@ import { getStyleImage } from './style' import { uploadImage } from '@/api/upload' import MyEvent from '@/utils/myEvent' - // import Tag from './Tag.vue' + import Preview from '@/components/Preview/Preview.vue' const router = useRouter() const agentStore = useAgentStore() @@ -773,6 +759,13 @@ uploadedImages.value = [] } + const showPreview = ref(false) + const previewUrl = ref('') + const previewImage = (url: string) => { + showPreview.value = true + previewUrl.value = url + } + // 暴露方法给父组件 defineExpose({ addReportTag @@ -840,6 +833,18 @@ position: absolute; z-index: 0; pointer-events: none; + top: 0; + left: 0; + padding: 0 1.4rem 1.4rem; + font-size: 2rem; + font-family: 'InterRegular'; + font-weight: 400; + color: #999; + pointer-events: none; + white-space: pre-wrap; + word-wrap: break-word; + width: calc(100% - 2.8rem); + box-sizing: border-box; } .editor { @@ -896,29 +901,29 @@ .preview-image { width: 100%; height: 100%; - object-fit: contain; + object-fit: cover; border-radius: 0.8rem; + cursor: pointer; } .image-remove-btn { position: absolute; - top: 0.2rem; - right: 0.2rem; + top: 0.6rem; + right: 0.6rem; width: 1.6rem; height: 1.6rem; color: #fff; border-radius: 50%; - display: flex; + // display: flex; align-items: center; justify-content: center; font-size: 1.2rem; cursor: pointer; - opacity: 0; - transition: opacity 0.2s ease; + display: none; } &:hover .image-remove-btn { - opacity: 1; + display: flex; } } } @@ -1028,6 +1033,13 @@ padding: 0; height: 100%; min-height: 5rem; + line-height: 1.4rem; + } + .editor-placeholder{ + font-family: 'Regular'; + font-size: 1.4rem; + padding: 0; + line-height: 1.4rem; } } .operate {