|
|
@@ -94,7 +94,7 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
- <div class="row"><Button style="flex: 1;" @click="applyAllSlide()">应用背景到全部</Button></div>
|
|
|
+ <div class="row"><Button style="flex: 1;" @click="applyBackgroundAllSlide()">应用背景到全部</Button></div>
|
|
|
|
|
|
<Divider />
|
|
|
|
|
|
@@ -103,7 +103,8 @@
|
|
|
<div style="flex: 2;">字体:</div>
|
|
|
<Select
|
|
|
style="flex: 3;"
|
|
|
- value="微软雅黑"
|
|
|
+ :value="theme.fontName"
|
|
|
+ @change="value => updateTheme({ fontName: value })"
|
|
|
>
|
|
|
<SelectOption v-for="font in availableFonts" :key="font.en" :value="font.en">
|
|
|
<span :style="{ fontFamily: font.en }">{{font.zh}}</span>
|
|
|
@@ -115,10 +116,11 @@
|
|
|
<Popover trigger="click">
|
|
|
<template #content>
|
|
|
<ColorPicker
|
|
|
- modelValue="#333"
|
|
|
+ :modelValue="theme.fontColor"
|
|
|
+ @update:modelValue="value => updateTheme({ fontColor: value })"
|
|
|
/>
|
|
|
</template>
|
|
|
- <ColorButton color="#333" style="flex: 3;" />
|
|
|
+ <ColorButton :color="theme.fontColor" style="flex: 3;" />
|
|
|
</Popover>
|
|
|
</div>
|
|
|
<div class="row">
|
|
|
@@ -126,10 +128,11 @@
|
|
|
<Popover trigger="click">
|
|
|
<template #content>
|
|
|
<ColorPicker
|
|
|
- modelValue="#333"
|
|
|
+ :modelValue="theme.backgroundColor"
|
|
|
+ @update:modelValue="value => updateTheme({ backgroundColor: value })"
|
|
|
/>
|
|
|
</template>
|
|
|
- <ColorButton color="#333" style="flex: 3;" />
|
|
|
+ <ColorButton :color="theme.backgroundColor" style="flex: 3;" />
|
|
|
</Popover>
|
|
|
</div>
|
|
|
<div class="row">
|
|
|
@@ -137,20 +140,26 @@
|
|
|
<Popover trigger="click">
|
|
|
<template #content>
|
|
|
<ColorPicker
|
|
|
- modelValue="#333"
|
|
|
+ :modelValue="theme.themeColor"
|
|
|
+ @update:modelValue="value => updateTheme({ themeColor: value })"
|
|
|
/>
|
|
|
</template>
|
|
|
- <ColorButton color="#333" style="flex: 3;" />
|
|
|
+ <ColorButton :color="theme.themeColor" style="flex: 3;" />
|
|
|
</Popover>
|
|
|
</div>
|
|
|
|
|
|
- <div class="title" style="margin-top: 20px;">预置主题:</div>
|
|
|
+ <div class="title" style="margin-top: 20px;">应用预置主题:</div>
|
|
|
<div class="theme-list">
|
|
|
<div
|
|
|
class="theme-item"
|
|
|
v-for="(item, index) in themes"
|
|
|
:key="index"
|
|
|
:style="{ backgroundColor: item.background }"
|
|
|
+ @click="updateTheme({
|
|
|
+ fontColor: item.text,
|
|
|
+ backgroundColor: item.background,
|
|
|
+ themeColor: item.color,
|
|
|
+ })"
|
|
|
>
|
|
|
<div class="theme-item-content">
|
|
|
<div class="text" :style="{ color: item.text }">Aa</div>
|
|
|
@@ -159,7 +168,7 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
- <div class="row"><Button style="flex: 1;" @click="applyAllSlide()">应用主题到全部</Button></div>
|
|
|
+ <div class="row"><Button style="flex: 1;" @click="applyThemeAllSlide()">应用主题到全部</Button></div>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
@@ -167,42 +176,14 @@
|
|
|
import { computed, defineComponent } from 'vue'
|
|
|
import { useStore } from 'vuex'
|
|
|
import { MutationTypes, State } from '@/store'
|
|
|
-import { Slide, SlideBackground } from '@/types/slides'
|
|
|
+import { Slide, SlideBackground, SlideTheme } from '@/types/slides'
|
|
|
+import { PRESET_THEMES } from '@/configs/theme'
|
|
|
import useHistorySnapshot from '@/hooks/useHistorySnapshot'
|
|
|
|
|
|
import ColorButton from './common/ColorButton.vue'
|
|
|
import { getImageDataURL } from '@/utils/image'
|
|
|
|
|
|
-const themes = [
|
|
|
- { color: '#42464b', background: '#fff', text: '#333' },
|
|
|
- { color: '#5d82ba', background: '#fff', text: '#333' },
|
|
|
- { color: '#005a6f', background: '#fff', text: '#333' },
|
|
|
- { color: '#232d05', background: '#fff244', text: '#333' },
|
|
|
- { color: '#d0614c', background: '#dfb044', text: '#333' },
|
|
|
- { color: '#86a1ad', background: '#dfdbd4', text: '#333' },
|
|
|
- { color: '#697586', background: '#d5c4a4', text: '#333' },
|
|
|
- { color: '#333333', background: '#7acfa6', text: '#333' },
|
|
|
- { color: '#42464b', background: '#415065', text: '#fff' },
|
|
|
- { color: '#0c5999', background: '#35a2cd', text: '#fff' },
|
|
|
- { color: '#c49a41', background: '#8c4357', text: '#fff' },
|
|
|
- { color: '#dfaa00', background: '#2e4e7d', text: '#fff' },
|
|
|
- { color: '#d1ad88', background: '#f99070', text: '#fff' },
|
|
|
- { color: '#464d52', background: '#657984', text: '#fff' },
|
|
|
- { color: '#ffcfb6', background: '#1e4c6f', text: '#fff' },
|
|
|
- { color: '#c3a043', background: '#43292a', text: '#fff' },
|
|
|
- { color: '#ffffff', background: '#171925', text: '#fff' },
|
|
|
- { color: '#df9636', background: '#5b89a0', text: '#fff' },
|
|
|
- { color: '#b898a4', background: '#93716b', text: '#fff' },
|
|
|
- { color: '#c47a11', background: '#187db1', text: '#fff' },
|
|
|
- { color: '#333333', background: '#759564', text: '#fff' },
|
|
|
- { color: '#355b5e', background: '#424b50', text: '#fff' },
|
|
|
- { color: '#d29090', background: '#942a32', text: '#fff' },
|
|
|
- { color: '#00cfdf', background: '#3b434d', text: '#fff' },
|
|
|
- { color: '#424246', background: '#c70042', text: '#fff' },
|
|
|
- { color: '#2e4155', background: '#b35d44', text: '#fff' },
|
|
|
- { color: '#11bfce', background: '#8f98aa', text: '#fff' },
|
|
|
- { color: '#333333', background: '#549688', text: '#fff' },
|
|
|
-]
|
|
|
+const themes = PRESET_THEMES
|
|
|
|
|
|
export default defineComponent({
|
|
|
name: 'slide-style-panel',
|
|
|
@@ -212,6 +193,7 @@ export default defineComponent({
|
|
|
setup() {
|
|
|
const store = useStore<State>()
|
|
|
const slides = computed(() => store.state.slides)
|
|
|
+ const theme = computed(() => store.state.theme)
|
|
|
const currentSlide = computed<Slide>(() => store.getters.currentSlide)
|
|
|
const availableFonts = computed(() => store.state.availableFonts)
|
|
|
|
|
|
@@ -269,7 +251,7 @@ export default defineComponent({
|
|
|
getImageDataURL(imageFile).then(dataURL => updateBackground({ image: dataURL }))
|
|
|
}
|
|
|
|
|
|
- const applyAllSlide = () => {
|
|
|
+ const applyBackgroundAllSlide = () => {
|
|
|
const newSlides = slides.value.map(slide => {
|
|
|
return {
|
|
|
...slide,
|
|
|
@@ -280,14 +262,25 @@ export default defineComponent({
|
|
|
addHistorySnapshot()
|
|
|
}
|
|
|
|
|
|
+ const updateTheme = (themeProps: Partial<SlideTheme>) => {
|
|
|
+ store.commit(MutationTypes.SET_THEME, themeProps)
|
|
|
+ }
|
|
|
+
|
|
|
+ const applyThemeAllSlide = () => {
|
|
|
+ console.log('applyThemeAllSlide')
|
|
|
+ }
|
|
|
+
|
|
|
return {
|
|
|
availableFonts,
|
|
|
background,
|
|
|
updateBackgroundType,
|
|
|
updateBackground,
|
|
|
uploadBackgroundImage,
|
|
|
- applyAllSlide,
|
|
|
+ applyBackgroundAllSlide,
|
|
|
themes,
|
|
|
+ theme,
|
|
|
+ updateTheme,
|
|
|
+ applyThemeAllSlide,
|
|
|
}
|
|
|
},
|
|
|
})
|
|
|
@@ -356,6 +349,11 @@ export default defineComponent({
|
|
|
flex-direction: column;
|
|
|
justify-content: center;
|
|
|
align-items: center;
|
|
|
+ transition: box-shadow .2s;
|
|
|
+
|
|
|
+ &:hover {
|
|
|
+ box-shadow: 0 0 4px #888;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
.text {
|