Skip to content

Commit 1153a88

Browse files
authored
Merge pull request #76 from clavierpaul/master
Created arrow tool
2 parents 8a81af8 + 541bc21 commit 1153a88

File tree

4 files changed

+87
-0
lines changed

4 files changed

+87
-0
lines changed

examples/main.jsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,7 @@ class SketchFieldDemo extends React.Component {
393393
<MenuItem value={Tools.Select} key="Select">Select</MenuItem>
394394
<MenuItem value={Tools.Pencil} key="Pencil">Pencil</MenuItem>
395395
<MenuItem value={Tools.Line} key="Line">Line</MenuItem>
396+
<MenuItem value={Tools.Arrow} key="Arrow">Arrow</MenuItem>
396397
<MenuItem value={Tools.Rectangle} key="Rectangle">Rectangle</MenuItem>
397398
<MenuItem value={Tools.Circle} key="Circle">Circle</MenuItem>
398399
<MenuItem value={Tools.Pan} key="Pan">Pan</MenuItem>

src/SketchField.jsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {uuid4} from './utils';
77
import Select from './select';
88
import Pencil from './pencil';
99
import Line from './line';
10+
import Arrow from './arrow';
1011
import Rectangle from './rectangle';
1112
import Circle from './circle';
1213
import Pan from './pan';
@@ -81,6 +82,7 @@ class SketchField extends PureComponent {
8182
this._tools[Tool.Select] = new Select(fabricCanvas);
8283
this._tools[Tool.Pencil] = new Pencil(fabricCanvas);
8384
this._tools[Tool.Line] = new Line(fabricCanvas);
85+
this._tools[Tool.Arrow] = new Arrow(fabricCanvas);
8486
this._tools[Tool.Rectangle] = new Rectangle(fabricCanvas);
8587
this._tools[Tool.Circle] = new Circle(fabricCanvas);
8688
this._tools[Tool.Pan] = new Pan(fabricCanvas)

src/arrow.js

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/*eslint no-unused-vars: 0*/
2+
3+
import FabricCanvasTool from './fabrictool'
4+
5+
const fabric = require('fabric').fabric;
6+
7+
class Arrow extends FabricCanvasTool {
8+
9+
configureCanvas(props) {
10+
let canvas = this._canvas;
11+
canvas.isDrawingMode = canvas.selection = false;
12+
canvas.forEachObject((o) => o.selectable = o.evented = false);
13+
this._width = props.lineWidth;
14+
this._color = props.lineColor;
15+
}
16+
17+
doMouseDown(o) {
18+
this.isDown = true;
19+
let canvas = this._canvas;
20+
var pointer = canvas.getPointer(o.e);
21+
var points = [pointer.x, pointer.y, pointer.x, pointer.y];
22+
this.line = new fabric.Line(points, {
23+
strokeWidth: this._width,
24+
fill: this._color,
25+
stroke: this._color,
26+
originX: 'center',
27+
originY: 'center',
28+
selectable: false,
29+
evented: false
30+
});
31+
32+
this.head = new fabric.Triangle({
33+
fill: this._color,
34+
left: pointer.x,
35+
top: pointer.y,
36+
originX: 'center',
37+
originY: 'center',
38+
height: 3 * this._width,
39+
width: 3 * this._width,
40+
selectable: false,
41+
evented: false,
42+
angle: 90
43+
});
44+
45+
canvas.add(this.line);
46+
canvas.add(this.head);
47+
}
48+
49+
doMouseMove(o) {
50+
if (!this.isDown) return;
51+
let canvas = this._canvas;
52+
var pointer = canvas.getPointer(o.e);
53+
this.line.set({ x2: pointer.x, y2: pointer.y });
54+
this.line.setCoords();
55+
56+
let x_delta = pointer.x - this.line.x1;
57+
let y_delta = pointer.y - this.line.y1;
58+
59+
this.head.set({
60+
left: pointer.x,
61+
top: pointer.y,
62+
angle: 90 + Math.atan2(y_delta, x_delta) * 180/Math.PI
63+
});
64+
65+
canvas.renderAll();
66+
}
67+
68+
doMouseUp(o) {
69+
this.isDown = false;
70+
let canvas = this._canvas;
71+
72+
canvas.remove(this.line);
73+
canvas.remove(this.head);
74+
let arrow = new fabric.Group([this.line, this.head]);
75+
canvas.add(arrow);
76+
}
77+
78+
doMouseOut(o) {
79+
this.isDown = false;
80+
}
81+
}
82+
83+
export default Arrow;

src/tools.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
export default {
22
Circle: 'circle',
33
Line: 'line',
4+
Arrow: 'arrow',
45
Pencil: 'pencil',
56
Rectangle: 'rectangle',
67
Select: 'select',

0 commit comments

Comments
 (0)