index2.vue 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. <template>
  2. <div class="pptist-editor">
  3. <EditorHeader class="layout-header" />
  4. <div class="layout-content">
  5. <CollapsibleToolbar class="layout-sidebar" @toggle="handleToolbarToggle" />
  6. <div class="layout-content-center">
  7. <CanvasTool class="center-top" />
  8. <Canvas class="center-body" :style="{ height: `calc(100% - ${remarkHeight + 40}px - 120px)` }" :courseid="props.courseid"/>
  9. <!-- <Remark
  10. class="center-bottom"
  11. v-model:height="remarkHeight"
  12. :style="{ height: `${remarkHeight}px` }"
  13. v-show="false"
  14. /> -->
  15. <Thumbnails class="layout-content-left" />
  16. </div>
  17. <Toolbar class="layout-content-right" v-show="false"/>
  18. </div>
  19. </div>
  20. <SelectPanel v-if="showSelectPanel" />
  21. <SearchPanel v-if="showSearchPanel" />
  22. <NotesPanel v-if="showNotesPanel" />
  23. <MarkupPanel v-if="showMarkupPanel" />
  24. <Modal
  25. :visible="!!dialogForExport"
  26. :width="680"
  27. @closed="closeExportDialog()"
  28. >
  29. <ExportDialog />
  30. </Modal>
  31. <Modal
  32. :visible="showAIPPTDialog"
  33. :width="720"
  34. :closeOnClickMask="false"
  35. :closeOnEsc="false"
  36. closeButton
  37. @closed="closeAIPPTDialog()"
  38. >
  39. <AIPPTDialog />
  40. </Modal>
  41. </template>
  42. <script lang="ts" setup>
  43. import { ref, computed } from 'vue'
  44. import { storeToRefs } from 'pinia'
  45. import { useMainStore } from '@/store'
  46. import useGlobalHotkey from '@/hooks/useGlobalHotkey'
  47. import usePasteEvent from '@/hooks/usePasteEvent'
  48. import EditorHeader from './EditorHeader/index.vue'
  49. import Canvas from './Canvas/index.vue'
  50. import CanvasTool from './CanvasTool/index.vue'
  51. import Thumbnails from './Thumbnails/index2.vue'
  52. import Toolbar from './Toolbar/index.vue'
  53. import Remark from './Remark/index.vue'
  54. import ExportDialog from './ExportDialog/index.vue'
  55. import SelectPanel from './SelectPanel.vue'
  56. import SearchPanel from './SearchPanel.vue'
  57. import NotesPanel from './NotesPanel.vue'
  58. import MarkupPanel from './MarkupPanel.vue'
  59. import AIPPTDialog from './AIPPTDialog.vue'
  60. import Modal from '@/components/Modal.vue'
  61. import CollapsibleToolbar from '@/components/CollapsibleToolbar/index.vue'
  62. interface Props {
  63. courseid?: string | null
  64. }
  65. const props = withDefaults(defineProps<Props>(), {
  66. courseid: null,
  67. })
  68. const mainStore = useMainStore()
  69. const { dialogForExport, showSelectPanel, showSearchPanel, showNotesPanel, showMarkupPanel, showAIPPTDialog } = storeToRefs(mainStore)
  70. const closeExportDialog = () => mainStore.setDialogForExport('')
  71. const closeAIPPTDialog = () => mainStore.setAIPPTDialogState(false)
  72. const remarkHeight = ref(0)
  73. const sidebarCollapsed = ref(false)
  74. const handleToolbarToggle = (collapsed: boolean) => {
  75. sidebarCollapsed.value = collapsed
  76. }
  77. useGlobalHotkey()
  78. usePasteEvent()
  79. </script>
  80. <style lang="scss" scoped>
  81. .pptist-editor {
  82. height: 100%;
  83. }
  84. .layout-header {
  85. height: 40px;
  86. }
  87. .layout-content {
  88. height: calc(100% - 40px);
  89. display: flex;
  90. }
  91. .layout-sidebar {
  92. // width: 200px;
  93. width: auto;
  94. height: 100%;
  95. flex-shrink: 0;
  96. transition: width 0.3s ease;
  97. }
  98. .layout-sidebar.collapsed {
  99. width: 48px;
  100. }
  101. .layout-content-left {
  102. width: 100%;
  103. height: 120px;
  104. flex-shrink: 0;
  105. }
  106. .layout-content-center {
  107. flex: 1;
  108. transition: width 0.3s ease;
  109. max-width: 100%;
  110. overflow: hidden;
  111. }
  112. .layout-content-center .center-top {
  113. height: 40px;
  114. }
  115. .layout-content-right {
  116. width: 260px;
  117. height: 100%;
  118. }
  119. </style>