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 @@
+
+
+
+
handleSelectElement($event)"
+ @touchstart="$event => handleSelectElement($event)"
+ >
+
+
+
+
+
+
+
+
handleSelectElement($event, false)"
+ @touchstart="$event => handleSelectElement($event, false)"
+ >
+
+
+
+
+
+
+
+