From 582affb8638104a4288f4bd74716829451e7aaab Mon Sep 17 00:00:00 2001
From: Andrea Gottsponer <ago@attr.ch>
Date: Fri, 17 Jan 2020 15:26:37 +0100
Subject: [PATCH] - updates

---
 package-lock.json                             |  2 +-
 package.json                                  |  4 +--
 src/app/index.ts                              | 36 +++++++++++++++----
 .../elements/collections/LegendCollection.ts  | 10 ++++++
 src/lib/elements/connections/Line.ts          | 16 ++++-----
 .../elements/positionings/PositionPoint.ts    |  2 +-
 src/lib/elements/primitives/ArrowPrimitive.ts | 31 +++++++++-------
 .../elements/primitives/EllipsePrimitive.ts   | 21 ++++++-----
 .../elements/primitives/RectanglePrimitive.ts | 23 +++++++-----
 src/lib/elements/primitives/TextPrimitive.ts  | 11 ++++--
 src/lib/generators/TextPrimitiveGenerator.ts  |  9 ++++-
 11 files changed, 112 insertions(+), 53 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 7d4a235a..1b059640 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
 {
   "name": "medsurf-draw",
-  "version": "1.0.12",
+  "version": "1.0.13",
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
diff --git a/package.json b/package.json
index 0347f967..e673d78e 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "medsurf-draw",
-  "version": "1.0.12",
+  "version": "1.0.13",
   "description": "Draw annotations on jpg/zoomify images, based on PIXI.js",
   "keywords": [
     "draw",
@@ -10,7 +10,7 @@
     "zoomify",
     "marker"
   ],
-  "homepage": "https://iml.unibe.ch",
+  "homepage": "https://www.iml.unibe.ch",
   "repository": {
     "type": "git",
     "url": "https://git-repo.iml.unibe.ch/iml-open-source/medsurf-draw.git"
diff --git a/src/app/index.ts b/src/app/index.ts
index d078907b..d640d2e5 100644
--- a/src/app/index.ts
+++ b/src/app/index.ts
@@ -374,10 +374,18 @@ PIXI.Renderer.registerPlugin('bla', bla);
                 positionPoint: point5.model,
                 rotateWithLine: false,
                 text: "Hello Text",
+                rectangle: {
+                    x: 60,
+                    y: 0,
+                    width: 0,
+                    height: 0,
+                },
                 style: {
                     fill: 0xFFFFFF,
                     fontSize: 22,
                     fontFamily: "proxima_nova_altsemibold",
+                    align: 'left',
+                    wordWrap: false,
                 }
             });
             point5.addChild(text);
@@ -768,7 +776,9 @@ PIXI.Renderer.registerPlugin('bla', bla);
                 style: {
                     fill: 0xFFFFFF,
                     fontSize: 22,
-                    fontFamily: 'proxima_nova_altsemibold'
+                    fontFamily: 'proxima_nova_altsemibold',
+                    align: 'left',
+                    wordWrap: true,
                 },
                 col: legendColumn1
             };
@@ -780,7 +790,9 @@ PIXI.Renderer.registerPlugin('bla', bla);
                 style: {
                     fill: 0xFFFFFF,
                     fontSize: 22,
-                    fontFamily: 'proxima_nova_altsemibold'
+                    fontFamily: 'proxima_nova_altsemibold',
+                    align: 'left',
+                    wordWrap: true,
                 },
                 col: legendColumn1
             };
@@ -792,7 +804,9 @@ PIXI.Renderer.registerPlugin('bla', bla);
                 style: {
                     fill: 0xFFFFFF,
                     fontSize: 22,
-                    fontFamily: 'proxima_nova_altsemibold'
+                    fontFamily: 'proxima_nova_altsemibold',
+                    align: 'left',
+                    wordWrap: true,
                 },
                 col: legendColumn1
             };
@@ -811,7 +825,9 @@ PIXI.Renderer.registerPlugin('bla', bla);
                 style: {
                     fill: 0xFFFFFF,
                     fontSize: 22,
-                    fontFamily: 'proxima_nova_altsemibold'
+                    fontFamily: 'proxima_nova_altsemibold',
+                    align: 'left',
+                    wordWrap: true,
                 },
                 col: legendColumn2
             };
