Deactivate/activate tools

This commit is contained in:
ziajka
2018-03-13 15:05:50 +01:00
parent c128863d47
commit 31a20c2709
7 changed files with 86 additions and 23 deletions

View File

@ -94,6 +94,7 @@ export class MapComponent implements OnInit, OnChanges, OnDestroy {
} }
this.graphLayout = new GraphLayout(); this.graphLayout = new GraphLayout();
this.graphLayout.connect(this.svg, this.graphContext);
this.graphLayout.getNodesWidget().addOnNodeDraggingCallback((event: any, n: Node) => { this.graphLayout.getNodesWidget().addOnNodeDraggingCallback((event: any, n: Node) => {
const linksWidget = this.graphLayout.getLinksWidget(); const linksWidget = this.graphLayout.getLinksWidget();

View File

@ -2,4 +2,6 @@ import {SVGSelection} from "../../map/models/types";
export interface Tool { export interface Tool {
connect(selection: SVGSelection); connect(selection: SVGSelection);
activate();
deactivate();
} }

View File

@ -0,0 +1,24 @@
import {SVGSelection} from "../../../map/models/types";
import {mouse, select} from "d3-selection";
import {Context} from "../../../map/models/context";
export class MovingTool {
private selection: SVGSelection;
private path;
public connect(selection: SVGSelection, context: Context) {
}
public draw(selection: SVGSelection, context: Context) {
}
public activate() {
}
public deactivate() {
}
}

View File

@ -5,28 +5,22 @@ import {Context} from "../../../map/models/context";
export class SelectionTool { export class SelectionTool {
private selection: SVGSelection; private selection: SVGSelection;
private path; private path;
private context: Context;
public connect(selection: SVGSelection, context: Context) { public connect(selection: SVGSelection, context: Context) {
const self = this;
this.selection = selection; this.selection = selection;
const canvas = this.selection.select<SVGGElement>("g.canvas"); this.context = context;
}
if (!canvas.select<SVGGElement>("g.selection-line-tool").node()) { public activate() {
const g = canvas.append<SVGGElement>('g'); const self = this;
g.attr("class", "selection-line-tool");
this.path = g.append("path");
this.path
.attr("class", "selection")
.attr("visibility", "hidden");
}
const transformation = (p) => { const transformation = (p) => {
const transformation_point = context.getZeroZeroTransformationPoint(); const transformation_point = this.context.getZeroZeroTransformationPoint();
return [p[0] - transformation_point.x, p[1] - transformation_point.y]; return [p[0] - transformation_point.x, p[1] - transformation_point.y];
}; };
selection.on("mousedown", function() { this.selection.on("mousedown", function() {
const subject = select(window); const subject = select(window);
const parent = this.parentElement; const parent = this.parentElement;
@ -43,8 +37,22 @@ export class SelectionTool {
}); });
} }
public draw() { public deactivate() {
this.selection.on('mousedown', null);
}
public draw(selection: SVGSelection, context: Context) {
const canvas = selection.select<SVGGElement>("g.canvas");
if (!canvas.select<SVGGElement>("g.selection-line-tool").node()) {
const g = canvas.append<SVGGElement>('g');
g.attr("class", "selection-line-tool");
this.path = g.append("path");
this.path
.attr("class", "selection")
.attr("visibility", "hidden");
}
} }
private startSelection(start) { private startSelection(start) {

View File

@ -3,6 +3,7 @@ import {SVGSelection} from "../../../map/models/types";
import {Point} from "../models/point.model"; import {Point} from "../models/point.model";
import {line} from "d3-shape"; import {line} from "d3-shape";
import {event, mouse, select} from "d3-selection"; import {event, mouse, select} from "d3-selection";
import {Context} from "../../../map/models/context";
export class DrawingLineWidget { export class DrawingLineWidget {
private drawingLine: DrawingLine = new DrawingLine(); private drawingLine: DrawingLine = new DrawingLine();
@ -23,11 +24,11 @@ export class DrawingLineWidget {
const coordinates = mouse(node); const coordinates = mouse(node);
self.drawingLine.end.x = coordinates[0]; self.drawingLine.end.x = coordinates[0];
self.drawingLine.end.y = coordinates[1]; self.drawingLine.end.y = coordinates[1];
self.draw(); self.draw(null, null);
}; };
this.selection.on('mousemove', over); this.selection.on('mousemove', over);
this.draw(); this.draw(null, null);
} }
public isDrawing() { public isDrawing() {
@ -37,19 +38,20 @@ export class DrawingLineWidget {
public stop() { public stop() {
this.drawing = false; this.drawing = false;
this.selection.on('mousemove', null); this.selection.on('mousemove', null);
this.draw(); this.draw(null, null);
return this.data; return this.data;
} }
public connect(selection: SVGSelection) { public connect(selection: SVGSelection, context: Context) {
this.selection = selection; this.selection = selection;
}
public draw(selection: SVGSelection, context: Context) {
const canvas = this.selection.select<SVGGElement>("g.canvas"); const canvas = this.selection.select<SVGGElement>("g.canvas");
if (!canvas.select<SVGGElement>("g.drawing-line-tool").node()) { if (!canvas.select<SVGGElement>("g.drawing-line-tool").node()) {
canvas.append<SVGGElement>('g').attr("class", "drawing-line-tool"); canvas.append<SVGGElement>('g').attr("class", "drawing-line-tool");
} }
}
public draw() {
let link_data = []; let link_data = [];
if (this.drawing) { if (this.drawing) {

View File

@ -12,6 +12,7 @@ import { DrawingsWidget } from "./drawings.widget";
import { DrawingLineWidget } from "./drawing-line.widget"; import { DrawingLineWidget } from "./drawing-line.widget";
import {SelectionTool} from "../tools/selection-tool"; import {SelectionTool} from "../tools/selection-tool";
import {Tool} from "../tool"; import {Tool} from "../tool";
import {MovingTool} from "../tools/moving-tool";
export class GraphLayout implements Widget { export class GraphLayout implements Widget {
private nodes: Node[] = []; private nodes: Node[] = [];
@ -23,6 +24,7 @@ export class GraphLayout implements Widget {
private drawingsWidget: DrawingsWidget; private drawingsWidget: DrawingsWidget;
private drawingLineTool: DrawingLineWidget; private drawingLineTool: DrawingLineWidget;
private selectionTool: SelectionTool; private selectionTool: SelectionTool;
private movingTool: MovingTool;
private centerZeroZeroPoint = true; private centerZeroZeroPoint = true;
@ -32,6 +34,7 @@ export class GraphLayout implements Widget {
this.drawingsWidget = new DrawingsWidget(); this.drawingsWidget = new DrawingsWidget();
this.drawingLineTool = new DrawingLineWidget(); this.drawingLineTool = new DrawingLineWidget();
this.selectionTool = new SelectionTool(); this.selectionTool = new SelectionTool();
this.movingTool = new MovingTool();
} }
public setNodes(nodes: Node[]) { public setNodes(nodes: Node[]) {
@ -58,6 +61,22 @@ export class GraphLayout implements Widget {
return this.drawingLineTool; return this.drawingLineTool;
} }
public getMovingTool() {
return this.movingTool;
}
public getSelectionTool() {
return this.selectionTool;
}
connect(view: SVGSelection, context: Context) {
this.drawingLineTool.connect(view, context);
this.selectionTool.connect(view, context);
this.movingTool.connect(view, context);
this.selectionTool.activate();
}
draw(view: SVGSelection, context: Context) { draw(view: SVGSelection, context: Context) {
const self = this; const self = this;
@ -81,9 +100,9 @@ export class GraphLayout implements Widget {
this.nodesWidget.draw(canvas, this.nodes); this.nodesWidget.draw(canvas, this.nodes);
this.drawingsWidget.draw(canvas, this.drawings); this.drawingsWidget.draw(canvas, this.drawings);
this.drawingLineTool.draw(view, context);
this.drawingLineTool.connect(view); this.selectionTool.draw(view, context);
this.selectionTool.connect(view, context); this.movingTool.draw(view, context);
// const onZoom = function(this: SVGSVGElement) { // const onZoom = function(this: SVGSVGElement) {
// const e: D3ZoomEvent<SVGSVGElement, any> = event; // const e: D3ZoomEvent<SVGSVGElement, any> = event;

View File

@ -266,6 +266,13 @@ export class ProjectMapComponent implements OnInit {
public toggleMovingMode() { public toggleMovingMode() {
this.movingMode = !this.movingMode; this.movingMode = !this.movingMode;
if (this.movingMode) {
this.mapChild.graphLayout.getSelectionTool().deactivate();
this.mapChild.graphLayout.getMovingTool().activate();
} else {
this.mapChild.graphLayout.getSelectionTool().activate();
this.mapChild.graphLayout.getMovingTool().deactivate();
}
} }
public onChooseInterface(event) { public onChooseInterface(event) {