diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 74e82e1a..17ada7d7 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -72,6 +72,7 @@ import { SnapshotMenuItemComponent } from './components/snapshots/snapshot-menu- import { MATERIAL_IMPORTS } from './material.imports'; import { DrawingService } from './services/drawing.service'; import { ProjectNameValidator } from './components/projects/models/projectNameValidator'; +import { MatSidenavModule } from '@angular/material'; if (environment.production) { @@ -128,6 +129,7 @@ if (environment.production) { PersistenceModule, NgxElectronModule, FileUploadModule, + MatSidenavModule, MATERIAL_IMPORTS ], providers: [ diff --git a/src/app/cartography/cartography.module.ts b/src/app/cartography/cartography.module.ts index 8b9080fd..4f858503 100644 --- a/src/app/cartography/cartography.module.ts +++ b/src/app/cartography/cartography.module.ts @@ -5,6 +5,7 @@ import { MatMenuModule, MatIconModule } from '@angular/material'; import { MapComponent } from './components/map/map.component'; import { DrawLinkToolComponent } from './components/draw-link-tool/draw-link-tool.component'; import { NodeSelectInterfaceComponent } from './components/node-select-interface/node-select-interface.component'; +import { DrawingResizingComponent } from './components/drawing-resizing/drawing-resizing.components'; import { CssFixer } from './helpers/css-fixer'; import { FontFixer } from './helpers/font-fixer'; @@ -20,6 +21,7 @@ import { MapListeners } from './listeners/map-listeners'; import { DraggableListener } from './listeners/draggable-listener'; import { DrawingsEventSource } from './events/drawings-event-source'; import { NodesEventSource } from './events/nodes-event-source'; +import { MapDrawingToSvgConverter } from './converters/map/map-drawing-to-svg-converter'; import { DrawingToMapDrawingConverter } from './converters/map/drawing-to-map-drawing-converter'; import { LabelToMapLabelConverter } from './converters/map/label-to-map-label-converter'; import { LinkToMapLinkConverter } from './converters/map/link-to-map-link-converter'; @@ -50,7 +52,8 @@ import { LinksEventSource } from './events/links-event-source'; declarations: [ MapComponent, DrawLinkToolComponent, - NodeSelectInterfaceComponent + NodeSelectInterfaceComponent, + DrawingResizingComponent ], providers: [ CssFixer, @@ -69,6 +72,7 @@ import { LinksEventSource } from './events/links-event-source'; DrawingsEventSource, NodesEventSource, LinksEventSource, + MapDrawingToSvgConverter, DrawingToMapDrawingConverter, LabelToMapLabelConverter, LinkToMapLinkConverter, diff --git a/src/app/cartography/components/drawing-resizing/drawing-resizing.component.html b/src/app/cartography/components/drawing-resizing/drawing-resizing.component.html new file mode 100644 index 00000000..e69de29b diff --git a/src/app/cartography/components/drawing-resizing/drawing-resizing.component.scss b/src/app/cartography/components/drawing-resizing/drawing-resizing.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/src/app/cartography/components/drawing-resizing/drawing-resizing.component.spec.ts b/src/app/cartography/components/drawing-resizing/drawing-resizing.component.spec.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/app/cartography/components/drawing-resizing/drawing-resizing.components.ts b/src/app/cartography/components/drawing-resizing/drawing-resizing.components.ts new file mode 100644 index 00000000..73c5ee7d --- /dev/null +++ b/src/app/cartography/components/drawing-resizing/drawing-resizing.components.ts @@ -0,0 +1,42 @@ +import { Component, OnInit, ElementRef, OnDestroy, Input, Output, EventEmitter } from '@angular/core'; +import { Subscription } from 'rxjs'; +import { DrawingsEventSource } from '../../events/drawings-event-source'; +import { select } from 'd3-selection'; +import { DrawingsWidget } from '../../widgets/drawings'; +import { MapDrawing } from '../../models/map/map-drawing'; +import { DraggedDataEvent } from '../../events/event-source'; +import { ResizingEnd } from '../../events/resizing'; + +export class DrawingResizedEvent{ + constructor() {}; +} + + +@Component({ + selector: 'app-drawing-resizing', + template: ``, + styleUrls: ['./drawing-resizing.component.scss'] +}) +export class DrawingResizingComponent implements OnInit, OnDestroy{ + private resizingFinished: Subscription; + + @Input('svg') svg: SVGSVGElement; + + constructor( + private drawingsWidget: DrawingsWidget, + private drawingsEventSource: DrawingsEventSource + ) {} + + ngOnInit() { + const svg = select(this.svg); + + this.resizingFinished = this.drawingsWidget.resizingFinished.subscribe((evt: ResizingEnd) => { + console.log("inside component"); + this.drawingsEventSource.resized.emit(new DraggedDataEvent(evt.datum, evt.x, evt.y)); + }); + } + + ngOnDestroy() { + this.resizingFinished.unsubscribe(); + } +} \ No newline at end of file diff --git a/src/app/cartography/components/map/map.component.html b/src/app/cartography/components/map/map.component.html index dc9747ac..526c8968 100644 --- a/src/app/cartography/components/map/map.component.html +++ b/src/app/cartography/components/map/map.component.html @@ -7,4 +7,5 @@ - \ No newline at end of file + + \ No newline at end of file diff --git a/src/app/cartography/components/map/map.component.ts b/src/app/cartography/components/map/map.component.ts index d3879d8b..8518670b 100644 --- a/src/app/cartography/components/map/map.component.ts +++ b/src/app/cartography/components/map/map.component.ts @@ -12,6 +12,7 @@ import { InterfaceLabelWidget } from '../../widgets/interface-label'; import { SelectionTool } from '../../tools/selection-tool'; import { MovingTool } from '../../tools/moving-tool'; import { MapChangeDetectorRef } from '../../services/map-change-detector-ref'; +import { MapLinkCreated } from '../../events/links'; import { CanvasSizeDetector } from '../../helpers/canvas-size-detector'; import { MapListeners } from '../../listeners/map-listeners'; import { DrawingsWidget } from '../../widgets/drawings'; @@ -20,6 +21,7 @@ import { Link } from '../../../models/link'; import { Drawing } from '../../models/drawing'; import { Symbol } from '../../../models/symbol'; import { GraphDataManager } from '../../managers/graph-data-manager'; +import { DraggedDataEvent } from '../../events/event-source'; @Component({ @@ -36,6 +38,10 @@ export class MapComponent implements OnInit, OnChanges, OnDestroy { @Input() width = 1500; @Input() height = 600; + @Output() nodeDragged = new EventEmitter>(); + @Output() drawingDragged = new EventEmitter>(); + @Output() onLinkCreated = new EventEmitter(); + private parentNativeElement: any; private svg: Selection; @@ -83,6 +89,8 @@ export class MapComponent implements OnInit, OnChanges, OnDestroy { @Input('draw-link-tool') drawLinkTool: boolean; + @Input('is-rectangle-chosen') isRectangleChosen: boolean; + @Input('readonly') set readonly(value) { this.nodesWidget.draggingEnabled = !value; this.drawingsWidget.draggingEnabled = !value; @@ -95,12 +103,16 @@ export class MapComponent implements OnInit, OnChanges, OnDestroy { (changes['drawings'] && !changes['drawings'].isFirstChange()) || (changes['nodes'] && !changes['nodes'].isFirstChange()) || (changes['links'] && !changes['links'].isFirstChange()) || - (changes['symbols'] && !changes['symbols'].isFirstChange()) + (changes['symbols'] && !changes['symbols'].isFirstChange() || + (changes['isRectangleChosen'] && !changes['isRectangleChosen'].isFirstChange())) ) { if (this.svg.empty && !this.svg.empty()) { if (changes['symbols']) { this.onSymbolsChange(changes['symbols']); } + if (changes['isRectangleChosen']){ + this.onDrawingRectangleActive(); + } this.changeLayout(); } } @@ -156,10 +168,46 @@ export class MapComponent implements OnInit, OnChanges, OnDestroy { this.graphDataManager.setNodes(this.nodes); this.graphDataManager.setLinks(this.links); this.graphDataManager.setDrawings(this.drawings); - this.graphLayout.draw(this.svg, this.context); } + private onDrawingRectangleActive(){ + var map = document.getElementsByClassName('map')[0]; + console.log(this.drawings); + + map.addEventListener('click', (event: MouseEvent) => { + console.log(event); + + this.svg.select('g.drawings') + .append('g') + .attr("class", 'drawing') + .append('g') + .attr("class", 'drawing_body') + .attr('transform', `translate(${event.clientX-1000},${event.clientY-500}) rotate(0)`) + .append('rect') + .attr('class', 'rect_element noselect') + .attr('fill', '#ffffff') + .attr('fill-opacity', '1') + .attr('stroke', '#000000') + .attr('stroke-width', 2) + .attr('width', 200) + .attr('height', 100); + + let newRectangle = new Drawing; + /*drawing_id: string; + project_id: string; + rotation: number; + svg: string; + x: number; + y: number; + z: number; + is_selected = false; + element: DrawingElement;*/ + + //this.onRectangleCreated.emit(null); + }, {once : true}); + } + @HostListener('window:resize', ['$event']) onResize(event) { this.changeLayout(); diff --git a/src/app/cartography/converters/map/map-drawing-to-svg-converter.ts b/src/app/cartography/converters/map/map-drawing-to-svg-converter.ts new file mode 100644 index 00000000..f227a210 --- /dev/null +++ b/src/app/cartography/converters/map/map-drawing-to-svg-converter.ts @@ -0,0 +1,15 @@ +import { Injectable } from '@angular/core'; + +import { Converter } from '../converter'; +import { MapDrawing } from '../../models/map/map-drawing'; + + +@Injectable() +export class MapDrawingToSvgConverter implements Converter { + constructor( + ) {} + + convert(mapDrawing: MapDrawing) { + return ""; + } +} \ No newline at end of file diff --git a/src/app/cartography/events/drawings-event-source.ts b/src/app/cartography/events/drawings-event-source.ts index 40e1093e..8688ae96 100644 --- a/src/app/cartography/events/drawings-event-source.ts +++ b/src/app/cartography/events/drawings-event-source.ts @@ -6,4 +6,5 @@ import { MapDrawing } from "../models/map/map-drawing"; @Injectable() export class DrawingsEventSource { public dragged = new EventEmitter>(); + public resized = new EventEmitter>(); } diff --git a/src/app/cartography/events/event-source.ts b/src/app/cartography/events/event-source.ts index c6a2368a..3f03ee97 100644 --- a/src/app/cartography/events/event-source.ts +++ b/src/app/cartography/events/event-source.ts @@ -7,3 +7,13 @@ export class DataEventSource { } export class DraggedDataEvent extends DataEventSource {} + +export class ResizedDataEvent { + constructor( + public datum: T, + public x: number, + public y: number, + public width: number, + public height: number) { + } +} diff --git a/src/app/cartography/events/resizing.ts b/src/app/cartography/events/resizing.ts new file mode 100644 index 00000000..7ce2cc1b --- /dev/null +++ b/src/app/cartography/events/resizing.ts @@ -0,0 +1,7 @@ +export class ResizingEnd { + public datum: T; + public x: number; + public y: number; + public width: number; + public height: number; +} \ No newline at end of file diff --git a/src/app/cartography/widgets/drawing.ts b/src/app/cartography/widgets/drawing.ts index 14f1a104..9d62fedc 100644 --- a/src/app/cartography/widgets/drawing.ts +++ b/src/app/cartography/widgets/drawing.ts @@ -9,7 +9,9 @@ import { RectDrawingWidget } from "./drawings/rect-drawing"; import { LineDrawingWidget } from "./drawings/line-drawing"; import { EllipseDrawingWidget } from "./drawings/ellipse-drawing"; import { MapDrawing } from "../models/map/map-drawing"; - +import { drag } from "d3-drag"; +import { event } from "d3-selection"; +import { SelectionManager } from "../managers/selection-manager"; @Injectable() export class DrawingWidget implements Widget { @@ -20,7 +22,8 @@ export class DrawingWidget implements Widget { private imageDrawingWidget: ImageDrawingWidget, private rectDrawingWidget: RectDrawingWidget, private lineDrawingWidget: LineDrawingWidget, - private ellipseDrawingWidget: EllipseDrawingWidget + private ellipseDrawingWidget: EllipseDrawingWidget, + private selectionManager: SelectionManager ) { this.drawingWidgets = [ this.textDrawingWidget, @@ -33,17 +36,88 @@ export class DrawingWidget implements Widget { public draw(view: SVGSelection) { const drawing_body = view.selectAll("g.drawing_body") - .data((l) => [l]); + .data((l:MapDrawing) => [l]); const drawing_body_enter = drawing_body.enter() .append('g') - .attr("class", "drawing_body"); + .attr("class", "drawing_body") + + drawing_body_enter + .append('line') + .attr("class", "top"); + + drawing_body_enter + .append('line') + .attr("class", "bottom"); + + drawing_body_enter + .append('line') + .attr("class", "right"); + + drawing_body_enter + .append('line') + .attr("class", "left"); const drawing_body_merge = drawing_body.merge(drawing_body_enter) .attr('transform', (d: MapDrawing) => { return `translate(${d.x},${d.y}) rotate(${d.rotation})`; }); - + + drawing_body_merge + .select('line.top') + .attr('stroke', 'transparent') + .attr('stroke-width', '8px') + // .attr('stroke-dashoffset', '0') + // .attr('stroke-dasharray', '3') + .attr('x1', '0') + .attr('x2', (drawing) => drawing.element.width) + .attr('y1', '0') + .attr('y2', '0') + .attr('draggable', 'true') + .attr("cursor", "ns-resize"); + + drawing_body_merge + .select('line.bottom') + .attr('stroke', 'transparent') + .attr('stroke-width', '8px') + // .attr('stroke-dashoffset', '0') + // .attr('stroke-dasharray', '3') + .attr('x1', '0') + .attr('x2', (drawing) => drawing.element.width) + .attr('y1', (drawing) => drawing.element.height) + .attr('y2', (drawing) => drawing.element.height) + .attr('draggable', 'true') + .attr("cursor", "ns-resize"); + + drawing_body_merge + .select('line.right') + .attr('stroke', 'transparent') + .attr('stroke-width', '8px') + // .attr('stroke-dashoffset', '0') + // .attr('stroke-dasharray', '3') + .attr('x1', '0') + .attr('x2', '0') + .attr('y1', '0') + .attr('y2', (drawing) => drawing.element.height) + .attr('draggable', 'true') + .attr("cursor", "ew-resize"); + + drawing_body_merge + .select('line.left') + .attr('stroke', 'transparent') + .attr('stroke-width', '8px') + // .attr('stroke-dashoffset', '0') + // .attr('stroke-dasharray', '3') + .attr('x1', (drawing) => drawing.element.width) + .attr('x2', (drawing) => drawing.element.width) + .attr('y1', '0') + .attr('y2', (drawing) => drawing.element.height) + .attr('draggable', 'true') + .attr("cursor", "ew-resize"); + + drawing_body_merge + .classed('selected', (n: MapDrawing) => this.selectionManager.isSelected(n)); + this.drawingWidgets.forEach((widget) => { widget.draw(drawing_body_merge); }); diff --git a/src/app/cartography/widgets/drawings.ts b/src/app/cartography/widgets/drawings.ts index d20988a9..599f29ad 100644 --- a/src/app/cartography/widgets/drawings.ts +++ b/src/app/cartography/widgets/drawings.ts @@ -1,18 +1,24 @@ -import { Injectable } from "@angular/core"; +import { Injectable, EventEmitter } from "@angular/core"; import { Widget } from "./widget"; import { SVGSelection } from "../models/types"; import { Layer } from "../models/layer"; import { SvgToDrawingConverter } from "../helpers/svg-to-drawing-converter"; -import { Draggable } from "../events/draggable"; +import { Draggable, DraggableDrag, DraggableStart, DraggableEnd } from "../events/draggable"; import { DrawingWidget } from "./drawing"; +import { drag, D3DragEvent } from "d3-drag"; +import { event } from "d3-selection"; import { MapDrawing } from "../models/map/map-drawing"; +import { Context } from "../models/context"; +import { EllipseElement } from "../models/drawings/ellipse-element"; +import { ResizingEnd } from "../events/resizing"; @Injectable() export class DrawingsWidget implements Widget { public draggable = new Draggable(); public draggingEnabled = false; + public resizingFinished = new EventEmitter>(); // public onContextMenu = new EventEmitter(); // public onDrawingClicked = new EventEmitter(); @@ -22,6 +28,7 @@ export class DrawingsWidget implements Widget { constructor( private drawingWidget: DrawingWidget, private svgToDrawingConverter: SvgToDrawingConverter, + private context: Context ) { this.svgToDrawingConverter = new SvgToDrawingConverter(); } @@ -62,6 +69,123 @@ export class DrawingsWidget implements Widget { if (this.draggingEnabled) { this.draggable.call(merge); } + + let bottom = drag() + .on('start', (datum: MapDrawing) => { + document.body.style.cursor = "ns-resize"; + }) + .on('drag', (datum: MapDrawing) => { + const evt = event; + + if (datum.element instanceof EllipseElement){ + (datum.element as EllipseElement).cy = (datum.element as EllipseElement).cy + evt.dy/2 < 0 ? 1 : (datum.element as EllipseElement).cy += evt.dy/2; + (datum.element as EllipseElement).ry = (datum.element as EllipseElement).ry + evt.dy/2 < 0 ? 1 : (datum.element as EllipseElement).ry += evt.dy/2; + } + datum.element.height = (datum.element.height + evt.dy) < 0 ? 1: datum.element.height += evt.dy; + this.redrawDrawing(view, datum); + }) + .on('end', (datum: MapDrawing) => { + document.body.style.cursor = "initial"; + + const evt = new ResizingEnd(); + evt.x = datum.x; + evt.y = datum. y; + evt.width = datum.element.width; + evt.height = datum.element.height; + evt.datum = datum; + + this.resizingFinished.emit(evt); + }); + + let y: number; + let dy: number; + let top = drag() + .on('start', () => { + y = event.sourceEvent.clientY - this.context.getZeroZeroTransformationPoint().y; + document.body.style.cursor = "ns-resize"; + }) + .on('drag', (datum: MapDrawing) => { + const evt = event; + dy = y - (evt.sourceEvent.clientY - this.context.getZeroZeroTransformationPoint().y); + y = evt.sourceEvent.clientY - this.context.getZeroZeroTransformationPoint().y; + + if ((datum.element.height + dy) < 0){ + datum.element.height = 1; + } else { + datum.y = evt.sourceEvent.clientY - this.context.getZeroZeroTransformationPoint().y; + datum.element.height += dy; + if (datum.element instanceof EllipseElement) { + (datum.element as EllipseElement).cy = (datum.element as EllipseElement).cy + dy/2 < 0 ? 1 : (datum.element as EllipseElement).cy += dy/2; + (datum.element as EllipseElement).ry = (datum.element as EllipseElement).ry + dy/2 < 0 ? 1 : (datum.element as EllipseElement).ry += dy/2; + } + } + this.redrawDrawing(view, datum); + }) + .on('end', (datum: MapDrawing) => { + document.body.style.cursor = "initial"; + }); + + let x: number; + let dx: number; + let right = drag() + .on('start', () => { + x = event.sourceEvent.clientX - this.context.getZeroZeroTransformationPoint().x; + document.body.style.cursor = "ew-resize"; + }) + .on('drag', (datum: MapDrawing) => { + const evt = event; + dx = x - (evt.sourceEvent.clientX - this.context.getZeroZeroTransformationPoint().x); + x = evt.sourceEvent.clientX - this.context.getZeroZeroTransformationPoint().x; + + if ((datum.element.width + dx) < 0){ + datum.element.width = 1; + } else { + datum.x = evt.sourceEvent.clientX - this.context.getZeroZeroTransformationPoint().x; + datum.element.width += dx; + if (datum.element instanceof EllipseElement) { + (datum.element as EllipseElement).cx = (datum.element as EllipseElement).cx + dx/2 < 0 ? 1 : (datum.element as EllipseElement).cx += dx/2; + (datum.element as EllipseElement).rx = (datum.element as EllipseElement).rx + dx/2 < 0 ? 1 : (datum.element as EllipseElement).rx += dx/2; + } + } + this.redrawDrawing(view, datum); + }) + .on('end', (datum: MapDrawing) => { + document.body.style.cursor = "initial"; + }); + + let left = drag() + .on('start', () => { + document.body.style.cursor = "ew-resize"; + }) + .on('drag', (datum: MapDrawing) => { + const evt = event; + + if (datum.element instanceof EllipseElement){ + (datum.element as EllipseElement).cx = (datum.element as EllipseElement).cx + evt.dx/2 < 0 ? 1 : (datum.element as EllipseElement).cx += evt.dx/2; + (datum.element as EllipseElement).rx = (datum.element as EllipseElement).rx + evt.dx/2 < 0 ? 1 : (datum.element as EllipseElement).rx += evt.dx/2; + } + datum.element.width = (datum.element.width + evt.dx) < 0 ? 1 : datum.element.width += evt.dx; + this.redrawDrawing(view, datum); + }) + .on('end', (datum: MapDrawing) => { + document.body.style.cursor = "initial"; + }); + + merge + .select('line.bottom') + .call(bottom); + + merge + .select('line.top') + .call(top); + + merge + .select('line.right') + .call(right); + + merge + .select('line.left') + .call(left); } private selectDrawing(view: SVGSelection, drawing: MapDrawing) { diff --git a/src/app/cartography/widgets/drawings/rect-drawing.ts b/src/app/cartography/widgets/drawings/rect-drawing.ts index ba909184..25cc2b7c 100644 --- a/src/app/cartography/widgets/drawings/rect-drawing.ts +++ b/src/app/cartography/widgets/drawings/rect-drawing.ts @@ -19,7 +19,7 @@ export class RectDrawingWidget implements DrawingShapeWidget { .data((d: MapDrawing) => { return (d.element && d.element instanceof RectElement) ? [d.element] : []; }); - + const drawing_enter = drawing .enter() .append('rect') diff --git a/src/app/components/project-map/project-map.component.css b/src/app/components/project-map/project-map.component.css index 6faa7976..9ee25bdb 100644 --- a/src/app/components/project-map/project-map.component.css +++ b/src/app/components/project-map/project-map.component.css @@ -18,6 +18,69 @@ g.node:hover { box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); } +.draw-menu{ + position: fixed; + background: transparent; + top: 20px; + left: 92px; + width: 320px !important; + height: 72px !important; +} + +.draw-menu2{ + position: fixed; + background: transparent; + top: 20px; + left: 92px; + width: 320px !important; + height: 72px !important; + box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); +} + +.draw-menu button{ + outline: none; +} + +.drawer-container{ + height: 72px !important; + background: transparent; +} + +.drawer{ + width: 320px !important; + height: 72px !important; + background:#263238; +} + +.drawer-content{ + background: transparent; +} + +.drawer-button{ + height: 72px; + width: 64px!important; + background: #263238; + padding: 0; + border: none; + outline: none; + background-color: transparent; +} + +.drawer-arrow-button{ + width: 40px; + height: 72px; + padding-top: 16px; + background:#263238; + position: fixed; + box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); +} + +.drawer-buttons{ + background:#263238; + padding-top: 16px; + height: 72px; +} + .project-toolbar .mat-toolbar-multiple-rows { width: auto !important; } @@ -41,6 +104,10 @@ svg.map image:hover, svg.map image.chosen, g.selected { filter: url("#grayscale"); /* Chrome doesn't support CSS filters on SVG */ } +g.selected line { + stroke: black; +} + path.selected { stroke: darkred; } diff --git a/src/app/components/project-map/project-map.component.html b/src/app/components/project-map/project-map.component.html index f3e02314..f84a8930 100644 --- a/src/app/components/project-map/project-map.component.html +++ b/src/app/components/project-map/project-map.component.html @@ -11,6 +11,11 @@ [moving-tool]="tools.moving" [draw-link-tool]="tools.draw_link" [readonly]="inReadOnlyMode" + [is-rectangle-chosen]="drawTools.isRectangleChosen" + (nodeDragged)="onNodeDragged($event)" + (drawingDragged)="onDrawingDragged($event)" + (onLinkCreated)="onLinkCreated($event)" + (onDrawingResized)="onDrawingResized($event)" >
@@ -77,6 +82,42 @@
+
+ + +
+ + + + + +
+
+ +
+ +
+
+
+
+ diff --git a/src/app/components/project-map/project-map.component.ts b/src/app/components/project-map/project-map.component.ts index a3ecd2de..cf35f564 100644 --- a/src/app/components/project-map/project-map.component.ts +++ b/src/app/components/project-map/project-map.component.ts @@ -37,6 +37,7 @@ import { MapNode } from '../../cartography/models/map/map-node'; import { LinksEventSource } from '../../cartography/events/links-event-source'; import { MapDrawing } from '../../cartography/models/map/map-drawing'; import { MapPortToPortConverter } from '../../cartography/converters/map/map-port-to-port-converter'; +import { MapDrawingToSvgConverter } from '../../cartography/converters/map/map-drawing-to-svg-converter'; @Component({ @@ -62,6 +63,10 @@ export class ProjectMapComponent implements OnInit, OnDestroy { 'draw_link': false }; + protected drawTools = { + 'isRectangleChosen': false + }; + private inReadOnlyMode = false; @ViewChild(MapComponent) mapChild: MapComponent; @@ -89,7 +94,8 @@ export class ProjectMapComponent implements OnInit, OnDestroy { private drawingsDataSource: DrawingsDataSource, private nodesEventSource: NodesEventSource, private drawingsEventSource: DrawingsEventSource, - private linksEventSource: LinksEventSource + private linksEventSource: LinksEventSource, + private mapDrawingToSvgConverter: MapDrawingToSvgConverter ) {} ngOnInit() { @@ -164,6 +170,10 @@ export class ProjectMapComponent implements OnInit, OnDestroy { this.drawingsEventSource.dragged.subscribe((evt) => this.onDrawingDragged(evt)) ); + this.subscriptions.push( + this.drawingsEventSource.resized.subscribe((evt) => this.onDrawingResized(evt)) + ); + this.subscriptions.push( this.linksEventSource.created.subscribe((evt) => this.onLinkCreated(evt)) ); @@ -272,6 +282,25 @@ export class ProjectMapComponent implements OnInit, OnDestroy { }); } + private onDrawingResized(resizedEvent: DraggedDataEvent) { + console.log("ready to save"); + + const drawing = this.drawingsDataSource.get(resizedEvent.datum.id); + console.log(resizedEvent.datum.svg); + + let svgString = this.mapDrawingToSvgConverter.convert(resizedEvent.datum); + console.log(resizedEvent.datum); + + /* + this.drawingService + .updatePosition(this.server, drawing, drawing.x, drawing.y) + .subscribe((serverDrawing: Drawing) => { + //this.drawingsDataSource.update(serverDrawing); + // + console.log(serverDrawing.svg); + });*/ + } + public set readonly(value) { this.inReadOnlyMode = value; if (value) { @@ -296,10 +325,18 @@ export class ProjectMapComponent implements OnInit, OnDestroy { this.tools.draw_link = !this.tools.draw_link; } + public onRectangleCreated(rectangleCreated: any) { + this.drawTools.isRectangleChosen = false; + } + public toggleShowInterfaceLabels(enabled: boolean) { this.project.show_interface_labels = enabled; } + public drawRectangle() { + this.drawTools.isRectangleChosen = !this.drawTools.isRectangleChosen; + } + public ngOnDestroy() { this.drawingsDataSource.clear(); this.nodesDataSource.clear();