Youen Toupin
3 years ago
6 changed files with 75 additions and 14 deletions
@ -0,0 +1,3 @@ |
|||||||
|
div.widget.chronometer span.integral-value { |
||||||
|
font-size: 2.0rem; |
||||||
|
} |
@ -0,0 +1,54 @@ |
|||||||
|
import { NumericValue } from 'components/widgets/numeric-value'; |
||||||
|
|
||||||
|
require('./chronometer.css'); |
||||||
|
|
||||||
|
export class Chronometer extends NumericValue { |
||||||
|
private realTimeValue = 0; |
||||||
|
private realTimeReference = 0; |
||||||
|
|
||||||
|
private animating = false; |
||||||
|
private shuttingDown = false; |
||||||
|
|
||||||
|
protected mainClassName() { return 'numeric-value chronometer'; } |
||||||
|
|
||||||
|
protected onValueChange(value: number) { |
||||||
|
let now = Date.now() / 1000; |
||||||
|
|
||||||
|
let realTimeValue = this.realTimeValue + (now - this.realTimeReference); |
||||||
|
|
||||||
|
if(Math.abs(value - realTimeValue) < 2.0) |
||||||
|
return; |
||||||
|
|
||||||
|
this.realTimeValue = value; |
||||||
|
this.realTimeReference = now; |
||||||
|
realTimeValue = value; |
||||||
|
this.startAnimation(); |
||||||
|
} |
||||||
|
|
||||||
|
private startAnimation() { |
||||||
|
if(this.animating) |
||||||
|
return; |
||||||
|
this.animating = true; |
||||||
|
this.animate(); |
||||||
|
} |
||||||
|
|
||||||
|
onbeforeremove(vnode: any) { |
||||||
|
this.shuttingDown = true; |
||||||
|
super.onbeforeremove(vnode); |
||||||
|
} |
||||||
|
|
||||||
|
private animate() { |
||||||
|
if(this.shuttingDown) return; |
||||||
|
|
||||||
|
let now = Date.now() / 1000; |
||||||
|
let realTimeValue = this.realTimeValue + (now - this.realTimeReference); |
||||||
|
|
||||||
|
let hours = Math.floor(realTimeValue / 3600); |
||||||
|
let minutes = Math.floor((realTimeValue - hours * 3600)/60); |
||||||
|
let seconds = Math.floor(realTimeValue - hours * 3600 - minutes * 60); |
||||||
|
|
||||||
|
this.integralValueElement.innerText = (hours < 10 ? '0' : '') + hours + ':' + (minutes < 10 ? '0' : '') + minutes + ':' + (seconds < 10 ? '0' : '') + seconds; |
||||||
|
|
||||||
|
setTimeout(() => this.animate(), (Math.ceil(realTimeValue) + 0.05 - realTimeValue) * 1000); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue