diff --git a/clients/anim/index.html b/clients/anim/index.html index 0340cb1..1c8aa0b 100644 --- a/clients/anim/index.html +++ b/clients/anim/index.html @@ -120,6 +120,7 @@ position: relative; left: -420px; top: 0px; + cursor: pointer; } .marker { position: absolute; diff --git a/clients/anim/main.js b/clients/anim/main.js index 7b10f0a..62d6274 100644 --- a/clients/anim/main.js +++ b/clients/anim/main.js @@ -47,6 +47,28 @@ function setSpeed(speed) { $('#speed'+speed).addClass('active'); } +var mouseDragX0, dragTime, mouseDrag = false; +function sliderDragMove(event) { + if (mouseDrag) { + currentTime = dragTime + (mouseDragX0 - event.pageX); + + updateFrame(); + event.preventDefault(); + return false; + } else { + mouseDragX0 = event.pageX; + } +} + +function sliderDragStart() { + mouseDrag = true; + dragTime = currentTime; +} + +function sliderDragStop() { + mouseDrag = false; +} + function init() { context = $('#canvas')[0].getContext('2d'); clients = []; @@ -60,6 +82,11 @@ function init() { $('#speed2').click(function () { setSpeed(2); }); $('#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; }); + var index = -1; for (var time = -60; time <= (4*24+1)*60; time++) { while (data.times[index+1] <= time) index++; @@ -114,6 +141,8 @@ function togglePlay() { } function update() { + if (mouseDrag) return; + currentTime += timeStep; if (currentTime > maxTime) { currentTime = maxTime; @@ -122,6 +151,10 @@ function update() { if (currentTime < minTime) currentTime = minTime; + updateFrame(); +} + +function updateFrame() { renderTime(); updateData(); updatePosition(); @@ -155,6 +188,7 @@ function updateData() { var timeId = time2index[Math.floor(currentTime)]; var point = undefined; + var pointBefore = undefined; var t0 = data.times[timeId]; if (isNaN(t0)) t0 = 0; var t1 = data.times[timeId+1]; if (isNaN(t1)) t1 = 1e10; @@ -162,24 +196,34 @@ function updateData() { var offset = (currentTime-t0)/(t1-t0); if (offset < random[index]) { - point = times[timeId-1]; + pointBefore = times[timeId-2]; + point = times[timeId-1]; } else { - point = times[timeId]; + pointBefore = times[timeId-1]; + point = times[timeId]; } + if (!valid(pointBefore)) pointBefore = undefined; + if (!valid(point)) point = undefined; + var client = clients[index]; if (client.point != point) { - if (valid(point)) { + if (point !== undefined) { client.x0 = data.points[point].x*width; client.y0 = data.points[point].y*height; client.r0 = 1; - if (!valid(client.point)) client.x = undefined; + if (client.point === undefined) client.x = undefined; } else { client.r0 = 0; } client.point = point; client.lastEvent = currentTime; client.settled = false; + + if (mouseDrag) { + client.x = undefined; + client.y = client.y0; + } } }); } @@ -345,7 +389,7 @@ function renderCanvas() { var dy = client.y - client.yo; var r = Math.sqrt(dx*dx + dy*dy); - if (r > 1) { + if ((r > 1) && (!client.settled)) { var a = Math.min(Math.pow(1/r, 0.7), 1); context.strokeStyle = 'rgba(0,0,0,'+a+')'; context.lineWidth = client.r*2*radius;