index.vue 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. <template>
  2. <div class="editor-header">
  3. <div class="left">
  4. <Dropdown :trigger="['click']">
  5. <div class="menu-item"><IconEdit /> <span class="text">编辑</span></div>
  6. <template #overlay>
  7. <Menu>
  8. <MenuItem @click="undo()">撤销</MenuItem>
  9. <MenuItem @click="redo()">重做</MenuItem>
  10. <MenuItem @click="createSlide()">添加页面</MenuItem>
  11. <MenuItem @click="deleteSlide()">删除页面</MenuItem>
  12. <MenuItem @click="toggleGridLines()">{{ showGridLines ? '关闭网格线' : '打开网格线' }}</MenuItem>
  13. <MenuItem @click="resetSlides()">重置幻灯片</MenuItem>
  14. </Menu>
  15. </template>
  16. </Dropdown>
  17. <Dropdown :trigger="['click']">
  18. <div class="menu-item"><IconPpt /> <span class="text">演示</span></div>
  19. <template #overlay>
  20. <Menu>
  21. <MenuItem @click="enterScreeningFromStart()">从头开始</MenuItem>
  22. <MenuItem @click="enterScreening()">从当前页开始</MenuItem>
  23. </Menu>
  24. </template>
  25. </Dropdown>
  26. <Dropdown :trigger="['click']">
  27. <div class="menu-item"><IconHelpcenter /> <span class="text">帮助</span></div>
  28. <template #overlay>
  29. <Menu>
  30. <MenuItem @click="openDoc()">开发文档</MenuItem>
  31. <MenuItem @click="hotkeyDrawerVisible = true">快捷键</MenuItem>
  32. </Menu>
  33. </template>
  34. </Dropdown>
  35. </div>
  36. <div class="right">
  37. <Tooltip :mouseLeaveDelay="0" title="幻灯片放映">
  38. <div class="menu-item" @click="enterScreening()">
  39. <IconPpt size="18" fill="#666" style="margin-top: 2px;" />
  40. </div>
  41. </Tooltip>
  42. <Tooltip :mouseLeaveDelay="0" title="Github 仓库">
  43. <a href="https://github.com/pipipi-pikachu/PPTist" target="_blank">
  44. <div class="menu-item"><IconGithub size="18" fill="#666" /></div>
  45. </a>
  46. </Tooltip>
  47. </div>
  48. <Drawer
  49. width="320"
  50. placement="right"
  51. :visible="hotkeyDrawerVisible"
  52. @close="hotkeyDrawerVisible = false"
  53. >
  54. <HotkeyDoc />
  55. </Drawer>
  56. </div>
  57. </template>
  58. <script lang="ts">
  59. import { computed, defineComponent, ref } from 'vue'
  60. import { MutationTypes, useStore } from '@/store'
  61. import { createRandomCode } from '@/utils/common'
  62. import useScreening from '@/hooks/useScreening'
  63. import useSlideHandler from '@/hooks/useSlideHandler'
  64. import useHistorySnapshot from '@/hooks/useHistorySnapshot'
  65. import HotkeyDoc from './HotkeyDoc.vue'
  66. import { message } from 'ant-design-vue'
  67. export default defineComponent({
  68. name: 'editor-header',
  69. components: {
  70. HotkeyDoc,
  71. },
  72. setup() {
  73. const store = useStore()
  74. const { enterScreening, enterScreeningFromStart } = useScreening()
  75. const { createSlide, deleteSlide } = useSlideHandler()
  76. const { redo, undo } = useHistorySnapshot()
  77. const showGridLines = computed(() => store.state.showGridLines)
  78. const toggleGridLines = () => {
  79. store.commit(MutationTypes.SET_GRID_LINES_STATE, !showGridLines.value)
  80. }
  81. const resetSlides = () => {
  82. store.commit(MutationTypes.SET_ACTIVE_ELEMENT_ID_LIST, [])
  83. store.commit(MutationTypes.SET_SLIDES, [{
  84. id: createRandomCode(),
  85. elements: [],
  86. }])
  87. }
  88. const openDoc = () => {
  89. message.warning('作者努力编写中...')
  90. }
  91. const hotkeyDrawerVisible = ref(false)
  92. return {
  93. enterScreening,
  94. enterScreeningFromStart,
  95. createSlide,
  96. deleteSlide,
  97. redo,
  98. undo,
  99. toggleGridLines,
  100. showGridLines,
  101. resetSlides,
  102. openDoc,
  103. hotkeyDrawerVisible,
  104. }
  105. },
  106. })
  107. </script>
  108. <style lang="scss" scoped>
  109. .editor-header {
  110. background-color: #fff;
  111. user-select: none;
  112. border-bottom: 1px solid $borderColor;
  113. display: flex;
  114. justify-content: space-between;
  115. padding: 0 10px;
  116. }
  117. .left, .right {
  118. display: flex;
  119. justify-content: center;
  120. align-items: center;
  121. }
  122. .menu-item {
  123. height: 70%;
  124. display: flex;
  125. justify-content: center;
  126. align-items: center;
  127. font-size: 13px;
  128. margin: 0 10px;
  129. cursor: pointer;
  130. .text {
  131. margin-left: 4px;
  132. }
  133. }
  134. </style>