diff --git a/src/components/IconFont.ts b/src/components/IconFont.ts index b17bb0f6..786e90e7 100644 --- a/src/components/IconFont.ts +++ b/src/components/IconFont.ts @@ -3,5 +3,5 @@ import { createFromIconfontCN } from '@ant-design/icons-vue' export default createFromIconfontCN({ - scriptUrl: '//at.alicdn.com/t/font_2317509_83tu8tohuv.js', + scriptUrl: '//at.alicdn.com/t/font_2317509_nn4bn0af7a.js', }) as any \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index 002a4b1c..00637f9a 100644 --- a/src/main.ts +++ b/src/main.ts @@ -29,6 +29,7 @@ import { Switch, Radio, Input, + Modal, } from 'ant-design-vue' const app = createApp(App) @@ -48,6 +49,7 @@ app.component('RadioGroup', Radio.Group) app.component('RadioButton', Radio.Button) app.component('Input', Input) app.component('InputGroup', Input.Group) +app.component('Modal', Modal) app.use(contextmenu) app.use(clickOutside) diff --git a/src/views/Editor/Toolbar/ElementStylePanel/ImageStylePanel.vue b/src/views/Editor/Toolbar/ElementStylePanel/ImageStylePanel.vue index 7c487eda..bf05dc4f 100644 --- a/src/views/Editor/Toolbar/ElementStylePanel/ImageStylePanel.vue +++ b/src/views/Editor/Toolbar/ElementStylePanel/ImageStylePanel.vue @@ -321,7 +321,7 @@ export default defineComponent({ store.commit(MutationTypes.REMOVE_ELEMENT_PROPS, { id: handleElement.value.id, - propName: ['clip', 'outline', 'flip', 'shadow', 'filter'], + propName: ['clip', 'outline', 'flip', 'shadow', 'filters'], }) addHistorySnapshot() } diff --git a/src/views/Screen/index.vue b/src/views/Screen/index.vue index fa01bb6a..1e98acef 100644 --- a/src/views/Screen/index.vue +++ b/src/views/Screen/index.vue @@ -8,12 +8,13 @@
@@ -32,6 +33,33 @@
+ + +
+
+ +
+
+
+ +
+ + + + +
@@ -40,18 +68,20 @@ import { computed, defineComponent, onMounted, onUnmounted, Ref, ref } from 'vue import { useStore } from 'vuex' import throttle from 'lodash/throttle' import { MutationTypes, State } from '@/store' +import { Slide } from '@/types/slides' import { exitFullscreen, isFullscreen } from '@/utils/fullscreen' import { VIEWPORT_ASPECT_RATIO, VIEWPORT_SIZE } from '@/configs/canvas' import { KEYS } from '@/configs/hotkey' import { ContextmenuItem } from '@/components/Contextmenu/types' import ScreenSlide from './ScreenSlide.vue' -import { Slide } from '@/types/slides' +import ThumbnailSlide from '@/views/components/ThumbnailSlide/index.vue' export default defineComponent({ name: 'screen', components: { ScreenSlide, + ThumbnailSlide, }, setup() { const store = useStore() @@ -63,6 +93,8 @@ export default defineComponent({ const slideHeight = ref(0) const scale = computed(() => slideWidth.value / VIEWPORT_SIZE) + const slideListModelVisible = ref(false) + const setSlideContentSize = () => { const winWidth = document.body.clientWidth const winHeight = document.body.clientHeight @@ -158,6 +190,12 @@ export default defineComponent({ animationIndex.value = 0 } + const turnSlideToIndex = (index: number) => { + slideListModelVisible.value = false + store.commit(MutationTypes.UPDATE_SLIDE_INDEX, index) + animationIndex.value = 0 + } + const contextmenus = (): ContextmenuItem[] => { return [ { @@ -188,6 +226,10 @@ export default defineComponent({ mousewheelListener, animationIndex, contextmenus, + execPrev, + execNext, + slideListModelVisible, + turnSlideToIndex, } }, }) @@ -212,17 +254,48 @@ export default defineComponent({ left: 0; width: 100%; height: 100%; - transition-property: transform; - transition-duration: .4s; &.show { z-index: 2; } - &.prev { - transform: translateY(-100%); + + &.turning-mode-no { + &.prev { + transform: translateY(-100%); + } + &.next { + transform: translateY(100%); + } } - &.next { - transform: translateY(100%); + &.turning-mode-fade { + transition: opacity .75s; + + &.prev { + pointer-events: none; + opacity: 0; + } + &.next { + pointer-events: none; + opacity: 0; + } + } + &.turning-mode-slideX { + transition: transform .35s; + &.prev { + transform: translateX(-100%); + } + &.next { + transform: translateX(100%); + } + } + &.turning-mode-slideY { + transition: transform .35s; + &.prev { + transform: translateY(-100%); + } + &.next { + transform: translateY(100%); + } } } .slide-content { @@ -235,4 +308,47 @@ export default defineComponent({ justify-content: center; align-items: center; } + +.tools { + position: fixed; + bottom: 8px; + left: 8px; + font-size: 25px; + color: #666; + z-index: 10; + cursor: pointer; +} +.tool-btn { + opacity: .35; + + &:hover { + opacity: .7; + } + & + .tool-btn { + margin-left: 8px; + } +} + +.slide-list-model { + height: 600px; + padding: 5px 10px; + display: flex; + flex-wrap: wrap; + align-content: flex-start; + overflow: overlay; + + .thumbnail { + width: 150px; + margin-bottom: 12px; + outline: 1px solid rgba($color: $themeColor, $alpha: .1); + + &.active { + outline-color: $themeColor; + } + + &:not(:nth-child(6n)) { + margin-right: 12px; + } + } +} \ No newline at end of file