Bin
2025-12-17 bc6aa38242b0a7dea4b18bc90e2d78740436a58b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import { getEnv, getSnapshot, getType, types } from "mobx-state-tree";
import { observer } from "mobx-react";
import { Tool } from "../components/Toolbar/Tool";
import kebabCase from "lodash/kebabCase";
 
const ToolView = observer(({ item }) => {
  return (
    <Tool
      ariaLabel={kebabCase(getType(item).name)}
      active={item.selected}
      icon={item.iconClass}
      label={item.viewTooltip}
      shortcut={item.shortcut}
      extraShortcuts={item.extraShortcuts}
      tool={item}
      onClick={() => {
        item.manager.selectTool(item, true);
      }}
    />
  );
});
 
const BaseTool = types
  .model("BaseTool", {
    smart: false,
    unselectRegionOnToolChange: false,
    removeDuplicatesNamed: types.maybeNull(types.string),
  })
  .volatile(() => ({
    dynamic: false,
    index: 1,
    canInteractWithRegions: true,
  }))
  .views((self) => {
    return {
      get toolName() {
        return getType(self).name;
      },
      get isSeparated() {
        return self.control.isSeparated;
      },
      get viewClass() {
        return () => (self.shouldRenderView ? <ToolView item={self} /> : null);
      },
      get viewTooltip() {
        return null;
      },
      get controls() {
        return null;
      },
      get shouldRenderView() {
        return (self.isSeparated || self.smartEnabled) && self.iconClass;
      },
      get iconClass() {
        if (self.iconComponent) {
          const Icon = self.iconComponent;
 
          return <Icon />;
        }
        return null;
      },
      get iconComponent() {
        return null;
      },
      get smartEnabled() {
        return self.control?.smartEnabled ?? false;
      },
    };
  })
  .actions((self) => {
    return {
      afterCreate() {
        if (self.smart && self.control?.smart) {
          const currentEnv = getEnv(self);
          const toolType = getType(self);
          const snapshot = {
            ...getSnapshot(self),
            smart: false,
            default: false,
          };
          const env = {
            ...currentEnv,
          };
 
          const smartCopy = toolType.create(snapshot, env);
 
          smartCopy.makeDynamic();
 
          getEnv(self).manager.addTool(`${toolType.name}-smart`, smartCopy, self.control.removeDuplicatesNamed);
        }
      },
 
      makeDynamic() {
        self.dynamic = true;
      },
    };
  });
 
export const MIN_SIZE = { X: 3, Y: 3 };
 
export const DEFAULT_DIMENSIONS = {
  rect: { width: 30, height: 30 },
  ellipse: { radius: 30 },
  polygon: { length: 30 },
  vector: { length: 30 },
};
 
export default BaseTool;