Написан базовый класс конструтор, который наследую все 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();