2 changed files with 16 additions and 424 deletions
@ -1,423 +1,13 @@ |
|||
<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> |
|||
|
|||
<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 { |
|||
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> |
|||
<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> |
|||
|
Loading…
Reference in new issue