diff -r 67f3a24a7c01 -r fa8035885814 client/js/paper-renderer.js
--- a/client/js/paper-renderer.js Tue Apr 29 23:53:13 2014 +0200
+++ b/client/js/paper-renderer.js Mon May 05 17:43:37 2014 +0200
@@ -11,94 +11,7 @@
/* This object contains constants, utility functions and classes for Renkan's Graph Manipulation GUI */
- var Renderer = Rkns.Renderer = {},
- /* The minimum distance (in pixels) the mouse has to move to consider an element was dragged */
- _MIN_DRAG_DISTANCE = 2,
- /* Distance between the inner and outer radius of buttons that appear when hovering on a node */
- _NODE_BUTTON_WIDTH = 40,
-
- _EDGE_BUTTON_INNER = 2,
- _EDGE_BUTTON_OUTER = 40,
- /* Constants used to know if a specific action is to be performed when clicking on the canvas */
- _CLICKMODE_ADDNODE = 1,
- _CLICKMODE_STARTEDGE = 2,
- _CLICKMODE_ENDEDGE = 3,
- /* Node size step: Used to calculate the size change when clicking the +/- buttons */
- _NODE_SIZE_STEP = Math.LN2/4,
- _MIN_SCALE = 1/20,
- _MAX_SCALE = 20,
- _MOUSEMOVE_RATE = 80,
- _DOUBLETAP_DELAY = 800,
- /* Maximum distance in pixels (squared, to reduce calculations)
- * between two taps when double-tapping on a touch terminal */
- _DOUBLETAP_DISTANCE = 20*20,
- /* A placeholder so a default colour is displayed when a node has a null value for its user property */
- _USER_PLACEHOLDER = function(_renkan) {
- return {
- color: _renkan.options.default_user_color,
- title: _renkan.translate("(unknown user)"),
- get: function(attr) {
- return this[attr] || false;
- }
- };
- },
- /* The code for the "Drag and Add Bookmarklet", slightly minified and with whitespaces removed, though
- * it doesn't seem that it's still a requirement in newer browsers (i.e. the ones compatibles with canvas drawing)
- */
- _BOOKMARKLET_CODE = function(_renkan) {
- return "(function(a,b,c,d,e,f,h,i,j,k,l,m,n,o,p,q,r){a=document;b=a.body;c=a.location.href;j='draggable';m='text/x-iri-';d=a.createElement('div');d.innerHTML='"
- + _renkan.translate("Drag items from this website, drop them in Renkan").replace(/ /g,"_")
- + "
'.replace(/_/g,String.fromCharCode(32));b.appendChild(d);e=[{r:/https?:\\/\\/[^\\/]*twitter\\.com\\//,s:'.tweet',n:'twitter'},{r:/https?:\\/\\/[^\\/]*google\\.[^\\/]+\\//,s:'.g',n:'google'},{r:/https?:\\/\\/[^\\/]*lemonde\\.fr\\//,s:'[data-vr-contentbox]',n:'lemonde'}];f=false;e.forEach(function(g){if(g.r.test(c)){f=g;}});if(f){h=function(){Array.prototype.forEach.call(a.querySelectorAll(f.s),function(i){i[j]=true;k=i.style;k.borderWidth='2px';k.borderColor='#909';k.borderStyle='solid';k.backgroundColor='rgba(200,0,180,.1)';})};window.setInterval(h,500);h();};a.addEventListener('dragstart',function(k){l=k.dataTransfer;l.setData(m+'source-uri',c);l.setData(m+'source-title',a.title);n=k.target;if(f){o=n;while(!o.attributes[j]){o=o.parentNode;if(o==b){break;}}}if(f&&o.attributes[j]){p=o.cloneNode(true);l.setData(m+'specific-site',f.n)}else{q=a.getSelection();if(q.type==='Range'||!q.type){p=q.getRangeAt(0).cloneContents();}else{p=n.cloneNode();}}r=a.createElement('div');r.appendChild(p);l.setData('text/x-iri-selected-text',r.textContent.trim());l.setData('text/x-iri-selected-html',r.innerHTML);},false);})();";
- },
- /* Shortens text to the required length then adds ellipsis */
- shortenText = function(_text, _maxlength) {
- return (_text.length > _maxlength ? (_text.substr(0,_maxlength) + '…') : _text);
- },
- /* Drawing an edit box with an arrow and positioning the edit box according to the position of the node/edge being edited
- * Called by Rkns.Renderer.NodeEditor and Rkns.Renderer.EdgeEditor */
- drawEditBox = function(_options, _coords, _path, _xmargin, _selector) {
- _selector.css({
- width: ( _options.tooltip_width - 2* _options.tooltip_padding )
- });
- var _height = _selector.outerHeight() + 2* _options.tooltip_padding,
- _isLeft = (_coords.x < paper.view.center.x ? 1 : -1),
- _left = _coords.x + _isLeft * ( _xmargin + _options.tooltip_arrow_length ),
- _right = _coords.x + _isLeft * ( _xmargin + _options.tooltip_arrow_length + _options.tooltip_width ),
- _top = _coords.y - _height / 2;
- if (_top + _height > (paper.view.size.height - _options.tooltip_margin)) {
- _top = Math.max( paper.view.size.height - _options.tooltip_margin, _coords.y + _options.tooltip_arrow_width / 2 ) - _height;
- }
- if (_top < _options.tooltip_margin) {
- _top = Math.min( _options.tooltip_margin, _coords.y - _options.tooltip_arrow_width / 2 );
- }
- var _bottom = _top + _height;
- _path.segments[0].point
- = _path.segments[7].point
- = _coords.add([_isLeft * _xmargin, 0]);
- _path.segments[1].point.x
- = _path.segments[2].point.x
- = _path.segments[5].point.x
- = _path.segments[6].point.x
- = _left;
- _path.segments[3].point.x
- = _path.segments[4].point.x
- = _right;
- _path.segments[2].point.y
- = _path.segments[3].point.y
- = _top;
- _path.segments[4].point.y
- = _path.segments[5].point.y
- = _bottom;
- _path.segments[1].point.y = _coords.y - _options.tooltip_arrow_width / 2;
- _path.segments[6].point.y = _coords.y + _options.tooltip_arrow_width / 2;
- _path.closed = true;
- _path.fillColor = new paper.GradientColor(new paper.Gradient([_options.tooltip_top_color, _options.tooltip_bottom_color]), [0,_top], [0, _bottom]);
- _selector.css({
- left: (_options.tooltip_padding + Math.min(_left, _right)),
- top: (_options.tooltip_padding + _top)
- });
- return _path;
- };
+ var Renderer = Rkns.Renderer = {};
/* Rkns.Renderer._BaseRepresentation Class */
@@ -261,7 +174,7 @@
},
redraw: function(_dontRedrawEdges) {
var _model_coords = new paper.Point(this.model.get("position")),
- _baseRadius = this.options.node_size_base * Math.exp((this.model.get("size") || 0) * _NODE_SIZE_STEP);
+ _baseRadius = this.options.node_size_base * Math.exp((this.model.get("size") || 0) * Rkns.Utils._NODE_SIZE_STEP);
if (!this.is_dragging || !this.paper_coords) {
this.paper_coords = this.renderer.toPaperCoords(_model_coords);
}
@@ -314,7 +227,7 @@
this.circle.opacity = this.options.show_node_circles ? opacity : .01;
var _text = this.model.get("title") || this.renkan.translate(this.options.label_untitled_nodes) || "";
- _text = shortenText(_text, this.options.node_label_max_length);
+ _text = Rkns.Utils.shortenText(_text, this.options.node_label_max_length);
if (typeof this.highlighted === "object") {
this.title.html(this.highlighted.replace(_(_text).escape(),'$1'));
@@ -327,7 +240,7 @@
top: this.paper_coords.y + this.circle_radius * this.h_ratio + this.options.node_label_distance,
opacity: opacity
});
- var _color = this.model.get("color") || (this.model.get("created_by") || _USER_PLACEHOLDER(this.renkan)).get("color");
+ var _color = this.model.get("color") || (this.model.get("created_by") || Rkns.Utils._USER_PLACEHOLDER(this.renkan)).get("color");
this.circle.strokeColor = _color;
var _pc = this.paper_coords;
this.all_buttons.forEach(function(b) {
@@ -694,7 +607,7 @@
_a = _v.angle,
_textdelta = _ortho.multiply(this.options.edge_label_distance),
_handle = _v.divide(3),
- _color = this.model.get("color") || this.model.get("color") || (this.model.get("created_by") || _USER_PLACEHOLDER(this.renkan)).get("color"),
+ _color = this.model.get("color") || this.model.get("color") || (this.model.get("created_by") || Rkns.Utils._USER_PLACEHOLDER(this.renkan)).get("color"),
opacity = 1;
if (this.model.get("delete_scheduled") || this.from_representation.model.get("delete_scheduled") || this.to_representation.model.get("delete_scheduled")) {
@@ -740,7 +653,7 @@
_textdelta = _textdelta.multiply(-1);
}
var _text = this.model.get("title") || this.renkan.translate(this.options.label_untitled_edges) || "";
- _text = shortenText(_text, this.options.node_label_max_length);
+ _text = Rkns.Utils.shortenText(_text, this.options.node_label_max_length);
this.text.text(_text);
var _textpos = this.paper_coords.add(_textdelta);
this.text.css({
@@ -853,7 +766,7 @@
this.renderer.edge_layer.activate();
this.type = "Temp-edge";
- var _color = (this.project.get("users").get(this.renkan.current_user) || _USER_PLACEHOLDER(this.renkan)).get("color");
+ var _color = (this.project.get("users").get(this.renkan.current_user) || Rkns.Utils._USER_PLACEHOLDER(this.renkan)).get("color");
this.line = new paper.Path();
this.line.strokeColor = _color;
this.line.dashArray = [4, 2];
@@ -988,7 +901,7 @@
),
draw: function() {
var _model = this.source_representation.model,
- _created_by = _model.get("created_by") || _USER_PLACEHOLDER(this.renkan),
+ _created_by = _model.get("created_by") || Rkns.Utils._USER_PLACEHOLDER(this.renkan),
_template = (this.renderer.isEditable() ? this.template : this.readOnlyTemplate ),
_image_placeholder = this.options.static_url + "img/image-placeholder.png",
_size = (_model.get("size") || 0);
@@ -998,7 +911,7 @@
has_creator: !!_model.get("created_by"),
title: _model.get("title"),
uri: _model.get("uri"),
- short_uri: shortenText((_model.get("uri") || "").replace(/^(https?:\/\/)?(www\.)?/,'').replace(/\/$/,''),40),
+ short_uri: Rkns.Utils.shortenText((_model.get("uri") || "").replace(/^(https?:\/\/)?(www\.)?/,'').replace(/\/$/,''),40),
description: _model.get("description"),
image: _model.get("image") || "",
image_placeholder: _image_placeholder,
@@ -1010,7 +923,7 @@
},
renkan: this.renkan,
options: this.options,
- shortenText: shortenText
+ shortenText: Rkns.Utils.shortenText
}));
this.redraw();
var _this = this,
@@ -1104,7 +1017,7 @@
},
function(_e) {
_e.preventDefault();
- _this.editor_$.find(".Rk-Edit-Color").css("background", _model.get("color") || (_model.get("created_by") || _USER_PLACEHOLDER(_this.renkan)).get("color"));
+ _this.editor_$.find(".Rk-Edit-Color").css("background", _model.get("color") || (_model.get("created_by") || Rkns.Utils._USER_PLACEHOLDER(_this.renkan)).get("color"));
}
).click(function(_e) {
_e.preventDefault();
@@ -1151,7 +1064,7 @@
},
redraw: function() {
var _coords = this.source_representation.paper_coords;
- drawEditBox(this.options, _coords, this.editor_block, this.source_representation.circle_radius * .75, this.editor_$);
+ Rkns.Utils.drawEditBox(this.options, _coords, this.editor_block, this.source_representation.circle_radius * .75, this.editor_$);
this.editor_$.show();
paper.view.draw();
}
@@ -1191,7 +1104,7 @@
var _model = this.source_representation.model,
_from_model = _model.get("from"),
_to_model = _model.get("to"),
- _created_by = _model.get("created_by") || _USER_PLACEHOLDER(this.renkan),
+ _created_by = _model.get("created_by") || Rkns.Utils._USER_PLACEHOLDER(this.renkan),
_template = (this.renderer.isEditable() ? this.template : this.readOnlyTemplate);
this.editor_$
.html(_template({
@@ -1199,18 +1112,18 @@
has_creator: !!_model.get("created_by"),
title: _model.get("title"),
uri: _model.get("uri"),
- short_uri: shortenText((_model.get("uri") || "").replace(/^(https?:\/\/)?(www\.)?/,'').replace(/\/$/,''),40),
+ short_uri: Rkns.Utils.shortenText((_model.get("uri") || "").replace(/^(https?:\/\/)?(www\.)?/,'').replace(/\/$/,''),40),
description: _model.get("description"),
color: _model.get("color") || _created_by.get("color"),
from_title: _from_model.get("title"),
to_title: _to_model.get("title"),
- from_color: _from_model.get("color") || (_from_model.get("created_by") || _USER_PLACEHOLDER(this.renkan)).get("color"),
- to_color: _to_model.get("color") || (_to_model.get("created_by") || _USER_PLACEHOLDER(this.renkan)).get("color"),
+ from_color: _from_model.get("color") || (_from_model.get("created_by") || Rkns.Utils._USER_PLACEHOLDER(this.renkan)).get("color"),
+ to_color: _to_model.get("color") || (_to_model.get("created_by") || Rkns.Utils._USER_PLACEHOLDER(this.renkan)).get("color"),
created_by_color: _created_by.get("color"),
created_by_title: _created_by.get("title")
},
renkan: this.renkan,
- shortenText: shortenText,
+ shortenText: Rkns.Utils.shortenText,
options: this.options
}));
this.redraw();
@@ -1295,7 +1208,7 @@
},
function(_e) {
_e.preventDefault();
- _this.editor_$.find(".Rk-Edit-Color").css("background", _model.get("color") || (_model.get("created_by") || _USER_PLACEHOLDER(_this.renkan)).get("color"));
+ _this.editor_$.find(".Rk-Edit-Color").css("background", _model.get("color") || (_model.get("created_by") || Rkns.Utils._USER_PLACEHOLDER(_this.renkan)).get("color"));
}
).click(function(_e) {
_e.preventDefault();
@@ -1311,7 +1224,7 @@
},
redraw: function() {
var _coords = this.source_representation.paper_coords;
- drawEditBox(this.options, _coords, this.editor_block, 5, this.editor_$);
+ Rkns.Utils.drawEditBox(this.options, _coords, this.editor_block, 5, this.editor_$);
this.editor_$.show();
paper.view.draw();
}
@@ -1330,7 +1243,7 @@
}
this.sector = this.renderer.drawSector(
this, 1 + sectorInner,
- _NODE_BUTTON_WIDTH + sectorInner,
+ Rkns.Utils._NODE_BUTTON_WIDTH + sectorInner,
this.startAngle,
this.endAngle,
1,
@@ -1496,7 +1409,7 @@
_(EdgeEditButton.prototype).extend({
_init: function() {
this.type = "Edge-edit-button";
- this.sector = this.renderer.drawSector(this, _EDGE_BUTTON_INNER, _EDGE_BUTTON_OUTER, -270, -90, 1, "edit", this.renkan.translate("Edit"));
+ this.sector = this.renderer.drawSector(this, Rkns.Utils._EDGE_BUTTON_INNER, Rkns.Utils._EDGE_BUTTON_OUTER, -270, -90, 1, "edit", this.renkan.translate("Edit"));
},
mouseup: function() {
if (!this.renderer.is_dragging) {
@@ -1512,7 +1425,7 @@
_(EdgeRemoveButton.prototype).extend({
_init: function() {
this.type = "Edge-remove-button";
- this.sector = this.renderer.drawSector(this, _EDGE_BUTTON_INNER, _EDGE_BUTTON_OUTER, -90, 90, 1, "remove", this.renkan.translate("Remove"));
+ this.sector = this.renderer.drawSector(this, Rkns.Utils._EDGE_BUTTON_INNER, Rkns.Utils._EDGE_BUTTON_OUTER, -90, 90, 1, "remove", this.renkan.translate("Remove"));
},
mouseup: function() {
this.renderer.click_target = null;
@@ -1542,7 +1455,7 @@
_(EdgeRevertButton.prototype).extend({
_init: function() {
this.type = "Edge-revert-button";
- this.sector = this.renderer.drawSector(this, _EDGE_BUTTON_INNER, _EDGE_BUTTON_OUTER, -135, 135, 1, "revert", this.renkan.translate("Cancel deletion"));
+ this.sector = this.renderer.drawSector(this, Rkns.Utils._EDGE_BUTTON_INNER, Rkns.Utils._EDGE_BUTTON_OUTER, -135, 135, 1, "revert", this.renkan.translate("Cancel deletion"));
},
mouseup: function() {
this.renderer.click_target = null;
@@ -1646,10 +1559,10 @@
img.src = _renkan.options.static_url + 'img/' + imgname + '.png';
_this.icon_cache[imgname] = img;
});
-
+
var throttledMouseMove = _.throttle(function(_event, _isTouch) {
_this.onMouseMove(_event, _isTouch);
- }, _MOUSEMOVE_RATE);
+ }, Rkns.Utils._MOUSEMOVE_RATE);
this.canvas_$.on({
mousedown: function(_event) {
@@ -1677,8 +1590,8 @@
var _touches = _event.originalEvent.touches[0];
if (
_renkan.options.allow_double_click
- && new Date() - _lastTap < _DOUBLETAP_DELAY
- && ( Math.pow(_lastTapX - _touches.pageX, 2) + Math.pow(_lastTapY - _touches.pageY, 2) < _DOUBLETAP_DISTANCE )
+ && new Date() - _lastTap < Rkns.Utils._DOUBLETAP_DELAY
+ && ( Math.pow(_lastTapX - _touches.pageX, 2) + Math.pow(_lastTapY - _touches.pageY, 2) < Rkns.Utils._DOUBLETAP_DISTANCE )
) {
_lastTap = 0;
_this.onDoubleClick(_touches);
@@ -1820,7 +1733,7 @@
bindClick(".Rk-Save-Button", "save");
bindClick(".Rk-Open-Button", "open");
this.$.find(".Rk-Bookmarklet-Button")
- .attr("href","javascript:" + _BOOKMARKLET_CODE(_renkan))
+ .attr("href","javascript:" + Rkns.Utils._BOOKMARKLET_CODE(_renkan))
.click(function(){
_this.notif_$
.text(_renkan.translate("Drag this button to your bookmark bar. When on a third-party website, click it to enable drag-and-drop from the website to Renkan."))
@@ -2201,7 +2114,7 @@
this.redrawUsers();
},
setScale: function(_newScale, _offset) {
- if ((_newScale/this.initialScale) > _MIN_SCALE && (_newScale/this.initialScale) < _MAX_SCALE) {
+ if ((_newScale/this.initialScale) > Rkns.Utils._MIN_SCALE && (_newScale/this.initialScale) < Rkns.Utils._MAX_SCALE) {
this.scale = _newScale;
if (_offset) {
this.offset = _offset;
@@ -2272,6 +2185,8 @@
},
addRepresentation: function(_type, _model) {
var _repr = new Renderer[_type](this, _model);
+ console.log("REPR RENKAN",_repr);
+ console.log("REPR RENKAN",Renderer[_type]);
this.representations.push(_repr);
return _repr;
},
@@ -2426,7 +2341,7 @@
]),
_delta = _point.subtract(this.last_point);
this.last_point = _point;
- if (!this.is_dragging && this.mouse_down && _delta.length > _MIN_DRAG_DISTANCE) {
+ if (!this.is_dragging && this.mouse_down && _delta.length > Rkns.Utils._MIN_DRAG_DISTANCE) {
this.is_dragging = true;
}
var _hitResult = paper.project.hitTest(_point);
@@ -2458,7 +2373,7 @@
this.click_target.mousedown(_event, _isTouch);
} else {
this.click_target = null;
- if (this.isEditable() && this.click_mode === _CLICKMODE_ADDNODE) {
+ if (this.isEditable() && this.click_mode === Rkns.Utils._CLICKMODE_ADDNODE) {
var _coords = this.toModelCoords(_point),
_data = {
id: Rkns.Utils.getUID('node'),
@@ -2474,10 +2389,10 @@
}
}
if (this.click_mode) {
- if (this.isEditable() && this.click_mode === _CLICKMODE_STARTEDGE && this.click_target && this.click_target.type === "Node") {
+ if (this.isEditable() && this.click_mode === Rkns.Utils._CLICKMODE_STARTEDGE && this.click_target && this.click_target.type === "Node") {
this.removeRepresentationsOfType("editor");
this.addTempEdge(this.click_target, _point);
- this.click_mode = _CLICKMODE_ENDEDGE;
+ this.click_mode = Rkns.Utils._CLICKMODE_ENDEDGE;
this.notif_$.fadeOut(function() {
$(this).html(this.renkan.translate("Click on a second node to complete the edge")).fadeIn();
});
@@ -2716,21 +2631,21 @@
this.setScale( _newScale, _offset );
},
addNodeBtn: function() {
- if (this.click_mode === _CLICKMODE_ADDNODE) {
+ if (this.click_mode === Rkns.Utils._CLICKMODE_ADDNODE) {
this.click_mode = false;
this.notif_$.hide();
} else {
- this.click_mode = _CLICKMODE_ADDNODE;
+ this.click_mode = Rkns.Utils._CLICKMODE_ADDNODE;
this.notif_$.text(this.renkan.translate("Click on the background canvas to add a node")).fadeIn();
}
return false;
},
addEdgeBtn: function() {
- if (this.click_mode === _CLICKMODE_STARTEDGE || this.click_mode === _CLICKMODE_ENDEDGE) {
+ if (this.click_mode === Rkns.Utils._CLICKMODE_STARTEDGE || this.click_mode === Rkns.Utils._CLICKMODE_ENDEDGE) {
this.click_mode = false;
this.notif_$.hide();
} else {
- this.click_mode = _CLICKMODE_STARTEDGE;
+ this.click_mode = Rkns.Utils._CLICKMODE_STARTEDGE;
this.notif_$.text(this.renkan.translate("Click on a first node to start the edge")).fadeIn();
}
return false;