@eclipse-glsp/client 2.2.0-next.329 → 2.2.0-next.330
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.
- package/css/change-bounds.css +15 -0
- package/css/glsp-sprotty.css +17 -0
- package/lib/base/drag-aware-mouse-listener.d.ts +5 -2
- package/lib/base/drag-aware-mouse-listener.d.ts.map +1 -1
- package/lib/base/drag-aware-mouse-listener.js +11 -0
- package/lib/base/drag-aware-mouse-listener.js.map +1 -1
- package/lib/base/feedback/css-feedback.d.ts +4 -0
- package/lib/base/feedback/css-feedback.d.ts.map +1 -1
- package/lib/base/feedback/css-feedback.js +4 -0
- package/lib/base/feedback/css-feedback.js.map +1 -1
- package/lib/base/feedback/feeback-emitter.d.ts +67 -0
- package/lib/base/feedback/feeback-emitter.d.ts.map +1 -0
- package/lib/base/feedback/feeback-emitter.js +109 -0
- package/lib/base/feedback/feeback-emitter.js.map +1 -0
- package/lib/base/feedback/feedback-action-dispatcher.d.ts +17 -5
- package/lib/base/feedback/feedback-action-dispatcher.d.ts.map +1 -1
- package/lib/base/feedback/feedback-action-dispatcher.js +23 -3
- package/lib/base/feedback/feedback-action-dispatcher.js.map +1 -1
- package/lib/base/feedback/index.d.ts +1 -0
- package/lib/base/feedback/index.d.ts.map +1 -1
- package/lib/base/feedback/index.js +1 -0
- package/lib/base/feedback/index.js.map +1 -1
- package/lib/base/selection-service.d.ts +3 -2
- package/lib/base/selection-service.d.ts.map +1 -1
- package/lib/base/selection-service.js.map +1 -1
- package/lib/features/accessibility/element-navigation/local-element-navigator.d.ts +3 -3
- package/lib/features/accessibility/element-navigation/local-element-navigator.d.ts.map +1 -1
- package/lib/features/accessibility/element-navigation/local-element-navigator.js.map +1 -1
- package/lib/features/accessibility/move-zoom/move-handler.d.ts +4 -2
- package/lib/features/accessibility/move-zoom/move-handler.d.ts.map +1 -1
- package/lib/features/accessibility/move-zoom/move-handler.js +10 -4
- package/lib/features/accessibility/move-zoom/move-handler.js.map +1 -1
- package/lib/features/accessibility/resize-key-tool/resize-key-handler.d.ts +4 -2
- package/lib/features/accessibility/resize-key-tool/resize-key-handler.d.ts.map +1 -1
- package/lib/features/accessibility/resize-key-tool/resize-key-handler.js +11 -3
- package/lib/features/accessibility/resize-key-tool/resize-key-handler.js.map +1 -1
- package/lib/features/change-bounds/model.d.ts +8 -8
- package/lib/features/change-bounds/model.d.ts.map +1 -1
- package/lib/features/change-bounds/model.js +17 -5
- package/lib/features/change-bounds/model.js.map +1 -1
- package/lib/features/change-bounds/movement-restrictor.d.ts +3 -2
- package/lib/features/change-bounds/movement-restrictor.d.ts.map +1 -1
- package/lib/features/change-bounds/movement-restrictor.js.map +1 -1
- package/lib/features/element-template/mouse-tracking-element-position-listener.d.ts +15 -5
- package/lib/features/element-template/mouse-tracking-element-position-listener.d.ts.map +1 -1
- package/lib/features/element-template/mouse-tracking-element-position-listener.js +27 -38
- package/lib/features/element-template/mouse-tracking-element-position-listener.js.map +1 -1
- package/lib/features/helper-lines/helper-line-manager-default.d.ts +4 -2
- package/lib/features/helper-lines/helper-line-manager-default.d.ts.map +1 -1
- package/lib/features/helper-lines/helper-line-manager-default.js +8 -12
- package/lib/features/helper-lines/helper-line-manager-default.js.map +1 -1
- package/lib/features/hints/type-hint-provider.d.ts +3 -0
- package/lib/features/hints/type-hint-provider.d.ts.map +1 -1
- package/lib/features/hints/type-hint-provider.js +10 -1
- package/lib/features/hints/type-hint-provider.js.map +1 -1
- package/lib/features/select/select-mouse-listener.d.ts +4 -3
- package/lib/features/select/select-mouse-listener.d.ts.map +1 -1
- package/lib/features/select/select-mouse-listener.js.map +1 -1
- package/lib/features/tools/base-tools.d.ts +23 -4
- package/lib/features/tools/base-tools.d.ts.map +1 -1
- package/lib/features/tools/base-tools.js +11 -6
- package/lib/features/tools/base-tools.js.map +1 -1
- package/lib/features/tools/change-bounds/change-bounds-tool-feedback.d.ts +1 -35
- package/lib/features/tools/change-bounds/change-bounds-tool-feedback.d.ts.map +1 -1
- package/lib/features/tools/change-bounds/change-bounds-tool-feedback.js +5 -206
- package/lib/features/tools/change-bounds/change-bounds-tool-feedback.js.map +1 -1
- package/lib/features/tools/change-bounds/change-bounds-tool-module.d.ts +1 -0
- package/lib/features/tools/change-bounds/change-bounds-tool-module.d.ts.map +1 -1
- package/lib/features/tools/change-bounds/change-bounds-tool-module.js +1 -0
- package/lib/features/tools/change-bounds/change-bounds-tool-module.js.map +1 -1
- package/lib/features/tools/change-bounds/change-bounds-tool-move-feedback.d.ts +67 -0
- package/lib/features/tools/change-bounds/change-bounds-tool-move-feedback.d.ts.map +1 -0
- package/lib/features/tools/change-bounds/change-bounds-tool-move-feedback.js +227 -0
- package/lib/features/tools/change-bounds/change-bounds-tool-move-feedback.js.map +1 -0
- package/lib/features/tools/change-bounds/change-bounds-tool.d.ts +34 -24
- package/lib/features/tools/change-bounds/change-bounds-tool.d.ts.map +1 -1
- package/lib/features/tools/change-bounds/change-bounds-tool.js +172 -180
- package/lib/features/tools/change-bounds/change-bounds-tool.js.map +1 -1
- package/lib/features/tools/change-bounds/index.d.ts +1 -0
- package/lib/features/tools/change-bounds/index.d.ts.map +1 -1
- package/lib/features/tools/change-bounds/index.js +1 -0
- package/lib/features/tools/change-bounds/index.js.map +1 -1
- package/lib/features/tools/change-bounds/view.d.ts +1 -1
- package/lib/features/tools/change-bounds/view.d.ts.map +1 -1
- package/lib/features/tools/change-bounds/view.js +3 -0
- package/lib/features/tools/change-bounds/view.js.map +1 -1
- package/lib/features/tools/deletion/delete-tool.d.ts +16 -1
- package/lib/features/tools/deletion/delete-tool.d.ts.map +1 -1
- package/lib/features/tools/deletion/delete-tool.js +5 -2
- package/lib/features/tools/deletion/delete-tool.js.map +1 -1
- package/lib/features/tools/edge-creation/dangling-edge-feedback.d.ts +17 -1
- package/lib/features/tools/edge-creation/dangling-edge-feedback.d.ts.map +1 -1
- package/lib/features/tools/edge-creation/dangling-edge-feedback.js +3 -1
- package/lib/features/tools/edge-creation/dangling-edge-feedback.js.map +1 -1
- package/lib/features/tools/edge-creation/edge-creation-tool-feedback.d.ts +3 -1
- package/lib/features/tools/edge-creation/edge-creation-tool-feedback.d.ts.map +1 -1
- package/lib/features/tools/edge-creation/edge-creation-tool-feedback.js +4 -7
- package/lib/features/tools/edge-creation/edge-creation-tool-feedback.js.map +1 -1
- package/lib/features/tools/edge-creation/edge-creation-tool.d.ts +20 -2
- package/lib/features/tools/edge-creation/edge-creation-tool.d.ts.map +1 -1
- package/lib/features/tools/edge-creation/edge-creation-tool.js +23 -18
- package/lib/features/tools/edge-creation/edge-creation-tool.js.map +1 -1
- package/lib/features/tools/edge-edit/edge-edit-tool-feedback.d.ts +3 -1
- package/lib/features/tools/edge-edit/edge-edit-tool-feedback.d.ts.map +1 -1
- package/lib/features/tools/edge-edit/edge-edit-tool-feedback.js +5 -8
- package/lib/features/tools/edge-edit/edge-edit-tool-feedback.js.map +1 -1
- package/lib/features/tools/edge-edit/edge-edit-tool.d.ts +4 -4
- package/lib/features/tools/edge-edit/edge-edit-tool.d.ts.map +1 -1
- package/lib/features/tools/edge-edit/edge-edit-tool.js +27 -44
- package/lib/features/tools/edge-edit/edge-edit-tool.js.map +1 -1
- package/lib/features/tools/marquee-selection/marquee-mouse-tool.d.ts +3 -2
- package/lib/features/tools/marquee-selection/marquee-mouse-tool.d.ts.map +1 -1
- package/lib/features/tools/marquee-selection/marquee-mouse-tool.js +4 -2
- package/lib/features/tools/marquee-selection/marquee-mouse-tool.js.map +1 -1
- package/lib/features/tools/node-creation/node-creation-tool.d.ts +14 -5
- package/lib/features/tools/node-creation/node-creation-tool.d.ts.map +1 -1
- package/lib/features/tools/node-creation/node-creation-tool.js +58 -24
- package/lib/features/tools/node-creation/node-creation-tool.js.map +1 -1
- package/lib/features/validation/marker-navigator.d.ts +7 -6
- package/lib/features/validation/marker-navigator.d.ts.map +1 -1
- package/lib/features/validation/marker-navigator.js.map +1 -1
- package/lib/features/validation/validate.d.ts +2 -5
- package/lib/features/validation/validate.d.ts.map +1 -1
- package/lib/features/validation/validate.js +4 -16
- package/lib/features/validation/validate.js.map +1 -1
- package/lib/utils/gmodel-util.d.ts +27 -2
- package/lib/utils/gmodel-util.d.ts.map +1 -1
- package/lib/utils/gmodel-util.js +30 -1
- package/lib/utils/gmodel-util.js.map +1 -1
- package/lib/utils/layout-utils.d.ts +8 -7
- package/lib/utils/layout-utils.d.ts.map +1 -1
- package/lib/utils/layout-utils.js +2 -4
- package/lib/utils/layout-utils.js.map +1 -1
- package/lib/utils/viewpoint-util.d.ts +4 -4
- package/lib/utils/viewpoint-util.d.ts.map +1 -1
- package/lib/utils/viewpoint-util.js.map +1 -1
- package/package.json +3 -3
- package/src/base/drag-aware-mouse-listener.ts +16 -2
- package/src/base/feedback/css-feedback.ts +4 -0
- package/src/base/feedback/feeback-emitter.ts +112 -0
- package/src/base/feedback/feedback-action-dispatcher.ts +41 -6
- package/src/base/feedback/index.ts +1 -0
- package/src/base/selection-service.spec.ts +5 -0
- package/src/base/selection-service.ts +2 -3
- package/src/features/accessibility/element-navigation/local-element-navigator.ts +4 -4
- package/src/features/accessibility/move-zoom/move-handler.ts +10 -5
- package/src/features/accessibility/resize-key-tool/resize-key-handler.ts +11 -7
- package/src/features/change-bounds/model.ts +25 -13
- package/src/features/change-bounds/movement-restrictor.ts +5 -4
- package/src/features/element-template/mouse-tracking-element-position-listener.ts +44 -44
- package/src/features/helper-lines/helper-line-manager-default.ts +12 -21
- package/src/features/hints/type-hint-provider.spec.ts +4 -1
- package/src/features/hints/type-hint-provider.ts +9 -2
- package/src/features/select/select-mouse-listener.ts +4 -3
- package/src/features/tools/base-tools.ts +15 -8
- package/src/features/tools/change-bounds/change-bounds-tool-feedback.ts +6 -232
- package/src/features/tools/change-bounds/change-bounds-tool-module.ts +1 -0
- package/src/features/tools/change-bounds/change-bounds-tool-move-feedback.ts +254 -0
- package/src/features/tools/change-bounds/change-bounds-tool.ts +217 -226
- package/src/features/tools/change-bounds/index.ts +1 -0
- package/src/features/tools/change-bounds/view.tsx +4 -1
- package/src/features/tools/deletion/delete-tool.ts +6 -6
- package/src/features/tools/edge-creation/dangling-edge-feedback.ts +7 -4
- package/src/features/tools/edge-creation/edge-creation-tool-feedback.ts +9 -9
- package/src/features/tools/edge-creation/edge-creation-tool.ts +33 -23
- package/src/features/tools/edge-edit/edge-edit-tool-feedback.ts +8 -8
- package/src/features/tools/edge-edit/edge-edit-tool.ts +42 -49
- package/src/features/tools/marquee-selection/marquee-mouse-tool.ts +7 -6
- package/src/features/tools/node-creation/node-creation-tool.ts +69 -25
- package/src/features/validation/marker-navigator.ts +6 -8
- package/src/features/validation/validate.ts +5 -20
- package/src/utils/gmodel-util.ts +44 -1
- package/src/utils/layout-utils.ts +9 -20
- package/src/utils/viewpoint-util.ts +3 -4
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* Copyright (c) 2019-2023 EclipseSource and others.
|
|
3
|
+
*
|
|
4
|
+
* This program and the accompanying materials are made available under the
|
|
5
|
+
* terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
+
* http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
+
*
|
|
8
|
+
* This Source Code may also be made available under the following Secondary
|
|
9
|
+
* Licenses when the conditions for such availability set forth in the Eclipse
|
|
10
|
+
* Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
11
|
+
* with the GNU Classpath Exception which is available at
|
|
12
|
+
* https://www.gnu.org/software/classpath/license.html.
|
|
13
|
+
*
|
|
14
|
+
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
|
|
15
|
+
********************************************************************************/
|
|
16
|
+
import { Action, Disposable, ElementMove, GModelElement, GModelRoot, MoveAction, Point, findParentByFeature } from '@eclipse-glsp/sprotty';
|
|
17
|
+
|
|
18
|
+
import { DebouncedFunc, debounce } from 'lodash';
|
|
19
|
+
import { DragAwareMouseListener } from '../../../base/drag-aware-mouse-listener';
|
|
20
|
+
import { CursorCSS, cursorFeedbackAction } from '../../../base/feedback/css-feedback';
|
|
21
|
+
import { FeedbackEmitter } from '../../../base/feedback/feeback-emitter';
|
|
22
|
+
import { MoveableElement, filter, getElements, isNonRoutableSelectedMovableBoundsAware, removeDescendants } from '../../../utils';
|
|
23
|
+
import { PointPositionUpdater } from '../../change-bounds';
|
|
24
|
+
import { SResizeHandle } from '../../change-bounds/model';
|
|
25
|
+
import { createMovementRestrictionFeedback, removeMovementRestrictionFeedback } from '../../change-bounds/movement-restrictor';
|
|
26
|
+
import { ChangeBoundsTool } from './change-bounds-tool';
|
|
27
|
+
import { MoveFinishedEventAction, MoveInitializedEventAction } from './change-bounds-tool-feedback';
|
|
28
|
+
|
|
29
|
+
export interface ValidatedElementMove extends ElementMove {
|
|
30
|
+
valid: boolean;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export namespace ValidatedElementMove {
|
|
34
|
+
export function isValid(move: ElementMove): boolean {
|
|
35
|
+
return (move as ValidatedElementMove).valid ?? true;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* This mouse listener provides visual feedback for moving by sending client-side
|
|
41
|
+
* `MoveAction`s while elements are selected and dragged. This will also update
|
|
42
|
+
* their bounds, which is important, as it is not only required for rendering
|
|
43
|
+
* the visual feedback but also the basis for sending the change to the server
|
|
44
|
+
* (see also `tools/MoveTool`).
|
|
45
|
+
*/
|
|
46
|
+
export class FeedbackMoveMouseListener extends DragAwareMouseListener implements Disposable {
|
|
47
|
+
protected rootElement?: GModelRoot;
|
|
48
|
+
protected positionUpdater;
|
|
49
|
+
protected elementId2startPos = new Map<string, Point>();
|
|
50
|
+
|
|
51
|
+
protected pendingMoveInitialized?: DebouncedFunc<() => void>;
|
|
52
|
+
|
|
53
|
+
protected moveInitializedFeedback: FeedbackEmitter;
|
|
54
|
+
protected moveFeedback: FeedbackEmitter;
|
|
55
|
+
|
|
56
|
+
constructor(protected tool: ChangeBoundsTool) {
|
|
57
|
+
super();
|
|
58
|
+
this.positionUpdater = new PointPositionUpdater(tool.positionSnapper);
|
|
59
|
+
this.moveInitializedFeedback = tool.createFeedbackEmitter();
|
|
60
|
+
this.moveFeedback = tool.createFeedbackEmitter();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
override mouseDown(target: GModelElement, event: MouseEvent): Action[] {
|
|
64
|
+
super.mouseDown(target, event);
|
|
65
|
+
if (event.button === 0) {
|
|
66
|
+
this.initializeMove(target, event);
|
|
67
|
+
return [];
|
|
68
|
+
}
|
|
69
|
+
this.positionUpdater.resetPosition();
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
protected initializeMove(target: GModelElement, event: MouseEvent): void {
|
|
74
|
+
if (target instanceof SResizeHandle) {
|
|
75
|
+
// avoid conflict with resize tool
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const moveable = findParentByFeature(target, this.isValidMoveable);
|
|
79
|
+
if (moveable !== undefined) {
|
|
80
|
+
this.positionUpdater.updateLastDragPosition(event);
|
|
81
|
+
this.scheduleMoveInitialized();
|
|
82
|
+
} else {
|
|
83
|
+
this.positionUpdater.resetPosition();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
protected scheduleMoveInitialized(): void {
|
|
88
|
+
this.pendingMoveInitialized?.cancel();
|
|
89
|
+
this.pendingMoveInitialized = debounce(() => {
|
|
90
|
+
this.moveInitialized();
|
|
91
|
+
this.pendingMoveInitialized = undefined;
|
|
92
|
+
}, 750);
|
|
93
|
+
this.pendingMoveInitialized();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
protected moveInitializationTimeout(): number {
|
|
97
|
+
return 750;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
protected moveInitialized(): void {
|
|
101
|
+
if (this.isMouseDown) {
|
|
102
|
+
this.moveInitializedFeedback
|
|
103
|
+
.add(MoveInitializedEventAction.create(), MoveFinishedEventAction.create())
|
|
104
|
+
.add(cursorFeedbackAction(CursorCSS.MOVE), cursorFeedbackAction(CursorCSS.DEFAULT))
|
|
105
|
+
.submit();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
protected isValidMoveable(element?: GModelElement): element is MoveableElement {
|
|
110
|
+
return !!element && isNonRoutableSelectedMovableBoundsAware(element) && !(element instanceof SResizeHandle);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
override nonDraggingMouseUp(element: GModelElement, event: MouseEvent): Action[] {
|
|
114
|
+
// should reset everything that may have happend on mouse down
|
|
115
|
+
this.moveInitializedFeedback.dispose();
|
|
116
|
+
this.positionUpdater.resetPosition();
|
|
117
|
+
return [];
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
override mouseMove(target: GModelElement, event: MouseEvent): Action[] {
|
|
121
|
+
super.mouseMove(target, event);
|
|
122
|
+
if (event.buttons === 0) {
|
|
123
|
+
return this.mouseUp(target, event);
|
|
124
|
+
} else if (!this.positionUpdater.isLastDragPositionUndefined()) {
|
|
125
|
+
return this.moveElements(target, event);
|
|
126
|
+
}
|
|
127
|
+
return [];
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
protected moveElements(target: GModelElement, event: MouseEvent): Action[] {
|
|
131
|
+
if (this.elementId2startPos.size === 0) {
|
|
132
|
+
this.initializeElementsToMove(target.root);
|
|
133
|
+
}
|
|
134
|
+
const moveAction = this.getElementMoves(target, event, false);
|
|
135
|
+
if (!moveAction) {
|
|
136
|
+
return [];
|
|
137
|
+
}
|
|
138
|
+
// cancel any pending move
|
|
139
|
+
this.pendingMoveInitialized?.cancel();
|
|
140
|
+
this.moveFeedback.add(moveAction, () => this.resetElementPositions(target));
|
|
141
|
+
this.addMovementFeedback(moveAction, target);
|
|
142
|
+
this.moveFeedback.submit();
|
|
143
|
+
return [];
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
protected addMovementFeedback(movement: MoveAction, ctx: GModelElement): void {
|
|
147
|
+
// cursor feedback
|
|
148
|
+
this.moveFeedback.add(cursorFeedbackAction(CursorCSS.MOVE), cursorFeedbackAction(CursorCSS.DEFAULT));
|
|
149
|
+
|
|
150
|
+
// restriction feedback
|
|
151
|
+
movement.moves.forEach(move => {
|
|
152
|
+
const element = ctx.root.index.getById(move.elementId);
|
|
153
|
+
if (element && this.tool.movementRestrictor) {
|
|
154
|
+
if (!ValidatedElementMove.isValid(move)) {
|
|
155
|
+
this.moveFeedback.add(createMovementRestrictionFeedback(element, this.tool.movementRestrictor), () =>
|
|
156
|
+
removeMovementRestrictionFeedback(element, this.tool.movementRestrictor!)
|
|
157
|
+
);
|
|
158
|
+
} else {
|
|
159
|
+
this.moveFeedback.add(removeMovementRestrictionFeedback(element, this.tool.movementRestrictor));
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
protected initializeElementsToMove(root: GModelRoot): void {
|
|
166
|
+
const elementsToMove = this.collectElementsToMove(root);
|
|
167
|
+
elementsToMove.forEach(element => this.elementId2startPos.set(element.id, element.position));
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
protected collectElementsToMove(root: GModelRoot): MoveableElement[] {
|
|
171
|
+
const moveableElements = filter(root.index, this.isValidMoveable);
|
|
172
|
+
const topLevelElements = removeDescendants(moveableElements);
|
|
173
|
+
return Array.from(topLevelElements);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
protected getElementsToMove(context: GModelElement): MoveableElement[] {
|
|
177
|
+
return getElements(context.root.index, Array.from(this.elementId2startPos.keys()), this.isValidMoveable);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
protected getElementMoves(target: GModelElement, event: MouseEvent, finished: boolean): MoveAction | undefined {
|
|
181
|
+
const delta = this.positionUpdater.updatePosition(target, event);
|
|
182
|
+
if (!delta) {
|
|
183
|
+
return undefined;
|
|
184
|
+
}
|
|
185
|
+
const elementMoves: ElementMove[] = this.getElementMovesForDelta(target, delta, finished).filter(move =>
|
|
186
|
+
this.filterElementMove(move)
|
|
187
|
+
);
|
|
188
|
+
if (elementMoves.length > 0) {
|
|
189
|
+
// we never want to animate the move action as this interferes with the move feedback
|
|
190
|
+
return MoveAction.create(elementMoves, { animate: false, finished });
|
|
191
|
+
} else {
|
|
192
|
+
return undefined;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
protected filterElementMove(elementMove: ValidatedElementMove): boolean {
|
|
197
|
+
return !!elementMove.fromPosition && !Point.equals(elementMove.fromPosition, elementMove.toPosition);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
protected getElementMovesForDelta(target: GModelElement, delta: Point, finished: boolean): ValidatedElementMove[] {
|
|
201
|
+
return this.getElementsToMove(target).flatMap<ValidatedElementMove>(element => {
|
|
202
|
+
const startPosition = this.elementId2startPos.get(element.id);
|
|
203
|
+
if (!startPosition) {
|
|
204
|
+
return [];
|
|
205
|
+
}
|
|
206
|
+
const targetPosition = Point.add(element.position, delta);
|
|
207
|
+
const valid = this.tool.movementRestrictor?.validate(element, targetPosition) ?? true;
|
|
208
|
+
return [this.createElementMove(element, targetPosition, valid, finished)];
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
protected createElementMove(element: MoveableElement, toPosition: Point, valid: boolean, finished: boolean): ValidatedElementMove {
|
|
213
|
+
// if we are finished and have an invalid move, we want to move the element back to its start position
|
|
214
|
+
return !valid && finished
|
|
215
|
+
? { elementId: element.id, fromPosition: element.position, toPosition: element.position, valid }
|
|
216
|
+
: { elementId: element.id, fromPosition: element.position, toPosition, valid };
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
protected resetElementPositions(context: GModelElement): MoveAction | undefined {
|
|
220
|
+
const elementMoves: ElementMove[] = this.revertElementMoves(context);
|
|
221
|
+
return MoveAction.create(elementMoves, { animate: false, finished: true });
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
protected revertElementMoves(context?: GModelElement): ElementMove[] {
|
|
225
|
+
const elementMoves: ElementMove[] = [];
|
|
226
|
+
if (context?.root?.index) {
|
|
227
|
+
const movableElements = this.getElementsToMove(context);
|
|
228
|
+
movableElements.forEach(element =>
|
|
229
|
+
elementMoves.push({ elementId: element.id, toPosition: this.elementId2startPos.get(element.id)! })
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
return elementMoves;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
override draggingMouseUp(target: GModelElement, event: MouseEvent): Action[] {
|
|
236
|
+
if (this.positionUpdater.isLastDragPositionUndefined()) {
|
|
237
|
+
return [];
|
|
238
|
+
}
|
|
239
|
+
// only reset the move of invalid elements, the others will be handled by the change bounds tool itself
|
|
240
|
+
const moves = this.getElementMovesForDelta(target, Point.ORIGIN, false);
|
|
241
|
+
moves.filter(move => move.valid).forEach(move => this.elementId2startPos.delete(move.elementId));
|
|
242
|
+
this.dispose();
|
|
243
|
+
return [];
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
override dispose(): void {
|
|
247
|
+
this.pendingMoveInitialized?.cancel();
|
|
248
|
+
this.moveInitializedFeedback.dispose();
|
|
249
|
+
this.moveFeedback.dispose();
|
|
250
|
+
this.positionUpdater.resetPosition();
|
|
251
|
+
this.elementId2startPos.clear();
|
|
252
|
+
super.dispose();
|
|
253
|
+
}
|
|
254
|
+
}
|