developed an initial attempt at a box to select feature. SO NICE. you just hold down shift and mouse over the ones you want. fixed an important bug that was causing deselecting to go wacky

This commit is contained in:
Connor Turland 2013-03-22 02:37:56 -04:00
parent 600e5814f0
commit 24269a10b9
7 changed files with 101 additions and 24 deletions

View file

@ -13,7 +13,7 @@ gem 'formtastic'
gem 'json' gem 'json'
gem 'rails3-jquery-autocomplete' gem 'rails3-jquery-autocomplete'
gem 'best_in_place' gem 'best_in_place'
gem 'therubyracer' #optional #gem 'therubyracer' #optional
gem 'rb-readline' gem 'rb-readline'
# Gems used only for assets and not required # Gems used only for assets and not required

View file

@ -94,6 +94,7 @@ GEM
rdoc (~> 3.4) rdoc (~> 3.4)
thor (>= 0.14.6, < 2.0) thor (>= 0.14.6, < 2.0)
rake (10.0.3) rake (10.0.3)
rb-readline (0.4.1)
rdoc (3.12) rdoc (3.12)
json (~> 1.4) json (~> 1.4)
sass (3.2.1) sass (3.2.1)
@ -133,5 +134,6 @@ DEPENDENCIES
pg pg
rails (= 3.2.11) rails (= 3.2.11)
rails3-jquery-autocomplete rails3-jquery-autocomplete
rb-readline
sass-rails (~> 3.2.3) sass-rails (~> 3.2.3)
uglifier (>= 1.0.3) uglifier (>= 1.0.3)

View file

@ -13,8 +13,8 @@ gem 'formtastic'
gem 'json' gem 'json'
gem 'rails3-jquery-autocomplete' gem 'rails3-jquery-autocomplete'
gem 'best_in_place' gem 'best_in_place'
#gem 'therubyracer' #optional gem 'therubyracer' #optional
#gem 'rb-readline' gem 'rb-readline'
# Gems used only for assets and not required # Gems used only for assets and not required
# in production environments by default. # in production environments by default.

View file

@ -20,6 +20,10 @@ MetamapsModel.widthOfLabel = null;
//is the mouse hovering over an edge? which one? //is the mouse hovering over an edge? which one?
MetamapsModel.edgeHoveringOver = false; MetamapsModel.edgeHoveringOver = false;
//coordinates of shift click for using box select
MetamapsModel.boxStartCoordinates = false;
MetamapsModel.boxEndCoordinates = false;
//double clicking of nodes or canvas //double clicking of nodes or canvas
MetamapsModel.lastNodeClick = 0; MetamapsModel.lastNodeClick = 0;
MetamapsModel.lastCanvasClick = 0; MetamapsModel.lastCanvasClick = 0;

View file

