mirror of
https://github.com/pipipi-pikachu/PPTist.git
synced 2025-04-15 02:20:00 +08:00
主题相关界面
This commit is contained in:
parent
cd47e26a6d
commit
a3e9146db0
@ -160,7 +160,7 @@ export default defineComponent({
|
|||||||
const donut = ref(false)
|
const donut = ref(false)
|
||||||
|
|
||||||
watch(handleElement, () => {
|
watch(handleElement, () => {
|
||||||
if(!handleElement.value) return
|
if(!handleElement.value || handleElement.value.type !== 'chart') return
|
||||||
fill.value = handleElement.value.fill || '#000'
|
fill.value = handleElement.value.fill || '#000'
|
||||||
|
|
||||||
if(handleElement.value.options) {
|
if(handleElement.value.options) {
|
||||||
|
@ -177,7 +177,7 @@ export default defineComponent({
|
|||||||
const filterOptions = ref<FilterOption[]>(JSON.parse(JSON.stringify(defaultFilters)))
|
const filterOptions = ref<FilterOption[]>(JSON.parse(JSON.stringify(defaultFilters)))
|
||||||
|
|
||||||
watch(handleElement, () => {
|
watch(handleElement, () => {
|
||||||
if(!handleElement.value) return
|
if(!handleElement.value || handleElement.value.type !== 'image') return
|
||||||
|
|
||||||
if(handleElement.value.flip) {
|
if(handleElement.value.flip) {
|
||||||
flip.value = {
|
flip.value = {
|
||||||
|
@ -106,7 +106,7 @@ export default defineComponent({
|
|||||||
const fillType = ref('fill')
|
const fillType = ref('fill')
|
||||||
|
|
||||||
watch(handleElement, () => {
|
watch(handleElement, () => {
|
||||||
if(!handleElement.value) return
|
if(!handleElement.value || handleElement.value.type !== 'shape') return
|
||||||
fill.value = handleElement.value.fill || '#000'
|
fill.value = handleElement.value.fill || '#000'
|
||||||
|
|
||||||
gradient.value = handleElement.value.gradient || { type: 'linear', rotate: 0, color: [fill.value, '#fff'] }
|
gradient.value = handleElement.value.gradient || { type: 'linear', rotate: 0, color: [fill.value, '#fff'] }
|
||||||
|
@ -228,7 +228,7 @@ export default defineComponent({
|
|||||||
const minColCount = ref(0)
|
const minColCount = ref(0)
|
||||||
|
|
||||||
watch(handleElement, () => {
|
watch(handleElement, () => {
|
||||||
if(!handleElement.value) return
|
if(!handleElement.value || handleElement.value.type !== 'table') return
|
||||||
|
|
||||||
theme.value = handleElement.value.theme
|
theme.value = handleElement.value.theme
|
||||||
hasTheme.value = !!theme.value
|
hasTheme.value = !!theme.value
|
||||||
@ -347,7 +347,8 @@ export default defineComponent({
|
|||||||
const value = +(e.target as HTMLInputElement).value
|
const value = +(e.target as HTMLInputElement).value
|
||||||
const rowCount = handleElement.value.data.length
|
const rowCount = handleElement.value.data.length
|
||||||
|
|
||||||
if(value <= rowCount) return message.warning('设置行数不能少于当前值')
|
if(value === rowCount) return
|
||||||
|
if(value < rowCount) return message.warning('设置行数不能少于当前值')
|
||||||
|
|
||||||
const rowCells: TableCell[] = new Array(colCount.value).fill({ id: createRandomCode(), colspan: 1, rowspan: 1, text: '' })
|
const rowCells: TableCell[] = new Array(colCount.value).fill({ id: createRandomCode(), colspan: 1, rowspan: 1, text: '' })
|
||||||
const newTableCells: TableCell[][] = new Array(value - rowCount).fill(rowCells)
|
const newTableCells: TableCell[][] = new Array(value - rowCount).fill(rowCells)
|
||||||
@ -364,7 +365,8 @@ export default defineComponent({
|
|||||||
const value = +(e.target as HTMLInputElement).value
|
const value = +(e.target as HTMLInputElement).value
|
||||||
const colCount = handleElement.value.data[0].length
|
const colCount = handleElement.value.data[0].length
|
||||||
|
|
||||||
if(value <= colCount) return message.warning('设置列数不能少于当前值')
|
if(value === colCount) return
|
||||||
|
if(value < colCount) return message.warning('设置列数不能少于当前值')
|
||||||
|
|
||||||
const tableCells = handleElement.value.data.map(item => {
|
const tableCells = handleElement.value.data.map(item => {
|
||||||
const cells: TableCell[] = new Array(value - colCount).fill({ id: createRandomCode(), colspan: 1, rowspan: 1, text: '' })
|
const cells: TableCell[] = new Array(value - colCount).fill({ id: createRandomCode(), colspan: 1, rowspan: 1, text: '' })
|
||||||
|
@ -227,7 +227,8 @@ export default defineComponent({
|
|||||||
const wordSpace = ref<number>()
|
const wordSpace = ref<number>()
|
||||||
|
|
||||||
watch(handleElement, () => {
|
watch(handleElement, () => {
|
||||||
if(!handleElement.value) return
|
if(!handleElement.value || handleElement.value.type !== 'text') return
|
||||||
|
|
||||||
fill.value = handleElement.value.fill || '#000'
|
fill.value = handleElement.value.fill || '#000'
|
||||||
lineHeight.value = handleElement.value.lineHeight || 1.5
|
lineHeight.value = handleElement.value.lineHeight || 1.5
|
||||||
wordSpace.value = handleElement.value.wordSpace || 0
|
wordSpace.value = handleElement.value.wordSpace || 0
|
||||||
|
@ -94,7 +94,72 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row"><Button style="flex: 1;" @click="applyAllSlide()">应用到全部</Button></div>
|
<div class="row"><Button style="flex: 1;" @click="applyAllSlide()">应用背景到全部</Button></div>
|
||||||
|
|
||||||
|
<Divider />
|
||||||
|
|
||||||
|
<div class="title">全局主题</div>
|
||||||
|
<div class="row">
|
||||||
|
<div style="flex: 2;">字体:</div>
|
||||||
|
<Select
|
||||||
|
style="flex: 3;"
|
||||||
|
value="微软雅黑"
|
||||||
|
>
|
||||||
|
<SelectOption v-for="font in availableFonts" :key="font.en" :value="font.en">
|
||||||
|
<span :style="{ fontFamily: font.en }">{{font.zh}}</span>
|
||||||
|
</SelectOption>
|
||||||
|
</Select>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div style="flex: 2;">字体颜色:</div>
|
||||||
|
<Popover trigger="click">
|
||||||
|
<template #content>
|
||||||
|
<ColorPicker
|
||||||
|
modelValue="#333"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
<ColorButton color="#333" style="flex: 3;" />
|
||||||
|
</Popover>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div style="flex: 2;">背景颜色:</div>
|
||||||
|
<Popover trigger="click">
|
||||||
|
<template #content>
|
||||||
|
<ColorPicker
|
||||||
|
modelValue="#333"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
<ColorButton color="#333" style="flex: 3;" />
|
||||||
|
</Popover>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div style="flex: 2;">主题色:</div>
|
||||||
|
<Popover trigger="click">
|
||||||
|
<template #content>
|
||||||
|
<ColorPicker
|
||||||
|
modelValue="#333"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
<ColorButton color="#333" style="flex: 3;" />
|
||||||
|
</Popover>
|
||||||
|
</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 }"
|
||||||
|
>
|
||||||
|
<div class="theme-item-content">
|
||||||
|
<div class="text" :style="{ color: item.text }">Aa</div>
|
||||||
|
<div class="color-block" :style="{ backgroundColor: item.color }"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row"><Button style="flex: 1;" @click="applyAllSlide()">应用主题到全部</Button></div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -108,6 +173,37 @@ import useHistorySnapshot from '@/hooks/useHistorySnapshot'
|
|||||||
import ColorButton from './common/ColorButton.vue'
|
import ColorButton from './common/ColorButton.vue'
|
||||||
import { getImageDataURL } from '@/utils/image'
|
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' },
|
||||||
|
]
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'slide-style-panel',
|
name: 'slide-style-panel',
|
||||||
components: {
|
components: {
|
||||||
@ -117,6 +213,7 @@ export default defineComponent({
|
|||||||
const store = useStore<State>()
|
const store = useStore<State>()
|
||||||
const slides = computed(() => store.state.slides)
|
const slides = computed(() => store.state.slides)
|
||||||
const currentSlide = computed<Slide>(() => store.getters.currentSlide)
|
const currentSlide = computed<Slide>(() => store.getters.currentSlide)
|
||||||
|
const availableFonts = computed(() => store.state.availableFonts)
|
||||||
|
|
||||||
const background = computed(() => {
|
const background = computed(() => {
|
||||||
if(!currentSlide.value.background) {
|
if(!currentSlide.value.background) {
|
||||||
@ -184,11 +281,13 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
availableFonts,
|
||||||
background,
|
background,
|
||||||
updateBackgroundType,
|
updateBackgroundType,
|
||||||
updateBackground,
|
updateBackground,
|
||||||
uploadBackgroundImage,
|
uploadBackgroundImage,
|
||||||
applyAllSlide,
|
applyAllSlide,
|
||||||
|
themes,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
@ -235,4 +334,38 @@ export default defineComponent({
|
|||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.theme-list {
|
||||||
|
@include grid-layout-wrapper();
|
||||||
|
}
|
||||||
|
.theme-item {
|
||||||
|
@include grid-layout-item(4, 22%);
|
||||||
|
|
||||||
|
padding-bottom: 22%;
|
||||||
|
border-radius: $borderRadius;
|
||||||
|
position: relative;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
.theme-item-content {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.color-block {
|
||||||
|
width: 28px;
|
||||||
|
height: 10px;
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
Loading…
x
Reference in New Issue
Block a user