bigbluebutton-Github/bbb-export-annotations/shapes/Checkbox.js

68 lines
2.0 KiB
JavaScript
Raw Normal View History

import {Line} from '@svgdotjs/svg.js';
import {Rectangle} from './Rectangle.js';
/**
* Creates an SVG "Checkbox" shape, which is a rectangle with a checkmark in it.
*
* @class Checkbox
* @extends {Rectangle}
*/
export class Checkbox extends Rectangle {
/**
* Gets the lines to draw a checkmark inside a given width and height.
* @param {number} w The width of the bounding rectangle.
* @param {number} h The height of the bounding rectangle.
* @return {Array} An array of lines, each defined by two arrays
* representing points.
* @see {@link https://github.com/tldraw/tldraw/blob/main/packages/tldraw/src/lib/shapes/geo/GeoShapeUtil.tsx} Adapted from Tldraw.
*/
static getCheckBoxLines(w, h) {
const size = Math.min(w, h) * 0.82;
const ox = (w - size) / 2;
const oy = (h - size) / 2;
const clampX = (x) => Math.max(0, Math.min(w, x));
const clampY = (y) => Math.max(0, Math.min(h, y));
return [
[
[clampX(ox + size * 0.25), clampY(oy + size * 0.52)],
[clampX(ox + size * 0.45), clampY(oy + size * 0.82)],
],
[
[clampX(ox + size * 0.45), clampY(oy + size * 0.82)],
[clampX(ox + size * 0.82), clampY(oy + size * 0.22)],
],
];
}
/**
* Draws a "Checkbox" shape on the SVG canvas.
* @return {G} Returns the SVG group element containing
* the rectangle and the checkmark.
*/
draw() {
// Draw the base rectangle
const rectGroup = super.draw();
// Get the lines for the checkmark
const lines = Checkbox.getCheckBoxLines(this.w, this.h + this.growY);
lines.forEach(([start, end]) => {
const line = new Line();
line.plot(start[0], start[1], end[0], end[1])
.stroke({color: this.shapeColor,
width: this.thickness,
linecap: 'round'})
.style({dasharray: this.dasharray});
// Add the line to the group
rectGroup.add(line);
});
this.drawLabel(rectGroup);
return rectGroup;
}
}