mirror of https://github.com/espruino/BangleApps
67 lines
2.6 KiB
JavaScript
67 lines
2.6 KiB
JavaScript
|
var Hand = require("fontclock.hand.js");
|
||
|
|
||
|
class ThinHand extends Hand {
|
||
|
/**
|
||
|
* The thin hand is created from a simple line, so its easy and fast
|
||
|
* to draw.
|
||
|
*/
|
||
|
constructor(centerX,
|
||
|
centerY,
|
||
|
length,
|
||
|
tolerance,
|
||
|
draw_test,
|
||
|
color_bg_supplier,
|
||
|
color_fg_supplier){
|
||
|
super();
|
||
|
this.centerX = centerX;
|
||
|
this.centerY = centerY;
|
||
|
this.length = length;
|
||
|
this.color_bg_supplier = color_bg_supplier;
|
||
|
this.color_fg_supplier = color_fg_supplier;
|
||
|
// The last x and y coordinates (not the centre) of the last draw
|
||
|
this.last_x = centerX;
|
||
|
this.last_y = centerY;
|
||
|
// tolerance is the angle tolerance (from the last draw)
|
||
|
// in radians for a redraw to be called.
|
||
|
this.tolerance = tolerance;
|
||
|
// draw test is a predicate (angle, time). This is called
|
||
|
// when the hand thinks that it does not have to draw (from its internal tests)
|
||
|
// to see if it has to draw because of another object.
|
||
|
this.draw_test = draw_test;
|
||
|
// The current angle of the hand. Set to -1 initially
|
||
|
this.angle = -1;
|
||
|
this.last_draw_time = null;
|
||
|
this.active = false;
|
||
|
}
|
||
|
// method to move the hand to a new angle
|
||
|
moveTo(angle){
|
||
|
// first test to see of the angle called is beyond the tolerance
|
||
|
// for a redraw
|
||
|
if(Math.abs(angle - this.angle) > this.tolerance ||
|
||
|
// and then call the predicate to see if a redraw is needed
|
||
|
this.draw_test(this.angle,this.last_draw_time) ){
|
||
|
// rub out the old hand line
|
||
|
var background = this.color_bg_supplier();
|
||
|
g.setColor(background[0],background[1],background[2]);
|
||
|
g.drawLine(this.centerX, this.centerY, this.last_x, this.last_y);
|
||
|
// Now draw the new hand line
|
||
|
var hand_color = this.color_fg_supplier();
|
||
|
g.setColor(hand_color[0],hand_color[1],hand_color[2]);
|
||
|
var x2 = this.centerX + this.length*Math.sin(angle);
|
||
|
var y2 = this.centerY - this.length*Math.cos(angle);
|
||
|
g.drawLine(this.centerX, this.centerY, x2, y2);
|
||
|
// and store the last draw details for the next call
|
||
|
this.last_x = x2;
|
||
|
this.last_y = y2;
|
||
|
this.angle = angle;
|
||
|
this.last_draw_time = new Date();
|
||
|
this.active = true;
|
||
|
return true;
|
||
|
} else {
|
||
|
this.active = false;
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports = ThinHand;
|