-
Notifications
You must be signed in to change notification settings - Fork 0
/
ds-Canvas-Guides.js
111 lines (101 loc) · 2.93 KB
/
ds-Canvas-Guides.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
(function (root, global, Backbone, _, $) {
if (!root || !global || !Backbone || !_ || !$) return;
var Canvas = root.Canvas;
/* Guides */
var Guide = Backbone.Model.extend({
validate: function(a) {
if (a.axis !== "x" && a.axis !== "y") {
return "Wrong value: The axis-attribute must either be 'x' or 'y'.";
}
if (typeof a.position != "number") {
return "Wrong type: The guide's position must be a number.";
}
},
initialize: function(a) {
this.set({
axis: a.axis,
position: a.position,
id: _.uniqueId("ds-canvas-guide-")
});
}
}),
GuideList = Backbone.Collection.extend({
model: Guide,
getGuideById: function (id) {
return this.where({id: id})[0];
}
}),
guideList = new GuideList;
var dsGuideView = new (Backbone.View.extend({
initialize: function() {
this.collection.on("add", this._addGuide, this);
this.collection.on("change", this._changeGuide, this);
this.collection.on("remove", this._removeGuide, this);
this.meta = this.$(".ds-canvas-metalayer").eq(0);
this.content = this.$(".ds-canvas-contentlayer").eq(0);
this._guideList = {};
this.pageOffset = {top: 0, left: 0};
Canvas.on("setup", function (data) {
this.pageOffset = {
top: data.pageStartY,
left: data.pageStartX
};
this._pageOffsetChanged();
}, this);
},
_pageOffsetChanged: function () {
this.collection.each(this._changeGuide, this);
},
_addGuide: function (m) {
var guide = m;
this._guideList[guide.get("id")] = $("<div class='ds-canvas-guide ds-scale' id='" + guide.get("id") + "' />").data("scaleproperty", "top left").appendTo(this.meta);
this._changeGuide(m);
},
_changeGuide: function (m) {
var guide = m, guideEl = this.getGuideById(guide);
if (guide.get("axis") === "y") {
guideEl.addClass("ds-canvas-guide-horizontal").css({
top: (this.pageOffset.top + guide.get("position")) + "px"
})
} else {
guideEl.addClass("ds-canvas-guide-vertical").css({
left: (this.pageOffset.left + guide.get("position")) + "px"
})
}
},
_removeGuide: function (m) {
var guide = m;
this.getGuideById(guide).remove();
delete this._guideList[guide.get("id")];
},
getGuideById: function (id) {
return this._guideList[ typeof id === "string" ? id : (id instanceof Guide ? id.get("id") : undefined)];
},
move: function (e) {
if (e.dsType === "guide") {
var horizontal = e.$target.hasClass("ds-canvas-guide-horizontal"),
attribute = horizontal ? "top" : "left",
position = horizontal ? e.pageY : e.pageX;
if (e.type === "dragstart") {
this.dragGuide = e.dsObject;
}
e.$target.css(attribute, position + this.pageOffset[attribute]);
if (e.type === "dragend") {
this.dragGuide.set("position", position);
}
}
},
events: {
"dragstart": "move",
"drag": "move",
"dragend": "move"
}
}))({
collection: guideList,
el: $(".ds-canvas")
});
root.supply({
"Guide": Guide,
"guideList": guideList
});
})(ds, this, Backbone, _, jQuery);