diff --git a/src/configs/element.ts b/src/configs/element.ts index 31dfbd59..b8da5a96 100644 --- a/src/configs/element.ts +++ b/src/configs/element.ts @@ -7,6 +7,7 @@ export const ELEMENT_TYPE_ZH = { table: '表格', video: '视频', audio: '音频', + frame: '网页', } export const MIN_SIZE = { @@ -17,4 +18,5 @@ export const MIN_SIZE = { table: 20, video: 250, audio: 20, + frame: 200, } \ No newline at end of file diff --git a/src/hooks/useCreateElement.ts b/src/hooks/useCreateElement.ts index 40e51267..c575205d 100644 --- a/src/hooks/useCreateElement.ts +++ b/src/hooks/useCreateElement.ts @@ -309,6 +309,19 @@ export default () => { }) } + const createFrameElement = (url: string) => { + createElement({ + type: 'frame', + id: nanoid(10), + width: 800, + height: 480, + rotate: 0, + left: (VIEWPORT_SIZE - 800) / 2, + top: (VIEWPORT_SIZE * viewportRatio.value - 480) / 2, + url, + }) + } + return { createImageElement, createChartElement, @@ -319,5 +332,6 @@ export default () => { createLatexElement, createVideoElement, createAudioElement, + createFrameElement, } } \ No newline at end of file diff --git a/src/types/slides.ts b/src/types/slides.ts index 7ba20ef4..1daa6a23 100644 --- a/src/types/slides.ts +++ b/src/types/slides.ts @@ -25,6 +25,7 @@ export const enum ElementTypes { LATEX = 'latex', VIDEO = 'video', AUDIO = 'audio', + FRAME = 'frame', } /** @@ -570,7 +571,18 @@ export interface PPTAudioElement extends PPTBaseElement { } -export type PPTElement = PPTTextElement | PPTImageElement | PPTShapeElement | PPTLineElement | PPTChartElement | PPTTableElement | PPTLatexElement | PPTVideoElement | PPTAudioElement +export interface PPTFrameElement extends PPTBaseElement { + type: 'frame' + id: string; + left: number; + top: number; + width: number; + height: number; + url: string; // 网页链接地址 +} + + +export type PPTElement = PPTTextElement | PPTImageElement | PPTShapeElement | PPTLineElement | PPTChartElement | PPTTableElement | PPTLatexElement | PPTVideoElement | PPTAudioElement | PPTFrameElement /** diff --git a/src/views/Editor/Canvas/EditableElement.vue b/src/views/Editor/Canvas/EditableElement.vue index 849f3984..a7532ba3 100644 --- a/src/views/Editor/Canvas/EditableElement.vue +++ b/src/views/Editor/Canvas/EditableElement.vue @@ -40,6 +40,7 @@ import TableElement from '@/views/components/element/TableElement/index.vue' import LatexElement from '@/views/components/element/LatexElement/index.vue' import VideoElement from '@/views/components/element/VideoElement/index.vue' import AudioElement from '@/views/components/element/AudioElement/index.vue' +import FrameElement from '@/views/components/element/FrameElement/index.vue' const props = defineProps({ elementInfo: { @@ -75,6 +76,7 @@ const currentElementComponent = computed(() => { [ElementTypes.LATEX]: LatexElement, [ElementTypes.VIDEO]: VideoElement, [ElementTypes.AUDIO]: AudioElement, + [ElementTypes.FRAME]: FrameElement, } return elementTypeMap[props.elementInfo.type] || null }) diff --git a/src/views/Editor/Canvas/Operate/index.vue b/src/views/Editor/Canvas/Operate/index.vue index 4efc9cea..b0821055 100644 --- a/src/views/Editor/Canvas/Operate/index.vue +++ b/src/views/Editor/Canvas/Operate/index.vue @@ -104,6 +104,7 @@ const currentOperateComponent = computed(() => { [ElementTypes.LATEX]: CommonElementOperate, [ElementTypes.VIDEO]: CommonElementOperate, [ElementTypes.AUDIO]: CommonElementOperate, + [ElementTypes.FRAME]: CommonElementOperate, } return elementTypeMap[props.elementInfo.type] || null }) diff --git a/src/views/Editor/CanvasTool/index.vue b/src/views/Editor/CanvasTool/index.vue index 7bf0d852..8e4eca35 100644 --- a/src/views/Editor/CanvasTool/index.vue +++ b/src/views/Editor/CanvasTool/index.vue @@ -68,6 +68,7 @@ + 插入网页
@@ -152,6 +153,7 @@ const { createLatexElement, createVideoElement, createAudioElement, + createFrameElement, } = useCreateElement() const insertImageElement = (files: FileList) => { diff --git a/src/views/Editor/Toolbar/ElementStylePanel/FrameStylePanel.vue b/src/views/Editor/Toolbar/ElementStylePanel/FrameStylePanel.vue new file mode 100644 index 00000000..689790fa --- /dev/null +++ b/src/views/Editor/Toolbar/ElementStylePanel/FrameStylePanel.vue @@ -0,0 +1,29 @@ + + + \ No newline at end of file diff --git a/src/views/Editor/Toolbar/ElementStylePanel/index.vue b/src/views/Editor/Toolbar/ElementStylePanel/index.vue index a252a940..5cabae2e 100644 --- a/src/views/Editor/Toolbar/ElementStylePanel/index.vue +++ b/src/views/Editor/Toolbar/ElementStylePanel/index.vue @@ -20,6 +20,7 @@ import LatexStylePanel from './LatexStylePanel.vue' import VideoStylePanel from './VideoStylePanel.vue' import AudioStylePanel from './AudioStylePanel.vue' import MultiStylePanel from './MultiStylePanel.vue' +import FrameStylePanel from './FrameStylePanel.vue' const panelMap = { [ElementTypes.TEXT]: TextStylePanel, @@ -31,6 +32,7 @@ const panelMap = { [ElementTypes.LATEX]: LatexStylePanel, [ElementTypes.VIDEO]: VideoStylePanel, [ElementTypes.AUDIO]: AudioStylePanel, + [ElementTypes.FRAME]: FrameStylePanel, } const { activeElementIdList, activeElementList, handleElement, activeGroupElementId } = storeToRefs(useMainStore()) diff --git a/src/views/Mobile/MobileEditor/MobileEditableElement.vue b/src/views/Mobile/MobileEditor/MobileEditableElement.vue index 397c5c1d..5cdb8f1c 100644 --- a/src/views/Mobile/MobileEditor/MobileEditableElement.vue +++ b/src/views/Mobile/MobileEditor/MobileEditableElement.vue @@ -27,6 +27,7 @@ import TableElement from '@/views/components/element/TableElement/index.vue' import LatexElement from '@/views/components/element/LatexElement/index.vue' import VideoElement from '@/views/components/element/VideoElement/index.vue' import AudioElement from '@/views/components/element/AudioElement/index.vue' +import FrameElement from '@/views/components/element/FrameElement/index.vue' const props = defineProps({ elementInfo: { @@ -54,6 +55,7 @@ const currentElementComponent = computed(() => { [ElementTypes.LATEX]: LatexElement, [ElementTypes.VIDEO]: VideoElement, [ElementTypes.AUDIO]: AudioElement, + [ElementTypes.FRAME]: FrameElement, } return elementTypeMap[props.elementInfo.type] || null }) diff --git a/src/views/Screen/ScreenElement.vue b/src/views/Screen/ScreenElement.vue index 4efc099c..f93c0b1f 100644 --- a/src/views/Screen/ScreenElement.vue +++ b/src/views/Screen/ScreenElement.vue @@ -34,6 +34,7 @@ import BaseTableElement from '@/views/components/element/TableElement/BaseTableE import BaseLatexElement from '@/views/components/element/LatexElement/BaseLatexElement.vue' import ScreenVideoElement from '@/views/components/element/VideoElement/ScreenVideoElement.vue' import ScreenAudioElement from '@/views/components/element/AudioElement/ScreenAudioElement.vue' +import BaseFrameElement from '@/views/components/element/FrameElement/BaseFrameElement.vue' const props = defineProps({ elementInfo: { @@ -69,6 +70,7 @@ const currentElementComponent = computed(() => { [ElementTypes.LATEX]: BaseLatexElement, [ElementTypes.VIDEO]: ScreenVideoElement, [ElementTypes.AUDIO]: ScreenAudioElement, + [ElementTypes.FRAME]: BaseFrameElement, } return elementTypeMap[props.elementInfo.type] || null }) diff --git a/src/views/components/ThumbnailSlide/ThumbnailElement.vue b/src/views/components/ThumbnailSlide/ThumbnailElement.vue index cb69af72..4525b4f7 100644 --- a/src/views/components/ThumbnailSlide/ThumbnailElement.vue +++ b/src/views/components/ThumbnailSlide/ThumbnailElement.vue @@ -27,6 +27,7 @@ import BaseTableElement from '@/views/components/element/TableElement/BaseTableE import BaseLatexElement from '@/views/components/element/LatexElement/BaseLatexElement.vue' import BaseVideoElement from '@/views/components/element/VideoElement/BaseVideoElement.vue' import BaseAudioElement from '@/views/components/element/AudioElement/BaseAudioElement.vue' +import BaseFrameElement from '@/views/components/element/FrameElement/BaseFrameElement.vue' const props = defineProps({ elementInfo: { @@ -50,6 +51,7 @@ const currentElementComponent = computed(() => { [ElementTypes.LATEX]: BaseLatexElement, [ElementTypes.VIDEO]: BaseVideoElement, [ElementTypes.AUDIO]: BaseAudioElement, + [ElementTypes.FRAME]: BaseFrameElement, } return elementTypeMap[props.elementInfo.type] || null }) diff --git a/src/views/components/element/FrameElement/BaseFrameElement.vue b/src/views/components/element/FrameElement/BaseFrameElement.vue new file mode 100644 index 00000000..00beacb2 --- /dev/null +++ b/src/views/components/element/FrameElement/BaseFrameElement.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/src/views/components/element/FrameElement/index.vue b/src/views/components/element/FrameElement/index.vue new file mode 100644 index 00000000..fab719e2 --- /dev/null +++ b/src/views/components/element/FrameElement/index.vue @@ -0,0 +1,116 @@ + + + + +