106 lines
3.5 KiB
JavaScript
106 lines
3.5 KiB
JavaScript
/**
|
||
* Очищает область рисования
|
||
* @param {Object} canvas canvas object
|
||
* @param {String} color строка с цветом (HEX, либо имя, либо rgba, etc)
|
||
*/
|
||
export function clearContext(canvas, color) {
|
||
let cW = canvas.width;
|
||
let cH = canvas.height;
|
||
|
||
let context = canvas.getContext('2d');
|
||
|
||
context.fillStyle = color;
|
||
context.fillRect(0, 0, cW, cH);
|
||
}
|
||
|
||
export function placeImage(canvas, area, imageFile, colors) {
|
||
let context = canvas.getContext('2d');
|
||
|
||
let image = new Image();
|
||
image.src = `assets/images/${imageFile}`;
|
||
|
||
context.strokeStyle = colors.buttonStroke;
|
||
context.lineWidth = colors.strokeSize;
|
||
|
||
if (image.width >= image.height) {
|
||
if (image.width > area.w) {
|
||
let newImageW = area.w;
|
||
let newImageH = image.height / (image.width / area.w);
|
||
|
||
context.drawImage(image, getCenterH(canvas.width, newImageW), area.y, newImageW, newImageH);
|
||
context.strokeRect(getCenterH(canvas.width, newImageW), area.y, newImageW, newImageH);
|
||
}
|
||
else {
|
||
// TODO: getCenterV({this}) <= need plus progressBar sizes
|
||
context.drawImage(image, getCenterH(canvas.width, image.width), getCenterV(canvas.height / 2 + area.y, image.height), image.width, image.height);
|
||
context.strokeRect(getCenterH(canvas.width, image.width), getCenterV(canvas.height / 2 + area.y, image.height), image.width, image.height);
|
||
}
|
||
}
|
||
else {
|
||
let newImageH = area.h;
|
||
let newImageW = image.width * (area.h / image.height);
|
||
context.drawImage(image, getCenterH(canvas.width, newImageW), area.y, newImageW, newImageH);
|
||
context.strokeRect(getCenterH(canvas.width, newImageW), area.y, newImageW, newImageH);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Возвращает X координату для центрировки объекта
|
||
* @param {Integer} canvasWidth
|
||
* @param {Integer} objectWidth
|
||
* @return {Integer} X координата
|
||
*/
|
||
export function getCenterH(canvasWidth, objectWidth) {
|
||
return canvasWidth / 2 - objectWidth / 2;
|
||
}
|
||
|
||
/**
|
||
* Возвращает Y координату для центрировки объекта
|
||
* @param {Integer} canvasHeight
|
||
* @param {Integer} objectHeight
|
||
* @return {Integer} Y координата
|
||
*/
|
||
export function getCenterV(canvasHeight, objectHeight) {
|
||
return canvasHeight / 2 - objectHeight / 2;
|
||
}
|
||
|
||
/**
|
||
* Рисует полосу прогресса с визуализацией правильных и неправильных ответов
|
||
* @param {} context
|
||
* @param {Object} area зона в которой будет отрисовываться объект
|
||
* @param {Object} colors объект цветов
|
||
* @param {Object} questions объект вопросов
|
||
*/
|
||
export function drawProgressBar(context, area, colors, questions) {
|
||
let sizeProgressItem = area.w / questions.length;
|
||
|
||
context.strokeStyle = colors.strokeSize;
|
||
|
||
for (let i = 0; i < questions.length; i++) {
|
||
switch (questions[i].status) {
|
||
case null:
|
||
context.fillStyle = colors.answer.notPassed;
|
||
break;
|
||
case true:
|
||
context.fillStyle = colors.answer.right;
|
||
break;
|
||
case false:
|
||
context.fillStyle = colors.answer.wrong;
|
||
break;
|
||
}
|
||
|
||
context.fillRect(10 + (i * sizeProgressItem), 10, sizeProgressItem, 20);
|
||
context.strokeRect(10 + (i * sizeProgressItem), 10, sizeProgressItem, 20);
|
||
}
|
||
}
|
||
|
||
export function drawQuestionLabel(canvas, area, questLabel) {
|
||
let context = canvas.getContext('2d');
|
||
|
||
context.font = '32px Yanone Kaffeesatz';
|
||
context.textAlign = 'center';
|
||
context.fillStyle = '#ffffff';
|
||
|
||
context.fillText(questLabel, canvas.width / 2, area.y + 30);
|
||
}
|