@operato/process 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/.storybook/main.js +3 -0
  2. package/.storybook/server.mjs +8 -0
  3. package/CHANGELOG.md +1824 -0
  4. package/LICENSE +21 -0
  5. package/README.md +95 -0
  6. package/demo/index-modeller.html +101 -0
  7. package/demo/index-viewer.html +101 -0
  8. package/demo/index.html +101 -0
  9. package/dist/src/data-storage/data-storage.d.ts +8 -0
  10. package/dist/src/data-storage/data-storage.js +28 -0
  11. package/dist/src/data-storage/data-storage.js.map +1 -0
  12. package/dist/src/graphql/data-subscription.d.ts +5 -0
  13. package/dist/src/graphql/data-subscription.js +24 -0
  14. package/dist/src/graphql/data-subscription.js.map +1 -0
  15. package/dist/src/graphql/favorite-process.d.ts +1 -0
  16. package/dist/src/graphql/favorite-process.js +23 -0
  17. package/dist/src/graphql/favorite-process.js.map +1 -0
  18. package/dist/src/graphql/index.d.ts +3 -0
  19. package/dist/src/graphql/index.js +4 -0
  20. package/dist/src/graphql/index.js.map +1 -0
  21. package/dist/src/graphql/process-group.d.ts +7 -0
  22. package/dist/src/graphql/process-group.js +125 -0
  23. package/dist/src/graphql/process-group.js.map +1 -0
  24. package/dist/src/graphql/process.d.ts +6 -0
  25. package/dist/src/graphql/process.js +130 -0
  26. package/dist/src/graphql/process.js.map +1 -0
  27. package/dist/src/graphql/scenario.d.ts +6 -0
  28. package/dist/src/graphql/scenario.js +69 -0
  29. package/dist/src/graphql/scenario.js.map +1 -0
  30. package/dist/src/index.d.ts +5 -0
  31. package/dist/src/index.js +6 -0
  32. package/dist/src/index.js.map +1 -0
  33. package/dist/src/modeller/component-toolbar/component-detail.d.ts +12 -0
  34. package/dist/src/modeller/component-toolbar/component-detail.js +58 -0
  35. package/dist/src/modeller/component-toolbar/component-detail.js.map +1 -0
  36. package/dist/src/modeller/component-toolbar/component-menu.d.ts +24 -0
  37. package/dist/src/modeller/component-toolbar/component-menu.js +190 -0
  38. package/dist/src/modeller/component-toolbar/component-menu.js.map +1 -0
  39. package/dist/src/modeller/component-toolbar/component-toolbar.d.ts +28 -0
  40. package/dist/src/modeller/component-toolbar/component-toolbar.js +168 -0
  41. package/dist/src/modeller/component-toolbar/component-toolbar.js.map +1 -0
  42. package/dist/src/modeller/component-toolbar/mode-icons.d.ts +2 -0
  43. package/dist/src/modeller/component-toolbar/mode-icons.js +86 -0
  44. package/dist/src/modeller/component-toolbar/mode-icons.js.map +1 -0
  45. package/dist/src/modeller/edit-toolbar-style.d.ts +4 -0
  46. package/dist/src/modeller/edit-toolbar-style.js +227 -0
  47. package/dist/src/modeller/edit-toolbar-style.js.map +1 -0
  48. package/dist/src/modeller/edit-toolbar.d.ts +61 -0
  49. package/dist/src/modeller/edit-toolbar.js +641 -0
  50. package/dist/src/modeller/edit-toolbar.js.map +1 -0
  51. package/dist/src/modeller/property-sidebar/abstract-property.d.ts +10 -0
  52. package/dist/src/modeller/property-sidebar/abstract-property.js +55 -0
  53. package/dist/src/modeller/property-sidebar/abstract-property.js.map +1 -0
  54. package/dist/src/modeller/property-sidebar/effects/effects-shared-style.d.ts +4 -0
  55. package/dist/src/modeller/property-sidebar/effects/effects-shared-style.js +61 -0
  56. package/dist/src/modeller/property-sidebar/effects/effects-shared-style.js.map +1 -0
  57. package/dist/src/modeller/property-sidebar/effects/effects.d.ts +20 -0
  58. package/dist/src/modeller/property-sidebar/effects/effects.js +42 -0
  59. package/dist/src/modeller/property-sidebar/effects/effects.js.map +1 -0
  60. package/dist/src/modeller/property-sidebar/effects/property-shadow.d.ts +23 -0
  61. package/dist/src/modeller/property-sidebar/effects/property-shadow.js +103 -0
  62. package/dist/src/modeller/property-sidebar/effects/property-shadow.js.map +1 -0
  63. package/dist/src/modeller/property-sidebar/effects/value-converter.d.ts +1 -0
  64. package/dist/src/modeller/property-sidebar/effects/value-converter.js +21 -0
  65. package/dist/src/modeller/property-sidebar/effects/value-converter.js.map +1 -0
  66. package/dist/src/modeller/property-sidebar/inspector/inspector.d.ts +29 -0
  67. package/dist/src/modeller/property-sidebar/inspector/inspector.js +318 -0
  68. package/dist/src/modeller/property-sidebar/inspector/inspector.js.map +1 -0
  69. package/dist/src/modeller/property-sidebar/property-shared-style.d.ts +4 -0
  70. package/dist/src/modeller/property-sidebar/property-shared-style.js +135 -0
  71. package/dist/src/modeller/property-sidebar/property-shared-style.js.map +1 -0
  72. package/dist/src/modeller/property-sidebar/property-sidebar.d.ts +43 -0
  73. package/dist/src/modeller/property-sidebar/property-sidebar.js +309 -0
  74. package/dist/src/modeller/property-sidebar/property-sidebar.js.map +1 -0
  75. package/dist/src/modeller/property-sidebar/shapes/box-padding-editor-styles.d.ts +1 -0
  76. package/dist/src/modeller/property-sidebar/shapes/box-padding-editor-styles.js +94 -0
  77. package/dist/src/modeller/property-sidebar/shapes/box-padding-editor-styles.js.map +1 -0
  78. package/dist/src/modeller/property-sidebar/shapes/shapes.d.ts +28 -0
  79. package/dist/src/modeller/property-sidebar/shapes/shapes.js +321 -0
  80. package/dist/src/modeller/property-sidebar/shapes/shapes.js.map +1 -0
  81. package/dist/src/modeller/property-sidebar/specifics/specific-properties-builder.d.ts +16 -0
  82. package/dist/src/modeller/property-sidebar/specifics/specific-properties-builder.js +132 -0
  83. package/dist/src/modeller/property-sidebar/specifics/specific-properties-builder.js.map +1 -0
  84. package/dist/src/modeller/property-sidebar/specifics/specifics.d.ts +25 -0
  85. package/dist/src/modeller/property-sidebar/specifics/specifics.js +81 -0
  86. package/dist/src/modeller/property-sidebar/specifics/specifics.js.map +1 -0
  87. package/dist/src/modeller/property-sidebar/styles/styles.d.ts +21 -0
  88. package/dist/src/modeller/property-sidebar/styles/styles.js +559 -0
  89. package/dist/src/modeller/property-sidebar/styles/styles.js.map +1 -0
  90. package/dist/src/modeller/scene-viewer/scene-handler.d.ts +11 -0
  91. package/dist/src/modeller/scene-viewer/scene-handler.js +32 -0
  92. package/dist/src/modeller/scene-viewer/scene-handler.js.map +1 -0
  93. package/dist/src/modeller/scene-viewer/scene-layer.d.ts +10 -0
  94. package/dist/src/modeller/scene-viewer/scene-layer.js +38 -0
  95. package/dist/src/modeller/scene-viewer/scene-layer.js.map +1 -0
  96. package/dist/src/modeller/scene-viewer/scene-property.d.ts +6 -0
  97. package/dist/src/modeller/scene-viewer/scene-property.js +15 -0
  98. package/dist/src/modeller/scene-viewer/scene-property.js.map +1 -0
  99. package/dist/src/modeller/scene-viewer/scene-viewer.d.ts +38 -0
  100. package/dist/src/modeller/scene-viewer/scene-viewer.js +243 -0
  101. package/dist/src/modeller/scene-viewer/scene-viewer.js.map +1 -0
  102. package/dist/src/ox-process-list.d.ts +2 -0
  103. package/dist/src/ox-process-list.js +427 -0
  104. package/dist/src/ox-process-list.js.map +1 -0
  105. package/dist/src/ox-process-modeller.d.ts +58 -0
  106. package/dist/src/ox-process-modeller.js +396 -0
  107. package/dist/src/ox-process-modeller.js.map +1 -0
  108. package/dist/src/ox-process-viewer.d.ts +51 -0
  109. package/dist/src/ox-process-viewer.js +512 -0
  110. package/dist/src/ox-process-viewer.js.map +1 -0
  111. package/dist/src/types.d.ts +37 -0
  112. package/dist/src/types.js +2 -0
  113. package/dist/src/types.js.map +1 -0
  114. package/dist/stories/index.stories.d.ts +33 -0
  115. package/dist/stories/index.stories.js +33 -0
  116. package/dist/stories/index.stories.js.map +1 -0
  117. package/dist/tsconfig.tsbuildinfo +1 -0
  118. package/icons/components/audio.png +0 -0
  119. package/icons/components/both-arrow.png +0 -0
  120. package/icons/components/color-image.png +0 -0
  121. package/icons/components/container.png +0 -0
  122. package/icons/components/dash.png +0 -0
  123. package/icons/components/donut.png +0 -0
  124. package/icons/components/ellipse.png +0 -0
  125. package/icons/components/forklift.png +0 -0
  126. package/icons/components/gif-image.png +0 -0
  127. package/icons/components/global-reference.png +0 -0
  128. package/icons/components/gray-image.png +0 -0
  129. package/icons/components/humidity-sensor.png +0 -0
  130. package/icons/components/info-window.png +0 -0
  131. package/icons/components/line.png +0 -0
  132. package/icons/components/local-reference.png +0 -0
  133. package/icons/components/no-image.png +0 -0
  134. package/icons/components/ortholine.png +0 -0
  135. package/icons/components/person.png +0 -0
  136. package/icons/components/polygon.png +0 -0
  137. package/icons/components/polyline.png +0 -0
  138. package/icons/components/popup.png +0 -0
  139. package/icons/components/rect.png +0 -0
  140. package/icons/components/single-arrow.png +0 -0
  141. package/icons/components/star.png +0 -0
  142. package/icons/components/streamline.png +0 -0
  143. package/icons/components/text.png +0 -0
  144. package/icons/components/triangle.png +0 -0
  145. package/icons/icon-collapse-active.png +0 -0
  146. package/icons/icon-collapse.png +0 -0
  147. package/icons/icon-fullscreen.png +0 -0
  148. package/icons/icon-htoolbar.png +0 -0
  149. package/icons/icon-properties-arrow-type.png +0 -0
  150. package/icons/icon-properties-gradient-direction.png +0 -0
  151. package/icons/icon-properties-label.png +0 -0
  152. package/icons/icon-properties-line-type.png +0 -0
  153. package/icons/icon-properties-padding.png +0 -0
  154. package/icons/icon-properties-ratio.png +0 -0
  155. package/icons/icon-properties-table.png +0 -0
  156. package/icons/icon-properties.png +0 -0
  157. package/icons/icon-shell-inspector.png +0 -0
  158. package/package.json +115 -0
  159. package/src/data-storage/data-storage.ts +47 -0
  160. package/src/graphql/data-subscription.ts +30 -0
  161. package/src/graphql/favorite-process.ts +25 -0
  162. package/src/graphql/index.ts +3 -0
  163. package/src/graphql/process-group.ts +138 -0
  164. package/src/graphql/process.ts +144 -0
  165. package/src/graphql/scenario.ts +79 -0
  166. package/src/index.ts +7 -0
  167. package/src/modeller/component-toolbar/component-detail.ts +58 -0
  168. package/src/modeller/component-toolbar/component-menu.ts +187 -0
  169. package/src/modeller/component-toolbar/component-toolbar.ts +173 -0
  170. package/src/modeller/component-toolbar/mode-icons.ts +86 -0
  171. package/src/modeller/edit-toolbar-style.ts +228 -0
  172. package/src/modeller/edit-toolbar.ts +641 -0
  173. package/src/modeller/property-sidebar/abstract-property.ts +69 -0
  174. package/src/modeller/property-sidebar/effects/effects-shared-style.ts +62 -0
  175. package/src/modeller/property-sidebar/effects/effects.ts +47 -0
  176. package/src/modeller/property-sidebar/effects/property-shadow.ts +114 -0
  177. package/src/modeller/property-sidebar/effects/value-converter.ts +23 -0
  178. package/src/modeller/property-sidebar/inspector/inspector.ts +361 -0
  179. package/src/modeller/property-sidebar/property-shared-style.ts +136 -0
  180. package/src/modeller/property-sidebar/property-sidebar.ts +308 -0
  181. package/src/modeller/property-sidebar/shapes/box-padding-editor-styles.ts +94 -0
  182. package/src/modeller/property-sidebar/shapes/shapes.ts +326 -0
  183. package/src/modeller/property-sidebar/specifics/specific-properties-builder.ts +144 -0
  184. package/src/modeller/property-sidebar/specifics/specifics.ts +77 -0
  185. package/src/modeller/property-sidebar/styles/styles.ts +577 -0
  186. package/src/modeller/scene-viewer/scene-handler.ts +39 -0
  187. package/src/modeller/scene-viewer/scene-layer.ts +41 -0
  188. package/src/modeller/scene-viewer/scene-property.ts +9 -0
  189. package/src/modeller/scene-viewer/scene-viewer.ts +249 -0
  190. package/src/ox-process-list.ts +459 -0
  191. package/src/ox-process-modeller.ts +396 -0
  192. package/src/ox-process-viewer.ts +555 -0
  193. package/src/types.ts +68 -0
  194. package/stories/index.stories.ts +52 -0
  195. package/tsconfig.json +23 -0
  196. package/web-dev-server.config.mjs +30 -0
  197. package/web-test-runner.config.mjs +29 -0
@@ -0,0 +1,641 @@
1
+ /**
2
+ * @license Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+
5
+ import { html, LitElement, PropertyValues } from 'lit'
6
+ import { property, query, queryAll } from 'lit/decorators.js'
7
+
8
+ import { Component, Scene } from '@hatiolab/things-scene'
9
+ import { copyToClipboard, isMacOS } from '@operato/utils'
10
+
11
+ import { style } from './edit-toolbar-style'
12
+
13
+ const MACOS = isMacOS()
14
+
15
+ export class EditToolbar extends LitElement {
16
+ static styles = [style]
17
+
18
+ @property({ type: Object }) scene?: Scene
19
+ @property({ type: Array }) selected: any[] = []
20
+ @property({ type: Boolean }) hideProperty: boolean = false
21
+
22
+ private cliped?: string
23
+
24
+ @query('#redo') private redo!: HTMLElement
25
+ @query('#undo') private undo!: HTMLElement
26
+
27
+ @query('#fullscreen') private fullscreen!: HTMLElement
28
+ @query('#cut') private cut!: HTMLElement
29
+ @query('#copy') private copy!: HTMLElement
30
+ @query('#paste') private paste!: HTMLElement
31
+ @query('#delete') private delete!: HTMLElement
32
+
33
+ @query('#forward') private forward!: HTMLElement
34
+ @query('#backward') private backward!: HTMLElement
35
+ @query('#front') private front!: HTMLElement
36
+ @query('#back') private back!: HTMLElement
37
+
38
+ @queryAll('[data-align]') private aligners!: NodeListOf<HTMLSpanElement>
39
+ @queryAll('[data-zorder]') private zorders!: NodeListOf<HTMLSpanElement>
40
+ @queryAll('[data-distribute]') private distributes!: NodeListOf<HTMLSpanElement>
41
+
42
+ firstUpdated() {
43
+ this.addEventListener('mousewheel', this.onWheelEvent.bind(this) as EventListener, false)
44
+
45
+ window.addEventListener('paste', (e: Event) => {
46
+ this.cliped = (e as ClipboardEvent).clipboardData?.getData('text/plain')
47
+ })
48
+
49
+ this.aligners.forEach(aligner => aligner.addEventListener('tap', this.onTapAlign.bind(this) as EventListener))
50
+ this.zorders.forEach(zorder => zorder.addEventListener('tap', this.onTapZorder.bind(this) as EventListener))
51
+ this.distributes.forEach(distribute =>
52
+ distribute.addEventListener('tap', this.onTapDistribute.bind(this) as EventListener)
53
+ )
54
+
55
+ this.undo.addEventListener('tap', this.onTapUndo.bind(this) as EventListener)
56
+ this.redo.addEventListener('tap', this.onTapRedo.bind(this) as EventListener)
57
+ this.fullscreen.addEventListener('tap', this.onTapFullscreen.bind(this) as EventListener)
58
+ this.cut.addEventListener('tap', this.onTapCut.bind(this) as EventListener)
59
+ this.copy.addEventListener('tap', this.onTapCopy.bind(this) as EventListener)
60
+ this.paste.addEventListener('tap', this.onTapPaste.bind(this) as EventListener)
61
+ this.delete.addEventListener('tap', this.onTapDelete.bind(this) as EventListener)
62
+
63
+ this.renderRoot
64
+ .querySelector('#font-increase')!
65
+ .addEventListener('tap', this.onTapFontIncrease.bind(this) as EventListener)
66
+ this.renderRoot
67
+ .querySelector('#font-decrease')!
68
+ .addEventListener('tap', this.onTapFontDecrease.bind(this) as EventListener)
69
+ this.renderRoot.querySelector('#group')!.addEventListener('tap', this.onTapGroup.bind(this) as EventListener)
70
+ this.renderRoot.querySelector('#ungroup')!.addEventListener('tap', this.onTapUngroup.bind(this) as EventListener)
71
+ this.renderRoot
72
+ .querySelector('#symmetry-x')!
73
+ .addEventListener('tap', this.onTapSymmetryX.bind(this) as EventListener)
74
+ this.renderRoot
75
+ .querySelector('#symmetry-y')!
76
+ .addEventListener('tap', this.onTapSymmetryY.bind(this) as EventListener)
77
+ this.renderRoot.querySelector('#rotate-cw')!.addEventListener('tap', this.onTapRotateCW.bind(this) as EventListener)
78
+ this.renderRoot
79
+ .querySelector('#rotate-ccw')!
80
+ .addEventListener('tap', this.onTapRotateCCW.bind(this) as EventListener)
81
+ this.renderRoot
82
+ .querySelector('#toggle-property')!
83
+ .addEventListener('tap', this.onTapToggle.bind(this) as EventListener)
84
+ this.renderRoot.querySelector('#fit-scene')!.addEventListener('tap', this.onTapFitScene.bind(this) as EventListener)
85
+ this.renderRoot.querySelector('#preview')!.addEventListener('tap', this.onTapPreview.bind(this) as EventListener)
86
+ }
87
+
88
+ updated(changes: PropertyValues<this>) {
89
+ changes.has('scene') && this.onSceneChanged(this.scene, changes.get('scene') as Scene)
90
+ changes.has('selected') && this.onSelectedChanged(this.selected, changes.get('selected') as Component[])
91
+ }
92
+
93
+ render() {
94
+ return html`
95
+ <div tools>
96
+ <span><slot></slot></span>
97
+
98
+ <span button id="undo" title="undo (${this.getShortcutString('cmd', 'z')})"> </span>
99
+ <span button id="redo" title="redo (${this.getShortcutString('cmd', 'shift', 'z')})"> </span>
100
+
101
+ <span class="vline"></span>
102
+
103
+ <span button id="cut" title="cut (${this.getShortcutString('cmd', 'x')})"> </span>
104
+ <span button id="copy" title="copy (${this.getShortcutString('cmd', 'c')})"> </span>
105
+ <span button id="paste" title="paste (${this.getShortcutString('cmd', 'v')})"> </span>
106
+ <span
107
+ button
108
+ id="delete"
109
+ title="delete (${this.getShortcutString('backspace')}, ${this.getShortcutString('delete')})"
110
+ >
111
+ </span>
112
+
113
+ <span class="vline"></span>
114
+
115
+ <!-- TODO Implement style-copy
116
+ <span button id="style-copy" title="format painter"></span>
117
+ <span class="vline"></span>
118
+ -->
119
+
120
+ <span
121
+ button
122
+ data-align="left"
123
+ id="align-left"
124
+ title="align left (${this.getShortcutString('alt', 'shift', 'l')})"
125
+ >
126
+ </span>
127
+ <span
128
+ button
129
+ data-align="center"
130
+ id="align-center"
131
+ title="align center (${this.getShortcutString('alt', 'shift', 'c')})"
132
+ >
133
+ </span>
134
+ <span
135
+ button
136
+ data-align="right"
137
+ id="align-right"
138
+ title="align right (${this.getShortcutString('alt', 'shift', 'r')})"
139
+ >
140
+ </span>
141
+
142
+ <span button data-align="top" id="align-top" title="align top (${this.getShortcutString('alt', 'shift', 't')})">
143
+ </span>
144
+ <span
145
+ button
146
+ data-align="middle"
147
+ id="align-middle"
148
+ title="align middle (${this.getShortcutString('alt', 'shift', 'm')})"
149
+ >
150
+ </span>
151
+ <span
152
+ button
153
+ data-align="bottom"
154
+ id="align-bottom"
155
+ title="align bottom (${this.getShortcutString('alt', 'shift', 'b')})"
156
+ >
157
+ </span>
158
+
159
+ <span
160
+ button
161
+ data-distribute="HORIZONTAL"
162
+ id="distribute-horizontal"
163
+ title="distribute horizontally (${this.getShortcutString('alt', 'shift', 'h')})"
164
+ >
165
+ </span>
166
+
167
+ <span
168
+ button
169
+ data-distribute="VERTICAL"
170
+ id="distribute-vertical"
171
+ title="distribute vertically (${this.getShortcutString('alt', 'shift', 'v')})"
172
+ >
173
+ </span>
174
+
175
+ <span class="vline"></span>
176
+
177
+ <span
178
+ button
179
+ id="front"
180
+ data-zorder="front"
181
+ title="bring to front (${this.getShortcutString('cmd', 'shift', 'f')})"
182
+ >
183
+ </span>
184
+ <span button id="back" data-zorder="back" title="send to back (${this.getShortcutString('cmd', 'shift', 'b')})">
185
+ </span>
186
+ <span button id="forward" data-zorder="forward" title="bring forward (${this.getShortcutString('cmd', 'f')})">
187
+ </span>
188
+ <span button id="backward" data-zorder="backward" title="send backward (${this.getShortcutString('cmd', 'b')})">
189
+ </span>
190
+
191
+ <span class="vline"></span>
192
+
193
+ <span button id="symmetry-x" title="symmetry-x (${this.getShortcutString('alt', 'shift', 'x')})"> </span>
194
+ <span button id="symmetry-y" title="symmetry-y (${this.getShortcutString('alt', 'shift', 'y')})"> </span>
195
+ <span button id="rotate-cw" title="rotate clockwise (${this.getShortcutString('alt', 'shift', 'e')})"> </span>
196
+ <span button id="rotate-ccw" title="rotate counter clockwise (${this.getShortcutString('alt', 'shift', 'w')})">
197
+ </span>
198
+
199
+ <span class="vline"></span>
200
+
201
+ <span button id="group" title="group (${this.getShortcutString('cmd', 'g')})"> </span>
202
+ <span button id="ungroup" title="ungroup (${this.getShortcutString('cmd', 'shift', 'g')})"> </span>
203
+
204
+ <span class="vline"></span>
205
+
206
+ <span button id="font-increase" title="increase font size"></span>
207
+ <span button id="font-decrease" title="decrease font size"></span>
208
+
209
+ <span class="vline"></span>
210
+ <span padding></span>
211
+
212
+ <span button id="fit-scene" title="fit scene (${this.getShortcutString('cmd', 'd')})"> </span>
213
+
214
+ <span class="vline"></span>
215
+
216
+ <span button id="preview" title="preview (${this.getShortcutString('ctrl', 'p')})"> </span>
217
+
218
+ <span button id="fullscreen" title="fullscreen (${this.getShortcutString('f11')})"> </span>
219
+
220
+ <span
221
+ button
222
+ id="toggle-property"
223
+ title="toggle property panel (${this.getShortcutString('cmd', 'h')})"
224
+ toggles="true"
225
+ >
226
+ </span>
227
+ </div>
228
+ `
229
+ }
230
+
231
+ onWheelEvent(e: Event) {
232
+ var delta = Math.max(-1, Math.min(1, (e as WheelEvent).deltaY || -(e as WheelEvent).detail))
233
+ this.scrollLeft -= delta * 40
234
+
235
+ e.preventDefault()
236
+ }
237
+
238
+ getSymbol(key: string) {
239
+ var symbol
240
+ switch (key) {
241
+ case 'cmd':
242
+ case 'ctrl':
243
+ symbol = MACOS ? '⌘' : 'Ctrl'
244
+ break
245
+ case 'shift':
246
+ symbol = MACOS ? '⇧' : 'Shift'
247
+ break
248
+ case 'alt':
249
+ case 'option':
250
+ symbol = MACOS ? '⌥' : 'Alt'
251
+ break
252
+ case 'backspace':
253
+ symbol = MACOS ? '⌫' : 'BackSpace'
254
+ break
255
+ case 'delete':
256
+ symbol = MACOS ? '⌦' : 'Del'
257
+ break
258
+ default:
259
+ symbol = key.toUpperCase()
260
+ break
261
+ }
262
+
263
+ return symbol
264
+ }
265
+
266
+ private getShortcutString(...keys: string[]) {
267
+ var symbols = []
268
+ for (var i = 0; i < arguments.length; i++) {
269
+ symbols.push(this.getSymbol(arguments[i]))
270
+ }
271
+
272
+ return symbols.join(MACOS ? '' : '+')
273
+ }
274
+
275
+ onShortcut(e: KeyboardEvent) {
276
+ if (MACOS) var ctrlKey = e.metaKey
277
+ else var ctrlKey = e.ctrlKey
278
+
279
+ var altKey = e.altKey
280
+ var shiftKey = e.shiftKey
281
+
282
+ var defaultPrevent = ctrlKey || altKey
283
+
284
+ switch (e.code) {
285
+ case 'KeyZ':
286
+ if (ctrlKey && !shiftKey) this.onTapUndo()
287
+ else if (ctrlKey && shiftKey) this.onTapRedo()
288
+ break
289
+ case 'KeyY':
290
+ if (ctrlKey && !shiftKey) this.onTapRedo()
291
+ else if (altKey && shiftKey) this.onTapSymmetryY()
292
+ break
293
+ case 'KeyC':
294
+ if (ctrlKey && !shiftKey) this.onTapCopy()
295
+ else if (altKey && shiftKey) this.onTapAlign('center')
296
+ break
297
+ case 'KeyX':
298
+ if (ctrlKey && !shiftKey) this.onTapCut()
299
+ else if (altKey && shiftKey) this.onTapSymmetryX()
300
+ break
301
+ case 'KeyV':
302
+ if (ctrlKey && !shiftKey) {
303
+ this.onTapPaste()
304
+ defaultPrevent = false
305
+ } else if (altKey && shiftKey) this.onTapDistribute('VERTICAL')
306
+ break
307
+ case 'Delete':
308
+ case 'Backspace':
309
+ this.onTapDelete()
310
+ defaultPrevent = true
311
+ break
312
+ case 'KeyG':
313
+ if (ctrlKey && !shiftKey) this.onTapGroup()
314
+ else if (ctrlKey && shiftKey) this.onTapUngroup()
315
+ break
316
+ case 'KeyF':
317
+ if (ctrlKey && !shiftKey) this.scene?.zorder('forward')
318
+ else if (ctrlKey && shiftKey) this.scene?.zorder('front')
319
+ break
320
+ case 'KeyB':
321
+ if (ctrlKey && !shiftKey) this.scene?.zorder('backward')
322
+ else if (ctrlKey && shiftKey) this.scene?.zorder('back')
323
+ else if (altKey && shiftKey) this.onTapAlign('bottom')
324
+ break
325
+ // case 'Equal':
326
+ // if (ctrlKey) this.onTapZoom(zoomin)
327
+ // break
328
+ // case 'Minus':
329
+ // if (ctrlKey) this.onTapZoom(zoomout)
330
+ // break
331
+ case 'KeyH':
332
+ if (ctrlKey && !shiftKey) this.onTapToggle()
333
+ else if (altKey && shiftKey) this.onTapDistribute('HORIZONTAL')
334
+ break
335
+ case 'F11':
336
+ this.onTapFullscreen()
337
+ defaultPrevent = true
338
+ break
339
+ case 'KeyP':
340
+ if (ctrlKey) {
341
+ this.onTapPreview()
342
+ defaultPrevent = true
343
+ }
344
+ break
345
+ case 'KeyA':
346
+ if (ctrlKey) this.onTapSelectAll()
347
+ break
348
+ case 'KeyL':
349
+ if (altKey && shiftKey) this.onTapAlign('left')
350
+ break
351
+ case 'KeyR':
352
+ if (altKey && shiftKey) this.onTapAlign('right')
353
+ break
354
+ case 'KeyM':
355
+ if (altKey && shiftKey) this.onTapAlign('middle')
356
+ break
357
+ case 'KeyT':
358
+ if (altKey && shiftKey) this.onTapAlign('top')
359
+ break
360
+ case 'KeyY':
361
+ if (altKey && shiftKey) this.onTapSymmetryY()
362
+ break
363
+ case 'KeyD':
364
+ if (ctrlKey) {
365
+ this.onTapFitScene()
366
+ defaultPrevent = true
367
+ }
368
+ break
369
+ case 'KeyE':
370
+ if (altKey && shiftKey) this.onTapRotateCW()
371
+ else if (ctrlKey && shiftKey) this.onTapDownloadModel()
372
+ break
373
+ case 'KeyW':
374
+ if (altKey && shiftKey) this.onTapRotateCCW()
375
+ break
376
+ case 'Digit1':
377
+ if (ctrlKey) {
378
+ console.log('MODEL', this.scene && this.scene.model)
379
+ defaultPrevent = true
380
+ }
381
+ break
382
+ case 'Digit2':
383
+ if (ctrlKey) {
384
+ console.log('SELECTED', this.scene && this.scene.selected)
385
+ defaultPrevent = true
386
+ }
387
+ break
388
+
389
+ default:
390
+ return false
391
+ }
392
+
393
+ if (defaultPrevent) e.preventDefault()
394
+ return true
395
+ }
396
+
397
+ onExecute(command: string, undoable: boolean, redoable: boolean) {
398
+ !undoable ? this.undo.setAttribute('disabled', '') : this.undo.removeAttribute('disabled')
399
+ !redoable ? this.redo.setAttribute('disabled', '') : this.redo.removeAttribute('disabled')
400
+ }
401
+
402
+ onUndo(undoable: boolean, redoable: boolean) {
403
+ !undoable ? this.undo.setAttribute('disabled', '') : this.undo.removeAttribute('disabled')
404
+ !redoable ? this.redo.setAttribute('disabled', '') : this.redo.removeAttribute('disabled')
405
+ }
406
+
407
+ onRedo(undoable: boolean, redoable: boolean) {
408
+ !undoable ? this.undo.setAttribute('disabled', '') : this.undo.removeAttribute('disabled')
409
+ !redoable ? this.redo.setAttribute('disabled', '') : this.redo.removeAttribute('disabled')
410
+ }
411
+
412
+ onSceneChanged(after?: Scene, before?: Scene) {
413
+ if (before) {
414
+ before.off('execute', this.onExecute, this)
415
+ before.off('undo', this.onUndo, this)
416
+ before.off('redo', this.onRedo, this)
417
+ }
418
+
419
+ if (after) {
420
+ after.on('execute', this.onExecute, this)
421
+ after.on('undo', this.onUndo, this)
422
+ after.on('redo', this.onRedo, this)
423
+ }
424
+ }
425
+
426
+ // @query('#align-left') private alignLeft!: HTMLElement
427
+ // @query('#align-center') private alignCenter!: HTMLElement
428
+ // @query('#align-right') private alignRight!: HTMLElement
429
+ // @query('#align-top') private alignTop!: HTMLElement
430
+ // @query('#align-middle') private alignMiddle!: HTMLElement
431
+ // @query('#align-bottom') private alignBottom!: HTMLElement
432
+
433
+ onSelectedChanged(after: Component[], before: Component[]) {
434
+ var alignable = after.length > 1
435
+
436
+ this.aligners.forEach(aligner =>
437
+ alignable ? aligner.removeAttribute('disabled') : aligner.setAttribute('disabled', '')
438
+ )
439
+
440
+ var movable = after.length === 1
441
+
442
+ /* forward, backward 이동은 한 컴포넌트만 가능하다. */
443
+ !movable ? this.forward.setAttribute('disabled', '') : this.forward.removeAttribute('disabled')
444
+ !movable ? this.backward.setAttribute('disabled', '') : this.backward.removeAttribute('disabled')
445
+
446
+ /* 여러 컴포넌트는 front, back 이동이 가능하다. */
447
+ !(alignable || movable) ? this.front.setAttribute('disabled', '') : this.front.removeAttribute('disabled')
448
+ !(alignable || movable) ? this.back.setAttribute('disabled', '') : this.back.removeAttribute('disabled')
449
+ }
450
+
451
+ onTapUndo() {
452
+ this.scene?.undo()
453
+ }
454
+
455
+ onTapRedo() {
456
+ this.scene?.redo()
457
+ }
458
+
459
+ onTapCut() {
460
+ this.scene?.cut()
461
+ }
462
+
463
+ async onTapCopy() {
464
+ var copied = this.scene?.copy()
465
+
466
+ if (!copied) return
467
+
468
+ await copyToClipboard(copied)
469
+ this.cliped = copied
470
+ }
471
+
472
+ onTapPaste() {
473
+ setTimeout(() => {
474
+ this.cliped && this.scene?.paste(this.cliped)
475
+ }, 100)
476
+ }
477
+
478
+ onTapDelete() {
479
+ this.scene?.remove()
480
+ }
481
+
482
+ onTapSelectAll() {
483
+ this.scene?.select('(child)')
484
+ }
485
+
486
+ onTapFontIncrease(e: TouchEvent) {
487
+ var selected = this.scene?.selected
488
+ if (!selected || !selected.length) {
489
+ return
490
+ }
491
+
492
+ this.scene?.undoableChange(function () {
493
+ selected!.forEach(function (component) {
494
+ var fontSize = component.get('fontSize')
495
+
496
+ if (!fontSize) fontSize = '15'
497
+
498
+ if (fontSize) {
499
+ var size = parseInt(fontSize)
500
+ component.set('fontSize', size + 1)
501
+ }
502
+ })
503
+ })
504
+ }
505
+
506
+ onTapFontDecrease(e: TouchEvent) {
507
+ var selected = this.scene?.selected
508
+
509
+ if (!selected || !selected.length) {
510
+ return
511
+ }
512
+
513
+ this.scene?.undoableChange(function () {
514
+ selected!.forEach(function (component) {
515
+ var fontSize = component.get('fontSize')
516
+
517
+ if (!fontSize) fontSize = '15'
518
+
519
+ if (fontSize) {
520
+ var size = parseInt(fontSize)
521
+ if (size > 1) component.set('fontSize', size - 1)
522
+ }
523
+ })
524
+ })
525
+ }
526
+
527
+ onTapAlign(e: TouchEvent | string) {
528
+ if (!this.scene) return
529
+
530
+ var selected = this.scene.selected
531
+ if (selected.length <= 1) return
532
+
533
+ var align = typeof e === 'string' ? e : (e.target as HTMLElement).getAttribute('data-align')
534
+
535
+ align && this.scene.align(align)
536
+ }
537
+
538
+ onTapZorder(e: TouchEvent | string) {
539
+ if (!this.scene) return
540
+
541
+ var selected = this.scene.selected
542
+ if (selected.length < 1) return
543
+
544
+ var zorder = typeof e === 'string' ? e : (e.target as HTMLElement).getAttribute('data-zorder')
545
+
546
+ zorder && this.scene.zorder(zorder)
547
+ }
548
+
549
+ onTapSymmetryX() {
550
+ this.scene && this.scene.symmetryX()
551
+ }
552
+
553
+ onTapSymmetryY() {
554
+ this.scene && this.scene.symmetryY()
555
+ }
556
+
557
+ onTapRotateCW() {
558
+ if (!this.scene) return
559
+
560
+ var selected = this.scene.selected
561
+ if (selected.length && selected[0].isRootModel()) return
562
+
563
+ this.scene.undoableChange(function () {
564
+ selected.forEach(function (component) {
565
+ var rotation = component.get('rotation')
566
+
567
+ if (!rotation) rotation = 0
568
+
569
+ component.set('rotation', (rotation + Math.PI / 2) % (Math.PI * 2))
570
+ })
571
+ })
572
+ }
573
+
574
+ onTapRotateCCW() {
575
+ if (!this.scene) return
576
+
577
+ var selected = this.scene.selected
578
+ if (selected.length && selected[0].isRootModel()) return
579
+
580
+ this.scene.undoableChange(function () {
581
+ selected.forEach(function (component) {
582
+ var rotation = component.get('rotation')
583
+
584
+ if (!rotation) rotation = 0
585
+
586
+ component.set('rotation', (rotation - Math.PI / 2) % (Math.PI * 2))
587
+ })
588
+ })
589
+ }
590
+
591
+ onTapGroup() {
592
+ this.scene && this.scene.group()
593
+ }
594
+
595
+ onTapUngroup() {
596
+ this.scene && this.scene.ungroup()
597
+ }
598
+
599
+ onTapFullscreen() {
600
+ this.dispatchEvent(new CustomEvent('modeller-fullscreen'))
601
+ }
602
+
603
+ onTapToggle() {
604
+ this.hideProperty = !this.hideProperty
605
+ this.dispatchEvent(
606
+ new CustomEvent('hide-property-changed', {
607
+ bubbles: true,
608
+ composed: true,
609
+ detail: { value: this.hideProperty }
610
+ })
611
+ )
612
+ }
613
+
614
+ onTapFitScene() {
615
+ if (this.scene) {
616
+ this.scene.resize()
617
+ this.scene.fit('ratio')
618
+ }
619
+ }
620
+
621
+ onTapPreview() {
622
+ this.dispatchEvent(new CustomEvent('open-preview'))
623
+ }
624
+
625
+ onTapDownloadModel() {
626
+ this.dispatchEvent(new CustomEvent('download-model'))
627
+ }
628
+
629
+ onTapDistribute(e: TouchEvent | string) {
630
+ if (!this.scene) return
631
+
632
+ var selected = this.scene.selected
633
+ if (selected.length <= 1) {
634
+ return
635
+ }
636
+
637
+ var distribute = typeof e === 'string' ? e : (e.target as HTMLElement)!.getAttribute('data-distribute')
638
+
639
+ distribute && this.scene.distribute(distribute)
640
+ }
641
+ }
@@ -0,0 +1,69 @@
1
+ /**
2
+ * @license Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+
5
+ import { LitElement } from 'lit'
6
+
7
+ export class AbstractProperty extends LitElement {
8
+ firstUpdated() {
9
+ this.renderRoot.addEventListener('change', this._onValueChange.bind(this))
10
+ }
11
+
12
+ _onValueChange(e: Event) {
13
+ var element = e.target as HTMLElement
14
+ var key = element.getAttribute('value-key')
15
+
16
+ if (!key) {
17
+ return
18
+ }
19
+
20
+ var value = this._getValueFromEventTarget(element)
21
+
22
+ this._onAfterValueChange(key, value)
23
+ }
24
+
25
+ _getValueFromEventTarget(element: HTMLElement) {
26
+ var value
27
+
28
+ switch (element.tagName) {
29
+ case 'INPUT':
30
+ switch ((element as any).type) {
31
+ case 'checkbox':
32
+ value = (element as any).checked
33
+ break
34
+ case 'number':
35
+ value = Number((element as any).valueAsNumber)
36
+ break
37
+ case 'text':
38
+ value = String((element as any).value)
39
+ }
40
+ break
41
+
42
+ case 'PAPER-BUTTON':
43
+ value = (element as any).active
44
+ break
45
+
46
+ case 'PAPER-LISTBOX':
47
+ value = (element as any).selected
48
+ break
49
+
50
+ default:
51
+ value = (element as any).value
52
+ break
53
+ }
54
+
55
+ return value
56
+ }
57
+
58
+ _onAfterValueChange(key: string, value: any) {
59
+ this.dispatchEvent(
60
+ new CustomEvent('property-change', {
61
+ bubbles: true,
62
+ composed: true,
63
+ detail: {
64
+ [key]: value
65
+ }
66
+ })
67
+ )
68
+ }
69
+ }