summaryrefslogtreecommitdiff
path: root/src/ws/view.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/ws/view.js')
-rw-r--r--src/ws/view.js87
1 files changed, 79 insertions, 8 deletions
diff --git a/src/ws/view.js b/src/ws/view.js
index 4e2d837..4a10386 100644
--- a/src/ws/view.js
+++ b/src/ws/view.js
@@ -49,6 +49,28 @@ function deleteNode(id)
remove(id);
}
+function getElementAfter(e)
+{
+ var element_after = null;
+ var min_y_diff = 9999999999999;
+ for(i = 0; i < e.target.children.length; ++i)
+ {
+ if(e.target.children[i].className != "node") // Only look at node elements
+ {
+ continue;
+ }
+
+ var y_diff = e.target.children[i].getBoundingClientRect().y - e.y;
+ if(y_diff > 0 && y_diff < min_y_diff)
+ {
+ element_after = e.target.children[i];
+ min_y_diff = y_diff;
+ }
+ }
+
+ return element_after;
+}
+
function drag(target, e)
{
e.dataTransfer.setData('id', target.id);
@@ -56,8 +78,47 @@ function drag(target, e)
update(idFromStr(target.id), "dragged", "true");
}
+function dragenter(e)
+{
+ e.target.style.backgroundColor = "#646588";
+ last_over = e.target;
+}
+
+var last_after = null;
+function dragover(e)
+{
+ e.preventDefault();
+
+ var after = getElementAfter(e);
+ if(last_after != null)
+ {
+ last_after.style.borderColor = "black";
+ }
+ after.style.borderColor = "red black black black";
+ last_after = after;
+}
+
+function dragleave(e)
+{
+ e.target.style.backgroundColor = "#aaa";
+}
+
function dragEnd(e)
{
+ e.target.style.backgroundColor = "#aaa";
+
+ if(last_after != null)
+ {
+ last_after.style.borderColor = "black";
+ last_after = null;
+ }
+
+ if(last_over != null)
+ {
+ last_over.style.backgroundColor = "#aaa";
+ last_over = null;
+ }
+
e.preventDefault();
e.stopPropagation();
@@ -66,14 +127,24 @@ function dragEnd(e)
update(idFromStr(id), "dragged", "false");
}
-function drop(target, e)
+function drop(e)
{
- e.preventDefault();
- e.stopPropagation();
-
var id = e.dataTransfer.getData('id');
update(idFromStr(id), "dragged", "false");
- move(idFromStr(id), idFromStr(target.id), -1);
+
+ // Prevent dropping on item itself
+ if(id == e.target.id)
+ {
+ return;
+ }
+
+ var before_id = -1;
+ var element_after = getElementAfter(e);
+ if(element_after != null)
+ {
+ before_id = idFromStr(element_after.id);
+ }
+ move(idFromStr(id), idFromStr(e.target.id), before_id);
}
function subscribeMe(target, e)
@@ -95,15 +166,15 @@ function showHideChildren(target, e)
if(target.style.backgroundColor != "red")
{
target.style.backgroundColor = "red";
- for(var i = 1; i < target.childNodes.length; i++)
+ for(i = 1; i < target.childNodes.length; i++)
{
target.childNodes[i].style.display = "none";
}
}
else
{
- target.style.backgroundColor = "grey";
- for(var i = 1; i < target.childNodes.length; i++)
+ target.style.backgroundColor = "#aaa";
+ for(i = 1; i < target.childNodes.length; i++)
{
target.childNodes[i].style.display = "block";
}