index.vue 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. <template>
  2. <Dropdown v-model:open="open" overlayClassName="down-item">
  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. width: 5px;
  35. height: 5px;
  36. transform: translate(-50%, -50%);
  37. z-index: 99;
  38. }
  39. </style>