use-status.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import { computed, reactive } from "vue";
  2. import { installGlobalVar, stackVar, useDownKeys, useStage } from "./use-global-vars";
  3. import { Mode } from "@/constant/mode";
  4. import { useInteractiveProps } from "./use-interactive";
  5. export const useMode = installGlobalVar(() => {
  6. const stack = stackVar(new Set([Mode.write]));
  7. const modeStack = {
  8. ...stack,
  9. get value() {
  10. return stack.value;
  11. },
  12. set value(val: Set<Mode>) {
  13. stack.value = val;
  14. },
  15. push(...modes: Mode[]) {
  16. return stack.push(new Set(modes));
  17. },
  18. include(...modes: Mode[]) {
  19. return modes.every((m) => modeStack.value.has(m));
  20. },
  21. add(...modes: Mode[]) {
  22. modes.forEach((mode) => modeStack.value.add(mode));
  23. },
  24. del(...modes: Mode[]) {
  25. modes.forEach((mode) => modeStack.value.delete(mode));
  26. },
  27. };
  28. // if (import.meta.env.DEV) {
  29. // watchEffect(
  30. // () => {
  31. // console.error([...modeStack.value.values()].join(","));
  32. // },
  33. // { flush: "sync" }
  34. // );
  35. // }
  36. return modeStack;
  37. }, Symbol("mode"));
  38. export const useCan = installGlobalVar(() => {
  39. const mode = useMode();
  40. const operMode = useOperMode()
  41. const stage = useStage();
  42. const key = useDownKeys();
  43. const loaded = computed(() => !!stage.value?.getStage());
  44. // 鼠标是否可用
  45. const mouse = computed(() => loaded.value && !mode.include(Mode.static) && !mode.include(Mode.readonly));
  46. // 可以进入拖拽模式
  47. const dragMode = computed(() => {
  48. if (!mouse.value || mode.include(Mode.readonly) || key.has(" "))
  49. return false;
  50. return mode.include(Mode.draw) || mode.include(Mode.update);
  51. });
  52. // 是否在视图模式
  53. const viewMode = computed(() => {
  54. return mouse.value && ((!mode.include(Mode.draging) && !operMode.value.mulSelection) || key.has(" "));
  55. });
  56. // shape是否可以对鼠标做出反应
  57. const mouseReact = computed(
  58. () => mouse.value && (mode.include(Mode.write) || mode.include(Mode.update))
  59. );
  60. // 可以进入编辑模式
  61. const editMode = computed(() => mouse.value && mode.include(Mode.write) && !operMode.value.mulSelection);
  62. // 可以进入绘制模式
  63. const drawMode = computed(() => mouse.value && mode.include(Mode.write) && !operMode.value.mulSelection);
  64. return reactive({
  65. viewMouseReact: mouse,
  66. viewMode,
  67. drawMode,
  68. mouseReact,
  69. editMode,
  70. dragMode,
  71. });
  72. });
  73. export const useOperMode = installGlobalVar(() => {
  74. const keys = useDownKeys()
  75. const interactiveProps = useInteractiveProps();
  76. return computed(() => ({
  77. // 多选模式
  78. mulSelection: keys.has('Ctrl') && !keys.has(' ') && !keys.has('Alt') && !interactiveProps.value,
  79. // mulSelection: keys.has('Meta') && !keys.has(' ') && !keys.has('Alt'),
  80. // mulSelection: false,
  81. // 自由移动视图
  82. freeView: keys.has(' '),
  83. // 自由绘图,不吸附
  84. freeDraw: keys.has('Control'),
  85. // 组操作模式
  86. // group: keys.has('Alt')
  87. group: false
  88. }))
  89. })