@@ -823,7 +839,9 @@ PIXI.Renderer.registerPlugin('bla', bla);
                 style: {
                     fill: 0xFFFFFF,
                     fontSize: 22,
-                    fontFamily: 'proxima_nova_altsemibold'
+                    fontFamily: 'proxima_nova_altsemibold',
+                    align: 'left',
+                    wordWrap: true,
                 },
                 col: legendColumn2
             };
@@ -842,7 +860,9 @@ PIXI.Renderer.registerPlugin('bla', bla);
                 style: {
                     fill: 0xFFFFFF,
                     fontSize: 22,
-                    fontFamily: 'proxima_nova_altsemibold'
+                    fontFamily: 'proxima_nova_altsemibold',
+                    align: 'left',
+                    wordWrap: true,
                 },
                 col: legendColumn3
             };
@@ -854,7 +874,9 @@ PIXI.Renderer.registerPlugin('bla', bla);
                 style: {
                     fill: 0xFFFFFF,
                     fontSize: 22,
-                    fontFamily: 'proxima_nova_altsemibold'
+                    fontFamily: 'proxima_nova_altsemibold',
+                    align: 'left',
+                    wordWrap: true,
                 },
                 col: legendColumn3
             };
diff --git a/src/lib/elements/collections/LegendCollection.ts b/src/lib/elements/collections/LegendCollection.ts
index 305190f3..41526485 100644
--- a/src/lib/elements/collections/LegendCollection.ts
+++ b/src/lib/elements/collections/LegendCollection.ts
@@ -68,6 +68,8 @@ export class LegendCollection extends BaseElementContainer<Models.LegendCollecti
     protected readonly _fillColorDefault: number = 0xFFFFFF;
     protected readonly _fontSizeDefault: number = 12;
     protected readonly _fontFamilyDefault: string = "proxima_nova_altsemibold";
+    protected readonly _alignDefault: string = "left";
+    protected readonly _wordWrapDefault: boolean = false;
     // TODO rowDistance std -> 14
     // TODO colDistance std -> 14
     // TODO indexWidth std -> 14
@@ -239,6 +241,10 @@ export class LegendCollection extends BaseElementContainer<Models.LegendCollecti
 
                 numberElement.text = index.toString();
 
+                // @ts-ignore
+                textElement._textElement.style.breakWords = true;
+                // @ts-ignore
+                textElement._textElement.style.wordWrap = true;
                 // @ts-ignore
                 textElement._textElement.style.wordWrapWidth = colWidth - this._enumerationPadding;
 
@@ -319,6 +325,8 @@ export class LegendCollection extends BaseElementContainer<Models.LegendCollecti
                 fill: this._fillColorDefault,
                 fontSize: this._fontSizeDefault,
                 fontFamily: this._fontFamilyDefault,
+                align: this._alignDefault,
+                wordWrap: this._wordWrapDefault,
             },
             col: legendColumn,
         };
@@ -401,6 +409,8 @@ export class LegendCollection extends BaseElementContainer<Models.LegendCollecti
                 fill: this._fillColorDefault,
                 fontSize: this._fontSizeDefault,
                 fontFamily: this._fontFamilyDefault,
+                align: this._alignDefault,
+                wordWrap: this._wordWrapDefault,
             },
             col: this.model.cols[col]
         });
