GuiElement - базовый класс для всех элементов UI

Написан базовый класс конструтор, который наследую все GUI элементы.

/// @description Основноей родительский элемент
//Site:   MidaDev.ru
//Author: Dimusikus
//EMail:  Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.
//базовый конструктор всех элементов GUI
function GUIElement() constructor 
{
	//*******************************************************************
	#region Constructor
	//---------------------------------------------------------------------------
	value       = 0;			//значение любого типа
    my_name_is  = "";			// unique name
	enabled		= true;			//включен/выключен объект
	_other		= other;
	//object_index=other.object_index;
	//visible	= other.visible;//видимый
	//---------------------------------------------------------------------------
	focus		= false;		//имеет ли фокус
	//callback	= pointer_null;
	//---------------------------------------------------------------------------
	//static color_backgr_form	= bgr($676767); //цыет фона формы и регионов(рамок)
	static color_backgr_form	= bgr($F2F2F2); //цыет фона формы и регионов(рамок)	
	layer_background_blend(layer_background_get_id(layer_get_id("Background")), $F2F2F2)
	
	static color_backgr_text		= bgr($F2F2F2);//цвет фона где рисуется текст 
	static color_backgr_text_edit	= bgr($FFFFFF);//цыет фона редактора текста
	static color_backgr2_text_edit	= merge_colour(color_backgr_text_edit, color_backgr_form, 0.5);//цыет обводки фона редактора текста
	static color_backgr_button		= bgr($F2F2F2);//цвет фона кнопки
	
	static color_border			= $0;			//цвет бордюра элемента
	static color_text			= $0;			//цвет текста
	static color_focus			= merge_colour(0, self.color_border, 0.7);
	static color_fill_slider	= bgr($0078d7); //цвет закраски слайдера
	static color_fill_checkbox	= bgr($0078d7); //цвет закраски выделенного элемента
	static color_fill_radiobox	= bgr($0078d7); //цвет закраски выделенного элемента
	static color_fill_listbox	= bgr($0078d7); //цвет закраски выделенного элемента
	
	static font = font_gui;	
	//---------------------------------------------------------------------------
	_id			= other.id;
	//oid			= other.id;
	x			= other.x;
	y			= other.y;
    width		= other.sprite_width ;	//ширина
    height		= other.sprite_height;	//высота
	w2			= width/2;
	h2			= height/2;
	xoffset		= other.sprite_xoffset;
	yoffset		= other.sprite_yoffset;
	_xo			= x - xoffset;
	_yo			= y - yoffset;
    padding		= 5;					//отступ текста от элемента, other.padding;	
	//---------------------------------------------------------------------------
	mouse_over  = false;				//флаг наведения курсора
	mouse_click = false;				//флаг что произошол клик мышкой
	mouse_grab	= false;				//флаг что идёт удержание мышкой элемента
	pointinrect = true;					//по дефолту мыш чекается попадание в квадрат, иначе в окружность
	//---------------------------------------------------------------------------
	draw_set_font(font);
	char_width		= string_width(" ");//ширина символа для текущего шрифта
	char_height		= string_height(" ");//высота символов для текущего шрифта	
	//---------------------------------------------------------------------------
	#endregion
	///*******************************************************************
	//*******************************************************************
	#region Methods
	//*******************************************************************
	//static get_obj_name = function(){ return object_get_name(object_index); };
	//static get_obj_full_name = function(){ return get_obj_name() + "(" + my_name_is + ")"; };
	//static get_obj_full_name = function(){ return my_name_is + ": "; };
	//*******************************************************************
	static set_focus = function() {focus = true;}
	//*******************************************************************
	static get_focus = function() {return focus;}
	//*******************************************************************
	static remove_focus = function() {focus = false;}
	//*******************************************************************	
	static get = function() {return self.value;}
	//*******************************************************************
	static set_font = function(_font)
	{	if is_undefined(_font) then return;
		font = _font;
		draw_set_font(font);
		char_width		= string_width(" ");//ширина символа для текущего шрифта
		char_height		= string_height(" ");//высота символов для текущего шрифта	
	}
	//*******************************************************************
	static set = function(_value) {self.value = _value;}
	//*******************************************************************
	static update_coord = function() 
	{	//обновление координат элемента, ScrollBox(как дочерний элемент) отключает эту функцию
		x = other.x; y = other.y; _xo = x - xoffset; _yo = y - yoffset;	}
	//*******************************************************************
	static step = function()
	{	update_coord();
		if pointinrect then mouse_over		= point_in_rectangle(mouse_x, mouse_y, _xo, _yo, _xo + width, _yo + height);
		else				mouse_over		= point_in_circle(mouse_x, mouse_y, _xo + xoffset, _yo+yoffset, min(width, height)/2);
		
		mouse_click		= mouse_check_button_pressed(mb_left);
		mouse_released  = mouse_check_button_released(mb_left);
		mouse_grab		= mouse_check_button(mb_left) && mouse_over;
		
		//если удерживается кнопа на елементе то ессно он получил фокуспокус
		//if (mouse_grab and mouse_over) then listen();
		//если элемент в фокусе, то ессно, слушаем......
		if get_focus() then listen();
		//клик в зоне элемента знач слик
		if (mouse_click and mouse_over) then click();		
		//если клик был вне зоны то элемент теряет фокуспокус
		if (mouse_click and !mouse_over) then remove_focus();		
	}
	//*******************************************************************
	static click = function() {	set_focus(); /*can_click = false;*/}
	//*******************************************************************
	static listen = function() { /* */ }
	//*******************************************************************
	static draw = function() { /* */ }
	//*******************************************************************
	static draw_focus = function() 
	{ 	if focus then //если элемент в фокусе то рисуем обрамляющую рамку окрух нехо
		{	var b=1;			
			draw_set_color(color_focus);
			//draw_rectangle(_xo-b, _yo-b  , _xo + width + b, _yo + height + b, true);
			draw_rectangle(_other.bbox_left+b, _other.bbox_top+b , _other.bbox_right - b-1, _other.bbox_bottom - b-1, true);
		}
	}
	//*******************************************************************
	//static add_callback = function(_func) { callback = _func; }
	//*******************************************************************
	#endregion	
	//*******************************************************************
}

