Update nodes and drawings at the same time

This commit is contained in:
ziajka 2018-11-14 14:20:30 +01:00
parent 0e04e85e53
commit 332303da4c
7 changed files with 40 additions and 18 deletions

View File

@ -145,12 +145,12 @@ export class MapComponent implements OnInit, OnChanges, OnDestroy {
this.nodeDraggedSub = this.nodesEventSource.dragged.subscribe((evt) => { this.nodeDraggedSub = this.nodesEventSource.dragged.subscribe((evt) => {
const converted = evt.datum.map((e) => this.mapNodeToNode.convert(e)); const converted = evt.datum.map((e) => this.mapNodeToNode.convert(e));
this.nodeDragged.emit(new DraggedDataEvent<Node[]>(converted)); this.nodeDragged.emit(new DraggedDataEvent<Node[]>(converted, evt.dx, evt.dy));
}); });
this.drawingDraggedSub = this.drawingsEventSource.dragged.subscribe((evt) => { this.drawingDraggedSub = this.drawingsEventSource.dragged.subscribe((evt) => {
const converted = evt.datum.map((e) => this.mapDrawingToDrawing.convert(e)); const converted = evt.datum.map((e) => this.mapDrawingToDrawing.convert(e));
this.drawingDragged.emit(new DraggedDataEvent<Drawing[]>(converted)); this.drawingDragged.emit(new DraggedDataEvent<Drawing[]>(converted, evt.dx, evt.dy));
}); });
this.selectionChanged = this.selectionManager.subscribe(this.selectionToolWidget.rectangleSelected); this.selectionChanged = this.selectionManager.subscribe(this.selectionToolWidget.rectangleSelected);

View File

@ -38,13 +38,19 @@ export abstract class DataSource<T> {
this.dataChange.next(this.data); this.dataChange.next(this.data);
} }
public get(key: string | number) {
const index = this.data.findIndex((i: T) => this.getItemKey(i) === key);
if (index >= 0) {
return this.data[index];
}
}
public update(item: T) { public update(item: T) {
const index = this.findIndex(item); const index = this.findIndex(item);
if (index >= 0) { if (index >= 0) {
const updated = Object.assign(this.data[index], item); const updated = Object.assign(this.data[index], item);
this.data[index] = updated; this.data[index] = updated;
this.dataChange.next(this.data); this.dataChange.next(this.data);
console.log("Item updated");
this.itemUpdated.next(updated); this.itemUpdated.next(updated);
} }
} }

View File

