use-status.ts 2.8 KB

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