2021-05-17 23:38:10 +05:00
|
|
|
|
function BlinkStatus(x, y, w, h) {
|
|
|
|
|
//Основной прямоугольник
|
|
|
|
|
var rAll = new Rectangle(x, y, w, h);
|
|
|
|
|
//Массив цветов статусов
|
|
|
|
|
var statColor = [];
|
|
|
|
|
//Текущий статус
|
2021-05-18 10:38:44 +05:00
|
|
|
|
var status = -1;
|
2021-05-17 23:38:10 +05:00
|
|
|
|
/*Проценты поднимаются снизу вверх (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();
|
|
|
|
|
};
|
|
|
|
|
}
|