//аггрегатор элементов ГУИ, через нег ополучаем необходимую инфу о элементахпо их имени
function _GUI_Elements() constructor
{
	#region Constructor
	callbacks		 = ds_map_create();	//калл баки элементов, доступ к ним идёт по их имени
	elements		 = ds_map_create();	//айди создаваемых элементов, доступ к ним идёт по их имени
	radio_groups	 = ds_map_create(); //айди радио батонов, что бы они могли друг на друга влиять
	tabsheets_groups = ds_map_create(); //айди ТАБОВ, что бы они могли друг на друга влиять
	//buttons		 = ds_map_create(); //айди кнопок, хранит каллбаки событийного вызова.
	//menus			 = ds_map_create(); //айди менюх,  хранит каллбаки событийного вызова.
	#endregion
	
	#region Все GUI элементы
	//*******************************************************************
	static add_element = function(_name, _self)
	{
		var e = get_element_self(_name);
		//если элемент не существует, то добавляем его
		if is_undefined(e) then
		{
			ds_map_add(elements, _name, _self);
			ds_map_add(callbacks, _name, pointer_null);
		}
		//элемент существует, значит меняем его параметры
		//else elements[? _name] = _self;
		else ds_map_set(elements, _name, _self);
	};
	//*******************************************************************
	static get_element_self = function(_name)
	{
		return ds_map_find_value(elements, _name);
	};
	//*******************************************************************
	static get_element_callback = function(_name)
	{
		return ds_map_find_value(callbacks, _name);
	};
	//*******************************************************************
	static add_callback = function(_name, _call)
	{	
		var e = get_element_self(_name);
		//если элемент не существует, то добавляем его
		if is_undefined(e) then	ds_map_add(callbacks, _name, _call);		
		//назначаем элементу каллбак функцию
		//else e.callback = _call;
		else ds_map_set(callbacks, _name, _call);
		//назначаем элементу каллбак функцию
		//try{ds_map_find_value(elements, _name).callback = _call; return true;}catch(_){return false;};		
		//try{get_element(_name).callback = _call; return true;}catch(_null){return false;};
	};
	//*******************************************************************
	static element_callback = function(_name, param=undefined)
	{
		var func = get_element_callback(_name);
		//var _self=get_element_self(_name);
		if func==pointer_null then return;
		if is_undefined(func) then return;		
		
		//_self.
		func(param);
		//script_execute()
	};
	//*******************************************************************
	//пишет лог в лог гуи элементы по его имени
	static log_gui = function(_name, _param=undefined, _color=undefined)
	{		
		var _self=get_element_self(_name);
		if !is_undefined(_self) then _self.log(_param, _color);					
		else trace(_name, " - Logger несуществует");		
	};
	#endregion
	//*******************************************************************
	#region RadioGroupe
	//*******************************************************************
	//добавляет название группы радио батон, в параметре лежит id элемента который был чекнут
	static add_radio_group = function(_grup)
	{
		if !ds_map_exists(radio_groups, _grup)		ds_map_add(radio_groups, _grup, -1);				
	}
	//*******************************************************************
	//утанавливает "главаря"(чекнутый элемент) _id
	static radio_group_set_me = function(_grup, _id)
	{
		radio_groups[? _grup] = _id;
	}
	//*******************************************************************
	//проверка, кто главный(чекнутый)
	static radio_group_is_me = function(_grup, _id)
	{
		if ds_map_find_value(radio_groups, _grup) == _id then return true;
		return false;
	}
	//*******************************************************************
	#endregion
	//*******************************************************************
	#region TabSheets
	//*******************************************************************	
	static tabsheets_add_group = function(_grup)
	{	//добавляем название новой ГРУППЫ ТАБОВ если она ещ не добавлена
		if !ds_map_exists(tabsheets_groups, _grup)
		{	//добавляем новую группу, а вней создаём список который будет хранить табы
			ds_map_add(tabsheets_groups, _grup, ds_list_create());
		}
	}
	//*******************************************************************
	static tabsheets_add_tab = function(_grup, _callback)
	{
		var idlist = ds_map_find_value(tabsheets_groups, _grup);
		ds_list_add(idlist, _callback);
		//tabsheets_groups[? _grup] = _id;
	}
	//*******************************************************************
	static tabsheets_set_me = function(_grup, _aidi)
	{
		var idlist = ds_map_find_value(tabsheets_groups, _grup);
		for (var pos = 0; pos < ds_list_size(idlist); pos++;)
		{
			var d= ds_list_find_value(idlist, pos);
			d.message(_aidi);//(_id);
		};
	}
	//*******************************************************************
	static tabsheets_is_me = function(_grup, _id)
	{
		//if ds_map_find_value(tabsheets_groups, _grup) == _id then return true;
		//return false;
	}
	//*******************************************************************
	#endregion
	
}

//глобальные переменные для доступа к элементам ГУИ
globalvar GUI_Elements;
GUI_Elements = new _GUI_Elements();