2021-05-17 23:38:10 +05:00

110 lines
3.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

function BlinkStatus(x, y, w, h) {
//Основной прямоугольник
var rAll = new Rectangle(x, y, w, h);
//Массив цветов статусов
var statColor = [];
//Текущий статус
var status = 0;
/*Проценты поднимаются снизу вверх (false)
*или слева направо (true)*/
var rotate = false;
/*Функции для работы с координатами
* основного прямоугольника */
this.X = function (val) {
if (val === undefined) return rAll().X();
rAll().X(val);
};
this.Y = function (val) {
if (val === undefined) return rAll().Y();
rAll().Y(val);
};
this.W = function (val) {
if (val === undefined) return rAll().W();
rAll().W(val);
};
this.H = function (val) {
if (val === undefined) return rAll().H();
rAll().H(val);
};
//Установка статуса от -1 до (кол-во элементов в массиве статусов - 1)
this.Status = function (val) {
if (val === undefined) return status;
var v = parseInt(val);
status = (isNaN(v) || v < -1) ? -1 :
v >= statColor.length ? (statColor.length - 1) : v;
};
//Количество статусов
this.StatCount = function () {
return statColor.length;
};
//Функция изменения начальной координаты и размеров прямоугольника
this.RectParam = function (_x, _y, _w, _h) {
rAll.RectParam(_x, _y, _w, _h);
};
//Функция изменения прямоугольника по другому прямоугольнику
this.Rect = function (val) {
if (val === undefined) return rAll;
rAll.Rect(val);
};
//Изменение направления отрисовки текста
this.Rotate = function (val) {
if (val === undefined) return rotate;
rotate = (typeof val === 'boolean') ? val : false;
};
//Установка нового статуса
this.AddStatus = function (index, color) {
if (color === undefined) color = '#000';
var c = color.match(/^#([0-9a-f]{3}|[0-9a-f]{6})$/i);
c = (c === null) ? '#000000' : c[0];
var idx = parseInt(index);
if (isNaN(idx) || idx < 0 || idx > statColor.length - 1)
statColor.push(c);
else
statColor.splice(idx, 0, c);
};
//Изменение статуса
this.ChangeStatus = function (index, color) {
if (color === undefined) color = '#000';
var c = color.match(/^#([0-9a-f]{3}|[0-9a-f]{6})$/i);
c = (c === null) ? '#000000' : c[0];
var idx = parseInt(index);
if (!isNaN(idx) && idx >= 0 && idx < statColor.length)
statColor.splice(idx, 1, c);
};
//Удаление статуса
this.DelStatus = function (index) {
var idx = parseInt(index);
if (!isNaN(idx) && idx >= 0 && idx < statColor.length)
statColor.splice(idx, 1);
else if (statColor.length > 0)
statColor.pop();
};
//Заполнение мигалки по умолчанию
this.BuildDefault = function () {
var defaultColor = ['#00f', '#f00', '#0f0'];
for (var i = 0; i < defaultColor.length; i++)
this.AddStatus(0, defaultColor[i]);
};
//Печать мигалки
this.Print = function (ctx) {
ctx.fillStyle = status >= 0 && status < statColor.length ? statColor[status] : '#ddd';
ctx.fillRect(rAll.X(), rAll.Y(), rAll.W(), rAll.H());
ctx.strokeStyle = '#000'; //'#333'
ctx.strokeRect(rAll.X(), rAll.Y(), rAll.W(), rAll.H());
};
//Печать текста мигалки
this.PrintText = function (ctx) {
ctx.save();
ctx.translate(rAll.X() + rAll.W() / 2, rAll.Y() + rAll.H() / 2);
if (rotate) ctx.rotate(3 * Math.PI / 2);
ctx.fillStyle = '#888';
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
if (rotate)
ctx.font = (rAll.W() - 2 < 0 ? 0 : rAll.W() - 2) + 'px Arial';
else
ctx.font = (rAll.H() - 2 < 0 ? 0 : rAll.H() - 2) + 'px Arial';
ctx.fillText((status + 1) + '/' + statColor.length, 0, 0);
ctx.restore();
};
}