src_js/iconolab-bundle/src/components/cutout/Cutout.vue
changeset 146 f912b591e1c1
child 151 797460904f77
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src_js/iconolab-bundle/src/components/cutout/Cutout.vue	Fri Aug 19 19:04:26 2016 +0200
@@ -0,0 +1,170 @@
+<script>
+
+	import svgboard from './svgboard'
+	import Typeahead from '../typeahead/Typeahead.vue'
+	import Zoomview from '../zoomview/Zoomview.vue'
+
+	export default {
+
+		el: '#drawing-zone',
+		MODE_RECT: 'RECT',
+		MODE_FREE: 'FREE',
+		ZOOM_IN: 'in',
+		ZOOM_OUT: 'out',
+
+		components: {typeahead: Typeahead, zoomview: Zoomview},
+		data: { 
+			mode:"",
+			isRect: true,
+			normalizePath: "",
+			readOnly: false,
+			formView: true,
+			useClipPath: false,
+			transformMatrix: "",
+			fragmentPath: "",
+			canZoom: true,
+			displayMask: false
+		},
+
+		mounted () {
+			var self = this;
+			this.initialDrawingMode = null;
+			this.drawingComponent = svgboard.init({ 
+				wrapperId: '#iconolab-image-wrapper',
+					actionWrapper: '#action-wrapper',
+					readOnly: false,
+					onDrawingModeChange: function (mode) {
+						self.setDrawingMode(mode, false);
+					}
+			});
+			this.$refs.zoomview.setZoomTarget(this.drawingComponent.getPaper());
+			this.showEditor();
+			this.drawingComponent.createTestHandler(10,20, 50);
+		},
+
+		methods: {
+
+			computeCentreredViewBox: function () {
+				var zoomSvg = this.$refs.zoomSvg;
+				var viewBox = [];
+				var imageWidth = zoomSvg.getAttribute("width"); 
+				var imageHeight = zoomSvg.getAttribute("height");
+
+				/* normalize */
+				var xRatio = imageWidth / 100 ;
+				var yRatio = imageHeight / 100;
+
+				var zTarget = this.drawingComponent.getShapeBBox(); 
+				viewBox = [(zTarget.x - 1) * xRatio, (zTarget.y - 1) * yRatio, (zTarget.w + 2) * xRatio, (zTarget.h + 2) * yRatio];
+				return viewBox.join(" ");
+
+			},
+
+			computeZoomedViewBox: function () {
+				var viewBoxArray = [];
+				var zoomSvg = this.$refs.zoomSvg;
+				var shapeBBox = this.drawingComponent.getShapeBBox();
+				var imageWidth = zoomSvg.getAttribute("width");
+				var imageHeight = zoomSvg.getAttribute("height");
+				var xRatio = imageWidth / 100;
+				var yRatio = imageHeight / 100;
+				/* denormalize coordonate, max is imageX * 100x = imageHeigth*/
+				shapeBBox.x = shapeBBox.x * xRatio;
+				shapeBBox.y = shapeBBox.y * yRatio;
+
+				shapeBBox.w = shapeBBox.w * xRatio;
+				shapeBBox.h = shapeBBox.h * yRatio;
+
+	        	var imgRatio = imageWidth / imageHeight;
+		        if (shapeBBox.w > shapeBBox.h) {
+		            shapeBBox.y = Math.max(0, shapeBBox.y - (((shapeBBox.w * imgRatio) - shapeBBox.h) / 2));
+		            shapeBBox.h = shapeBBox.w * imgRatio;
+		        }
+		       	else {
+		       		shapeBBox.x = Math.max(0, shapeBBox.x - (((shapeBBox.h / imgRatio) - shapeBBox.w) / 2));
+		            shapeBBox.w = shapeBBox.h / imgRatio;
+		       	}
+		       	viewBoxArray = [shapeBBox.x, shapeBBox.y, shapeBBox.w, shapeBBox.h];
+
+				if (!shapeBBox) { return false; }
+			
+				return viewBoxArray.join(" ");
+			},
+
+			zoom: function (direction) {
+
+				var mainSvgWrapper = this.$refs.smallSvgWrapper;
+				if (this.$options.ZOOM_OUT === direction) {
+					var defaultViewBox = [0, 0, mainSvgWrapper.getAttribute("width"), mainSvgWrapper.getAttribute("height")];
+					mainSvgWrapper.setAttribute("viewBox", defaultViewBox.join(" "));
+					this.canZoom = true;
+				}
+
+				if (this.$options.ZOOM_IN === direction) { 
+					mainSvgWrapper.setAttribute("viewBox", this.computeCentreredViewBox());//this.computeZoomedViewBox());//
+					this.canZoom = false; 
+				}
+			},
+
+			setDrawingMode: function (mode, updateComponent) {
+				if (!this.initialDrawingMode) {
+					this.initialDrawingMode = mode;//useful for cancel
+				}
+				var updateComponent = (typeof updateComponent === "boolean") ? updateComponent: true;
+				this.mode = this.$options['MODE_' + mode];
+				this.isRect = (this.mode === this.$options.MODE_RECT) ? true: false;
+				if (updateComponent) {
+					this.drawingComponent.setDrawingMode(this.mode);
+				}
+			},
+			
+			cancel: function () {
+				this.formView = true;
+				var currentPath = this.$refs.currentPath.getAttribute("d");
+				if (!currentPath.length || !this.initialDrawingMode) { return; } {
+					currentPath += ";" + this.initialDrawingMode; 
+					this.drawingComponent.setPath(currentPath);
+				}
+			},
+
+			highLightZone: function () {
+				if (!this.displayMask) {
+					this.displayMask = true;
+				}
+				else {
+					this.displayMask = false;
+				}
+			},
+
+			displayEditedPath: function () {
+				var normalizePath = this.drawingComponent.getPath();
+			},
+			
+			resetZoom: function () {
+				this.zoom(this.$options.ZOOM_OUT);
+			},
+
+			showEditor: function () {
+				this.formView = true;
+				this.resetZoom();
+				/* on edit mode reset*/
+			},
+
+			showForm: function () {
+				this.normalizePath = this.drawingComponent.getPath();
+				var smallImage = this.$refs.smallImage;
+				this.formView = true;
+				var xRatio = smallImage.getAttribute("width") / 100;
+				var yRatio = smallImage.getAttribute("height") / 100;
+				var transformMatrix = [xRatio, 0, 0, yRatio, 0, 0].join(',');
+				this.transformMatrix ="matrix(" + transformMatrix + ")";
+				this.fragmentPath = this.normalizePath.split(';')[0];
+			},
+
+			clear: function () {
+				this.drawingComponent.clear();
+			}
+		}
+	}
+</script>
+