From 162aa32d59fde8fb99d7c0d983c35ee468e67dc7 Mon Sep 17 00:00:00 2001 From: pipipi-pikachu Date: Sun, 9 Jan 2022 15:30:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E9=9F=B3=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 | 22 + src/types/slides.ts | 27 +- src/views/Editor/Canvas/EditableElement.vue | 2 + .../Canvas/Operate/CommonElementOperate.vue | 8 +- src/views/Editor/Canvas/Operate/index.vue | 1 + src/views/Editor/CanvasTool/MediaInput.vue | 98 ++++ src/views/Editor/CanvasTool/VideoInput.vue | 45 -- src/views/Editor/CanvasTool/index.vue | 29 +- src/views/Editor/Thumbnails/index.vue | 2 +- .../Editor/Toolbar/ElementPositionPanel.vue | 4 +- .../ElementStylePanel/AudioStylePanel.vue | 85 +++ .../Toolbar/ElementStylePanel/index.vue | 2 + src/views/Editor/Toolbar/SlideDesignPanel.vue | 1 + src/views/Screen/ScreenElement.vue | 2 + src/views/Screen/ScreenSlide.vue | 5 +- .../ThumbnailSlide/ThumbnailElement.vue | 2 + .../element/AudioElement/AudioPlayer.vue | 543 ++++++++++++++++++ .../element/AudioElement/BaseAudioElement.vue | 69 +++ .../AudioElement/ScreenAudioElement.vue | 139 +++++ .../components/element/AudioElement/index.vue | 143 +++++ .../VideoElement/ScreenVideoElement.vue | 11 +- .../VideoElement/VideoPlayer/index.vue | 7 +- .../VideoElement/VideoPlayer/style.scss | 3 +- 24 files changed, 1182 insertions(+), 70 deletions(-) create mode 100644 src/views/Editor/CanvasTool/MediaInput.vue delete mode 100644 src/views/Editor/CanvasTool/VideoInput.vue create mode 100644 src/views/Editor/Toolbar/ElementStylePanel/AudioStylePanel.vue create mode 100644 src/views/components/element/AudioElement/AudioPlayer.vue create mode 100644 src/views/components/element/AudioElement/BaseAudioElement.vue create mode 100644 src/views/components/element/AudioElement/ScreenAudioElement.vue create mode 100644 src/views/components/element/AudioElement/index.vue diff --git a/src/configs/element.ts b/src/configs/element.ts index 3533065e..31dfbd59 100644 --- a/src/configs/element.ts +++ b/src/configs/element.ts @@ -6,6 +6,7 @@ export const ELEMENT_TYPE_ZH = { chart: '图表', table: '表格', video: '视频', + audio: '音频', } export const MIN_SIZE = { @@ -15,4 +16,5 @@ export const MIN_SIZE = { chart: 200, table: 20, video: 250, + audio: 20, } \ No newline at end of file diff --git a/src/hooks/useCreateElement.ts b/src/hooks/useCreateElement.ts index 63596834..959709fb 100644 --- a/src/hooks/useCreateElement.ts +++ b/src/hooks/useCreateElement.ts @@ -261,6 +261,27 @@ export default () => { src, }) } + + /** + * 创建音频元素 + * @param src 音频地址 + */ + const createAudioElement = (src: string) => { + createElement({ + type: 'audio', + id: createRandomCode(), + width: 50, + height: 50, + rotate: 0, + left: (VIEWPORT_SIZE - 50) / 2, + top: (VIEWPORT_SIZE * viewportRatio.value - 50) / 2, + loop: false, + autoplay: false, + fixedRatio: true, + color: theme.value.themeColor, + src, + }) + } return { createImageElement, @@ -271,5 +292,6 @@ export default () => { createLineElement, createLatexElement, createVideoElement, + createAudioElement, } } \ No newline at end of file diff --git a/src/types/slides.ts b/src/types/slides.ts index 6cb71287..9ea5fe45 100644 --- a/src/types/slides.ts +++ b/src/types/slides.ts @@ -9,6 +9,7 @@ export const enum ElementTypes { TABLE = 'table', LATEX = 'latex', VIDEO = 'video', + AUDIO = 'audio', } /** @@ -511,8 +512,32 @@ export interface PPTVideoElement extends PPTBaseElement { poster?: string; } +/** + * 音频元素 + * + * type: 元素类型(audio) + * + * fixedRatio: 固定图标宽高比例 + * + * color: 图标颜色 + * + * loop: 循环播放 + * + * autoplay: 自动播放 + * + * src: 音频地址 + */ +export interface PPTAudioElement extends PPTBaseElement { + type: 'audio'; + fixedRatio: boolean; + color: string, + loop: boolean, + autoplay: boolean, + src: string; +} -export type PPTElement = PPTTextElement | PPTImageElement | PPTShapeElement | PPTLineElement | PPTChartElement | PPTTableElement | PPTLatexElement | PPTVideoElement + +export type PPTElement = PPTTextElement | PPTImageElement | PPTShapeElement | PPTLineElement | PPTChartElement | PPTTableElement | PPTLatexElement | PPTVideoElement | PPTAudioElement /** diff --git a/src/views/Editor/Canvas/EditableElement.vue b/src/views/Editor/Canvas/EditableElement.vue index 9e5c393c..475f4d82 100644 --- a/src/views/Editor/Canvas/EditableElement.vue +++ b/src/views/Editor/Canvas/EditableElement.vue @@ -39,6 +39,7 @@ import ChartElement from '@/views/components/element/ChartElement/index.vue' 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' export default defineComponent({ name: 'editable-element', @@ -75,6 +76,7 @@ export default defineComponent({ [ElementTypes.TABLE]: TableElement, [ElementTypes.LATEX]: LatexElement, [ElementTypes.VIDEO]: VideoElement, + [ElementTypes.AUDIO]: AudioElement, } return elementTypeMap[props.elementInfo.type] || null }) diff --git a/src/views/Editor/Canvas/Operate/CommonElementOperate.vue b/src/views/Editor/Canvas/Operate/CommonElementOperate.vue index 68aec164..e84b2745 100644 --- a/src/views/Editor/Canvas/Operate/CommonElementOperate.vue +++ b/src/views/Editor/Canvas/Operate/CommonElementOperate.vue @@ -19,6 +19,7 @@ /> @@ -30,7 +31,7 @@ import { computed, defineComponent, PropType } from 'vue' import { storeToRefs } from 'pinia' import { useMainStore } from '@/store' -import { PPTShapeElement, PPTVideoElement, PPTLatexElement } from '@/types/slides' +import { PPTShapeElement, PPTVideoElement, PPTLatexElement, PPTAudioElement } from '@/types/slides' import { OperateResizeHandler } from '@/types/edit' import useCommonOperate from '../hooks/useCommonOperate' @@ -38,7 +39,7 @@ import RotateHandler from './RotateHandler.vue' import ResizeHandler from './ResizeHandler.vue' import BorderLine from './BorderLine.vue' -type PPTElement = PPTShapeElement | PPTVideoElement | PPTLatexElement +type PPTElement = PPTShapeElement | PPTVideoElement | PPTLatexElement | PPTAudioElement export default defineComponent({ name: 'common-element-operate', @@ -73,10 +74,13 @@ export default defineComponent({ const scaleHeight = computed(() => props.elementInfo.height * canvasScale.value) const { resizeHandlers, borderLines } = useCommonOperate(scaleWidth, scaleHeight) + const cannotRotate = computed(() => ['video', 'audio'].includes(props.elementInfo.type)) + return { scaleWidth, resizeHandlers, borderLines, + cannotRotate, } }, }) diff --git a/src/views/Editor/Canvas/Operate/index.vue b/src/views/Editor/Canvas/Operate/index.vue index 8a479f37..aca4db42 100644 --- a/src/views/Editor/Canvas/Operate/index.vue +++ b/src/views/Editor/Canvas/Operate/index.vue @@ -107,6 +107,7 @@ export default defineComponent({ [ElementTypes.CHART]: CommonElementOperate, [ElementTypes.LATEX]: CommonElementOperate, [ElementTypes.VIDEO]: CommonElementOperate, + [ElementTypes.AUDIO]: CommonElementOperate, } return elementTypeMap[props.elementInfo.type] || null }) diff --git a/src/views/Editor/CanvasTool/MediaInput.vue b/src/views/Editor/CanvasTool/MediaInput.vue new file mode 100644 index 00000000..b6b19c78 --- /dev/null +++ b/src/views/Editor/CanvasTool/MediaInput.vue @@ -0,0 +1,98 @@ + + + + + diff --git a/src/views/Editor/CanvasTool/VideoInput.vue b/src/views/Editor/CanvasTool/VideoInput.vue deleted file mode 100644 index 92fdeb17..00000000 --- a/src/views/Editor/CanvasTool/VideoInput.vue +++ /dev/null @@ -1,45 +0,0 @@ - - - - - diff --git a/src/views/Editor/CanvasTool/index.vue b/src/views/Editor/CanvasTool/index.vue index 27b7e680..02b41cba 100644 --- a/src/views/Editor/CanvasTool/index.vue +++ b/src/views/Editor/CanvasTool/index.vue @@ -56,14 +56,15 @@ - + - + @@ -108,7 +109,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' +import MediaInput from './MediaInput.vue' import LaTeXEditor from '@/components/LaTeXEditor/index.vue' export default defineComponent({ @@ -118,7 +119,7 @@ export default defineComponent({ LinePool, ChartPool, TableGenerator, - VideoInput, + MediaInput, LaTeXEditor, }, setup() { @@ -131,7 +132,14 @@ export default defineComponent({ const { scaleCanvas, setCanvasPercentage } = useScaleCanvas() const { redo, undo } = useHistorySnapshot() - const { createImageElement, createChartElement, createTableElement, createLatexElement, createVideoElement } = useCreateElement() + const { + createImageElement, + createChartElement, + createTableElement, + createLatexElement, + createVideoElement, + createAudioElement, + } = useCreateElement() const insertImageElement = (files: File[]) => { const imageFile = files[0] @@ -143,7 +151,7 @@ export default defineComponent({ const linePoolVisible = ref(false) const chartPoolVisible = ref(false) const tableGeneratorVisible = ref(false) - const videoInputVisible = ref(false) + const mediaInputVisible = ref(false) const latexEditorVisible = ref(false) // 绘制文字范围 @@ -184,7 +192,7 @@ export default defineComponent({ linePoolVisible, chartPoolVisible, tableGeneratorVisible, - videoInputVisible, + mediaInputVisible, latexEditorVisible, drawText, drawShape, @@ -193,6 +201,7 @@ export default defineComponent({ createTableElement, createLatexElement, createVideoElement, + createAudioElement, } }, }) diff --git a/src/views/Editor/Thumbnails/index.vue b/src/views/Editor/Thumbnails/index.vue index 54fcf785..c43322a4 100644 --- a/src/views/Editor/Thumbnails/index.vue +++ b/src/views/Editor/Thumbnails/index.vue @@ -44,7 +44,7 @@ + + \ 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 7a9a231c..2a8c4ede 100644 --- a/src/views/Editor/Toolbar/ElementStylePanel/index.vue +++ b/src/views/Editor/Toolbar/ElementStylePanel/index.vue @@ -21,6 +21,7 @@ import ChartStylePanel from './ChartStylePanel/index.vue' import TableStylePanel from './TableStylePanel.vue' import LatexStylePanel from './LatexStylePanel.vue' import VideoStylePanel from './VideoStylePanel.vue' +import AudioStylePanel from './AudioStylePanel.vue' export default defineComponent({ name: 'element-style-panel', @@ -39,6 +40,7 @@ export default defineComponent({ [ElementTypes.TABLE]: TableStylePanel, [ElementTypes.LATEX]: LatexStylePanel, [ElementTypes.VIDEO]: VideoStylePanel, + [ElementTypes.AUDIO]: AudioStylePanel, } return panelMap[handleElement.value.type] || null }) diff --git a/src/views/Editor/Toolbar/SlideDesignPanel.vue b/src/views/Editor/Toolbar/SlideDesignPanel.vue index ad11f397..dd8f5f61 100644 --- a/src/views/Editor/Toolbar/SlideDesignPanel.vue +++ b/src/views/Editor/Toolbar/SlideDesignPanel.vue @@ -329,6 +329,7 @@ export default defineComponent({ el.gridColor = fontColor } else if (el.type === 'latex') el.color = fontColor + else if (el.type === 'audio') el.color = themeColor } } slidesStore.setSlides(newSlides) diff --git a/src/views/Screen/ScreenElement.vue b/src/views/Screen/ScreenElement.vue index a663d71b..b0aa0625 100644 --- a/src/views/Screen/ScreenElement.vue +++ b/src/views/Screen/ScreenElement.vue @@ -33,6 +33,7 @@ import ScreenChartElement from '@/views/components/element/ChartElement/ScreenCh import BaseTableElement from '@/views/components/element/TableElement/BaseTableElement.vue' 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' export default defineComponent({ name: 'screen-element', @@ -65,6 +66,7 @@ export default defineComponent({ [ElementTypes.TABLE]: BaseTableElement, [ElementTypes.LATEX]: BaseLatexElement, [ElementTypes.VIDEO]: ScreenVideoElement, + [ElementTypes.AUDIO]: ScreenAudioElement, } return elementTypeMap[props.elementInfo.type] || null }) diff --git a/src/views/Screen/ScreenSlide.vue b/src/views/Screen/ScreenSlide.vue index 17f85fa9..13e9f214 100644 --- a/src/views/Screen/ScreenSlide.vue +++ b/src/views/Screen/ScreenSlide.vue @@ -20,7 +20,7 @@ + + \ No newline at end of file diff --git a/src/views/components/element/AudioElement/BaseAudioElement.vue b/src/views/components/element/AudioElement/BaseAudioElement.vue new file mode 100644 index 00000000..7576b7ce --- /dev/null +++ b/src/views/components/element/AudioElement/BaseAudioElement.vue @@ -0,0 +1,69 @@ + + + + + diff --git a/src/views/components/element/AudioElement/ScreenAudioElement.vue b/src/views/components/element/AudioElement/ScreenAudioElement.vue new file mode 100644 index 00000000..e94c76b6 --- /dev/null +++ b/src/views/components/element/AudioElement/ScreenAudioElement.vue @@ -0,0 +1,139 @@ + + + + + diff --git a/src/views/components/element/AudioElement/index.vue b/src/views/components/element/AudioElement/index.vue new file mode 100644 index 00000000..a4077c9a --- /dev/null +++ b/src/views/components/element/AudioElement/index.vue @@ -0,0 +1,143 @@ + + + + + diff --git a/src/views/components/element/VideoElement/ScreenVideoElement.vue b/src/views/components/element/VideoElement/ScreenVideoElement.vue index a57f79c9..0e1edfae 100644 --- a/src/views/components/element/VideoElement/ScreenVideoElement.vue +++ b/src/views/components/element/VideoElement/ScreenVideoElement.vue @@ -13,6 +13,7 @@ >