@ -43,14 +43,16 @@ export class Draggable<GElement extends DraggedElementBaseType, Datum> {
} }
private behaviour() { private behaviour() {
let startEvt;
return drag<GElement, Datum>() return drag<GElement, Datum>()
.on('start', (datum: Datum) => { .on('start', (datum: Datum) => {
const evt = new DraggableStart<Datum>(datum); startEvt = new DraggableStart<Datum>(datum);
evt.dx = event.dx; startEvt.dx = event.dx;
evt.dy = event.dy; startEvt.dy = event.dy;
evt.x = event.x; startEvt.x = event.x;
evt.y = event.y; startEvt.y = event.y;
this.start.emit(evt); this.start.emit(startEvt);
}) })
.on('drag', (datum: Datum) => { .on('drag', (datum: Datum) => {
const evt = new DraggableDrag<Datum>(datum); const evt = new DraggableDrag<Datum>(datum);
@ -62,10 +64,11 @@ export class Draggable<GElement extends DraggedElementBaseType, Datum> {
}) })
.on('end', (datum: Datum) => { .on('end', (datum: Datum) => {
const evt = new DraggableEnd<Datum>(datum); const evt = new DraggableEnd<Datum>(datum);
evt.dx = event.dx; evt.dx = event.x - startEvt.x;
evt.dy = event.dy; evt.dy = event.y - startEvt.y;
evt.x = event.x; evt.x = event.x;
evt.y = event.y; evt.y = event.y;
console.log(evt);
this.end.emit(evt); this.end.emit(evt);
}); });
} }

View File

@ -1,6 +1,8 @@
export class DataEventSource<T> { export class DataEventSource<T> {
constructor( constructor(
public datum: T public datum: T,
public dx: number,
public dy: number
) {} ) {}
} }

View File

@ -86,13 +86,15 @@ export class NodesDraggableListener {
this.nodesWidget.draggable.end, this.nodesWidget.draggable.end,
this.drawingsWidget.draggable.end this.drawingsWidget.draggable.end
).subscribe((evt: DraggableEnd<any>) => { ).subscribe((evt: DraggableEnd<any>) => {
console.log(evt);
const selected = this.selectionManager.getSelected(); const selected = this.selectionManager.getSelected();
const updatedNodes = selected.filter((item) => item instanceof MapNode).map((item: MapNode) => item); const updatedNodes = selected.filter((item) => item instanceof MapNode).map((item: MapNode) => item);
this.nodesEventSource.dragged.emit(new DraggedDataEvent<MapNode[]>(updatedNodes))
const updatedDrawings = selected.filter((item) => item instanceof MapDrawing).map((item: MapDrawing) => item); const updatedDrawings = selected.filter((item) => item instanceof MapDrawing).map((item: MapDrawing) => item);
this.drawingsEventSource.dragged.emit(new DraggedDataEvent<MapDrawing[]>(updatedDrawings));
this.nodesEventSource.dragged.emit(new DraggedDataEvent<MapNode[]>(updatedNodes, evt.dx, evt.dy));
this.drawingsEventSource.dragged.emit(new DraggedDataEvent<MapDrawing[]>(updatedDrawings, evt.dx, evt.dy));
}); });
} }

View File

@ -27,6 +27,8 @@ export class GraphDataManager {
) {} ) {}
public setNodes(nodes: Node[]) { public setNodes(nodes: Node[]) {
console.log("set all nodes");
const mapNodes = nodes.map((n) => this.nodeToMapNode.convert(n)); const mapNodes = nodes.map((n) => this.nodeToMapNode.convert(n));
this.mapNodesDataSource.set(mapNodes); this.mapNodesDataSource.set(mapNodes);

View File

@ -214,8 +214,11 @@ export class ProjectMapComponent implements OnInit, OnDestroy {
} }
onNodeDragged(draggedEvent: DraggedDataEvent<Node[]>) { onNodeDragged(draggedEvent: DraggedDataEvent<Node[]>) {
draggedEvent.datum.forEach((node: Node) => { draggedEvent.datum.forEach((n: Node) => {
this.nodesDataSource.update(node); const node = this.nodesDataSource.get(n.node_id);
node.x += draggedEvent.dx;
node.y += draggedEvent.dy;
this.nodeService this.nodeService
.updatePosition(this.server, node, node.x, node.y) .updatePosition(this.server, node, node.x, node.y)
.subscribe((serverNode: Node) => { .subscribe((serverNode: Node) => {
@ -225,8 +228,12 @@ export class ProjectMapComponent implements OnInit, OnDestroy {
} }
onDrawingDragged(draggedEvent: DraggedDataEvent<Drawing[]>) { onDrawingDragged(draggedEvent: DraggedDataEvent<Drawing[]>) {
draggedEvent.datum.forEach((drawing: Drawing) => { draggedEvent.datum.forEach((d: Drawing) => {
this.drawingsDataSource.update(drawing);
const drawing = this.drawingsDataSource.get(d.drawing_id);
drawing.x += draggedEvent.dx;
drawing.y += draggedEvent.dy;
this.drawingService this.drawingService
.updatePosition(this.server, drawing, drawing.x, drawing.y) .updatePosition(this.server, drawing, drawing.x, drawing.y)
.subscribe((serverDrawing: Drawing) => { .subscribe((serverDrawing: Drawing) => {