index.vue 935 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. <template>
  2. <Dropdown v-model:open="open">
  3. <span class="proce" :style="{ left: pixel.x + 'px', top: pixel.y + 'px' }"></span>
  4. <template #overlay>
  5. <Menu>
  6. <MenuItem @click="clickHandler(menu)" v-for="menu in menus">
  7. <template #icon><ui-icon :type="menu.icon" /></template>
  8. {{ menu.label }}
  9. </MenuItem>
  10. </Menu>
  11. </template>
  12. </Dropdown>
  13. </template>
  14. <script lang="ts" setup>
  15. import { Dropdown, Menu, MenuItem } from "ant-design-vue";
  16. import { RMenu } from ".";
  17. import { Pos } from "../drawing/dec";
  18. import { ref, watchEffect } from "vue";
  19. const props = defineProps<{ menus: RMenu[]; pixel: Pos; onClose: () => void }>();
  20. const open = ref(true);
  21. watchEffect(() => {
  22. if (!open.value) {
  23. props.onClose();
  24. }
  25. });
  26. const clickHandler = (menu: RMenu) => {
  27. menu.handler();
  28. props.onClose()
  29. };
  30. </script>
  31. <style lang="scss" scoped>
  32. .proce {
  33. position: absolute;
  34. }
  35. </style>