123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- <template>
- <div class="editable-element-frame"
- :style="{
- top: elementInfo.top + 'px',
- left: elementInfo.left + 'px',
- width: elementInfo.width + 'px',
- height: elementInfo.height + 'px',
- }"
- >
- <div
- class="rotate-wrapper"
- :style="{ transform: `rotate(${elementInfo.rotate}deg)` }"
- >
- <div
- class="element-content"
- v-contextmenu="contextmenus"
- @mousedown="$event => handleSelectElement($event)"
- @touchstart="$event => handleSelectElement($event)"
- >
- <iframe :srcdoc="elementInfo.url" v-if="elementInfo.isHTML"
- :width="elementInfo.width"
- :height="elementInfo.height"
- :frameborder="0"
- :allowfullscreen="true"></iframe>
- <iframe v-else
- :src="elementInfo.url"
- :width="elementInfo.width"
- :height="elementInfo.height"
- :frameborder="0"
- :allowfullscreen="true"
- ></iframe>
- <div class="drag-handler top"></div>
- <div class="drag-handler bottom"></div>
- <div class="drag-handler left"></div>
- <div class="drag-handler right"></div>
- <div class="mask"
- v-if="handleElementId !== elementInfo.id"
- @mousedown="$event => handleSelectElement($event, false)"
- @touchstart="$event => handleSelectElement($event, false)"
- ></div>
- </div>
- </div>
- </div>
- </template>
- <script lang="ts" setup>
- import type { PropType } from 'vue'
- import { storeToRefs } from 'pinia'
- import { useMainStore } from '@/store'
- import type { PPTFrameElement } from '@/types/slides'
- import type { ContextmenuItem } from '@/components/Contextmenu/types'
- const props = defineProps({
- elementInfo: {
- type: Object as PropType<PPTFrameElement>,
- required: true,
- },
- selectElement: {
- type: Function as PropType<(e: MouseEvent | TouchEvent, element: PPTFrameElement, canMove?: boolean) => void>,
- required: true,
- },
- contextmenus: {
- type: Function as PropType<() => ContextmenuItem[] | null>,
- required: true,
- },
- })
- const { handleElementId } = storeToRefs(useMainStore())
- const handleSelectElement = (e: MouseEvent | TouchEvent, canMove = true) => {
- e.stopPropagation()
- props.selectElement(e, props.elementInfo, canMove)
- }
- </script>
- <style lang="scss" scoped>
- .editable-element-frame {
- position: absolute;
- }
- .element-content {
- width: 100%;
- height: 100%;
- cursor: move;
- }
- .drag-handler {
- position: absolute;
- &.top {
- height: 20px;
- left: 0;
- right: 0;
- top: 0;
- }
- &.bottom {
- height: 20px;
- left: 0;
- right: 0;
- bottom: 0;
- }
- &.left {
- width: 20px;
- top: 0;
- bottom: 0;
- left: 0;
- }
- &.right {
- width: 20px;
- top: 0;
- bottom: 0;
- right: 0;
- }
- }
- .mask {
- position: absolute;
- top: 0;
- bottom: 0;
- left: 0;
- right: 0;
- }
- </style>
|