UNPKG

nidza

Version:

Nidza.js is ultimate canvas2d+3d solution. In context of 3d graphics it is used for GLSL manipulation. Objective is low CPU usage price.

136 lines (113 loc) 3.45 kB
import { NidzaElement } from "./base-component.js"; import { Osc, drawSimpleText, drawRotatedText, drawBorder, drawWithBorder, drawRotatedBorderText } from "./operations.js"; import {Rotator} from "./rotation.js"; export class NidzaTextComponent extends NidzaElement { constructor(arg) { const eArg = { position: arg.position, id: arg.id, canvasDom: arg.canvasDom } super(eArg); this.id = arg.id; this.text = arg.text; this.color = arg.color || 'black'; // Must be optimized with new override draws who setup font // for now i use flag `isActive`. this.font = { isActive: false, fontSize: "30px", fontStyle: "bold", fontName: "serif" }; if (arg.font) { this.font = { isActive: true, fontSize: arg.font.fontSize, fontStyle: arg.font.fontStyle, fontName: arg.font.fontName }; } this.ctx = arg.ctx; this.canvasDom = arg.canvasDom; this.draw = drawSimpleText; this.drawRotatedText = drawRotatedText; this.drawRotatedBorderText = drawRotatedBorderText; this.drawBorder = drawBorder; this.drawWithBorder = drawWithBorder; this.border = { typeOfDraw: 'fill-stroke', isActive: false, fillColor: 'gold', strokeColor: 'red', radius: 10 }; if (arg.border) { this.border = { typeOfDraw: arg.border.typeOfDraw || 'fill-stroke', isActive: true, fillColor: arg.border.fillColor || 'gold', strokeColor: arg.border.strokeColor || 'red', radius: arg.border.radius || 10 }; this.setBorder(this.border); } this.rotation = new Rotator(this.id, this.canvasDom.id); this.rotation.setId(this.id); addEventListener(this.getKey("activate-rotator"), this.activateRotator, false); var newW = 20, newH = 20; if (arg.dimension) { newW = arg.dimension.width || 20; newH = arg.dimension.height || 20; } this.dimension.setReferent(this.canvasDom); this.dimension.elementIdentity = this.id; this.dimension.setDimension(newW, newH); } getKey(action) { return action + this.canvasDom.id; } getFont() { return this.font.fontStyle + " " + this.font.fontSize + " " + this.font.fontName; } setBorder(arg) { if (arg) { this.border = { typeOfDraw: arg.typeOfDraw || 'fill-stroke', isActive: true, fillColor: arg.fillColor || 'gold', strokeColor: arg.strokeColor || 'red', radius: arg.radius || 10 }; } this.border.isActive = true; if (this.rotation && this.rotation.isActive) { this.draw = this.drawRotatedBorderText; } else { this.draw = this.drawWithBorder; } } // Important - overriding is here // flag rotation.isActive indicate activateRotator = () => { if (this.rotation.isActive == false) { this.rotation.isActive = true; if (this.border.isActive) { this.draw = this.drawRotatedBorderText; } else { this.draw = this.drawRotatedText; } } dispatchEvent(new CustomEvent(this.getKey("activate-updater"), { detail: { id: this.elementIdentity, oneDraw: true } })); } }