Reputation: 622
Good Night, dear colleages! I need two draw application with two buttons: selection and draw line. The button "selection" should select shapes to tranform them. THe button draw line shoul draw line.
Now my code draw line and made it selected. I want to devide this functions. How should I solve my problem?
var Line = (function() {
function Line(canvas) {
this.canvas = canvas;
this.isDrawing = false;
this.bindEvents();
}
Line.prototype.bindEvents = function() {
var inst = this;
inst.canvas.on('mouse:down', function(o) {
inst.onMouseDown(o);
});
inst.canvas.on('mouse:move', function(o) {
inst.onMouseMove(o);
});
inst.canvas.on('mouse:up', function(o) {
inst.onMouseUp(o);
});
inst.canvas.on('object:moving', function(o) {
inst.disable();
})
}
Line.prototype.onMouseUp = function(o) {
var inst = this;
if (inst.isEnable()) {
inst.disable();
}
};
Line.prototype.onMouseMove = function(o) {
var inst = this;
if (!inst.isEnable()) {
return;
}
var pointer = inst.canvas.getPointer(o.e);
var activeObj = inst.canvas.getActiveObject();
activeObj.set({
x2: pointer.x,
y2: pointer.y
});
activeObj.setCoords();
inst.canvas.renderAll();
};
Line.prototype.onMouseDown = function(o) {
var inst = this;
inst.enable();
var pointer = inst.canvas.getPointer(o.e);
origX = pointer.x;
origY = pointer.y;
var points = [pointer.x, pointer.y, pointer.x, pointer.y];
var line = new fabric.Line(points, {
strokeWidth: 5,
stroke: 'red',
fill: 'red',
originX: 'center',
originY: 'center',
hasBorders: false,
hasControls: false
});
inst.canvas.add(line).setActiveObject(line);
};
Line.prototype.isEnable = function() {
return this.isDrawing;
}
Line.prototype.enable = function() {
this.isDrawing = true;
}
Line.prototype.disable = function() {
this.isDrawing = false;
}
return Line;
}());
console.log(fabric);
var canvas = new fabric.Canvas('canvas');
var line = new Line(canvas);
<div id="canvasContainer">
<canvas id="canvas" width="400" height="400" style="border: solid 1px"></canvas>
</div>
<script
type="text/javascript"
src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.4.0/fabric.min.js"
></script>
Upvotes: 0
Views: 427
Reputation: 12891
At the moment you have both drawing and selecting because Fabric makes it's associated canvas selectable by default.
This behaviour is controlled by changing the boolean .selection property on the object returned by calling new fabric.Canvas()
.
So all you have to do is set up two buttons (Select/Draw), set canvas.selection
to the desired state and return from the mouseMove handler before doing any drawing in case selection==true
.
Here's an example:
function select(state) {
canvas.selection = state;
}
var Line = (function() {
function Line(canvas) {
this.canvas = canvas;
this.isDrawing = false;
this.bindEvents();
}
Line.prototype.bindEvents = function() {
var inst = this;
inst.canvas.on('mouse:down', function(o) {
inst.onMouseDown(o);
});
inst.canvas.on('mouse:move', function(o) {
inst.onMouseMove(o);
});
inst.canvas.on('mouse:up', function(o) {
inst.onMouseUp(o);
});
inst.canvas.on('object:moving', function(o) {
inst.disable();
})
}
Line.prototype.onMouseUp = function(o) {
var inst = this;
if (inst.isEnable()) {
inst.disable();
}
};
Line.prototype.onMouseMove = function(o) {
var inst = this;
if (!inst.isEnable() || canvas.selection) {
return;
}
var pointer = inst.canvas.getPointer(o.e);
var activeObj = inst.canvas.getActiveObject();
activeObj.set({
x2: pointer.x,
y2: pointer.y
});
activeObj.setCoords();
inst.canvas.renderAll();
};
Line.prototype.onMouseDown = function(o) {
var inst = this;
inst.enable();
var pointer = inst.canvas.getPointer(o.e);
origX = pointer.x;
origY = pointer.y;
var points = [pointer.x, pointer.y, pointer.x, pointer.y];
var line = new fabric.Line(points, {
strokeWidth: 5,
stroke: 'red',
fill: 'red',
originX: 'center',
originY: 'center',
hasBorders: false,
hasControls: false
});
inst.canvas.add(line).setActiveObject(line);
};
Line.prototype.isEnable = function() {
return this.isDrawing;
}
Line.prototype.enable = function() {
this.isDrawing = true;
}
Line.prototype.disable = function() {
this.isDrawing = false;
}
return Line;
}());
var canvas = new fabric.Canvas('canvas');
canvas.selection = false;
var line = new Line(canvas);
<div id="canvasContainer">
<canvas id="canvas" width="400" height="400" style="border: solid 1px"></canvas>
</div>
<button onclick='select(true);'>Select</button>
<button onclick='select(false);'>Draw</button>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.4.0/fabric.min.js"></script>
Upvotes: 1