@ -105,7 +105,11 @@ function graphSettings(type, embed) {
if (e.target.id != "infovis-canvas") return false; if (e.target.id != "infovis-canvas") return false;
//topic and synapse editing cards //topic and synapse editing cards
if (!Mconsole.events.moved) hideCards(); if (!Mconsole.events.moved && !node) {
hideCards();
deselectAllNodes();
deselectAllEdges();
}
//clicking on a node, or clicking on blank part of canvas? //clicking on a node, or clicking on blank part of canvas?
if (node.nodeFrom) { if (node.nodeFrom) {
@ -427,10 +431,65 @@ var nodeSettings = {
} }
} }
function drawSelectBox(eventInfo, e) {
var ctx=Mconsole.canvas.getCtx();
var startX = MetamapsModel.boxStartCoordinates.x,
startY = MetamapsModel.boxStartCoordinates.y,
currX = eventInfo.getPos().x,
currY = eventInfo.getPos().y;
Mconsole.plot();
ctx.moveTo(startX,startY);
ctx.lineTo(startX,currY);
ctx.stroke();
ctx.lineTo(currX,currY);
ctx.stroke();
ctx.lineTo(currX,startY);
ctx.stroke();
ctx.lineTo(startX,startY);
ctx.stroke();
}
function selectNodesWithBox() {
var sX = MetamapsModel.boxStartCoordinates.x,
sY = MetamapsModel.boxStartCoordinates.y,
eX = MetamapsModel.boxEndCoordinates.x,
eY = MetamapsModel.boxEndCoordinates.y;
Mconsole.graph.eachNode(function (n) {
var x = n.pos.x, y = n.pos.y;
if ((sX < x && x < eX && sY < y && y < eY) || (sX > x && x > eX && sY > y && y > eY) || (sX > x && x > eX && sY < y && y < eY) || (sX < x && x < eX && sY > y && y > eY)) {
selectNode(n);
}
});
MetamapsModel.boxStartCoordinates = false;
MetamapsModel.boxEndCoordinates = false;
Mconsole.plot();
}
function onMouseMoveHandler(node, eventInfo, e) { function onMouseMoveHandler(node, eventInfo, e) {
if (Mconsole.busy) return; if (Mconsole.busy) return;
if (!MetamapsModel.boxStartCoordinates && e.shiftKey) {
MetamapsModel.boxStartCoordinates = eventInfo.getPos();
return;
}
if (MetamapsModel.boxStartCoordinates && e.shiftKey) {
drawSelectBox(eventInfo,e);
return;
}
if (MetamapsModel.boxStartCoordinates && !e.shiftKey) {
MetamapsModel.boxEndCoordinates = eventInfo.getPos();
Mconsole.plot();
selectNodesWithBox();
return;
}
var node = eventInfo.getNode(); var node = eventInfo.getNode();
var edge = eventInfo.getEdge(); var edge = eventInfo.getEdge();

View file

@ -230,12 +230,21 @@ function best_in_place_perms(edge) {
}//best_in_place_perms }//best_in_place_perms
function deselectAllEdges() { function deselectAllEdges() {
for (var i = 0; i < MetamapsModel.selectedEdges.length; i += 1) { var l = MetamapsModel.selectedEdges.length;
for (var i = l-1; i >= 0; i -= 1) {
var edge = MetamapsModel.selectedEdges[i]; var edge = MetamapsModel.selectedEdges[i];
deselectEdge(edge); deselectEdge(edge);
} }
} }
function deselectAllNodes() {
var l = MetamapsModel.selectedNodes.length;
for (var i = l-1; i >= 0; i -= 1) {
var node = MetamapsModel.selectedNodes[i];
deselectNode(node);
}
}
// this is for hiding one topic from your canvas // this is for hiding one topic from your canvas
function removeEdge(edge) { function removeEdge(edge) {
var id = edge.getData("id"); var id = edge.getData("id");
@ -261,7 +270,8 @@ function hideEdge(edge) {
} }
function hideSelectedEdges() { function hideSelectedEdges() {
for (var i = 0; i < MetamapsModel.selectedEdges.length; i += 1) { var l = MetamapsModel.selectedEdges.length;
for (var i = l-1; i >= 0; i -= 1) {
var edge = MetamapsModel.selectedEdges[i]; var edge = MetamapsModel.selectedEdges[i];
hideEdge(edge); hideEdge(edge);
} }
@ -269,7 +279,8 @@ function hideSelectedEdges() {
} }
function removeSelectedEdges() { function removeSelectedEdges() {
for (var i = 0; i < MetamapsModel.selectedEdges.length; i += 1) { var l = MetamapsModel.selectedEdges.length;
for (var i = l-1; i >= 0; i -= 1) {
if (mapid != null) { if (mapid != null) {
var edge = MetamapsModel.selectedEdges[i]; var edge = MetamapsModel.selectedEdges[i];
var id = edge.getData("id"); var id = edge.getData("id");
@ -285,7 +296,8 @@ function removeSelectedEdges() {
} }
function deleteSelectedEdges() { function deleteSelectedEdges() {
for (var i = 0; i < MetamapsModel.selectedEdges.length; i += 1) { var l = MetamapsModel.selectedEdges.length;
for (var i = l-1; i >= 0; i -= 1) {
var edge = MetamapsModel.selectedEdges[i]; var edge = MetamapsModel.selectedEdges[i];
var id = edge.getData("id"); var id = edge.getData("id");
$.ajax({ $.ajax({
@ -400,11 +412,11 @@ function hideNode(nodeid) {
} }
function hideSelectedNodes() { function hideSelectedNodes() {
Mconsole.graph.eachNode( function (n) { var l = MetamapsModel.selectedNodes.length;
if (n.getData('whiteCircle') == true) { for (var i = l-1; i >= 0; i -= 1) {
hideNode(n.id); var node = MetamapsModel.selectedNodes[i];
} hideNode(node.id);
}); }
} }
function removeNode(nodeid) { function removeNode(nodeid) {
@ -419,11 +431,11 @@ function removeNode(nodeid) {
} }
function removeSelectedNodes() { function removeSelectedNodes() {
if (mapperm) { if (mapperm) {
Mconsole.graph.eachNode( function (n) { var l = MetamapsModel.selectedNodes.length;
if (n.getData('whiteCircle') == true) { for (var i = l-1; i >= 0; i -= 1) {
removeNode(n.id); var node = MetamapsModel.selectedNodes[i];
} removeNode(node.id);
}); }
} }
} }
@ -438,9 +450,9 @@ function deleteNode(nodeid) {
}); });
} }
function deleteSelectedNodes() { function deleteSelectedNodes() {
Mconsole.graph.eachNode( function (n) { var l = MetamapsModel.selectedNodes.length;
if (n.getData('whiteCircle') == true) { for (var i = l-1; i >= 0; i -= 1) {
deleteNode(n.id); var node = MetamapsModel.selectedNodes[i];
} deleteNode(node.id);
}); }
} }

View file

@ -9,7 +9,7 @@
<button onclick="if (!goRealtime) { this.innerHTML = 'Stop Realtime'; } else if (goRealtime) { this.innerHTML = 'Start Realtime'; } goRealtime = !goRealtime;">Start Realtime</button> <button onclick="if (!goRealtime) { this.innerHTML = 'Stop Realtime'; } else if (goRealtime) { this.innerHTML = 'Start Realtime'; } goRealtime = !goRealtime;">Start Realtime</button>
<% end %> <% end %>
<button onclick="hideSelectedEdges();hideSelectedNodes();">Hide Selected</button> <button onclick="hideSelectedEdges();hideSelectedNodes();">Hide Selected</button>
<button onclick="enterKeyPressed();">Keep Selected</button> <button onclick="enterKeyHandler();">Keep Selected</button>
<% if authenticated? %> <% if authenticated? %>
<% if (@map.permission == "commons" && authenticated?) || @map.user == user %> <% if (@map.permission == "commons" && authenticated?) || @map.user == user %>
<button onclick="removeSelectedEdges();removeSelectedNodes();">Remove Selected From Map</button> <button onclick="removeSelectedEdges();removeSelectedNodes();">Remove Selected From Map</button>