|
@@ -22,6 +22,7 @@
|
|
|
<template v-else-if="item.type === 'mediaAsset'">媒资</template>
|
|
<template v-else-if="item.type === 'mediaAsset'">媒资</template>
|
|
|
<template v-else-if="item.type === 'live'">直播</template>
|
|
<template v-else-if="item.type === 'live'">直播</template>
|
|
|
<template v-else-if="item.type === 'webPage'">网页</template>
|
|
<template v-else-if="item.type === 'webPage'">网页</template>
|
|
|
|
|
+ <template v-else-if="item.type === 'clock'">时钟</template>
|
|
|
<!-- 未来可扩展图片等类型 -->
|
|
<!-- 未来可扩展图片等类型 -->
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
@@ -36,6 +37,7 @@
|
|
|
<div class="toolbar-item" draggable="true" @dragstart="onToolbarDragStart('mediaAsset')">媒资</div>
|
|
<div class="toolbar-item" draggable="true" @dragstart="onToolbarDragStart('mediaAsset')">媒资</div>
|
|
|
<div class="toolbar-item" draggable="true" @dragstart="onToolbarDragStart('live')">直播</div>
|
|
<div class="toolbar-item" draggable="true" @dragstart="onToolbarDragStart('live')">直播</div>
|
|
|
<div class="toolbar-item" draggable="true" @dragstart="onToolbarDragStart('webPage')">网页</div>
|
|
<div class="toolbar-item" draggable="true" @dragstart="onToolbarDragStart('webPage')">网页</div>
|
|
|
|
|
+ <div class="toolbar-item" draggable="true" @dragstart="onToolbarDragStart('clock')">时钟</div>
|
|
|
<!-- 可扩展更多组件 -->
|
|
<!-- 可扩展更多组件 -->
|
|
|
</div>
|
|
</div>
|
|
|
<div class="editor-canvas" ref="editorCanvasRef" @dragover.prevent @drop="onCanvasDrop">
|
|
<div class="editor-canvas" ref="editorCanvasRef" @dragover.prevent @drop="onCanvasDrop">
|
|
@@ -95,6 +97,14 @@
|
|
|
item.height = height / canvasScale;
|
|
item.height = height / canvasScale;
|
|
|
}
|
|
}
|
|
|
" @click.stop="selectComponent(item)" :class="{ selected: selectedComponent === item }" />
|
|
" @click.stop="selectComponent(item)" :class="{ selected: selectedComponent === item }" />
|
|
|
|
|
+ <ClockBoard v-if="item.type === 'clock'" :width="item.width * canvasScale"
|
|
|
|
|
+ :height="item.height * canvasScale" :format="item.format" :selected="selectedComponent === item"
|
|
|
|
|
+ @resize="
|
|
|
|
|
+ ({ width, height }) => {
|
|
|
|
|
+ item.width = width / canvasScale;
|
|
|
|
|
+ item.height = height / canvasScale;
|
|
|
|
|
+ }
|
|
|
|
|
+ " @click.stop="selectComponent(item)" :class="{ selected: selectedComponent === item }" />
|
|
|
<!-- 未来可扩展更多类型 -->
|
|
<!-- 未来可扩展更多类型 -->
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
@@ -137,6 +147,13 @@
|
|
|
v-else-if="key === 'color' && (selectedComponent.type === 'text' || selectedComponent.type === 'scrollingText')">
|
|
v-else-if="key === 'color' && (selectedComponent.type === 'text' || selectedComponent.type === 'scrollingText')">
|
|
|
<BackgroundSelector v-model="selectedComponent[key]" :isCanvas="false" />
|
|
<BackgroundSelector v-model="selectedComponent[key]" :isCanvas="false" />
|
|
|
</template>
|
|
</template>
|
|
|
|
|
+ <template v-else-if="selectedComponent.type === 'clock' && key === 'format'">
|
|
|
|
|
+ <el-select v-model="selectedComponent[key]" style="width: 100%">
|
|
|
|
|
+ <el-option label="24小时制 (HH:mm:ss)" value="24h" />
|
|
|
|
|
+ <el-option label="12小时制 (hh:mm:ss A)" value="12h" />
|
|
|
|
|
+ <el-option label="日期+时间 (YYYY-MM-DD HH:mm:ss)" value="date" />
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ </template>
|
|
|
<template v-else>
|
|
<template v-else>
|
|
|
<el-input v-model="selectedComponent[key]" />
|
|
<el-input v-model="selectedComponent[key]" />
|
|
|
</template>
|
|
</template>
|
|
@@ -289,13 +306,15 @@ import MediaFileSelector from '@/components/MediaFileSelector.vue';
|
|
|
import BackgroundSelector from '@/components/BackgroundSelector.vue';
|
|
import BackgroundSelector from '@/components/BackgroundSelector.vue';
|
|
|
import LiveBoard from './component/LiveBoard.vue';
|
|
import LiveBoard from './component/LiveBoard.vue';
|
|
|
import WebPageBoard from './component/WebPageBoard.vue';
|
|
import WebPageBoard from './component/WebPageBoard.vue';
|
|
|
|
|
+import ClockBoard from './component/ClockBoard.vue';
|
|
|
import {
|
|
import {
|
|
|
canvasPropNameMap,
|
|
canvasPropNameMap,
|
|
|
textPropNameMap,
|
|
textPropNameMap,
|
|
|
scrollingTextPropNameMap,
|
|
scrollingTextPropNameMap,
|
|
|
mediaAssetPropNameMap,
|
|
mediaAssetPropNameMap,
|
|
|
livePropNameMap,
|
|
livePropNameMap,
|
|
|
- webPagePropNameMap
|
|
|
|
|
|
|
+ webPagePropNameMap,
|
|
|
|
|
+ clockPropNameMap
|
|
|
} from './component/propNameMaps';
|
|
} from './component/propNameMaps';
|
|
|
// 拖拽类型
|
|
// 拖拽类型
|
|
|
const dragType = ref<string | null>(null);
|
|
const dragType = ref<string | null>(null);
|
|
@@ -352,6 +371,8 @@ function getPropLabel(key: string) {
|
|
|
return livePropNameMap[key] || key;
|
|
return livePropNameMap[key] || key;
|
|
|
} else if (selectedComponent.value?.type === 'webPage') {
|
|
} else if (selectedComponent.value?.type === 'webPage') {
|
|
|
return webPagePropNameMap[key] || key;
|
|
return webPagePropNameMap[key] || key;
|
|
|
|
|
+ } else if (selectedComponent.value?.type === 'clock') {
|
|
|
|
|
+ return clockPropNameMap[key] || key;
|
|
|
}
|
|
}
|
|
|
return key;
|
|
return key;
|
|
|
}
|
|
}
|
|
@@ -555,6 +576,18 @@ function onCanvasDrop(e: DragEvent) {
|
|
|
};
|
|
};
|
|
|
editorContent.value.elements.push(newWebPage);
|
|
editorContent.value.elements.push(newWebPage);
|
|
|
nextTick(() => selectComponent(newWebPage));
|
|
nextTick(() => selectComponent(newWebPage));
|
|
|
|
|
+ } else if (dragType.value === 'clock') {
|
|
|
|
|
+ const newClock = {
|
|
|
|
|
+ type: 'clock',
|
|
|
|
|
+ format: '24h', // default format, can be '24h', '12h', or 'dateTime'
|
|
|
|
|
+ x: x,
|
|
|
|
|
+ y: y,
|
|
|
|
|
+ width: 200,
|
|
|
|
|
+ height: 60,
|
|
|
|
|
+ depth: getMaxDepth() + 1
|
|
|
|
|
+ };
|
|
|
|
|
+ editorContent.value.elements.push(newClock);
|
|
|
|
|
+ nextTick(() => selectComponent(newClock));
|
|
|
}
|
|
}
|
|
|
dragType.value = null;
|
|
dragType.value = null;
|
|
|
}
|
|
}
|