define(['app'], function (app) { //'use strict'; app.controller('TshirtdesignCtrl', function ($scope, $rootScope, $window, $timeout, $illustration) { var canvas = new fabric.Canvas('main-design-container'); //Set width and height canvas var _modalWidth = $('.modal-dialog').width(); var _windowWidth = window.innerWidth; if(_windowWidth > 762) { var _contentCanvasWidth = _modalWidth*8/12 - 100; } else { var _contentCanvasWidth = _windowWidth-70; } canvas.setWidth(_contentCanvasWidth); canvas.setHeight(650); //Custom control fabric.Object.prototype.transparentCorners = false; fabric.Object.prototype.hasRotatingPoint = false; var ctrVisible = {tl: false, ml:false, bl:false, mb: false, br: true, mr: false, tr: true, mt: true, mtr: false}; for(key in ctrVisible) { fabric.Object.prototype.setControlVisible(key,ctrVisible[key]); } fabric.Object.prototype.customiseCornerIcons({ settings: { borderColor: '#0000ff', cornerSize: 25, cornerShape: 'circle', cornerBackgroundColor: '#0171b4', cornerPadding: 6 }, mt: { icon: 'images/control-icon/trash.png' }, br: { icon: 'images/control-icon/resize.png' }, tr: { icon: 'images/control-icon/rotate.png' } }); fabric.Canvas.prototype.customiseControls({ mt: { cursor: 'pointer', // action: 'remove' action: function(e, target) { currentObj = canvas.getActiveObject(); if(confirm('削除してもよろしいですか?')) { currentObj.remove(); } } }, br: { }, tr: { action: 'rotate', cursor: 'crosshair' } }); canvas.on('after:render', function() { // console.log('after render'); }); canvas.on({ 'mouse:up' : mouseUp, 'object:added' : onIllustrationAdded, 'object:moving' : onIllustrationMoving, 'object:scaling' : onIllustrationChange, 'object:rotating' : onIllustrationChange, 'object:selected' : onObjectSelected, 'object:modified' : onIllustrationModifield, 'selection:cleared' : onObjectOut, }); var currentObj; var listObj = []; var stateObj = []; var indexCurr = 0; var indexCurr2 = 0; var actionObj = false; var refreshObj = true; var spacingNum = 0; $scope.itemFont = 0; $scope.showDesignTab = function(tab){ canvas.deactivateAll().renderAll(); $rootScope.isShowLeftPanel = tab; switch (tab) { case 'illustration': { $scope.IllustrationList = $illustration.getAll(); $rootScope.outputImage = false; $scope.illustrationSelectConfig = { allowClear:true }; $timeout(function(){ $('.illstration-item').tooltip({ animated: 'fade', placement: 'bottom', html: true }); // console.log('here'); },1000); break; } case 'text': { break; } } }; $scope.showDesignTab('default'); function onIllustrationAdded(options){ var object = options.target; // console.log('object:added'); if (actionObj === true) { stateObj = [stateObj[indexCurr2]]; listObj = [listObj[indexCurr2]]; actionObj = false; console.log(stateObj); indexCurr = 1; } object.saveState(); console.log(object.originalState); stateObj[indexCurr] = JSON.stringify(object.originalState); listObj[indexCurr] = object; indexCurr++; indexCurr2 = indexCurr - 1; refreshObj = true; } function onIllustrationModifield(options){ // var pointer = canvas.getPointer(options.e); if (pointer.x >= 567 && pointer.y >= 620 && pointer.x <= 600 && pointer.y <= 670){ canvas.getActiveObject().remove(); $('.design-content .trash-design img').attr({'src':'images/trash.png'}); return; } // var objOffset = canvas.getActiveObject().getBoundingRect(); var cH = canvas.height, cW = canvas.width, H0 = 20, W0 = 20; //console.log(objOffset,canvas.height,canvas.width); if (objOffset.leftcW-W0 || objOffset.topcH-H0){ if (confirm('削除してもよろしいですか')){ canvas.getActiveObject().remove(); }else{ undoCanvas(); return; } } var object = options.target; // console.log('object:modified'); if (actionObj === true) { stateObj = [stateObj[indexCurr2]]; listObj = [listObj[indexCurr2]]; actionObj = false; console.log(stateObj); indexCurr = 1; } object.saveState(); stateObj[indexCurr] = JSON.stringify(object.originalState); listObj[indexCurr] = object; indexCurr++; indexCurr2 = indexCurr - 1; // console.log(stateObj); refreshObj = true; } function onIllustrationChange(options) { // options.target.setCoords(); // canvas.forEachObject(function(obj) { // if (obj === options.target) return; // obj.setOpacity(options.target.intersectsWithObject(obj) ? 0.5 : 1); // }); } function onIllustrationMoving(options) { var pointer = canvas.getPointer(options.e); if (pointer.x >= 567 && pointer.y >= 620 && pointer.x <= 600 && pointer.y <= 670){ $('.design-content .trash-design img').attr({'src':'images/trash-hover.png'}); }else{ $('.design-content .trash-design img').attr({'src':'images/trash.png'}); } } function onObjectOut() { delete currentObj; $scope.designTextValue = ''; } function undoCanvas() { if (indexCurr <= 0) { indexCurr = 0; return; } if (refreshObj === true) { indexCurr--; refreshObj = false; } console.log('undo'); indexCurr2 = indexCurr - 1; currentObj = listObj[indexCurr2]; if (currentObj){ currentObj.setOptions(JSON.parse(indexCurr[indexCurr2])); } indexCurr--; currentObj.setCoords(); canvas.renderAll(); actionObj = true; } function redoCanvas() { actionObj = true; if (indexCurr >= stateObj.length - 1) { return; } console.log('redo'); indexCurr2 = indexCurr + 1; currentObj = listObj[indexCurr2]; currentObj.setOptions(JSON.parse(indexCurr[indexCurr2])); indexCurr++; currentObj.setCoords(); canvas.renderAll(); } $scope.canvasClearAll = function(){ if (confirm('配置されたすべての文字や画像を消去します')){ canvas.clear(); } } function onObjectSelected(options) { var currentObj = options.target; $scope.typeObject = currentObj.type; switch ($scope.typeObject) { case 'i-text' : $rootScope.isShowLeftPanel = 'text'; var text = currentObj.text; if(text != '') { $scope.designText = text; $scope.designTextValue = text; } break; case 'path-group' : $rootScope.isShowLeftPanel = 'illustration'; break; case 'image': $rootScope.isShowLeftPanel = 'image'; break; default : $rootScope.isShowLeftPanel = 'default'; break; } $rootScope.safeApply(); } // Illustration process $scope.changeIllustrationCategory = function(currentIllustration){ $scope.currentIllustrationCate = $illustration.getList(currentIllustration); //console.log($scope.currentIllustrationCate); }; $scope.insertSvg = function(item){ fabric.loadSVGFromURL(item.path, function(objects, options) { var shape = fabric.util.groupSVGElements(objects, options); //shape.setFill('green'); canvas.add(shape.scale(0.6)); shape.set({ left: 150, top: 200 }).setCoords(); canvas.renderAll(); canvas.setActiveObject(shape); }); }; // color pattern $scope.listColorPatterns = [ '#000000','#ffff00','#ff6600','#ff0000','#ff6262','#ffa19c','#ff9933','#c45d01','#5d2b03','#ffffcc', '#ffff99','#ffd500','#c0db50','#21a52a','#00663f','#abfcab','#36ffaa','#89eaea','#00938c','#005450', '#0badff','#006cff','#839aff','#0410a0','#ffb2ff','#f93fff','#6600ca','#ff6699','#999999','#666666', '#333333' ]; $scope.changeColorPattern = function(color){ var obj = canvas.getActiveObject(); if (!color){ color = 'none'; } if (obj instanceof fabric.PathGroup) { obj.getObjects().forEach(function(o) { o.fill = color; }); } else { obj.fill = color; } canvas.renderAll(); // if (canvas.getActiveObject()){ // canvas.getActiveObject().set("fill", color); // canvas.renderAll(); // } }; //Font $scope.listFontFamily = [ { name : 'GN Aki iro Sesami Cookies', slug : 'gn_aki_iro_sesami_cookies', }, { name : 'GN-Fuyu-iro_Script_Bold', slug : 'gn_fuyu_iro_script_bold' }, { name : 'GN Killgothic U Kanana', slug : 'gn_killgothic_u_kanana' }, { name : 'GN-Kin-iro_Alphabet_Cookies', slug : 'gn_kin_iro_alphabet_cookies' }, { name : 'GN-Kin-iro_SansSerif', slug : 'gn_kin_iro_sansserif' }, { name : 'GN-Koharuiro_Sunray', slug : 'gn_koharuiro_sunray' }, { name : 'GN-Kyu-pin', slug : 'gn_kyu_pin' }, { name : 'gn_natsu_iro_schedule', slug : 'gn_natsu_iro_schedule' }, { name : 'gnkana_kiniro_sansserif_l', slug : 'gnkana_kiniro_sansserif_l' }, { name : 'gnkana_kiniro_sansserif_st', slug : 'gnkana_kiniro_sansserif_st' }, { name : 'gnkana_kon_iro_nightfall', slug : 'gnkana_kon_iro_nightfall' }, { name : 'ms_gothic', slug : 'ms_gothic' }, { name : 'msmincho', slug : 'msmincho' }, { name : 'ufonts_com_ms_pgothic', slug : 'ufonts_com_ms_pgothic' } ]; // layer process $scope.layerProcess = function(mode) { // console.log('layerProcess'); var activeObject = canvas.getActiveObject(); console.log(activeObject); if (activeObject){ switch (mode) { case 1: // canvas.bringForward(activeObject); activeObject.bringForward(); break; case 2: // canvas.sendBackwards(activeObject); activeObject.sendBackwards(); break; case 3: // canvas.bringToFront(activeObject); activeObject.bringToFront(); break; case 4: // canvas.sendToBack(activeObject); activeObject.sendToBack(); break; } canvas.deactivateAll().renderAll(); } }; $scope.focusInputText = function(text) { currentObj = canvas.getActiveObject(); if(typeof currentObj == 'undefined' || currentObj == null) { $scope.iText = new fabric.IText('', { left: 150, top: 200, fontFamily: 'Arial', fontWeight: 'normal', textAlign: 'center', fontSize: 28, fill: 'black' }); } else { if(currentObj.type != 'i-text') { $scope.iText = new fabric.IText('', { left: 150, top: 200, fontFamily: 'Arial', fontWeight: 'normal', textAlign: 'center', fontSize: 28, fill: 'black' }); } else{ $scope.iText = currentObj; } } }; //Design text $scope.inputText = function(e) { if(typeof $scope.iText != "undefined") { var iText = $scope.iText; iText.text = e; canvas.add(iText); canvas.renderAll(); canvas.setActiveObject(iText); } }; $scope.setFontFamily = function(font,index) { $scope.itemFont = index; if(canvas.getActiveObject()) { var currentObj = canvas.getActiveObject(); if(currentObj.type == 'i-text') { currentObj.set('fontFamily', font); canvas.renderAll(); canvas.setActiveObject(currentObj); } } }; //Set letter spacing text $scope.setLetterSpacingText = function(e) { if(canvas.getActiveObject()) { var currentObj = canvas.getActiveObject(); if(currentObj.type == 'i-text') { if(e == 'plus') spacingNum = spacingNum + 30; else if (spacingNum >= -30){ spacingNum = spacingNum - 30; } currentObj.set('charSpacing', spacingNum); canvas.renderAll(); canvas.setActiveObject(currentObj); } } }; $scope.setLetterSpacingTextDefault = function() { if(canvas.getActiveObject()) { var currentObj = canvas.getActiveObject(); if(currentObj.type == 'i-text') { spacingNum = 0; currentObj.set('charSpacing', spacingNum); canvas.renderAll(); canvas.setActiveObject(currentObj); } } }; /**** process insert image */ if (typeof($window.localStorage.recentImages) != 'undefined'){ $scope.recentImages = JSON.parse($window.localStorage.recentImages); }else{ $scope.recentImages = {}; } var addToRecentImage = function(name, data){ if (typeof($window.localStorage.recentImages) != 'undefined'){ $scope.recentImages = JSON.parse($window.localStorage.recentImages); }else{ $scope.recentImages = {}; } if (typeof($scope.recentImages[name]) == 'undefined'){ var ii=0; var II = 0; for(var item in $scope.recentImages){ if (II==0){ II = item; } ii++; } if (ii>16 && II!=0){ delete $scope.recentImages[II]; } $scope.recentImages[name] = data; $window.localStorage.recentImages = JSON.stringify($scope.recentImages); } } $scope.chooseImage = function(e){//console.log(e); if (e.target.files[0] && e.target.files[0].size > 5*1024*1024){ alert('アップロードできませんでした'); return; } var reader = new FileReader(); reader.onload = function (event) { addToRecentImage ($('#imgLoader').val(), event.target.result); var imgObj = new Image();//console.log($('#imgLoader').val()); imgObj.src = event.target.result; imgObj.onload = function () { // start fabricJS stuff var image = new fabric.Image(imgObj); image.set({ left: 50, top: 50 }); //image.scale(getRandomNum(0.1, 0.25)).setCoords(); image.scaleToWidth(200); canvas.add(image); } } reader.readAsDataURL(e.target.files[0]); } $scope.insertRecentImage = function(data){ var imgObj = new Image(); imgObj.src = data; imgObj.onload = function () { // start fabricJS stuff var image = new fabric.Image(imgObj); image.set({ left: 50, top: 50 }); image.scaleToWidth(200); canvas.add(image); } } //Traslation text $scope.rotateText = function(style) { if(canvas.getActiveObject()) { var currentObj = canvas.getActiveObject(); if(currentObj.type == 'i-text') { currentObj.set('rotate', Math.PI / 4); canvas.renderAll(); canvas.setActiveObject(currentObj); } } }; /* Process output */ $scope.outputDesign = function(){ $rootScope.outputImage = canvas.toDataURL('png'); // console.log(); $('#tshirt-design').modal('hide'); } }); });