This app provides monitoring and information features for the common freifunk user and the technical stuff of a freifunk community.
Code base is taken from a TUM Practical Course project and added here to see if Freifunk Altdorf can use it.
https://www.freifunk-altdorf.de
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
116 lines
2.8 KiB
116 lines
2.8 KiB
var Class = require('../../core/class'); |
|
var Base = require('./base'); |
|
|
|
var fontAnchors = { middle: 'center' }; |
|
|
|
module.exports = Class(Base, { |
|
|
|
base_initialize: Base.prototype.initialize, |
|
|
|
initialize: function(text, font, alignment, path){ |
|
this.base_initialize(); |
|
this.draw.apply(this, arguments); |
|
}, |
|
|
|
draw: function(text, font, alignment, path){ |
|
var em; |
|
if (typeof font == 'string'){ |
|
em = Number(/(\d+)/.exec(font)[0]); |
|
} else if (font){ |
|
em = parseFloat(font.fontSize || font['font-size'] || '12'); |
|
font = (font.fontStyle || font['font-style'] || '') + ' ' + |
|
(font.fontVariant || font['font-variant'] || '') + ' ' + |
|
(font.fontWeight || font['font-weight'] || '') + ' ' + |
|
em + 'px ' + |
|
(font.fontFamily || font['font-family'] || 'Arial'); |
|
} else { |
|
font = this._font; |
|
} |
|
|
|
var lines = text && text.split(/\r?\n/); |
|
this._font = font; |
|
this._fontSize = em; |
|
this._text = lines; |
|
this._alignment = fontAnchors[alignment] || alignment || 'left'; |
|
|
|
var context = Base._genericContext; |
|
|
|
context.font = this._font; |
|
context.textAlign = this._alignment; |
|
context.textBaseline = 'middle'; |
|
|
|
lines = this._text; |
|
var l = lines.length, width = 0; |
|
for (var i = 0; i < l; i++){ |
|
var w = context.measureText(lines[i]).width; |
|
if (w > width) width = w; |
|
} |
|
this.width = width; |
|
this.height = l ? l * 1.1 * em : 0; |
|
return this.invalidate(); |
|
}, |
|
|
|
// Interaction |
|
|
|
localHitTest: function(x, y){ |
|
if (!this._fill) return null; |
|
if (x > 0 && y > 0 && x < this.width && y < this.height){ |
|
return this; |
|
} |
|
return null; |
|
}, |
|
|
|
// Rendering |
|
|
|
renderShapeTo: function(context){ |
|
if (this._invisible || !this._text || (!this._fill && !this._stroke)) { |
|
return null; |
|
} |
|
context.transform(this.xx, this.yx, this.xy, this.yy, this.x, this.y); |
|
var fill = this._fill, |
|
stroke = this._stroke, |
|
text = this._text, |
|
dash = this._strokeDash; |
|
|
|
context.font = this._font; |
|
context.textAlign = this._alignment; |
|
context.textBaseline = 'middle'; |
|
|
|
var em = this._fontSize, |
|
y = em / 2, |
|
lineHeight = 1.1 * em, |
|
lines = text, |
|
l = lines.length; |
|
|
|
if (fill){ |
|
context.fillStyle = fill; |
|
for (var i = 0; i < l; i++) |
|
context.fillText(lines[i], 0, y + i * lineHeight); |
|
} |
|
if (stroke){ |
|
if (dash) { |
|
if (context.setLineDash) { |
|
context.setLineDash(dash); |
|
} else { |
|
// TODO: Remove when FF supports setLineDash. |
|
context.mozDash = dash; |
|
} |
|
// TODO: Create fallback to other browsers. |
|
} else { |
|
if (context.setLineDash) { |
|
context.setLineDash([]); |
|
} else { |
|
context.mozDash = null; |
|
} |
|
} |
|
|
|
context.strokeStyle = stroke; |
|
context.lineWidth = this._strokeWidth; |
|
context.lineCap = this._strokeCap; |
|
context.lineJoin = this._strokeJoin; |
|
for (i = 0; i < l; i++) |
|
context.strokeText(lines[i], 0, y + i * lineHeight); |
|
} |
|
} |
|
|
|
});
|
|
|