Skip to content

Commit

Permalink
[997] Prevent move event to be sent when handling routing points move
Browse files Browse the repository at this point in the history
Bug: #997
Signed-off-by: Guillaume Coutable <guillaume.coutable@obeo.fr>
  • Loading branch information
gcoutable committed Feb 22, 2022
1 parent cda6a87 commit 4e6cc63
Show file tree
Hide file tree
Showing 4 changed files with 106 additions and 2 deletions.
2 changes: 2 additions & 0 deletions frontend/src/diagram/sprotty/DependencyInjection.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ import {
zorderModule,
} from 'sprotty';
import { Action, Point, RequestPopupModelAction, SetPopupModelAction, UpdateModelAction } from 'sprotty-protocol';
import { siriusCommonModule } from './common/siriusCommonModule';
import { siriusRoutingModule } from './routing/siriusRoutingModule';

/**
Expand Down Expand Up @@ -149,6 +150,7 @@ export const createDependencyInjectionContainer = (containerId: string, getCurso
const container = new Container();
container.load(
defaultModule,
siriusCommonModule,
boundsModule,
selectModule,
siriusDragAndDropModule,
Expand Down
12 changes: 10 additions & 2 deletions frontend/src/diagram/sprotty/DiagramServer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ import {
SetViewportAction,
UpdateModelAction,
} from 'sprotty-protocol';
import { IsSiriusModelElementAction, IsSiriusModelElementResult } from './common/isSiriusModelElementRequest';

/** Action to delete a sprotty element */
export const SPROTTY_DELETE_ACTION = 'sprottyDeleteElement';
Expand Down Expand Up @@ -266,13 +267,20 @@ export class DiagramServer extends ModelSource {
}
}

handleMoveAction(action) {
handleMoveAction(action: MoveAction) {
const { finished, moves } = action;
if (finished && moves.length > 0) {
const { elementId, toPosition } = moves[0];
this.moveElement(elementId, toPosition?.x, toPosition?.y);
this.actionDispatcher
.request<IsSiriusModelElementResult>(IsSiriusModelElementAction.create(elementId))
.then((isSiriusModelElementResult) => {
if (isSiriusModelElementResult.isSiriusModelElement) {
this.moveElement(elementId, toPosition?.x, toPosition?.y);
}
});
}
}

handleResizeAction(action: ResizeAction) {
const { finished, resize } = action;
if (finished && resize) {
Expand Down
75 changes: 75 additions & 0 deletions frontend/src/diagram/sprotty/common/isSiriusModelElementRequest.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
/*******************************************************************************
* Copyright (c) 2022 Obeo.
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Obeo - initial API and implementation
*******************************************************************************/
import { decorate, inject } from 'inversify';
import { CommandExecutionContext, SModelElement, SModelRoot, TYPES } from 'sprotty';
import { generateRequestId, RequestAction, ResponseAction } from 'sprotty-protocol';
import { ModelRequestCommand } from 'sprotty/lib/base/commands/request-command';
import { Edge, Node } from '../Diagram.types';

export interface IsSiriusModelElementAction extends RequestAction<IsSiriusModelElementResult> {
kind: typeof IsSiriusModelElementAction.KIND;
elementId: string;
}

export namespace IsSiriusModelElementAction {
export const KIND = 'isSiriusModelElement';

export const create = (elementId: string): IsSiriusModelElementAction => {
return {
kind: KIND,
elementId,
requestId: generateRequestId(),
};
};
}

export interface IsSiriusModelElementResult extends ResponseAction {
kind: typeof IsSiriusModelElementResult.KIND;
isSiriusModelElement: boolean;
}

export namespace IsSiriusModelElementResult {
export const KIND = 'isSiriusModelElementResult';

export const create = (isSiriusModelElement: boolean, requestId: string): IsSiriusModelElementResult => {
return {
kind: KIND,
isSiriusModelElement,
responseId: requestId,
};
};
}

export class IsSiriusModelElementCommand extends ModelRequestCommand {
static readonly KIND = IsSiriusModelElementAction.KIND;

constructor(protected readonly action: IsSiriusModelElementAction) {
super();
}

protected retrieveResult(context: CommandExecutionContext): ResponseAction {
const elem = context.root;
const isSiriusModelElement = this.isSiriusModelElement(elem, this.action.elementId);
return IsSiriusModelElementResult.create(isSiriusModelElement, this.action.requestId);
}

private isSiriusModelElement(root: SModelRoot, elementId: string): boolean {
const element = root.index.getById(elementId);
return isSiriusModelElement(element);
}
}
decorate(inject(TYPES.Action) as ParameterDecorator, IsSiriusModelElementCommand, 0);

export const isSiriusModelElement = (element: SModelElement): boolean => {
return element instanceof Node || element instanceof Edge;
};
19 changes: 19 additions & 0 deletions frontend/src/diagram/sprotty/common/siriusCommonModule.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/*******************************************************************************
* Copyright (c) 2022 Obeo.
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Obeo - initial API and implementation
*******************************************************************************/
import { ContainerModule } from 'inversify';
import { configureCommand } from 'sprotty';
import { IsSiriusModelElementCommand } from './isSiriusModelElementRequest';

export const siriusCommonModule = new ContainerModule((bind, unbind, isBound, rebind) => {
configureCommand({ bind, isBound }, IsSiriusModelElementCommand);
});

0 comments on commit 4e6cc63

Please sign in to comment.