From b0fffe5e06103f6a5a3f0287e87649a018fadd6d Mon Sep 17 00:00:00 2001 From: pipipi-pikachu Date: Fri, 3 Sep 2021 21:36:04 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E5=85=83=E7=B4=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/configs/element.ts | 2 + src/hooks/useCreateElement.ts | 17 + src/plugins/icon.ts | 14 + src/types/slides.ts | 19 +- src/views/Editor/Canvas/EditableElement.vue | 2 + .../Canvas/Operate/VideoElementOperate.vue | 74 ++++ src/views/Editor/Canvas/Operate/index.vue | 2 + src/views/Editor/CanvasTool/VideoInput.vue | 45 +++ src/views/Editor/CanvasTool/index.vue | 18 +- .../Editor/Toolbar/ElementAnimationPanel.vue | 4 +- .../ElementStylePanel/VideoStylePanel.vue | 91 +++++ .../Toolbar/ElementStylePanel/index.vue | 2 + src/views/Screen/ScreenElement.vue | 2 + .../ThumbnailSlide/ThumbnailElement.vue | 2 + .../element/VideoElement/BaseVideoElement.vue | 51 +++ .../VideoElement/ScreenVideoElement.vue | 58 +++ .../VideoElement/VideoPlayer/index.vue | 381 ++++++++++++++++++ .../VideoElement/VideoPlayer/style.scss | 353 ++++++++++++++++ .../VideoElement/VideoPlayer/useMSE.ts | 41 ++ .../components/element/VideoElement/index.vue | 121 ++++++ 20 files changed, 1295 insertions(+), 4 deletions(-) create mode 100644 src/views/Editor/Canvas/Operate/VideoElementOperate.vue create mode 100644 src/views/Editor/CanvasTool/VideoInput.vue create mode 100644 src/views/Editor/Toolbar/ElementStylePanel/VideoStylePanel.vue create mode 100644 src/views/components/element/VideoElement/BaseVideoElement.vue create mode 100644 src/views/components/element/VideoElement/ScreenVideoElement.vue create mode 100644 src/views/components/element/VideoElement/VideoPlayer/index.vue create mode 100644 src/views/components/element/VideoElement/VideoPlayer/style.scss create mode 100644 src/views/components/element/VideoElement/VideoPlayer/useMSE.ts create mode 100644 src/views/components/element/VideoElement/index.vue diff --git a/src/configs/element.ts b/src/configs/element.ts index 5730f818..3533065e 100644 --- a/src/configs/element.ts +++ b/src/configs/element.ts @@ -5,6 +5,7 @@ export const ELEMENT_TYPE_ZH = { line: '线条', chart: '图表', table: '表格', + video: '视频', } export const MIN_SIZE = { @@ -13,4 +14,5 @@ export const MIN_SIZE = { shape: 15, chart: 200, table: 20, + video: 250, } \ No newline at end of file diff --git a/src/hooks/useCreateElement.ts b/src/hooks/useCreateElement.ts index f30ee9a5..8d0ec32e 100644 --- a/src/hooks/useCreateElement.ts +++ b/src/hooks/useCreateElement.ts @@ -222,6 +222,22 @@ export default () => { if (data.isCurve) newElement.curve = [(start[0] + end[0]) / 2, (start[1] + end[1]) / 2] createElement(newElement) } + + /** + * 创建视频元素 + * @param src 视频地址 + */ + const createVideoElement = (src: string) => { + createElement({ + type: 'video', + id: createRandomCode(), + width: 500, + height: 300, + left: (VIEWPORT_SIZE - 500) / 2, + top: (VIEWPORT_SIZE * viewportRatio.value - 300) / 2, + src, + }) + } return { createImageElement, @@ -230,5 +246,6 @@ export default () => { createTextElement, createShapeElement, createLineElement, + createVideoElement, } } \ No newline at end of file diff --git a/src/plugins/icon.ts b/src/plugins/icon.ts index 77fc75fa..a33ace74 100644 --- a/src/plugins/icon.ts +++ b/src/plugins/icon.ts @@ -84,6 +84,12 @@ import { AlignTextTopOne, AlignTextBottomOne, AlignTextMiddleOne, + Pause, + VolumeMute, + VolumeNotice, + VolumeSmall, + LoopOnce, + VideoTwo, } from '@icon-park/vue-next' export default { @@ -95,6 +101,7 @@ export default { app.component('IconConnection', Connection) app.component('IconChartProportion', ChartProportion) app.component('IconInsertTable', InsertTable) + app.component('IconVideoTwo', VideoTwo) // 锁定与解锁 app.component('IconLock', Lock) @@ -195,5 +202,12 @@ export default { app.component('IconLogout', Logout) app.component('IconClear', Clear) app.component('IconFolderClose', FolderClose) + + // 视频播放器 + app.component('IconPause', Pause) + app.component('IconVolumeMute', VolumeMute) + app.component('IconVolumeNotice', VolumeNotice) + app.component('IconVolumeSmall', VolumeSmall) + app.component('IconLoopOnce', LoopOnce) } } \ No newline at end of file diff --git a/src/types/slides.ts b/src/types/slides.ts index dccd5f2e..4435bf34 100644 --- a/src/types/slides.ts +++ b/src/types/slides.ts @@ -7,6 +7,7 @@ export const enum ElementTypes { LINE = 'line', CHART = 'chart', TABLE = 'table', + VIDEO = 'video', } /** @@ -461,7 +462,23 @@ export interface PPTTableElement extends PPTBaseElement { } -export type PPTElement = PPTTextElement | PPTImageElement | PPTShapeElement | PPTLineElement | PPTChartElement | PPTTableElement +/** + * 视频元素 + * + * type: 元素类型(video) + * + * src: 视频地址 + * + * poster: 预览封面 + */ +export interface PPTVideoElement extends PPTBaseElement { + type: 'video'; + src: string; + poster?: string; +} + + +export type PPTElement = PPTTextElement | PPTImageElement | PPTShapeElement | PPTLineElement | PPTChartElement | PPTTableElement | PPTVideoElement /** diff --git a/src/views/Editor/Canvas/EditableElement.vue b/src/views/Editor/Canvas/EditableElement.vue index 7d9d514b..64d139bc 100644 --- a/src/views/Editor/Canvas/EditableElement.vue +++ b/src/views/Editor/Canvas/EditableElement.vue @@ -37,6 +37,7 @@ import ShapeElement from '@/views/components/element/ShapeElement/index.vue' import LineElement from '@/views/components/element/LineElement/index.vue' import ChartElement from '@/views/components/element/ChartElement/index.vue' import TableElement from '@/views/components/element/TableElement/index.vue' +import VideoElement from '@/views/components/element/VideoElement/index.vue' export default defineComponent({ name: 'editable-element', @@ -71,6 +72,7 @@ export default defineComponent({ [ElementTypes.LINE]: LineElement, [ElementTypes.CHART]: ChartElement, [ElementTypes.TABLE]: TableElement, + [ElementTypes.VIDEO]: VideoElement, } return elementTypeMap[props.elementInfo.type] || null }) diff --git a/src/views/Editor/Canvas/Operate/VideoElementOperate.vue b/src/views/Editor/Canvas/Operate/VideoElementOperate.vue new file mode 100644 index 00000000..0b1fb29a --- /dev/null +++ b/src/views/Editor/Canvas/Operate/VideoElementOperate.vue @@ -0,0 +1,74 @@ + + + \ No newline at end of file diff --git a/src/views/Editor/Canvas/Operate/index.vue b/src/views/Editor/Canvas/Operate/index.vue index a22eb207..916633c9 100644 --- a/src/views/Editor/Canvas/Operate/index.vue +++ b/src/views/Editor/Canvas/Operate/index.vue @@ -48,6 +48,7 @@ import ShapeElementOperate from './ShapeElementOperate.vue' import LineElementOperate from './LineElementOperate.vue' import ChartElementOperate from './ChartElementOperate.vue' import TableElementOperate from './TableElementOperate.vue' +import VideoElementOperate from './VideoElementOperate.vue' import LinkHandler from './LinkHandler.vue' export default defineComponent({ @@ -107,6 +108,7 @@ export default defineComponent({ [ElementTypes.LINE]: LineElementOperate, [ElementTypes.CHART]: ChartElementOperate, [ElementTypes.TABLE]: TableElementOperate, + [ElementTypes.VIDEO]: VideoElementOperate, } return elementTypeMap[props.elementInfo.type] || null }) diff --git a/src/views/Editor/CanvasTool/VideoInput.vue b/src/views/Editor/CanvasTool/VideoInput.vue new file mode 100644 index 00000000..92fdeb17 --- /dev/null +++ b/src/views/Editor/CanvasTool/VideoInput.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/src/views/Editor/CanvasTool/index.vue b/src/views/Editor/CanvasTool/index.vue index c0fd272c..8f6fc4c3 100644 --- a/src/views/Editor/CanvasTool/index.vue +++ b/src/views/Editor/CanvasTool/index.vue @@ -53,6 +53,17 @@ + + + + + +
@@ -80,6 +91,7 @@ import ShapePool from './ShapePool.vue' import LinePool from './LinePool.vue' import ChartPool from './ChartPool.vue' import TableGenerator from './TableGenerator.vue' +import VideoInput from './VideoInput.vue' export default defineComponent({ name: 'canvas-tool', @@ -88,6 +100,7 @@ export default defineComponent({ LinePool, ChartPool, TableGenerator, + VideoInput, }, setup() { const store = useStore() @@ -100,7 +113,7 @@ export default defineComponent({ const { scaleCanvas, setCanvasPercentage } = useScaleCanvas() const { redo, undo } = useHistorySnapshot() - const { createImageElement, createChartElement, createTableElement } = useCreateElement() + const { createImageElement, createChartElement, createTableElement, createVideoElement } = useCreateElement() const insertImageElement = (files: File[]) => { const imageFile = files[0] @@ -112,6 +125,7 @@ export default defineComponent({ const linePoolVisible = ref(false) const chartPoolVisible = ref(false) const tableGeneratorVisible = ref(false) + const videoInputVisible = ref(false) // 绘制文字范围 const drawText = () => { @@ -152,11 +166,13 @@ export default defineComponent({ linePoolVisible, chartPoolVisible, tableGeneratorVisible, + videoInputVisible, drawText, drawShape, drawLine, createChartElement, createTableElement, + createVideoElement, } }, }) diff --git a/src/views/Editor/Toolbar/ElementAnimationPanel.vue b/src/views/Editor/Toolbar/ElementAnimationPanel.vue index 1564183d..e9ebf128 100644 --- a/src/views/Editor/Toolbar/ElementAnimationPanel.vue +++ b/src/views/Editor/Toolbar/ElementAnimationPanel.vue @@ -1,7 +1,7 @@