|
var app = angular.module('pomodoroApp', []); |
|
|
|
app.controller('pomodoroCtrl', function($scope) { |
|
$scope.session = 1500; |
|
$scope.break = 15; |
|
$scope.display = 'Start'; |
|
$scope.type = 'session'; |
|
$scope.state = 'stoped'; |
|
|
|
|
|
var interval = null; |
|
var sessionTime = null; |
|
|
|
var canvas = document.getElementById('canvas'); |
|
var ctx = canvas.getContext('2d'); |
|
var quart = Math.PI / 2; |
|
var circ = Math.PI * 2; |
|
var radius = 86; |
|
|
|
var drawCircle = function(percent) { |
|
percent = Math.min(Math.max(0, percent || 1), 1); |
|
ctx.beginPath(); |
|
ctx.arc(120, 120, radius, 0, Math.PI * 2 * percent, false); |
|
ctx.strokeStyle = '#fff'; |
|
ctx.lineCap = 'square'; |
|
ctx.lineWidth = 12.0; |
|
ctx.stroke(); |
|
}; |
|
|
|
function drawProgress() { |
|
var current = |
|
(100 * sessionTime) / Number.parseInt($scope[$scope.type]); |
|
current / 100; |
|
ctx.save(); |
|
ctx.clearRect(0,0, 260, 260); |
|
drawCircle(current / 100); |
|
ctx.restore(); |
|
} |
|
|
|
$scope.$watch('session', function(val) { |
|
if ($scope.state !== 'stoped') { |
|
$scope.type = 'session'; |
|
$scope.state = 'stoped'; |
|
resetState(); |
|
} |
|
}); |
|
|
|
$scope.$watch('break', function(val) { |
|
if ($scope.state !== 'stoped') { |
|
$scope.type = 'break'; |
|
$scope.state = 'stoped'; |
|
resetState(); |
|
} |
|
}); |
|
|
|
|
|
function toTime(time) { |
|
var m = Math.floor(time / 60); |
|
var s = Math.round(time % 60); |
|
|
|
if (m < 10) { m = '0' + m; } |
|
if (s < 10) { s = '0' + s; } |
|
|
|
return m +' : ' + s; |
|
} |
|
|
|
function timer() { |
|
sessionTime -= 1; |
|
if (sessionTime < 0) { |
|
$scope.type = $scope.type === 'session' ? 'break' : 'session'; |
|
$scope.state = 'stoped'; |
|
resetState(); |
|
return; |
|
} |
|
$scope.display = toTime(sessionTime); |
|
$scope.$apply(); |
|
drawProgress(); |
|
} |
|
|
|
function resetState() { |
|
clearInterval(interval); |
|
|
|
if ($scope.state === 'stoped') { |
|
sessionTime = Number.parseInt($scope[$scope.type]) + 1; |
|
} |
|
|
|
if ($scope.state === 'paused' || $scope.state === 'stoped' ) { |
|
setTimeout(timer, 1); |
|
interval = setInterval(timer, 1000); |
|
$scope.state = $scope.type; |
|
} else { |
|
$scope.state = 'paused'; |
|
} |
|
} |
|
|
|
$scope.displayAction = resetState; |
|
drawProgress(); |
|
}); |
|
|
|
|
|
|
|
|
|
app.directive('rangeBtn', function() { |
|
return { |
|
restrict : 'A', |
|
scope : { |
|
minutes : '@', |
|
seconds : '@', |
|
time : '=' |
|
}, |
|
link : function(scope, element, attrs) { |
|
element.on('click', function(e) { |
|
if (scope.frozen === true) {return;} |
|
var targ = |
|
e.target.parentNode.parentNode.className; |
|
if (targ !== 'minutes' && targ !== 'seconds') {return;} |
|
var sign = e.target.parentNode.className.split(' ')[0]; |
|
var val = Number.parseInt(attrs[targ], 10); |
|
|
|
function leadIt(v) { |
|
if (v < 10) { |
|
return '0'+v; |
|
} |
|
return v; |
|
} |
|
|
|
if (sign === 'plus') { |
|
if (val < 59) { |
|
val += 1; |
|
} else { |
|
val = 0; |
|
} |
|
} |
|
|
|
if (sign === 'minus') { |
|
if (val > 0) { |
|
val -= 1; |
|
} else { |
|
val = 59; |
|
} |
|
} |
|
|
|
attrs.$set(targ, leadIt(val)); |
|
scope.$apply(function() { |
|
scope[targ] = leadIt(val); |
|
scope.time = |
|
Number.parseInt(attrs['minutes'], 10) * 60 + |
|
Number.parseInt(attrs['seconds'], 10); |
|
}); |
|
|
|
//scope.session = 'aaaa'; |
|
//scope.$apply(); |
|
}); |
|
}, |
|
template : '<div class="minutes"><span class="plus control"><i class="fa fa-caret-up"></i></span>' + |
|
'<span class="timer">{{minutes}}</span>' + |
|
'<span class="minus control"><i class="fa fa-caret-down"></i></span></div>' |
|
+ |
|
'<div class="seconds"><span class="plus control"><i class="fa fa-caret-up"></i></span>' + |
|
'<span class="timer">{{seconds}}</span>' + |
|
'<span class="minus control"><i class="fa fa-caret-down"></i></span></div>' |
|
} |
|
}); |