diff --git a/clients/anim/index.html b/clients/anim/index.html index ededf42..e3fccf4 100644 --- a/clients/anim/index.html +++ b/clients/anim/index.html @@ -23,6 +23,7 @@ position: absolute; top: 20px; left: 0; + cursor: pointer; } #canvas, #map, .label { position: absolute; diff --git a/clients/anim/main.js b/clients/anim/main.js index 12fddaf..f0f0963 100644 --- a/clients/anim/main.js +++ b/clients/anim/main.js @@ -47,33 +47,72 @@ function setSpeed(speed) { $('#speed'+speed).addClass('active'); } -var mouseDragX0, dragTime, mouseDrag = false; -function sliderDragMove(event) { - if (mouseDrag) { - currentTime = dragTime + (mouseDragX0 - event.pageX); +var mouseDrag = false; +var sliderDrag = false; +var mapDrag = false; +var mouseDragX0; +var mouseDragY0; +var mouseDragX; +var mouseDragY; +var sliderDragStartTime; + +function sliderDragStart() { + mouseDrag = true; + sliderDrag = true; + sliderDragStartTime = currentTime; +} + +function mapDragStart() { + mouseDrag = true; + mapDrag = true; + mouseDragX = mouseDragX0; + mouseDragY = mouseDragY0; + clients.forEach(function (c) { c.selected = false; }); +} + +function mouseDragMove(event) { + if (mouseDrag) { + if (sliderDrag) { + currentTime = sliderDragStartTime + (mouseDragX0 - event.pageX); + + updateFrame(); + } + if (mapDrag) { + mouseDragX = event.pageX; + mouseDragY = event.pageY; + var p = $('#container').offset(); + var x0 = Math.min(mouseDragX0, mouseDragX) - p.left; + var x1 = Math.max(mouseDragX0, mouseDragX) - p.left; + var y0 = Math.min(mouseDragY0, mouseDragY) - p.top; + var y1 = Math.max(mouseDragY0, mouseDragY) - p.top; + clients.forEach(function (c) { + c.selected = ((c.x >= x0) && (c.x <= x1) && (c.y >= y0) && (c.y <= y1)); + }); + + renderCanvas(); + } - updateFrame(); event.preventDefault(); return false; } else { mouseDragX0 = event.pageX; + mouseDragY0 = event.pageY; } } -function sliderDragStart() { - mouseDrag = true; - dragTime = currentTime; -} - -function sliderDragStop() { +function mouseDragStop() { mouseDrag = false; + sliderDrag = false; + mapDrag = false; + + renderCanvas(); } function init() { context = $('#canvas')[0].getContext('2d'); clients = []; data.matrix.forEach(function (times, index) { - clients[index] = { point:undefined, x:0, y:0, r:0, x0:0, y0:0, r0:0, index:index, lastEvent:0 }; + clients[index] = { point:undefined, x:0, y:0, r:0, x0:0, y0:0, r0:0, index:index, lastEvent:0, selected:false }; random[index] = Math.random(); }); @@ -83,9 +122,11 @@ function init() { $('#speed3').click(function () { setSpeed(3); }); $('#sliderWrapper').mousedown(function () { sliderDragStart(); }); - $(document).mousemove(function (e) { return sliderDragMove(e); }); - $(document).mouseup(function (e) { sliderDragStop(); }); - $(document).on('selectstart', function () { return !mouseDrag; }); + $('#container').mousedown(function () { mapDragStart(); }); + $(document).mousemove(function (e) { return mouseDragMove(e); }); + $(document).mouseup(function (e) { mouseDragStop(); }); + + $(document).on('selectstart', function (e) { e.preventDefault(); return !mouseDrag; }); var index = -1; for (var time = -60; time <= (4*24+1)*60; time++) { @@ -144,6 +185,11 @@ function update() { if (mouseDrag) return; currentTime += timeStep; + + updateFrame(); +} + +function updateFrame() { if (currentTime > maxTime) { currentTime = maxTime; stopPlay(); @@ -151,10 +197,6 @@ function update() { if (currentTime < minTime) currentTime = minTime; - updateFrame(); -} - -function updateFrame() { renderTime(); updateData(); updatePosition(); @@ -396,7 +438,6 @@ function updatePosition() { function renderCanvas() { context.clearRect(0, 0, width, height); - context.fillStyle = '#000'; clients.forEach(function (client) { if (client.valid) { @@ -406,7 +447,7 @@ function renderCanvas() { if ((r > 1) && (!client.settled)) { var a = Math.min(Math.pow(1/r, 0.7), 1); - context.strokeStyle = 'rgba(0,0,0,'+a+')'; + context.strokeStyle = (client.selected) ? 'rgba(238,0,0,'+a+')' : 'rgba(0,0,0,'+a+')'; context.lineWidth = client.r*2*radius; context.beginPath(); context.moveTo(client.xo, client.yo); @@ -414,6 +455,7 @@ function renderCanvas() { context.stroke(); } else { + context.fillStyle = (client.selected) ? '#e00' : '#000'; context.beginPath(); context.arc(client.x, client.y, client.r*radius, 0, 2*Math.PI, false); context.fill(); @@ -421,6 +463,24 @@ function renderCanvas() { } }); + if (mapDrag) { + var x = Math.min(mouseDragX0, mouseDragX); + var y = Math.min(mouseDragY0, mouseDragY); + var w = Math.max(mouseDragX0, mouseDragX) - x; + var h = Math.max(mouseDragY0, mouseDragY) - y; + var p = $('#container').offset(); + x -= 0.5 + p.left; + y -= 0.5 + p.top; + + context.fillStyle = 'rgba(238,0,0,0.1)'; + context.strokeStyle = 'rgba(238,0,0,0.5)'; + context.lineWidth = 1; + context.beginPath(); + context.rect(x, y, w, h); + context.fill(); + context.stroke(); + } + /* context.fillStyle = 'rgba(255,0,0,0.5)'; for (var x = 0; x < width/gridSize; x++) {