2 changed files with 16 additions and 424 deletions
			
			
		| @ -1,423 +1,13 @@ | |||||
| <template> | <template> | ||||
|   <div class="home"> |  | ||||
|     <Layout> |  | ||||
|       <Header v-if="show"> |  | ||||
|         <!-- 导入 --> |  | ||||
|         <import-JSON /> |  | ||||
|           |  | ||||
|         <import-svg /> |  | ||||
|           |  | ||||
|         <import-img /> |  | ||||
|           |  | ||||
|         <!-- 对齐方式 --> |  | ||||
|         <align /> |  | ||||
|           |  | ||||
|         <flip /> |  | ||||
|           |  | ||||
|         <center-align /> |  | ||||
|           |  | ||||
|         <group /> |  | ||||
|           |  | ||||
|         <zoom /> |  | ||||
|           |  | ||||
|         <lock /> |  | ||||
|           |  | ||||
|         <dele /> |  | ||||
|           |  | ||||
|         <clone /> |  | ||||
| 
 |  | ||||
|         <div style="float:right"> |  | ||||
|           <save /> |  | ||||
|         </div> |  | ||||
|       </Header> |  | ||||
|       <Content style=" display: flex; height: calc(100vh - 64px);"> |  | ||||
|         <div style="width: 380px; height: 100%; background:#fff; display: flex"> |  | ||||
|           <Menu :active-name="menuActive" accordion width="80px" @on-select="activeIndex => menuActive = activeIndex"> |  | ||||
|             <MenuItem :name="1" style="padding:10px"><Icon type="md-book" />模板</MenuItem> |  | ||||
|             <MenuItem :name="2" style="padding:10px"><Icon type="md-create" />元素</MenuItem> |  | ||||
|             <MenuItem :name="3" style="padding:10px"><Icon type="ios-build" />背景</MenuItem> |  | ||||
|             <MenuItem :name="4" style="padding:10px"><Icon type="ios-build" />画笔</MenuItem> |  | ||||
|           </Menu> |  | ||||
|           <div class="content"> |  | ||||
|             <template v-if="show"> |  | ||||
|               <!-- 生成模板 --> |  | ||||
|               <div v-show="menuActive === 1" class="left-panel"> |  | ||||
|                 <import-tmpl /> |  | ||||
|               </div> |  | ||||
|               <!-- 常用元素 --> |  | ||||
|               <div v-show="menuActive === 2" class="left-panel"> |  | ||||
|                 <tools /> |  | ||||
|                 <svgEl /> |  | ||||
|               </div> |  | ||||
|               <!-- 背景设置 --> |  | ||||
|               <div v-show="menuActive === 3" class="left-panel"> |  | ||||
|                 <set-size /> |  | ||||
|                 <bg-bar /> |  | ||||
|               </div> |  | ||||
|             </template> |  | ||||
|             <!-- 画笔设置 --> |  | ||||
|             <div v-show="menuActive === 4"> |  | ||||
|               <div style="display: inline-block; margin-left: 10px"> |  | ||||
|                 <button id="drawing-mode" class="btn btn-info">Cancel drawing mode</button><br> |  | ||||
|                 <button id="clear-canvas" class="btn btn-info">Clear</button><br> |  | ||||
| 
 |  | ||||
|                 <div id="drawing-mode-options"> |  | ||||
|                   <label for="drawing-mode-selector">Mode:</label> |  | ||||
|                   <select id="drawing-mode-selector"> |  | ||||
|                     <option>Pencil</option> |  | ||||
|                     <option>Circle</option> |  | ||||
|                     <option>Spray</option> |  | ||||
|                     <option>Pattern</option> |  | ||||
| 
 |  | ||||
|                     <option>hline</option> |  | ||||
|                     <option>vline</option> |  | ||||
|                     <option>square</option> |  | ||||
|                     <option>diamond</option> |  | ||||
|                     <option>texture</option> |  | ||||
|                   </select><br> |  | ||||
| 
 |  | ||||
|                   <label for="drawing-line-width">Line width:</label> |  | ||||
|                   <span class="info">30</span><input id="drawing-line-width" type="range" value="30" min="0" max="150"><br> |  | ||||
| 
 |  | ||||
|                   <label for="drawing-color">Line color:</label> |  | ||||
|                   <input id="drawing-color" type="color" value="#005E7A"><br> |  | ||||
| 
 |  | ||||
|                   <label for="drawing-shadow-color">Shadow color:</label> |  | ||||
|                   <input id="drawing-shadow-color" type="color" value="#005E7A"><br> |  | ||||
| 
 |  | ||||
|                   <label for="drawing-shadow-width">Shadow width:</label> |  | ||||
|                   <span class="info">0</span><input id="drawing-shadow-width" type="range" value="0" min="0" max="50"><br> |  | ||||
| 
 |  | ||||
|                   <label for="drawing-shadow-offset">Shadow offset:</label> |  | ||||
|                   <span class="info">0</span><input id="drawing-shadow-offset" type="range" value="0" min="0" max="50"><br> |  | ||||
|                 </div> |  | ||||
|               </div> |  | ||||
|             </div> |  | ||||
|           </div> |  | ||||
|         </div> |  | ||||
|         <!-- 画布区域 --> |  | ||||
|         <div style="width: 100%;position: relative; background:#F1F1F1;"> |  | ||||
|           <div class="canvas-box"> |  | ||||
|             <canvas id="canvas" /> |  | ||||
|           </div> |  | ||||
|         </div> |  | ||||
|         <!-- 属性区域 --> |  | ||||
|         <div style="width: 380px; height: 100%; padding:10px; overflow-y: auto; background:#fff"> |  | ||||
|           <history v-if="show" /> |  | ||||
|           <layer v-if="show" /> |  | ||||
|           <attribute v-if="show" /> |  | ||||
|         </div> |  | ||||
|       </Content> |  | ||||
|     </Layout> |  | ||||
|   </div> |  | ||||
|  |   <div /> | ||||
| </template> | </template> | ||||
| 
 | 
 | ||||
| <script> | <script> | ||||
| 
 |  | ||||
| // 导入元素 |  | ||||
| import importJSON from '@/components/img-editor/importJSON.vue' |  | ||||
| import importSvg from '@/components/img-editor/importSvg.vue' |  | ||||
| import importImg from '@/components/img-editor/importImg.vue' |  | ||||
| 
 |  | ||||
| // 顶部组件 |  | ||||
| import align from '@/components/img-editor/align.vue' |  | ||||
| import centerAlign from '@/components/img-editor/centerAlign.vue' |  | ||||
| import flip from '@/components/img-editor/flip.vue' |  | ||||
| import save from '@/components/img-editor/save.vue' |  | ||||
| import clone from '@/components/img-editor/clone.vue' |  | ||||
| import group from '@/components/img-editor/group.vue' |  | ||||
| import zoom from '@/components/img-editor/zoom.vue' |  | ||||
| import lock from '@/components/img-editor/lock.vue' |  | ||||
| import dele from '@/components/img-editor/del.vue' |  | ||||
| 
 |  | ||||
| // 左侧组件 |  | ||||
| import importTmpl from '@/components/img-editor/importTmpl.vue' |  | ||||
| import tools from '@/components/img-editor/tools.vue' |  | ||||
| import svgEl from '@/components/img-editor/svgEl.vue' |  | ||||
| import bgBar from '@/components/img-editor/bgBar.vue' |  | ||||
| import setSize from '@/components/img-editor/setSize.vue' |  | ||||
| import brush from '@/components/img-editor/brush' |  | ||||
| 
 |  | ||||
| // 右侧组件 |  | ||||
| import history from '@/components/img-editor/history.vue' |  | ||||
| import layer from '@/components/img-editor/layer.vue' |  | ||||
| import attribute from '@/components/img-editor/attribute.vue' |  | ||||
| 
 |  | ||||
| // 功能组件 |  | ||||
| import EventHandle from '@/utils/eventHandler' |  | ||||
| 
 |  | ||||
| import { fabric } from 'fabric' |  | ||||
| 
 |  | ||||
| // 对齐辅助线 |  | ||||
| import initAligningGuidelines from '@/core/initAligningGuidelines' |  | ||||
| import initHotkeys from '@/core/initHotKeys' |  | ||||
| import initControls from '@/core/initControls' |  | ||||
| 
 |  | ||||
| const event = new EventHandle() |  | ||||
| const canvas = {} |  | ||||
| export default { | export default { | ||||
|   name: 'HomeView', |  | ||||
|   provide: { |  | ||||
|     canvas, |  | ||||
|     fabric, |  | ||||
|     event |  | ||||
|   }, |  | ||||
|   components: { |  | ||||
|     setSize, tools, bgBar, lock, layer, align, attribute, dele, importSvg, save, importJSON, clone, flip, importImg, importTmpl, centerAlign, group, zoom, svgEl, history |  | ||||
|   }, |  | ||||
|   data() { |  | ||||
|     return { |  | ||||
|       menuActive: 4, |  | ||||
|       show: false, |  | ||||
|       select: null |  | ||||
|     } |  | ||||
|   }, |  | ||||
|   created() { |  | ||||
|     // this.$Spin.show() |  | ||||
|   }, |  | ||||
|   mounted() { |  | ||||
|     this.canvas = canvas.c = new fabric.Canvas('canvas', { |  | ||||
|       isDrawingMode: true |  | ||||
|     }) |  | ||||
|     // console.log(this.canvas) |  | ||||
|     this.canvas.set('backgroundColor', '#fff') |  | ||||
|     this.show = true |  | ||||
|     this.$Spin.hide() |  | ||||
|     event.init(canvas.c) |  | ||||
|     initAligningGuidelines(canvas.c) |  | ||||
|     initHotkeys(canvas.c) |  | ||||
|     initControls(canvas.c) |  | ||||
|     this.setBrush() |  | ||||
|   }, |  | ||||
|   methods: { |  | ||||
|     setBrush() { |  | ||||
|       var $ = function(id) { return document.getElementById(id) } |  | ||||
|       var canvas = this.canvas |  | ||||
|       fabric.Object.prototype.transparentCorners = false |  | ||||
| 
 |  | ||||
|       var drawingModeEl = $('drawing-mode') |  | ||||
|       var drawingOptionsEl = $('drawing-mode-options') |  | ||||
|       var drawingColorEl = $('drawing-color') |  | ||||
|       var drawingShadowColorEl = $('drawing-shadow-color') |  | ||||
|       var drawingLineWidthEl = $('drawing-line-width') |  | ||||
|       var drawingShadowWidth = $('drawing-shadow-width') |  | ||||
|       var drawingShadowOffset = $('drawing-shadow-offset') |  | ||||
|       var clearEl = $('clear-canvas') |  | ||||
| 
 |  | ||||
|       clearEl.onclick = function() { canvas.clear() } |  | ||||
| 
 |  | ||||
|       drawingModeEl.onclick = function() { |  | ||||
|         canvas.isDrawingMode = !canvas.isDrawingMode |  | ||||
|         if (canvas.isDrawingMode) { |  | ||||
|           drawingModeEl.innerHTML = 'Cancel drawing mode' |  | ||||
|           drawingOptionsEl.style.display = '' |  | ||||
|         } else { |  | ||||
|           drawingModeEl.innerHTML = 'Enter drawing mode' |  | ||||
|           drawingOptionsEl.style.display = 'none' |  | ||||
|         } |  | ||||
|       } |  | ||||
| 
 |  | ||||
|       if (fabric.PatternBrush) { |  | ||||
|         var vLinePatternBrush = new fabric.PatternBrush(canvas) |  | ||||
|         vLinePatternBrush.getPatternSrc = function() { |  | ||||
|           var patternCanvas = fabric.document.createElement('canvas') |  | ||||
|           patternCanvas.width = patternCanvas.height = 10 |  | ||||
|           var ctx = patternCanvas.getContext('2d') |  | ||||
| 
 |  | ||||
|           ctx.strokeStyle = this.color |  | ||||
|           ctx.lineWidth = 5 |  | ||||
|           ctx.beginPath() |  | ||||
|           ctx.moveTo(0, 5) |  | ||||
|           ctx.lineTo(10, 5) |  | ||||
|           ctx.closePath() |  | ||||
|           ctx.stroke() |  | ||||
| 
 |  | ||||
|           return patternCanvas |  | ||||
|         } |  | ||||
| 
 |  | ||||
|         var hLinePatternBrush = new fabric.PatternBrush(canvas) |  | ||||
|         hLinePatternBrush.getPatternSrc = function() { |  | ||||
|           var patternCanvas = fabric.document.createElement('canvas') |  | ||||
|           patternCanvas.width = patternCanvas.height = 10 |  | ||||
|           var ctx = patternCanvas.getContext('2d') |  | ||||
| 
 |  | ||||
|           ctx.strokeStyle = this.color |  | ||||
|           ctx.lineWidth = 5 |  | ||||
|           ctx.beginPath() |  | ||||
|           ctx.moveTo(5, 0) |  | ||||
|           ctx.lineTo(5, 10) |  | ||||
|           ctx.closePath() |  | ||||
|           ctx.stroke() |  | ||||
| 
 |  | ||||
|           return patternCanvas |  | ||||
|         } |  | ||||
| 
 |  | ||||
|         var squarePatternBrush = new fabric.PatternBrush(canvas) |  | ||||
|         squarePatternBrush.getPatternSrc = function() { |  | ||||
|           var squareWidth = 10; var squareDistance = 2 |  | ||||
| 
 |  | ||||
|           var patternCanvas = fabric.document.createElement('canvas') |  | ||||
|           patternCanvas.width = patternCanvas.height = squareWidth + squareDistance |  | ||||
|           var ctx = patternCanvas.getContext('2d') |  | ||||
| 
 |  | ||||
|           ctx.fillStyle = this.color |  | ||||
|           ctx.fillRect(0, 0, squareWidth, squareWidth) |  | ||||
| 
 |  | ||||
|           return patternCanvas |  | ||||
|         } |  | ||||
| 
 |  | ||||
|         var diamondPatternBrush = new fabric.PatternBrush(canvas) |  | ||||
|         diamondPatternBrush.getPatternSrc = function() { |  | ||||
|           var squareWidth = 10; var squareDistance = 5 |  | ||||
|           var patternCanvas = fabric.document.createElement('canvas') |  | ||||
|           var rect = new fabric.Rect({ |  | ||||
|             width: squareWidth, |  | ||||
|             height: squareWidth, |  | ||||
|             angle: 45, |  | ||||
|             fill: this.color |  | ||||
|           }) |  | ||||
| 
 |  | ||||
|           var canvasWidth = rect.getBoundingRect().width |  | ||||
| 
 |  | ||||
|           patternCanvas.width = patternCanvas.height = canvasWidth + squareDistance |  | ||||
|           rect.set({ left: canvasWidth / 2, top: canvasWidth / 2 }) |  | ||||
| 
 |  | ||||
|           var ctx = patternCanvas.getContext('2d') |  | ||||
|           rect.render(ctx) |  | ||||
| 
 |  | ||||
|           return patternCanvas |  | ||||
|         } |  | ||||
| 
 |  | ||||
|         var img = new Image() |  | ||||
|         img.src = '../assets/honey_im_subtle.png' |  | ||||
| 
 |  | ||||
|         var texturePatternBrush = new fabric.PatternBrush(canvas) |  | ||||
|         texturePatternBrush.source = img |  | ||||
|       } |  | ||||
| 
 |  | ||||
|       $('drawing-mode-selector').onchange = function() { |  | ||||
|         if (this.value === 'hline') { |  | ||||
|           canvas.freeDrawingBrush = vLinePatternBrush |  | ||||
|         } else if (this.value === 'vline') { |  | ||||
|           canvas.freeDrawingBrush = hLinePatternBrush |  | ||||
|         } else if (this.value === 'square') { |  | ||||
|           canvas.freeDrawingBrush = squarePatternBrush |  | ||||
|         } else if (this.value === 'diamond') { |  | ||||
|           canvas.freeDrawingBrush = diamondPatternBrush |  | ||||
|         } else if (this.value === 'texture') { |  | ||||
|           canvas.freeDrawingBrush = texturePatternBrush |  | ||||
|         } else { |  | ||||
|           canvas.freeDrawingBrush = new fabric[this.value + 'Brush'](canvas) |  | ||||
|         } |  | ||||
| 
 |  | ||||
|         if (canvas.freeDrawingBrush) { |  | ||||
|           var brush = canvas.freeDrawingBrush |  | ||||
|           brush.color = drawingColorEl.value |  | ||||
|           if (brush.getPatternSrc) { |  | ||||
|             brush.source = brush.getPatternSrc.call(brush) |  | ||||
|           } |  | ||||
|           brush.width = parseInt(drawingLineWidthEl.value, 10) || 1 |  | ||||
|           brush.shadow = new fabric.Shadow({ |  | ||||
|             blur: parseInt(drawingShadowWidth.value, 10) || 0, |  | ||||
|             offsetX: 0, |  | ||||
|             offsetY: 0, |  | ||||
|             affectStroke: true, |  | ||||
|             color: drawingShadowColorEl.value |  | ||||
|           }) |  | ||||
|         } |  | ||||
|       } |  | ||||
| 
 |  | ||||
|       drawingColorEl.onchange = function() { |  | ||||
|         var brush = canvas.freeDrawingBrush |  | ||||
|         brush.color = this.value |  | ||||
|         if (brush.getPatternSrc) { |  | ||||
|           brush.source = brush.getPatternSrc.call(brush) |  | ||||
|         } |  | ||||
|       } |  | ||||
|       drawingShadowColorEl.onchange = function() { |  | ||||
|         canvas.freeDrawingBrush.shadow.color = this.value |  | ||||
|       } |  | ||||
|       drawingLineWidthEl.onchange = function() { |  | ||||
|         canvas.freeDrawingBrush.width = parseInt(this.value, 10) || 1 |  | ||||
|         this.previousSibling.innerHTML = this.value |  | ||||
|       } |  | ||||
|       drawingShadowWidth.onchange = function() { |  | ||||
|         canvas.freeDrawingBrush.shadow.blur = parseInt(this.value, 10) || 0 |  | ||||
|         this.previousSibling.innerHTML = this.value |  | ||||
|       } |  | ||||
|       drawingShadowOffset.onchange = function() { |  | ||||
|         canvas.freeDrawingBrush.shadow.offsetX = parseInt(this.value, 10) || 0 |  | ||||
|         canvas.freeDrawingBrush.shadow.offsetY = parseInt(this.value, 10) || 0 |  | ||||
|         this.previousSibling.innerHTML = this.value |  | ||||
|       } |  | ||||
| 
 |  | ||||
|       if (canvas.freeDrawingBrush) { |  | ||||
|         canvas.freeDrawingBrush.color = drawingColorEl.value |  | ||||
|         canvas.freeDrawingBrush.source = canvas.freeDrawingBrush.getPatternSrc.call(this) |  | ||||
|         canvas.freeDrawingBrush.width = parseInt(drawingLineWidthEl.value, 10) || 1 |  | ||||
|         canvas.freeDrawingBrush.shadow = new fabric.Shadow({ |  | ||||
|           blur: parseInt(drawingShadowWidth.value, 10) || 0, |  | ||||
|           offsetX: 0, |  | ||||
|           offsetY: 0, |  | ||||
|           affectStroke: true, |  | ||||
|           color: drawingShadowColorEl.value |  | ||||
|         }) |  | ||||
|       } |  | ||||
|       var mainScriptEl = document.getElementById('main') |  | ||||
|       if (!mainScriptEl) return |  | ||||
|       var preEl = document.createElement('pre') |  | ||||
|       var codeEl = document.createElement('code') |  | ||||
|       codeEl.innerHTML = mainScriptEl.innerHTML |  | ||||
|       codeEl.className = 'language-javascript' |  | ||||
|       preEl.appendChild(codeEl) |  | ||||
|       document.getElementById('bd-wrapper').appendChild(preEl) |  | ||||
| 
 |  | ||||
|       window.addEventListener('load', function() { |  | ||||
|         var canvas = this.canvas |  | ||||
|         var canvases = this.__canvases || this.canvases |  | ||||
| 
 |  | ||||
|         canvas && canvas.calcOffset && canvas.calcOffset() |  | ||||
| 
 |  | ||||
|         if (canvases && canvases.length) { |  | ||||
|           for (var i = 0, len = canvases.length; i < len; i++) { |  | ||||
|             canvases[i].calcOffset() |  | ||||
|           } |  | ||||
|         } |  | ||||
|       }) |  | ||||
|     } |  | ||||
|   } |  | ||||
|  |   name: 'Index' | ||||
| } | } | ||||
| </script> | </script> | ||||
| <style lang="less" scoped> |  | ||||
| 
 | 
 | ||||
