ElementFlip2.vue 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. <template>
  2. <div class="element-flip">
  3. <ButtonGroup class="row">
  4. <CheckboxButton
  5. style="flex: 1;"
  6. :checked="flipV"
  7. @click="updateFlip({ flipV: !flipV })"
  8. ><IconFlipVertically /> {{lang.flipVertically}}</CheckboxButton>
  9. <CheckboxButton
  10. style="flex: 1;"
  11. :checked="flipH"
  12. @click="updateFlip({ flipH: !flipH })"
  13. ><IconFlipHorizontally /> {{lang.flipHorizontally}}</CheckboxButton>
  14. </ButtonGroup>
  15. </div>
  16. </template>
  17. <script lang="ts" setup>
  18. import { ref, watch } from 'vue'
  19. import { storeToRefs } from 'pinia'
  20. import { useMainStore, useSlidesStore } from '@/store'
  21. import type { ImageOrShapeFlip } from '@/types/slides'
  22. import useHistorySnapshot from '@/hooks/useHistorySnapshot'
  23. import CheckboxButton from '@/components/CheckboxButton.vue'
  24. import ButtonGroup from '@/components/ButtonGroup.vue'
  25. import { lang } from '@/main'
  26. const slidesStore = useSlidesStore()
  27. const { handleElement } = storeToRefs(useMainStore())
  28. const flipH = ref(false)
  29. const flipV = ref(false)
  30. watch(handleElement, () => {
  31. if (handleElement.value && (handleElement.value.type === 'image' || handleElement.value.type === 'shape')) {
  32. flipH.value = !!handleElement.value.flipH
  33. flipV.value = !!handleElement.value.flipV
  34. }
  35. }, { deep: true, immediate: true })
  36. const { addHistorySnapshot } = useHistorySnapshot()
  37. const updateFlip = (flipProps: ImageOrShapeFlip) => {
  38. if (!handleElement.value) return
  39. slidesStore.updateElement({ id: handleElement.value.id, props: flipProps })
  40. addHistorySnapshot()
  41. }
  42. </script>
  43. <style lang="scss" scoped>
  44. .row {
  45. width: 100%;
  46. display: flex;
  47. align-items: center;
  48. // margin-bottom: 10px;
  49. }
  50. </style>