Merge pull request #365 from Connoropolous/wip-zoomExtents
Various changes, but mostly to Selection with box and zoom to extents
This commit is contained in:
commit
ca8794e61b
5 changed files with 355 additions and 285 deletions
|
@ -2498,7 +2498,11 @@ Extras.Classes.Navigation = new Class({
|
||||||
if (!Metamaps.Mouse.boxStartCoordinates && (e.shiftKey || rightClick)) {
|
if (!Metamaps.Mouse.boxStartCoordinates && (e.shiftKey || rightClick)) {
|
||||||
Metamaps.Mouse.boxStartCoordinates = eventInfo.getPos();
|
Metamaps.Mouse.boxStartCoordinates = eventInfo.getPos();
|
||||||
}
|
}
|
||||||
|
|
||||||
Metamaps.Mouse.didPan = false;
|
Metamaps.Mouse.didPan = false;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// END METAMAPS CODE
|
// END METAMAPS CODE
|
||||||
|
|
||||||
this.pos = eventInfo.getPos();
|
this.pos = eventInfo.getPos();
|
||||||
|
@ -2570,6 +2574,8 @@ Extras.Classes.Navigation = new Class({
|
||||||
|
|
||||||
// START METAMAPS CODE
|
// START METAMAPS CODE
|
||||||
if (Metamaps.Mouse.didPan) Metamaps.JIT.SmoothPanning();
|
if (Metamaps.Mouse.didPan) Metamaps.JIT.SmoothPanning();
|
||||||
|
|
||||||
|
|
||||||
// END METAMAPS CODE
|
// END METAMAPS CODE
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -366,6 +366,29 @@ Metamaps.GlobalUI.Search = {
|
||||||
self.close(0, true);
|
self.close(0, true);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 65:
|
||||||
|
case 97:
|
||||||
|
|
||||||
|
if (e.ctrlKey){
|
||||||
|
Metamaps.Control.deselectAllNodes();
|
||||||
|
Metamaps.Control.deselectAllEdges();
|
||||||
|
|
||||||
|
e.preventDefault();
|
||||||
|
Metamaps.Visualize.mGraph.graph.eachNode(function (n) {
|
||||||
|
Metamaps.Control.selectNode(n,e);
|
||||||
|
});
|
||||||
|
|
||||||
|
Metamaps.Visualize.mGraph.plot();
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 69:
|
||||||
|
case 101:
|
||||||
|
if (e.ctrlKey){
|
||||||
|
e.preventDefault();
|
||||||
|
Metamaps.JIT.zoomExtents();
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break; //console.log(e.which);
|
break; //console.log(e.which);
|
||||||
}
|
}
|
||||||
|
|
|
@ -319,7 +319,7 @@ Metamaps.JIT = {
|
||||||
if (Metamaps.Mouse.boxStartCoordinates) {
|
if (Metamaps.Mouse.boxStartCoordinates) {
|
||||||
Metamaps.Visualize.mGraph.busy = false;
|
Metamaps.Visualize.mGraph.busy = false;
|
||||||
Metamaps.Mouse.boxEndCoordinates = eventInfo.getPos();
|
Metamaps.Mouse.boxEndCoordinates = eventInfo.getPos();
|
||||||
Metamaps.JIT.selectWithBox(e);
|
Metamaps.JIT.zoomToBox();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -672,8 +672,6 @@ Metamaps.JIT = {
|
||||||
|
|
||||||
var scale = dist / lastDist;
|
var scale = dist / lastDist;
|
||||||
|
|
||||||
console.log(scale);
|
|
||||||
|
|
||||||
if (8 >= Metamaps.Visualize.mGraph.canvas.scaleOffsetX * scale && Metamaps.Visualize.mGraph.canvas.scaleOffsetX * scale >= 1) {
|
if (8 >= Metamaps.Visualize.mGraph.canvas.scaleOffsetX * scale && Metamaps.Visualize.mGraph.canvas.scaleOffsetX * scale >= 1) {
|
||||||
Metamaps.Visualize.mGraph.canvas.scale(scale, scale);
|
Metamaps.Visualize.mGraph.canvas.scale(scale, scale);
|
||||||
}
|
}
|
||||||
|
@ -940,7 +938,7 @@ Metamaps.JIT = {
|
||||||
Metamaps.Control.deselectAllEdges();
|
Metamaps.Control.deselectAllEdges();
|
||||||
}
|
}
|
||||||
|
|
||||||
//select all nodes, and their edges, that are within the box
|
//select all nodes that are within the box
|
||||||
Metamaps.Visualize.mGraph.graph.eachNode(function (n) {
|
Metamaps.Visualize.mGraph.graph.eachNode(function (n) {
|
||||||
var x = n.pos.x,
|
var x = n.pos.x,
|
||||||
y = n.pos.y;
|
y = n.pos.y;
|
||||||
|
@ -969,8 +967,8 @@ Metamaps.JIT = {
|
||||||
var fromNodeY = -1 * synapse.get('edge').nodeFrom.pos.y;
|
var fromNodeY = -1 * synapse.get('edge').nodeFrom.pos.y;
|
||||||
var toNodeX = synapse.get('edge').nodeTo.pos.x;
|
var toNodeX = synapse.get('edge').nodeTo.pos.x;
|
||||||
var toNodeY = -1 * synapse.get('edge').nodeTo.pos.y;
|
var toNodeY = -1 * synapse.get('edge').nodeTo.pos.y;
|
||||||
|
|
||||||
var maxX = fromNodeX;
|
var maxX = fromNodeX;
|
||||||
var maxY = fromNodeY;
|
var maxY = fromNodeY;
|
||||||
var minX = fromNodeX;
|
var minX = fromNodeX;
|
||||||
var minY = fromNodeY;
|
var minY = fromNodeY;
|
||||||
|
@ -988,7 +986,7 @@ Metamaps.JIT = {
|
||||||
(eX > maxBoxX) ? (maxBoxX = eX):(minBoxX = eX);
|
(eX > maxBoxX) ? (maxBoxX = eX):(minBoxX = eX);
|
||||||
(eY > maxBoxY) ? (maxBoxY = eY):(minBoxY = eY);
|
(eY > maxBoxY) ? (maxBoxY = eY):(minBoxY = eY);
|
||||||
|
|
||||||
//Fins the slopes from the synapse fromNode to the 4 corners of the selection box
|
//Find the slopes from the synapse fromNode to the 4 corners of the selection box
|
||||||
var slopes = [];
|
var slopes = [];
|
||||||
slopes.push( (sY - fromNodeY) / (sX - fromNodeX) );
|
slopes.push( (sY - fromNodeY) / (sX - fromNodeX) );
|
||||||
slopes.push( (sY - fromNodeY) / (eX - fromNodeX) );
|
slopes.push( (sY - fromNodeY) / (eX - fromNodeX) );
|
||||||
|
@ -1005,40 +1003,44 @@ Metamaps.JIT = {
|
||||||
//Find synapse-in-question's slope
|
//Find synapse-in-question's slope
|
||||||
var synSlope = (toNodeY - fromNodeY) / (toNodeX - fromNodeX);
|
var synSlope = (toNodeY - fromNodeY) / (toNodeX - fromNodeX);
|
||||||
var b = fromNodeY - synSlope * fromNodeX;
|
var b = fromNodeY - synSlope * fromNodeX;
|
||||||
|
|
||||||
|
//Use the selection box edges as test cases for synapse intersection
|
||||||
|
var testX = sX;
|
||||||
|
var testY = synSlope * testX + b;
|
||||||
|
|
||||||
|
var selectTest;
|
||||||
|
|
||||||
var selectTest = false;
|
if(testX >= minX && testX <= maxX && testY >= minY && testY <= maxY && testY >= minBoxY && testY <= maxBoxY){
|
||||||
|
selectTest = true;
|
||||||
//if the synapse slope is within a range that would intersect with the selection box
|
|
||||||
if (synSlope <= maxSlope && synSlope >= minSlope){
|
|
||||||
var testX = sX;
|
|
||||||
var testY = synSlope * testX + b;
|
|
||||||
|
|
||||||
if(testX >= minX && testX <= maxX && testY >= minY && testY <= maxY && testY >= minBoxY && testY <= maxBoxY){
|
|
||||||
selectTest = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
testX = eX;
|
|
||||||
testY = synSlope * testX + b;
|
|
||||||
|
|
||||||
if(testX >= minX && testX <= maxX && testY >= minY && testY <= maxY && testY >= minBoxY && testY <= maxBoxY){
|
|
||||||
selectTest = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
testY = sY;
|
|
||||||
testX = (testY - b)/synSlope;
|
|
||||||
|
|
||||||
if(testX >= minX && testX <= maxX && testY >= minY && testY <= maxY && testX >= minBoxX && testY <= maxBoxX){
|
|
||||||
selectTest = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
testY = eY;
|
|
||||||
testX = (testY - b)/synSlope;
|
|
||||||
|
|
||||||
if(testX >= minX && testX <= maxX && testY >= minY && testY <= maxY && testX >= minBoxX && testY <= maxBoxX){
|
|
||||||
selectTest = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
//The test synapse was selected!
|
|
||||||
|
testX = eX;
|
||||||
|
testY = synSlope * testX + b;
|
||||||
|
|
||||||
|
if(testX >= minX && testX <= maxX && testY >= minY && testY <= maxY && testY >= minBoxY && testY <= maxBoxY){
|
||||||
|
selectTest = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
testY = sY;
|
||||||
|
testX = (testY - b)/synSlope;
|
||||||
|
|
||||||
|
if(testX >= minX && testX <= maxX && testY >= minY && testY <= maxY && testX >= minBoxX && testX <= maxBoxX){
|
||||||
|
selectTest = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
testY = eY;
|
||||||
|
testX = (testY - b)/synSlope;
|
||||||
|
|
||||||
|
if(testX >= minX && testX <= maxX && testY >= minY && testY <= maxY && testX >= minBoxX && testX <= maxBoxX){
|
||||||
|
selectTest = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Case where the synapse is wholly enclosed in the seldction box
|
||||||
|
if(fromNodeX >= minBoxX && fromNodeX <= maxBoxX && fromNodeY >= minBoxY && fromNodeY <= maxBoxY && toNodeX >= minBoxX && toNodeX <= maxBoxX && toNodeY >= minBoxY && toNodeY <= maxBoxY){
|
||||||
|
selectTest = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//The test synapse was selected!
|
||||||
if(selectTest){
|
if(selectTest){
|
||||||
if(e.ctrlKey){
|
if(e.ctrlKey){
|
||||||
if(Metamaps.Selected.Edges.indexOf(synapse.get('edge')) != -1 ){
|
if(Metamaps.Selected.Edges.indexOf(synapse.get('edge')) != -1 ){
|
||||||
|
@ -1102,15 +1104,23 @@ Metamaps.JIT = {
|
||||||
// wait a certain length of time, then check again, then run this code
|
// wait a certain length of time, then check again, then run this code
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
if (!Metamaps.JIT.nodeWasDoubleClicked()) {
|
if (!Metamaps.JIT.nodeWasDoubleClicked()) {
|
||||||
if (!e.shiftKey) {
|
if (!e.shiftKey && !e.ctrlKey) {
|
||||||
Metamaps.Control.deselectAllNodes();
|
Metamaps.Control.deselectAllNodes();
|
||||||
Metamaps.Control.deselectAllEdges();
|
Metamaps.Control.deselectAllEdges();
|
||||||
}
|
}
|
||||||
if (node.selected) {
|
if(e.ctrlKey || e.shiftKey){
|
||||||
Metamaps.Control.deselectNode(node);
|
if (node.selected) {
|
||||||
} else {
|
Metamaps.Control.deselectNode(node);
|
||||||
|
} else {
|
||||||
|
Metamaps.Control.selectNode(node,e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
Metamaps.Control.deselectAllNodes();
|
||||||
|
Metamaps.Control.deselectAllEdges();
|
||||||
Metamaps.Control.selectNode(node,e);
|
Metamaps.Control.selectNode(node,e);
|
||||||
}
|
}
|
||||||
|
|
||||||
//trigger animation to final styles
|
//trigger animation to final styles
|
||||||
Metamaps.Visualize.mGraph.fx.animate({
|
Metamaps.Visualize.mGraph.fx.animate({
|
||||||
modes: ['edge-property:lineWidth:color:alpha'],
|
modes: ['edge-property:lineWidth:color:alpha'],
|
||||||
|
@ -1138,7 +1148,6 @@ Metamaps.JIT = {
|
||||||
// create new menu for clicked on node
|
// create new menu for clicked on node
|
||||||
var rightclickmenu = document.createElement("div");
|
var rightclickmenu = document.createElement("div");
|
||||||
rightclickmenu.className = "rightclickmenu";
|
rightclickmenu.className = "rightclickmenu";
|
||||||
|
|
||||||
// add the proper options to the menu
|
// add the proper options to the menu
|
||||||
var menustring = '<ul>';
|
var menustring = '<ul>';
|
||||||
|
|
||||||
|
@ -1170,8 +1179,7 @@ Metamaps.JIT = {
|
||||||
top: e.clientY
|
top: e.clientY
|
||||||
});
|
});
|
||||||
//add the menu to the page
|
//add the menu to the page
|
||||||
$('#wrapper').append(rightclickmenu);
|
$('#infovis-canvaswidget').append(rightclickmenu);
|
||||||
|
|
||||||
|
|
||||||
// attach events to clicks on the list items
|
// attach events to clicks on the list items
|
||||||
|
|
||||||
|
@ -1494,133 +1502,163 @@ Metamaps.JIT = {
|
||||||
|
|
||||||
canvas.translate(-1*offsetX,-1*offsetY);
|
canvas.translate(-1*offsetX,-1*offsetY);
|
||||||
},
|
},
|
||||||
zoomExtents: function (event) {
|
zoomToBox: function () {
|
||||||
|
var sX = Metamaps.Mouse.boxStartCoordinates.x,
|
||||||
|
sY = Metamaps.Mouse.boxStartCoordinates.y,
|
||||||
|
eX = Metamaps.Mouse.boxEndCoordinates.x,
|
||||||
|
eY = Metamaps.Mouse.boxEndCoordinates.y;
|
||||||
|
|
||||||
|
Metamaps.JIT.centerMap();
|
||||||
|
|
||||||
|
var height = $(document).height(),
|
||||||
|
width = $(document).width();
|
||||||
|
|
||||||
|
var spanX = Math.abs(sX - eX);
|
||||||
|
var spanY = Math.abs(sY - eY);
|
||||||
|
var ratioX = width / spanX;
|
||||||
|
var ratioY = height / spanY;
|
||||||
|
|
||||||
|
var newRatio = Math.min(ratioX,ratioY);
|
||||||
|
|
||||||
|
var canvas = Metamaps.Visualize.mGraph.canvas;
|
||||||
|
|
||||||
|
if(canvas.scaleOffsetX *newRatio<= 5 && canvas.scaleOffsetX*newRatio >= 0.2){
|
||||||
|
canvas.scale(newRatio,newRatio);
|
||||||
|
}
|
||||||
|
else if(canvas.scaleOffsetX * newRatio > 5){
|
||||||
|
newRatio = 5/ canvas.scaleOffsetX;
|
||||||
|
canvas.scale(newRatio,newRatio);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
newRatio = 0.2/ canvas.scaleOffsetX;
|
||||||
|
canvas.scale(newRatio,newRatio);
|
||||||
|
}
|
||||||
|
|
||||||
|
var cogX = (sX + eX)/2;
|
||||||
|
var cogY = (sY + eY)/2;
|
||||||
|
|
||||||
|
canvas.translate(-1* cogX, -1* cogY);
|
||||||
|
|
||||||
|
|
||||||
|
Metamaps.Mouse.boxStartCoordinates = false;
|
||||||
|
Metamaps.Mouse.boxEndCoordinates = false;
|
||||||
|
Metamaps.Visualize.mGraph.plot();
|
||||||
|
|
||||||
|
},
|
||||||
|
zoomExtents: function () {
|
||||||
Metamaps.JIT.centerMap();
|
Metamaps.JIT.centerMap();
|
||||||
var height = $(document).height(),
|
var height = $(document).height(),
|
||||||
width = $(document).width(),
|
width = $(document).width(),
|
||||||
maxX, minX, maxY, minY, counter = 0;
|
maxX, minX, maxY, minY, counter = 0;
|
||||||
|
var canvas = Metamaps.Visualize.mGraph.canvas;
|
||||||
|
|
||||||
|
|
||||||
if (Metamaps.Selected.Nodes.length > 0) {
|
if (Metamaps.Selected.Nodes.length > 0) {
|
||||||
var nodes = Metamaps.Selected.Nodes;
|
var nodes = Metamaps.Selected.Nodes;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var nodes = _.values(Metamaps.Visualize.mGraph.graph.nodes);
|
||||||
|
}
|
||||||
|
|
||||||
if(nodes.length > 1){
|
if(nodes.length > 1){
|
||||||
nodes.forEach(function (n) {
|
nodes.forEach(function (n) {
|
||||||
var x = n.pos.x,
|
var x = n.pos.x,
|
||||||
y = n.pos.y;
|
y = n.pos.y;
|
||||||
|
|
||||||
if (counter == 0){
|
if (counter == 0){
|
||||||
maxX = x;
|
maxX = x;
|
||||||
minX = x;
|
minX = x;
|
||||||
maxY = y;
|
maxY = y;
|
||||||
minY = y;
|
minY = y;
|
||||||
}
|
}
|
||||||
|
|
||||||
maxX = Math.max(x,maxX);
|
var arrayOfLabelLines = Metamaps.Util.splitLine(n.name, 30).split('\n'),
|
||||||
maxY = Math.max(y,maxY);
|
dim = n.getData('dim'),
|
||||||
minX = Math.min(x,minX);
|
ctx = canvas.getCtx();
|
||||||
minY = Math.min(y,minY);
|
|
||||||
|
|
||||||
counter++;
|
var height = 25 * arrayOfLabelLines.length;
|
||||||
});
|
|
||||||
|
|
||||||
var spanX = maxX - minX;
|
var index, lineWidths = [];
|
||||||
var spanY = maxY - minY;
|
for (index = 0; index < arrayOfLabelLines.length; ++index) {
|
||||||
var ratioX = spanX / width;
|
lineWidths.push(ctx.measureText(arrayOfLabelLines[index]).width)
|
||||||
var ratioY = spanY / height;
|
}
|
||||||
|
var width = Math.max.apply(null, lineWidths) + 8;
|
||||||
|
|
||||||
var newRatio = Math.max(ratioX,ratioY);
|
maxX = Math.max(x + width /2,maxX);
|
||||||
|
maxY = Math.max(y + n.getData("height") + 5 + height,maxY);
|
||||||
|
minX = Math.min(x - width /2,minX);
|
||||||
|
minY = Math.min(y - dim,minY);
|
||||||
|
|
||||||
var canvas = Metamaps.Visualize.mGraph.canvas;
|
counter++;
|
||||||
|
});
|
||||||
|
|
||||||
canvas.scale(1/newRatio*0.8,1/newRatio*0.8);
|
var spanX = maxX - minX;
|
||||||
|
var spanY = maxY - minY;
|
||||||
|
var ratioX = spanX / width;
|
||||||
|
var ratioY = spanY / height;
|
||||||
|
|
||||||
counter = 0;
|
var newRatio = Math.max(ratioX,ratioY);
|
||||||
|
var scaleMultiplier = 1/newRatio*0.9;
|
||||||
|
|
||||||
nodes.forEach(function (n) {
|
if(canvas.scaleOffsetX *scaleMultiplier<= 3 && canvas.scaleOffsetX*scaleMultiplier >= 0.2){
|
||||||
var x = n.pos.x,
|
canvas.scale(scaleMultiplier,scaleMultiplier);
|
||||||
y = n.pos.y;
|
|
||||||
|
|
||||||
if (counter == 0){
|
|
||||||
maxX = x;
|
|
||||||
minX = x;
|
|
||||||
maxY = y;
|
|
||||||
minY = y;
|
|
||||||
}
|
|
||||||
|
|
||||||
maxX = Math.max(x,maxX);
|
|
||||||
maxY = Math.max(y,maxY);
|
|
||||||
minX = Math.min(x,minX);
|
|
||||||
minY = Math.min(y,minY);
|
|
||||||
|
|
||||||
counter++;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
else if(canvas.scaleOffsetX * scaleMultiplier > 3){
|
||||||
|
scaleMultiplier = 3/ canvas.scaleOffsetX;
|
||||||
|
canvas.scale(scaleMultiplier,scaleMultiplier);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
scaleMultiplier = 0.2/ canvas.scaleOffsetX;
|
||||||
|
canvas.scale(scaleMultiplier,scaleMultiplier);
|
||||||
|
}
|
||||||
|
|
||||||
|
counter = 0;
|
||||||
|
|
||||||
|
nodes.forEach(function (n) {
|
||||||
|
var x = n.pos.x,
|
||||||
|
y = n.pos.y;
|
||||||
|
|
||||||
|
if (counter == 0){
|
||||||
|
maxX = x;
|
||||||
|
minX = x;
|
||||||
|
maxY = y;
|
||||||
|
minY = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
var arrayOfLabelLines = Metamaps.Util.splitLine(n.name, 30).split('\n'),
|
||||||
|
dim = n.getData('dim'),
|
||||||
|
ctx = canvas.getCtx();
|
||||||
|
|
||||||
|
var height = 25 * arrayOfLabelLines.length;
|
||||||
|
|
||||||
|
var index, lineWidths = [];
|
||||||
|
for (index = 0; index < arrayOfLabelLines.length; ++index) {
|
||||||
|
lineWidths.push(ctx.measureText(arrayOfLabelLines[index]).width)
|
||||||
|
}
|
||||||
|
var width = Math.max.apply(null, lineWidths) + 8;
|
||||||
|
|
||||||
|
maxX = Math.max(x + width /2,maxX);
|
||||||
|
maxY = Math.max(y + n.getData("height") + 5 + height,maxY);
|
||||||
|
minX = Math.min(x - width /2,minX);
|
||||||
|
minY = Math.min(y - dim,minY);
|
||||||
|
|
||||||
|
counter++;
|
||||||
|
});
|
||||||
|
|
||||||
|
var cogX = (maxX + minX)/2;
|
||||||
|
var cogY = (maxY + minY)/2;
|
||||||
|
|
||||||
|
canvas.translate(-1* cogX, -1* cogY);
|
||||||
|
$(document).trigger(Metamaps.JIT.events.zoom, [event]);
|
||||||
}
|
}
|
||||||
else{
|
else if(nodes.length == 1){
|
||||||
var nodes = Metamaps.Visualize.mGraph.graph;
|
nodes.forEach(function (n) {
|
||||||
|
var x = n.pos.x,
|
||||||
|
y = n.pos.y;
|
||||||
|
|
||||||
if(Object.keys(nodes).length >1){
|
canvas.translate(-1* x, -1* y);
|
||||||
nodes.eachNode(function (n) {
|
$(document).trigger(Metamaps.JIT.events.zoom, [event]);
|
||||||
var x = n.pos.x,
|
});
|
||||||
y = n.pos.y;
|
|
||||||
|
|
||||||
if (counter == 0){
|
|
||||||
maxX = x;
|
|
||||||
minX = x;
|
|
||||||
maxY = y;
|
|
||||||
minY = y;
|
|
||||||
}
|
|
||||||
|
|
||||||
maxX = Math.max(x,maxX);
|
|
||||||
maxY = Math.max(y,maxY);
|
|
||||||
minX = Math.min(x,minX);
|
|
||||||
minY = Math.min(y,minY);
|
|
||||||
|
|
||||||
counter++;
|
|
||||||
});
|
|
||||||
|
|
||||||
var spanX = maxX - minX;
|
|
||||||
var spanY = maxY - minY;
|
|
||||||
var ratioX = spanX / width;
|
|
||||||
var ratioY = spanY / height;
|
|
||||||
|
|
||||||
var newRatio = Math.max(ratioX,ratioY);
|
|
||||||
|
|
||||||
var canvas = Metamaps.Visualize.mGraph.canvas;
|
|
||||||
|
|
||||||
canvas.scale(1/newRatio*0.8,1/newRatio*0.8);
|
|
||||||
|
|
||||||
counter = 0;
|
|
||||||
|
|
||||||
nodes.eachNode(function (n) {
|
|
||||||
var x = n.pos.x,
|
|
||||||
y = n.pos.y;
|
|
||||||
|
|
||||||
if (counter == 0){
|
|
||||||
maxX = x;
|
|
||||||
minX = x;
|
|
||||||
maxY = y;
|
|
||||||
minY = y;
|
|
||||||
}
|
|
||||||
|
|
||||||
maxX = Math.max(x,maxX);
|
|
||||||
maxY = Math.max(y,maxY);
|
|
||||||
minX = Math.min(x,minX);
|
|
||||||
minY = Math.min(y,minY);
|
|
||||||
|
|
||||||
counter++;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var cogX = (maxX + minX)/2;
|
|
||||||
var cogY = (maxY + minY)/2;
|
|
||||||
|
|
||||||
canvas.translate(-1* cogX, -1* cogY);
|
|
||||||
$(document).trigger(Metamaps.JIT.events.zoom, [event]);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
|
@ -47,6 +47,7 @@ Metamaps.Touch = {
|
||||||
|
|
||||||
Metamaps.Mouse = {
|
Metamaps.Mouse = {
|
||||||
didPan: false,
|
didPan: false,
|
||||||
|
didBoxZoom: false,
|
||||||
changeInX: 0,
|
changeInX: 0,
|
||||||
changeInY: 0,
|
changeInY: 0,
|
||||||
edgeHoveringOver: false,
|
edgeHoveringOver: false,
|
||||||
|
@ -2021,11 +2022,13 @@ Metamaps.Control = {
|
||||||
if (Metamaps.Selected.Nodes.indexOf(node) != -1) return;
|
if (Metamaps.Selected.Nodes.indexOf(node) != -1) return;
|
||||||
node.selected = true;
|
node.selected = true;
|
||||||
node.setData('dim', 30, 'current');
|
node.setData('dim', 30, 'current');
|
||||||
|
/*
|
||||||
if(!(e.ctrlKey) && !(e.altKey)){
|
if(!(e.ctrlKey) && !(e.altKey)){
|
||||||
node.eachAdjacency(function (adj) {
|
node.eachAdjacency(function (adj) {
|
||||||
Metamaps.Control.selectEdge(adj);
|
Metamaps.Control.selectEdge(adj);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
Metamaps.Selected.Nodes.push(node);
|
Metamaps.Selected.Nodes.push(node);
|
||||||
},
|
},
|
||||||
|
|
266
db/schema.rb
266
db/schema.rb
|
@ -1,133 +1,133 @@
|
||||||
# encoding: UTF-8
|
# encoding: UTF-8
|
||||||
# This file is auto-generated from the current state of the database. Instead
|
# This file is auto-generated from the current state of the database. Instead
|
||||||
# of editing this file, please use the migrations feature of Active Record to
|
# of editing this file, please use the migrations feature of Active Record to
|
||||||
# incrementally modify your database, and then regenerate this schema definition.
|
# incrementally modify your database, and then regenerate this schema definition.
|
||||||
#
|
#
|
||||||
# Note that this schema.rb definition is the authoritative source for your
|
# Note that this schema.rb definition is the authoritative source for your
|
||||||
# database schema. If you need to create the application database on another
|
# database schema. If you need to create the application database on another
|
||||||
# system, you should be using db:schema:load, not running all the migrations
|
# system, you should be using db:schema:load, not running all the migrations
|
||||||
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
|
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
|
||||||
# you'll amass, the slower it'll run and the greater likelihood for issues).
|
# you'll amass, the slower it'll run and the greater likelihood for issues).
|
||||||
#
|
#
|
||||||
# It's strongly recommended to check this file into your version control system.
|
# It's strongly recommended to check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema.define(:version => 20140815162253) do
|
ActiveRecord::Schema.define(:version => 20140815162253) do
|
||||||
|
|
||||||
create_table "in_metacode_sets", :force => true do |t|
|
create_table "in_metacode_sets", :force => true do |t|
|
||||||
t.integer "metacode_id"
|
t.integer "metacode_id"
|
||||||
t.integer "metacode_set_id"
|
t.integer "metacode_set_id"
|
||||||
t.datetime "created_at", :null => false
|
t.datetime "created_at", :null => false
|
||||||
t.datetime "updated_at", :null => false
|
t.datetime "updated_at", :null => false
|
||||||
end
|
end
|
||||||
|
|
||||||
add_index "in_metacode_sets", ["metacode_id"], :name => "index_in_metacode_sets_on_metacode_id"
|
add_index "in_metacode_sets", ["metacode_id"], :name => "index_in_metacode_sets_on_metacode_id"
|
||||||
add_index "in_metacode_sets", ["metacode_set_id"], :name => "index_in_metacode_sets_on_metacode_set_id"
|
add_index "in_metacode_sets", ["metacode_set_id"], :name => "index_in_metacode_sets_on_metacode_set_id"
|
||||||
|
|
||||||
create_table "mappings", :force => true do |t|
|
create_table "mappings", :force => true do |t|
|
||||||
t.text "category"
|
t.text "category"
|
||||||
t.integer "xloc"
|
t.integer "xloc"
|
||||||
t.integer "yloc"
|
t.integer "yloc"
|
||||||
t.integer "topic_id"
|
t.integer "topic_id"
|
||||||
t.integer "synapse_id"
|
t.integer "synapse_id"
|
||||||
t.integer "map_id"
|
t.integer "map_id"
|
||||||
t.integer "user_id"
|
t.integer "user_id"
|
||||||
t.datetime "created_at", :null => false
|
t.datetime "created_at", :null => false
|
||||||
t.datetime "updated_at", :null => false
|
t.datetime "updated_at", :null => false
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "maps", :force => true do |t|
|
create_table "maps", :force => true do |t|
|
||||||
t.text "name"
|
t.text "name"
|
||||||
t.boolean "arranged"
|
t.boolean "arranged"
|
||||||
t.text "desc"
|
t.text "desc"
|
||||||
t.text "permission"
|
t.text "permission"
|
||||||
t.integer "user_id"
|
t.integer "user_id"
|
||||||
t.datetime "created_at", :null => false
|
t.datetime "created_at", :null => false
|
||||||
t.datetime "updated_at", :null => false
|
t.datetime "updated_at", :null => false
|
||||||
t.boolean "featured"
|
t.boolean "featured"
|
||||||
t.string "screenshot_file_name"
|
t.string "screenshot_file_name"
|
||||||
t.string "screenshot_content_type"
|
t.string "screenshot_content_type"
|
||||||
t.integer "screenshot_file_size"
|
t.integer "screenshot_file_size"
|
||||||
t.datetime "screenshot_updated_at"
|
t.datetime "screenshot_updated_at"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "metacode_sets", :force => true do |t|
|
create_table "metacode_sets", :force => true do |t|
|
||||||
t.string "name"
|
t.string "name"
|
||||||
t.text "desc"
|
t.text "desc"
|
||||||
t.integer "user_id"
|
t.integer "user_id"
|
||||||
t.boolean "mapperContributed"
|
t.boolean "mapperContributed"
|
||||||
t.datetime "created_at", :null => false
|
t.datetime "created_at", :null => false
|
||||||
t.datetime "updated_at", :null => false
|
t.datetime "updated_at", :null => false
|
||||||
end
|
end
|
||||||
|
|
||||||
add_index "metacode_sets", ["user_id"], :name => "index_metacode_sets_on_user_id"
|
add_index "metacode_sets", ["user_id"], :name => "index_metacode_sets_on_user_id"
|
||||||
|
|
||||||
create_table "metacodes", :force => true do |t|
|
create_table "metacodes", :force => true do |t|
|
||||||
t.text "name"
|
t.text "name"
|
||||||
t.string "icon"
|
t.string "icon"
|
||||||
t.datetime "created_at", :null => false
|
t.datetime "created_at", :null => false
|
||||||
t.datetime "updated_at", :null => false
|
t.datetime "updated_at", :null => false
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "synapses", :force => true do |t|
|
create_table "synapses", :force => true do |t|
|
||||||
t.text "desc"
|
t.text "desc"
|
||||||
t.text "category"
|
t.text "category"
|
||||||
t.text "weight"
|
t.text "weight"
|
||||||
t.text "permission"
|
t.text "permission"
|
||||||
t.integer "node1_id"
|
t.integer "node1_id"
|
||||||
t.integer "node2_id"
|
t.integer "node2_id"
|
||||||
t.integer "user_id"
|
t.integer "user_id"
|
||||||
t.datetime "created_at", :null => false
|
t.datetime "created_at", :null => false
|
||||||
t.datetime "updated_at", :null => false
|
t.datetime "updated_at", :null => false
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "topics", :force => true do |t|
|
create_table "topics", :force => true do |t|
|
||||||
t.text "name"
|
t.text "name"
|
||||||
t.text "desc"
|
t.text "desc"
|
||||||
t.text "link"
|
t.text "link"
|
||||||
t.text "permission"
|
t.text "permission"
|
||||||
t.integer "user_id"
|
t.integer "user_id"
|
||||||
t.integer "metacode_id"
|
t.integer "metacode_id"
|
||||||
t.datetime "created_at", :null => false
|
t.datetime "created_at", :null => false
|
||||||
t.datetime "updated_at", :null => false
|
t.datetime "updated_at", :null => false
|
||||||
t.string "image_file_name"
|
t.string "image_file_name"
|
||||||
t.string "image_content_type"
|
t.string "image_content_type"
|
||||||
t.integer "image_file_size"
|
t.integer "image_file_size"
|
||||||
t.datetime "image_updated_at"
|
t.datetime "image_updated_at"
|
||||||
t.string "audio_file_name"
|
t.string "audio_file_name"
|
||||||
t.string "audio_content_type"
|
t.string "audio_content_type"
|
||||||
t.integer "audio_file_size"
|
t.integer "audio_file_size"
|
||||||
t.datetime "audio_updated_at"
|
t.datetime "audio_updated_at"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "users", :force => true do |t|
|
create_table "users", :force => true do |t|
|
||||||
t.string "name"
|
t.string "name"
|
||||||
t.string "email"
|
t.string "email"
|
||||||
t.text "settings"
|
t.text "settings"
|
||||||
t.string "code", :limit => 8
|
t.string "code", :limit => 8
|
||||||
t.string "joinedwithcode", :limit => 8
|
t.string "joinedwithcode", :limit => 8
|
||||||
t.string "crypted_password"
|
t.string "crypted_password"
|
||||||
t.string "password_salt"
|
t.string "password_salt"
|
||||||
t.string "persistence_token"
|
t.string "persistence_token"
|
||||||
t.string "perishable_token"
|
t.string "perishable_token"
|
||||||
t.datetime "created_at", :null => false
|
t.datetime "created_at", :null => false
|
||||||
t.datetime "updated_at", :null => false
|
t.datetime "updated_at", :null => false
|
||||||
t.string "encrypted_password", :limit => 128, :default => ""
|
t.string "encrypted_password", :limit => 128, :default => ""
|
||||||
t.string "remember_token"
|
t.string "remember_token"
|
||||||
t.datetime "remember_created_at"
|
t.datetime "remember_created_at"
|
||||||
t.string "reset_password_token"
|
t.string "reset_password_token"
|
||||||
t.datetime "last_sign_in_at"
|
t.datetime "last_sign_in_at"
|
||||||
t.string "last_sign_in_ip"
|
t.string "last_sign_in_ip"
|
||||||
t.integer "sign_in_count", :default => 0
|
t.integer "sign_in_count", :default => 0
|
||||||
t.datetime "current_sign_in_at"
|
t.datetime "current_sign_in_at"
|
||||||
t.string "current_sign_in_ip"
|
t.string "current_sign_in_ip"
|
||||||
t.datetime "reset_password_sent_at"
|
t.datetime "reset_password_sent_at"
|
||||||
t.boolean "admin"
|
t.boolean "admin"
|
||||||
t.string "image_file_name"
|
t.string "image_file_name"
|
||||||
t.string "image_content_type"
|
t.string "image_content_type"
|
||||||
t.integer "image_file_size"
|
t.integer "image_file_size"
|
||||||
t.datetime "image_updated_at"
|
t.datetime "image_updated_at"
|
||||||
end
|
end
|
||||||
|
|
||||||
add_index "users", ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true
|
add_index "users", ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue