Skip to content

Instantly share code, notes, and snippets.

@steltenpower
Last active November 28, 2016 23:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save steltenpower/3726a9a1b8e6ce88b22709d958566202 to your computer and use it in GitHub Desktop.
Save steltenpower/3726a9a1b8e6ce88b22709d958566202 to your computer and use it in GitHub Desktop.
triple touch
license: gpl-3.0

A demonstration of handling multitouch events using D3. Requires a touch-supporting browser, such as iOS Safari.

forked from mbostock's block: Multitouch

<!DOCTYPE html>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1,maximum-scale=1">
<style>
html,body {height: 100%;}
body {margin: 0;}
svg {
display: block;
overflow: hidden;
width: 100%;
height: 100%;
}
</style>
<body>
<!--
<g id="edges">
<g id="outputs_0">
<path d="M" id="edge_0_1" title="loves"/>
</g>
</g>
<g id="nodes">
<circle cx="20" cy="20" r="10" id="node_0" title="steltenpower"/>
<circle cx="100" cy="100" r="10" id="node_1" title="web"/>
</g>
<g id="edgeNames">
<text x="60" y="60">loves</text>
</g>
<g id="NodeNames">
<text x="20" y="20">steltenpower</text>
<text x="100" y="100">web</text>
</g>
// http://bl.ocks.org/tmcw/4444952
-->
<script src="//d3js.org/d3.v3.min.js"></script>
<script>
var svg = d3.select("body").append("svg").attr("width",innerWidth).attr("height", innerHeight)
.on("touchstart",touch).on("touchmove",touch).on("touchend",touch);;
//var color = d3.scale.linear().domain([0,1,2]).range(['red','green','blue']);
var state="0base";
//var nodes=[]; // 1 node = elm_incl_cx_cy_id_title, [{relation,destinationId}]
function touch() {
d3.event.preventDefault();
/*
clear
touch0 (and back up) : if eventOnNode get i in nodes array, otherwise i=nodes.length; Node[i].x=event.x; Node[i].y=event.y;
reading nodeNameA : changing nodes[i].name
touch1 (and back up) / touch0up==>touch0=touch1; : if eventOnNode get i in nodes array, otherwise i=nodes.length; Node[i].x=event.x; Node[i].y=event.y; /
reading relationName
touch2 (and back up)
reading nodeNameB
*/
switch (state) {
case "0base":
if ((event.target.type=="circle")&&(event.type==touchstart)){
A=event.target;
}else A=new Circle(event.x,event.y); // take id of last node, add 1
state="1start";
// create txtA=textfield(A.name) and give it focus
break;
case "1Start":
if ((event.target.type=="circle")&&(event.type==touchend)){
A.name=txtA.value; //and hide txtA
state="0base";
}else{
if (event.type=touchstart){
if (event.target.type=="circle") B=event.target;
else B=new Circle(event.x,event.y) // take id of last node, add 1
// add edge (A,B)
state="2go"
// create txtR=textfield and give it focus
}
}
break;
case "2go":
if ((event.target.type=="circle")&&(event.type==touchend)){
//edges(A,B,txtRel.value); //hide txtRel
state="1start";
}else{
if (event.type=touchstart){
if (event.target.type=="circle") B=new Circle(event.x,event.y); // take id of last node, add 1
nodes[A].edges.push(B,"")
}
state="2go"
// create txtR=textfield and give it focus
}
}
break;
case "3end":
break;
default:
console.log("this code should never be reached");
break;
}
circle = circle
.data(d3.touches(svg.node()), function(d) { return d.identifier; });
circle.enter().append("circle")
.attr("class", "node")
.attr("r", 36)
.style("fill", function(d) { return color(d.identifier); })
.transition()
.duration(500)
.ease("elastic")
.attr("r", 48);
circle
.attr("cx", function(d) { return d[0]; })
.attr("cy", function(d) { return d[1]; })
.on("touchstart",touch).on("touchmove",touch).on("touchend",touch);
}
</script>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment