forked from FOSS/BangleApps
103 lines
4.3 KiB
JavaScript
103 lines
4.3 KiB
JavaScript
var Hand = require("fontclock.hand.js");
|
|
|
|
class ThickHand extends Hand {
|
|
/**
|
|
* The thick hand is created from a filled polygone, so its slower to
|
|
* draw so to be used sparingly with few redraws
|
|
*/
|
|
constructor(centerX,
|
|
centerY,
|
|
length,
|
|
tolerance,
|
|
draw_test,
|
|
color_bg_supplier,
|
|
color_fg_supplier,
|
|
base_height,
|
|
thickness){
|
|
super();
|
|
this.centerX = centerX;
|
|
this.centerY = centerY;
|
|
this.length = length;
|
|
this.color_bg_supplier = color_bg_supplier;
|
|
this.color_fg_supplier = color_fg_supplier;
|
|
this.base_height = base_height;
|
|
// angle from the center to the top corners of the rectangle
|
|
this.delta_top = Math.atan(thickness/(2*length));
|
|
// angle from the center to the bottom corners of the rectangle
|
|
this.delta_base = Math.atan(thickness/(2*base_height));
|
|
// the radius that the bottom corners of the rectangle move through
|
|
this.vertex_radius_base = Math.sqrt( (thickness*thickness/4) + base_height * base_height);
|
|
// the radius that the top corners of the rectangle move through
|
|
this.vertex_radius_top = Math.sqrt( (thickness*thickness/4) + length * length);
|
|
// last records the last plotted values (so we don't have to keep recalculating
|
|
this.last_x1 = centerX;
|
|
this.last_y1 = centerY;
|
|
this.last_x2 = centerX;
|
|
this.last_y2 = centerY;
|
|
this.last_x3 = centerX;
|
|
this.last_y3 = centerY;
|
|
this.last_x4 = centerX;
|
|
this.last_y4 = centerY;
|
|
// The change in angle from the last plotted angle before we actually redraw
|
|
this.tolerance = tolerance;
|
|
// predicate test that is called if the hand is not going to redraw to see
|
|
// if there is an externally defined reason for redrawing (like another hand)
|
|
this.draw_test = draw_test;
|
|
this.angle = -1;
|
|
this.last_draw_time = null;
|
|
}
|
|
// method to move the hand to a new angle
|
|
moveTo(angle){
|
|
if(Math.abs(angle - this.angle) > this.tolerance || this.draw_test(this.angle - this.delta_base,this.angle + this.delta_base ,this.last_draw_time) ){
|
|
//var background = color_schemes[color_scheme_index].background;
|
|
var background = this.color_bg_supplier;
|
|
g.setColor(background[0],background[1],background[2]);
|
|
g.fillPoly([this.last_x1,
|
|
this.last_y1,
|
|
this.last_x2,
|
|
this.last_y2,
|
|
this.last_x3,
|
|
this.last_y3,
|
|
this.last_x4,
|
|
this.last_y4
|
|
]);
|
|
// bottom left
|
|
var x1 = this.centerX +
|
|
this.vertex_radius_base*Math.sin(angle - this.delta_base);
|
|
var y1 = this.centerY - this.vertex_radius_base*Math.cos(angle - this.delta_base);
|
|
// bottom right
|
|
var x2 = this.centerX +
|
|
this.vertex_radius_base*Math.sin(angle + this.delta_base);
|
|
var y2 = this.centerY - this.vertex_radius_base*Math.cos(angle + this.delta_base);
|
|
// top right
|
|
var x3 = this.centerX + this.vertex_radius_top*Math.sin(angle + this.delta_top);
|
|
var y3 = this.centerY - this.vertex_radius_top*Math.cos(angle + this.delta_top);
|
|
// top left
|
|
var x4 = this.centerX + this.vertex_radius_top*Math.sin(angle - this.delta_top);
|
|
var y4 = this.centerY - this.vertex_radius_top*Math.cos(angle - this.delta_top);
|
|
//var hand_color = color_schemes[color_scheme_index][this.color_theme];
|
|
var hand_color = this.color_fg_supplier();
|
|
g.setColor(hand_color[0],hand_color[1],hand_color[2]);
|
|
g.fillPoly([x1,y1,
|
|
x2,y2,
|
|
x3,y3,
|
|
x4,y4
|
|
]);
|
|
this.last_x1 = x1;
|
|
this.last_y1 = y1;
|
|
this.last_x2 = x2;
|
|
this.last_y2 = y2;
|
|
this.last_x3 = x3;
|
|
this.last_y3 = y3;
|
|
this.last_x4 = x4;
|
|
this.last_y4 = y4;
|
|
this.angle = angle;
|
|
this.last_draw_time = new Date();
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = ThickHand; |