110 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
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();
 | 
						||
	};
 | 
						||
} |