From 7721cd584fd02e45176d357e399c7aae703870b4 Mon Sep 17 00:00:00 2001 From: Weady <657478957@qq.com> Date: Mon, 4 Dec 2023 19:56:04 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20=E9=9D=9E=E7=AD=89=E5=AE=BD=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E7=AD=89=E6=AF=94=E4=BE=8B=E7=BC=A9=E5=B0=8F=E6=97=B6?= =?UTF-8?q?=E5=A4=B1=E7=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Editor/Canvas/hooks/useScaleElement.ts | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/views/Editor/Canvas/hooks/useScaleElement.ts b/src/views/Editor/Canvas/hooks/useScaleElement.ts index 051d11c2..065f24e7 100644 --- a/src/views/Editor/Canvas/hooks/useScaleElement.ts +++ b/src/views/Editor/Canvas/hooks/useScaleElement.ts @@ -133,6 +133,10 @@ export default ( // 元素最小缩放限制 const minSize = MIN_SIZE[element.type] || 20 const getSizeWithinRange = (size: number) => size < minSize ? minSize : size + const getHeightWithinRange = (height: number) => { + const minHeight = minSize / aspectRatio + return height < minHeight ? minHeight : height + } let points: ReturnType let baseLeft = 0 @@ -269,22 +273,22 @@ export default ( // 但此处计算的大小不需要重新校正,因为前面已经重新计算需要缩放的距离,相当于大小已经经过了校正 if (command === OperateResizeHandlers.RIGHT_BOTTOM) { width = getSizeWithinRange(elOriginWidth + revisedX) - height = getSizeWithinRange(elOriginHeight + revisedY) + height = getHeightWithinRange(elOriginHeight + revisedY) } else if (command === OperateResizeHandlers.LEFT_BOTTOM) { width = getSizeWithinRange(elOriginWidth - revisedX) - height = getSizeWithinRange(elOriginHeight + revisedY) + height = getHeightWithinRange(elOriginHeight + revisedY) left = elOriginLeft - (width - elOriginWidth) } else if (command === OperateResizeHandlers.LEFT_TOP) { width = getSizeWithinRange(elOriginWidth - revisedX) - height = getSizeWithinRange(elOriginHeight - revisedY) + height = getHeightWithinRange(elOriginHeight - revisedY) left = elOriginLeft - (width - elOriginWidth) top = elOriginTop - (height - elOriginHeight) } else if (command === OperateResizeHandlers.RIGHT_TOP) { width = getSizeWithinRange(elOriginWidth + revisedX) - height = getSizeWithinRange(elOriginHeight - revisedY) + height = getHeightWithinRange(elOriginHeight - revisedY) top = elOriginTop - (height - elOriginHeight) } else if (command === OperateResizeHandlers.TOP) { @@ -336,7 +340,7 @@ export default ( else moveY = moveX / aspectRatio } width = getSizeWithinRange(elOriginWidth + moveX) - height = getSizeWithinRange(elOriginHeight + moveY) + height = getHeightWithinRange(elOriginHeight + moveY) } else if (command === OperateResizeHandlers.LEFT_BOTTOM) { const { offsetX, offsetY } = alignedAdsorption(elOriginLeft + moveX, elOriginTop + elOriginHeight + moveY) @@ -347,7 +351,7 @@ export default ( else moveY = -moveX / aspectRatio } width = getSizeWithinRange(elOriginWidth - moveX) - height = getSizeWithinRange(elOriginHeight + moveY) + height = getHeightWithinRange(elOriginHeight + moveY) left = elOriginLeft - (width - elOriginWidth) } else if (command === OperateResizeHandlers.LEFT_TOP) { @@ -359,7 +363,7 @@ export default ( else moveY = moveX / aspectRatio } width = getSizeWithinRange(elOriginWidth - moveX) - height = getSizeWithinRange(elOriginHeight - moveY) + height = getHeightWithinRange(elOriginHeight - moveY) left = elOriginLeft - (width - elOriginWidth) top = elOriginTop - (height - elOriginHeight) } @@ -372,7 +376,7 @@ export default ( else moveY = -moveX / aspectRatio } width = getSizeWithinRange(elOriginWidth + moveX) - height = getSizeWithinRange(elOriginHeight - moveY) + height = getHeightWithinRange(elOriginHeight - moveY) top = elOriginTop - (height - elOriginHeight) } else if (command === OperateResizeHandlers.LEFT) { From 1c40f578df6bf8db59e39d968be8f3316e444b70 Mon Sep 17 00:00:00 2001 From: Weady <657478957@qq.com> Date: Mon, 4 Dec 2023 20:02:15 +0800 Subject: [PATCH 2/3] =?UTF-8?q?perf:=20=E9=80=89=E8=89=B2=E5=99=A8?= =?UTF-8?q?=E8=BE=93=E5=85=A5=E6=A1=86=E4=BA=A4=E4=BA=92=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补充颜色值有效性校验 --- src/components/ColorPicker/EditableInput.vue | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/components/ColorPicker/EditableInput.vue b/src/components/ColorPicker/EditableInput.vue index 7f971f75..9f33cf0e 100644 --- a/src/components/ColorPicker/EditableInput.vue +++ b/src/components/ColorPicker/EditableInput.vue @@ -29,7 +29,12 @@ const val = computed(() => { const handleInput = (e: Event) => { const value = (e.target as HTMLInputElement).value - if (value.length >= 6) emit('colorChange', tinycolor(value).toRgb()) + if (value.length >= 6) { + const color = tinycolor(value) + if (color.isValid()) { + emit('colorChange', color.toRgb()) + } + } } From 70743c65873a258a57015e68c7fb8625f85f2c3e Mon Sep 17 00:00:00 2001 From: Weady <657478957@qq.com> Date: Mon, 4 Dec 2023 20:30:26 +0800 Subject: [PATCH 3/3] =?UTF-8?q?perf:=20=E6=96=87=E6=9C=AC=E6=A1=86?= =?UTF-8?q?=E4=BA=A4=E4=BA=92=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 点击或移动文本框时,立即同步样式面板文本属性 --- src/utils/emitter.ts | 2 ++ .../Editor/Toolbar/ElementStylePanel/TextStylePanel.vue | 1 + src/views/components/element/ProsemirrorEditor.vue | 7 +++++++ 3 files changed, 10 insertions(+) diff --git a/src/utils/emitter.ts b/src/utils/emitter.ts index a00bbb8b..b858d9ef 100644 --- a/src/utils/emitter.ts +++ b/src/utils/emitter.ts @@ -2,6 +2,7 @@ import mitt, { type Emitter } from 'mitt' export const enum EmitterEvents { RICH_TEXT_COMMAND = 'RICH_TEXT_COMMAND', + SYNC_RICH_TEXT_ATTRS_TO_STORE = 'SYNC_RICH_TEXT_ATTRS_TO_STORE', OPEN_CHART_DATA_EDITOR = 'OPEN_CHART_DATA_EDITOR', OPEN_LATEX_EDITOR = 'OPEN_LATEX_EDITOR', } @@ -18,6 +19,7 @@ export interface RichTextCommand { type Events = { [EmitterEvents.RICH_TEXT_COMMAND]: RichTextCommand + [EmitterEvents.SYNC_RICH_TEXT_ATTRS_TO_STORE]: void [EmitterEvents.OPEN_CHART_DATA_EDITOR]: void [EmitterEvents.OPEN_LATEX_EDITOR]: void } diff --git a/src/views/Editor/Toolbar/ElementStylePanel/TextStylePanel.vue b/src/views/Editor/Toolbar/ElementStylePanel/TextStylePanel.vue index a07725a5..fc5284ba 100644 --- a/src/views/Editor/Toolbar/ElementStylePanel/TextStylePanel.vue +++ b/src/views/Editor/Toolbar/ElementStylePanel/TextStylePanel.vue @@ -457,6 +457,7 @@ watch(handleElement, () => { lineHeight.value = handleElement.value.lineHeight || 1.5 wordSpace.value = handleElement.value.wordSpace || 0 paragraphSpace.value = handleElement.value.paragraphSpace === undefined ? 5 : handleElement.value.paragraphSpace + emitter.emit(EmitterEvents.SYNC_RICH_TEXT_ATTRS_TO_STORE) }, { deep: true, immediate: true }) const fontSizeOptions = [ diff --git a/src/views/components/element/ProsemirrorEditor.vue b/src/views/components/element/ProsemirrorEditor.vue index ee2adbc5..182f0fd2 100644 --- a/src/views/components/element/ProsemirrorEditor.vue +++ b/src/views/components/element/ProsemirrorEditor.vue @@ -262,9 +262,16 @@ onUnmounted(() => { editorView && editorView.destroy() }) +const syncAttrsToStore = () => { + if (handleElementId.value !== props.elementId) return + handleClick() +} + emitter.on(EmitterEvents.RICH_TEXT_COMMAND, execCommand) +emitter.on(EmitterEvents.SYNC_RICH_TEXT_ATTRS_TO_STORE, syncAttrsToStore) onUnmounted(() => { emitter.off(EmitterEvents.RICH_TEXT_COMMAND, execCommand) + emitter.off(EmitterEvents.SYNC_RICH_TEXT_ATTRS_TO_STORE, syncAttrsToStore) })