diff --git a/src/lib/elements/connections/Line.ts b/src/lib/elements/connections/Line.ts
index 0ec084ab..cf818f12 100644
--- a/src/lib/elements/connections/Line.ts
+++ b/src/lib/elements/connections/Line.ts
@@ -76,8 +76,6 @@ export class Line extends BaseElementContainer<Models.Line> {
      * Design
      */
     protected readonly _strokeWidth: number = 2;
-
-    protected readonly _lineWidth: number = 2;
     protected readonly _lineAlphaDefault: number = 1;
     protected readonly _lineColorDefault: number = 0xFFFFFF;
     protected readonly _lineColorSelected: number = 0x4a90e2;
@@ -293,7 +291,7 @@ export class Line extends BaseElementContainer<Models.Line> {
 
             if (startLines.length == 0 && endLines.length == 0) {
                 // No matching control points
-                this._lineElement.lineStyle(this._lineWidth, this._lineColor, this._lineAlpha);
+                this._lineElement.lineStyle(this.model.strokeWidth, this._lineColor, this._lineAlpha);
                 this._lineElement.moveTo(this.graphicLine.start.x, this.graphicLine.start.y);
                 this._lineElement.lineTo(this.graphicLine.end.x, this.graphicLine.end.y);
             }
@@ -429,7 +427,7 @@ export class Line extends BaseElementContainer<Models.Line> {
                     this._controlPointsElement.endFill();
                 }
 
-                this._lineElement.lineStyle(this._lineWidth, this._lineColor, this._lineAlpha);
+                this._lineElement.lineStyle(this.model.strokeWidth, this._lineColor, this._lineAlpha);
                 this._lineElement.moveTo(startPoint.x, startPoint.y);
                 if (startPoint.x == endPoint.x && endPoint.x == controlPoint.x || startPoint.y == endPoint.y && endPoint.y == controlPoint.y || Math.abs(Math.round((startPoint.x * (endPoint.y - controlPoint.y) + endPoint.x * (controlPoint.y - startPoint.y) + controlPoint.x * (startPoint.y - endPoint.y)) * 100000) / 100000) == 0) {
                     this._lineElement.lineTo(endPoint.x, endPoint.y);
@@ -573,7 +571,7 @@ export class Line extends BaseElementContainer<Models.Line> {
                     this._controlPointsElement.endFill();
                 }
 
-                this._lineElement.lineStyle(this._lineWidth, this._lineColor, this._lineAlpha);
+                this._lineElement.lineStyle(this.model.strokeWidth, this._lineColor, this._lineAlpha);
                 this._lineElement.moveTo(this.graphicLine.start.x, this.graphicLine.start.y);
                 this._lineElement.bezierCurveTo(controlPointsPrevious.c2.x, controlPointsPrevious.c2.y, controlPointsNext.c1.x, controlPointsNext.c1.y, this.graphicLine.end.x, this.graphicLine.end.y);
                 this.graphicLine.type = LineTypes.BEZIER;
@@ -581,7 +579,7 @@ export class Line extends BaseElementContainer<Models.Line> {
                 this.graphicLine.controlEnd = controlPointsNext.c1;
             }
         } else {
-            this._lineElement.lineStyle(this._lineWidth, this._lineColor, this._lineAlpha);
+            this._lineElement.lineStyle(this.model.strokeWidth, this._lineColor, this._lineAlpha);
             this._lineElement.moveTo(this.graphicLine.start.x, this.graphicLine.start.y);
             this._lineElement.lineTo(this.graphicLine.end.x, this.graphicLine.end.y);
         }
@@ -590,10 +588,10 @@ export class Line extends BaseElementContainer<Models.Line> {
 
         // TODO better resolution for circles or better calculation
         this._lineCornerElement.clear();
-        this._lineCornerElement.lineStyle(this._lineWidth / 2, this._lineColor, this._lineAlpha);
+        this._lineCornerElement.lineStyle(this.model.strokeWidth / 2, this._lineColor, this._lineAlpha);
         this._lineCornerElement.beginFill(this._lineColor, this._lineAlpha);
-        this._lineCornerElement.drawCircle(this.graphicLine.start.x, this.graphicLine.start.y, this._lineWidth / 4);
-        this._lineCornerElement.drawCircle(this.graphicLine.end.x, this.graphicLine.end.y, this._lineWidth / 4);
+        this._lineCornerElement.drawCircle(this.graphicLine.start.x, this.graphicLine.start.y, this.model.strokeWidth / 4);
+        this._lineCornerElement.drawCircle(this.graphicLine.end.x, this.graphicLine.end.y, this.model.strokeWidth / 4);
 
         this._lineCornerElement.endFill();
 
diff --git a/src/lib/elements/positionings/PositionPoint.ts b/src/lib/elements/positionings/PositionPoint.ts
index 17ff9ee4..b33ee993 100644
--- a/src/lib/elements/positionings/PositionPoint.ts
+++ b/src/lib/elements/positionings/PositionPoint.ts
@@ -91,7 +91,7 @@ export class PositionPoint extends BaseElementContainer<Models.PositionPoint> {
         this._fillColor = this.model.isSelftest ? this._lineColorSelftest : this._fillColorNormal;
 
         // Position
-        this.position.set(model.position.x, model.position.y);
+        this.position.set(this.model.position.x, this.model.position.y);
 
         // Events
         this.modeInteraction = new ModeInteraction(this);
diff --git a/src/lib/elements/primitives/ArrowPrimitive.ts b/src/lib/elements/primitives/ArrowPrimitive.ts
index 4c4cc008..3505ff95 100644
--- a/src/lib/elements/primitives/ArrowPrimitive.ts
+++ b/src/lib/elements/primitives/ArrowPrimitive.ts
@@ -34,6 +34,7 @@ export class ArrowPrimitive extends BaseElementContainer<Models.ArrowPrimitive>
      * Members
      */
     protected _fillColor: number;
+    protected _rectangle: PIXI.Rectangle;
 
     /**
      * Interactions
@@ -100,11 +101,15 @@ export class ArrowPrimitive extends BaseElementContainer<Models.ArrowPrimitive>
         // Setup
         this.zIndex = 300; // TODO how to implement moveToFront etc...
         this._fillColor = this.model.options.fillColor;
+        this._rectangle = new PIXI.Rectangle(0, 0, this.model.rectangle.width, this.model.rectangle.height);
         /* TODO remove
         this._rectangle = rectangle;
         this._color = color || 0xFFFFFF;
         */
 
+        // Position
+        this.position.set(this.model.rectangle.x, this.model.rectangle.y);
+
         // Events
         this.modeInteraction = new ModeInteraction(this);
         // Viewer
@@ -155,7 +160,7 @@ export class ArrowPrimitive extends BaseElementContainer<Models.ArrowPrimitive>
         this._arrowElement = new PIXI.Graphics();
         this._rotateContainer.addChild(this._arrowElement);
 
-        this._wedgePointElement = this.model.wedgePoint ? new PointElement(this.model.wedgePoint.x, this.model.wedgePoint.y) : new PointElement(this.model.rectangle.x + this.model.rectangle.width, this.model.rectangle.y + this.model.rectangle.height / 2);
+        this._wedgePointElement = this.model.wedgePoint ? new PointElement(this.model.wedgePoint.x, this.model.wedgePoint.y) : new PointElement(this._rectangle.x + this._rectangle.width, this._rectangle.y + this._rectangle.height / 2);
         this._wedgePointElement.on("onMove", this._onWedgeMove, this);
 
         this._configurationElement = new ConfigurationElement(this.modeInteraction);
@@ -248,11 +253,11 @@ export class ArrowPrimitive extends BaseElementContainer<Models.ArrowPrimitive>
         if (this._fillColor) {
             this._arrowElement.beginFill(this._fillColor);
         }
-        this._arrowElement.moveTo(this.model.rectangle.x, this.model.rectangle.y + this.model.rectangle.height / 2);
-        this._arrowElement.lineTo(this.model.rectangle.x + this.model.rectangle.width, this.model.rectangle.y);
+        this._arrowElement.moveTo(this._rectangle.x, this._rectangle.y + this._rectangle.height / 2);
+        this._arrowElement.lineTo(this._rectangle.x + this._rectangle.width, this._rectangle.y);
         this._arrowElement.lineTo(this._wedgePointElement.position.x, this._wedgePointElement.position.y);
-        this._arrowElement.lineTo(this.model.rectangle.x + this.model.rectangle.width, this.model.rectangle.y + this.model.rectangle.height);
-        this._arrowElement.lineTo(this.model.rectangle.x, this.model.rectangle.y + this.model.rectangle.height / 2);
+        this._arrowElement.lineTo(this._rectangle.x + this._rectangle.width, this._rectangle.y + this._rectangle.height);
+        this._arrowElement.lineTo(this._rectangle.x, this._rectangle.y + this._rectangle.height / 2);
         this._arrowElement.endFill();
 
         // @ts-ignore
@@ -645,8 +650,8 @@ export class ArrowPrimitive extends BaseElementContainer<Models.ArrowPrimitive>
 
     protected _onMove(event: PIXI.interaction.InteractionEvent, dX: number, dY: number): void {
         if (Keyboard.isKeyDown("ControlLeft") || Keyboard.isKeyDown("ControlRight")) {
-            this.position.x += dX;
-            this.position.y += dY;
+            this.model.rectangle.x = this.position.x += dX;
+            this.model.rectangle.y = this.position.y += dY;
         } else {
             this.parent.emit("onMove", event, dX, dY);
         }
@@ -674,7 +679,7 @@ export class ArrowPrimitive extends BaseElementContainer<Models.ArrowPrimitive>
     }
 
     protected _onScale(dX: number, dY: number, dW: number, dH: number): void {
-        if (this.model.rectangle.width + dW < 1) {
+        if (this._rectangle.width + dW < 1) {
             return;
             /*
             dW = 1 - this._ellipse.width;
@@ -682,7 +687,7 @@ export class ArrowPrimitive extends BaseElementContainer<Models.ArrowPrimitive>
             dY = 0;
             */
         }
-        if (this.model.rectangle.height + dH < 1) {
+        if (this._rectangle.height + dH < 1) {
             return;
             /*
             dH = 1 - this._ellipse.height;
@@ -692,8 +697,8 @@ export class ArrowPrimitive extends BaseElementContainer<Models.ArrowPrimitive>
         }
 
         // Element
-        this.model.rectangle.width += dW;
-        this.model.rectangle.height += dH;
+        this.model.rectangle.width = this._rectangle.width += dW;
+        this.model.rectangle.height = this._rectangle.height += dH;
 
         // Position TODO not needed ??
         // this.position.x += (dX + dW / 2) * Math.cos(this.rotation) - (dY + dH / 2) * Math.sin(this.rotation);
@@ -831,7 +836,7 @@ export class ArrowPrimitive extends BaseElementContainer<Models.ArrowPrimitive>
 
     //<editor-fold desc="BaseContainer">
     public getRectangle(): PIXI.Rectangle {
-        return new PIXI.Rectangle(this.model.rectangle.x, this.model.rectangle.y, this.model.rectangle.width, this.model.rectangle.height);
+        return new PIXI.Rectangle(this._rectangle.x, this._rectangle.y, this._rectangle.width, this._rectangle.height);
     }
 
     public getRotation(): number {
@@ -841,7 +846,7 @@ export class ArrowPrimitive extends BaseElementContainer<Models.ArrowPrimitive>
     public showItem(): void {
         this._arrowElement.renderable = true;
 
-        this._rotateContainer.pivot.set(this.model.rectangle.width / 2, this.model.rectangle.height / 2);
+        this._rotateContainer.pivot.set(this._rectangle.width / 2, this._rectangle.height / 2);
         // this.pivot.set(0, this._rectangle.height / 2); // TODO pivot for rotation
     }
 
diff --git a/src/lib/elements/primitives/EllipsePrimitive.ts b/src/lib/elements/primitives/EllipsePrimitive.ts
index b6cd9483..25ff1cfc 100644
--- a/src/lib/elements/primitives/EllipsePrimitive.ts
+++ b/src/lib/elements/primitives/EllipsePrimitive.ts
@@ -32,6 +32,7 @@ export class EllipsePrimitive extends BaseElementContainer<Models.EllipsePrimiti
      * Members
      */
     protected _fillColor: number;
+    protected _ellipse: PIXI.Ellipse;
 
     /**
      * Interactions
@@ -97,6 +98,10 @@ export class EllipsePrimitive extends BaseElementContainer<Models.EllipsePrimiti
         // Setup
         this.zIndex = 300; // TODO how to implement moveToFront etc...
         this._fillColor = this.model.options.fillColor;
+        this._ellipse = new PIXI.Ellipse(0, 0, this.model.ellipse.width / 2, this.model.ellipse.height / 2);
+
+        // Position
+        this.position.set(this.model.ellipse.x, this.model.ellipse.y);
 
         // Events
         this.modeInteraction = new ModeInteraction(this);
@@ -238,7 +243,7 @@ export class EllipsePrimitive extends BaseElementContainer<Models.EllipsePrimiti
         if (this._fillColor) {
             this._ellipseElement.beginFill(this._fillColor);
         }
-        this._ellipseElement.drawEllipse(this.model.ellipse.x, this.model.ellipse.y, this.model.ellipse.width, this.model.ellipse.height);
+        this._ellipseElement.drawEllipse(this._ellipse.x, this._ellipse.y, this._ellipse.width, this._ellipse.height);
         this._ellipseElement.endFill();
 
         // @ts-ignore
@@ -626,8 +631,8 @@ export class EllipsePrimitive extends BaseElementContainer<Models.EllipsePrimiti
 
     protected _onMove(event: PIXI.interaction.InteractionEvent, dX: number, dY: number): void {
         if (Keyboard.isKeyDown("ControlLeft") || Keyboard.isKeyDown("ControlRight")) {
-            this.position.x += dX;
-            this.position.y += dY;
+            this.model.ellipse.x = this.position.x += dX;
+            this.model.ellipse.y = this.position.y += dY;
         } else {
             this.parent.emit("onMove", event, dX, dY);
         }
@@ -650,7 +655,7 @@ export class EllipsePrimitive extends BaseElementContainer<Models.EllipsePrimiti
     }
 
     protected _onScale(dX: number, dY: number, dW: number, dH: number): void {
-        if (this.model.ellipse.width + dW < 1) {
+        if (this._ellipse.width + dW < 1) {
             return;
             /*
             dW = 1 - this._ellipse.width;
@@ -658,7 +663,7 @@ export class EllipsePrimitive extends BaseElementContainer<Models.EllipsePrimiti
             dY = 0;
             */
         }
-        if (this.model.ellipse.height + dH < 1) {
+        if (this._ellipse.height + dH < 1) {
             return;
             /*
             dH = 1 - this._ellipse.height;
@@ -668,8 +673,8 @@ export class EllipsePrimitive extends BaseElementContainer<Models.EllipsePrimiti
         }
 
         // Element
-        this.model.ellipse.width += dW;
-        this.model.ellipse.height += dH;
+        this.model.ellipse.width = this._ellipse.width += dW;
+        this.model.ellipse.height = this._ellipse.height += dH;
 
         // Position TODO not needed ??
         // this.position.x += dX * Math.cos(this.rotation) - dY * Math.sin(this.rotation);
@@ -794,7 +799,7 @@ export class EllipsePrimitive extends BaseElementContainer<Models.EllipsePrimiti
 
     //<editor-fold desc="BaseContainer">
     public getRectangle(): PIXI.Rectangle {
-        return new PIXI.Rectangle(this.model.ellipse.x - this.model.ellipse.width, this.model.ellipse.y - this.model.ellipse.height, this.model.ellipse.width * 2, this.model.ellipse.height * 2);
+        return new PIXI.Rectangle(this._ellipse.x - this._ellipse.width, this._ellipse.y - this._ellipse.height, this._ellipse.width * 2, this._ellipse.height * 2);
     }
 
     public getRotation(): number {
diff --git a/src/lib/elements/primitives/RectanglePrimitive.ts b/src/lib/elements/primitives/RectanglePrimitive.ts
index bef1e0d2..482c6000 100644
--- a/src/lib/elements/primitives/RectanglePrimitive.ts
+++ b/src/lib/elements/primitives/RectanglePrimitive.ts
@@ -32,6 +32,7 @@ export class RectanglePrimitive extends BaseElementContainer<Models.RectanglePri
      * Members
      */
     protected _fillColor: number;
+    protected _rectangle: PIXI.Rectangle;
 
     /**
      * Interactions
@@ -97,6 +98,10 @@ export class RectanglePrimitive extends BaseElementContainer<Models.RectanglePri
         // Setup
         this.zIndex = 300; // TODO how to implement moveToFront etc...
         this._fillColor = this.model.options.fillColor;
+        this._rectangle = new PIXI.Rectangle(0, 0, this.model.rectangle.width, this.model.rectangle.height);
+
+        // Position
+        this.position.set(this.model.rectangle.x, this.model.rectangle.y);
 
         // Events
         this.modeInteraction = new ModeInteraction(this);
@@ -238,7 +243,7 @@ export class RectanglePrimitive extends BaseElementContainer<Models.RectanglePri
         if (this._fillColor) {
             this._rectangleElement.beginFill(this._fillColor);
         }
-        this._rectangleElement.drawRect(this.model.rectangle.x, this.model.rectangle.y, this.model.rectangle.width, this.model.rectangle.height);
+        this._rectangleElement.drawRect(this._rectangle.x, this._rectangle.y, this._rectangle.width, this._rectangle.height);
         this._rectangleElement.endFill();
 
         // @ts-ignore
@@ -627,8 +632,8 @@ export class RectanglePrimitive extends BaseElementContainer<Models.RectanglePri
 
     protected _onMove(event: PIXI.interaction.InteractionEvent, dX: number, dY: number): void {
         if (Keyboard.isKeyDown("ControlLeft") || Keyboard.isKeyDown("ControlRight")) {
-            this.position.x += dX;
-            this.position.y += dY;
+            this.model.rectangle.x = this.position.x += dX;
+            this.model.rectangle.y = this.position.y += dY;
         } else {
             this.parent.emit("onMove", event, dX, dY);
         }
@@ -651,7 +656,7 @@ export class RectanglePrimitive extends BaseElementContainer<Models.RectanglePri
     }
 
     protected _onScale(dX: number, dY: number, dW: number, dH: number): void {
-        if (this.model.rectangle.width + dW < 1) {
+        if (this._rectangle.width + dW < 1) {
             return;
             /*
             dW = 1 - this._ellipse.width;
@@ -659,7 +664,7 @@ export class RectanglePrimitive extends BaseElementContainer<Models.RectanglePri
             dY = 0;
             */
         }
-        if (this.model.rectangle.height + dH < 1) {
+        if (this._rectangle.height + dH < 1) {
             return;
             /*
             dH = 1 - this._ellipse.height;
@@ -669,8 +674,8 @@ export class RectanglePrimitive extends BaseElementContainer<Models.RectanglePri
         }
 
         // Element
-        this.model.rectangle.width += dW;
-        this.model.rectangle.height += dH;
+        this.model.rectangle.width = this._rectangle.width += dW;
+        this.model.rectangle.height = this._rectangle.height += dH;
 
         // Position TODO not needed ??
         // this.position.x += (dX + dW / 2) * Math.cos(this.rotation) - (dY + dH / 2) * Math.sin(this.rotation);
@@ -797,7 +802,7 @@ export class RectanglePrimitive extends BaseElementContainer<Models.RectanglePri
 
     //<editor-fold desc="BaseContainer">
     public getRectangle(): PIXI.Rectangle {
-        return new PIXI.Rectangle(this.model.rectangle.x, this.model.rectangle.y, this.model.rectangle.width, this.model.rectangle.height);
+        return new PIXI.Rectangle(this._rectangle.x, this._rectangle.y, this._rectangle.width, this._rectangle.height);
     }
 
     public getRotation(): number {
@@ -807,7 +812,7 @@ export class RectanglePrimitive extends BaseElementContainer<Models.RectanglePri
     public showItem(): void {
         this._rectangleElement.renderable = true;
 
-        this._rotateContainer.pivot.set(this.model.rectangle.width / 2, this.model.rectangle.height / 2);
+        this._rotateContainer.pivot.set(this._rectangle.width / 2, this._rectangle.height / 2);
         /* TODO remove -> Test for pivot
         const test = new PIXI.Graphics();
         test.beginFill(0xffffff, 1);
diff --git a/src/lib/elements/primitives/TextPrimitive.ts b/src/lib/elements/primitives/TextPrimitive.ts
index 17e181b0..469cf74c 100644
--- a/src/lib/elements/primitives/TextPrimitive.ts
+++ b/src/lib/elements/primitives/TextPrimitive.ts
@@ -92,6 +92,8 @@ export class TextPrimitive extends BaseElementContainer<Models.TextPrimitive> {
     protected readonly _fillColorSelftestUnselected: number = 0xF02C6B;
     protected readonly _fontSizeDefault: number = 12;
     protected readonly _fontFamilyDefault: string = "proxima_nova_altsemibold";
+    protected readonly _alignDefault: string = "left";
+    protected readonly _wordWrapDefault: boolean = false;
 
     /**
      * Constructor
@@ -109,6 +111,8 @@ export class TextPrimitive extends BaseElementContainer<Models.TextPrimitive> {
                 fill: this._fillColorDefault,
                 fontSize: this._fontSizeDefault,
                 fontFamily: this._fontFamilyDefault,
+                align: this._alignDefault,
+                wordWrap: this._wordWrapDefault,
             };
         }
         if (!this.model.style.fill) {
@@ -129,6 +133,9 @@ export class TextPrimitive extends BaseElementContainer<Models.TextPrimitive> {
         this._text = text;
         */
 
+        // Position
+        this.position.set(this.model.rectangle.x, this.model.rectangle.y);
+
         // Events
         this.modeInteraction = new ModeInteraction(this);
         // Viewer
@@ -755,8 +762,8 @@ export class TextPrimitive extends BaseElementContainer<Models.TextPrimitive> {
 
     protected _onMove(event: PIXI.interaction.InteractionEvent, dX: number, dY: number): void {
         if (Keyboard.isKeyDown("ControlLeft") || Keyboard.isKeyDown("ControlRight")) {
-            this.position.x += dX;
-            this.position.y += dY;
+            this.model.rectangle.x = this.position.x += dX;
+            this.model.rectangle.y = this.position.y += dY;
         } else {
             this.parent.emit("onMove", event, dX, dY);
         }
diff --git a/src/lib/generators/TextPrimitiveGenerator.ts b/src/lib/generators/TextPrimitiveGenerator.ts
index e7bdd347..270d8d2f 100644
--- a/src/lib/generators/TextPrimitiveGenerator.ts
+++ b/src/lib/generators/TextPrimitiveGenerator.ts
@@ -5,6 +5,7 @@ import {ImageObject} from "../bases/BaseModul";
 import {DrawInteraction} from "../interactions/DrawInteraction";
 import {TextPrimitive} from "../elements/primitives/TextPrimitive";
 import {PositionPoint} from "../elements/positionings/PositionPoint";
+import {Rectangle} from "@ascii-dev-user/medsurf-lib/models";
 
 export class TextPrimitiveGenerator extends BaseDrawGenerator {
     /**
@@ -17,9 +18,12 @@ export class TextPrimitiveGenerator extends BaseDrawGenerator {
      * Design
      */
     protected readonly _text: string = ""; // TODO New Text
+    protected readonly _fillColorDefault: number = 0xFFFFFF;
     protected readonly _fontSizeDefault: number = 22;
     protected readonly _fontFamilyDefault: string = "proxima_nova_altsemibold";
-    protected readonly _fillColorDefault: number = 0xFFFFFF;
+    protected readonly _alignDefault: string = "left";
+    protected readonly _wordWrapDefault: boolean = false;
+    protected readonly _rectangleDefault: Rectangle = {x: 0, y: 0, width: 0, height: 0};
 
     /**
      * Constructor
@@ -50,10 +54,13 @@ export class TextPrimitiveGenerator extends BaseDrawGenerator {
             positionPoint: this.targetPositionPoint.model,
             rotateWithLine: false,
             text: this._text,
+            rectangle: this._rectangleDefault,
             style: {
                 fill: this._fillColorDefault,
                 fontSize: this._fontSizeDefault,
                 fontFamily: this._fontFamilyDefault,
+                align: this._alignDefault,
+                wordWrap: this._wordWrapDefault,
             },
         });
         this._textElement.modeInteraction.defaultMode = "author";
-- 
GitLab