| /deep/ .ivu-layout-header { |  | ||||
|   padding: 0 10px; |  | ||||
| } |  | ||||
| .home,.ivu-layout{ |  | ||||
|   height: 100vh; |  | ||||
| } |  | ||||
| .icon{ |  | ||||
|   display: block; |  | ||||
| } |  | ||||
| .canvas-box{ |  | ||||
|   position: absolute; |  | ||||
|   top: 50%; |  | ||||
|   left: 50%; |  | ||||
|   transform: translate(-50%, -50%); |  | ||||
| } |  | ||||
| #canvas{ |  | ||||
|   width: 300px; |  | ||||
|   height: 300px; |  | ||||
|   margin: 0 auto; |  | ||||
|   background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAHUlEQVQ4jWNgYGAQIYAJglEDhoUBg9+FowbQ2gAARjwKARjtnN8AAAAASUVORK5CYII="); |  | ||||
|   background-size: 30px 30px; |  | ||||
| } |  | ||||
| .content{ |  | ||||
|   flex: 1; |  | ||||
|   width: 200px; |  | ||||
|   padding:10px; |  | ||||
|   padding-top: 0; |  | ||||
|   height: 100%; |  | ||||
|   overflow-y: auto; |  | ||||
| } |  | ||||
|  | <style scoped> | ||||
|  | 
 | ||||
| </style> | </style> | ||||
|  | |||||
					Loading…
					
					
				
		Reference in new issue