Класс меню наследует базовый класс GuiElement:
/// @description MENU (переделака Drop Down без ограничения по высоте списка)
//Site: MidaDev.ru
//Author: Dimusikus
function GUI_Menu() : GUIElement() constructor
{
//*******************************************************************
#region Constructor
x = other.x;
y = other.y;
my_name_is = other.my_name_is;
text = other.text;
draw_set_font(font);
width = string_width(text);
options = other.options; //массив пунктов меню
widthP = 1; //ширина самого длинного названия подпункта менюхи
for(var i = array_length(options)-1; i>=0; i--){ widthP = max(widthP, string_width(options[i]));};
GUI_Elements.add_element(my_name_is, self);
#endregion
static set_focus = function() {focus = true; /*other.depth -= 10;*/}
//*******************************************************************
static remove_focus = function() {focus = false; /*other.depth = old_depth;*/}
//*******************************************************************
EVENTGUI.subscribe("set_" + my_name_is, function(_data){ set(_data, false); trace("GUI_DropDown(", my_name_is,") Получил событие=", "set_", my_name_is, ", данные=", _data);})
//*******************************************************************
static set = function(value, _flag=true)
{ //if is_undefined(_value) then {show_message("DROPDOWN set index = undefined"); _value=-1; return;};
//value =_value;
if _flag == true then EVENTGUI.publish(my_name_is, [options[value], value]);
//if callback != pointer_null then callback([options[value], value]);
GUI_Elements.element_callback(my_name_is, [options[value], value]);
}
//*******************************************************************
static listen = function()
{ //ждём клика мышкой
if (!mouse_check_button_pressed(mb_left)) return;
//очистка состояния кнопок мыши, что бы други элементы ГУИ под курсором не схавали это событие
//можно создать событие приоритета элементов, где он отключает реакции других элементов на мыщку
mouse_clear(mb_any);
//тогда высчитываем куда ана кликнула
for(var i = array_length(options)-1; i>=0; i--)
{ var x1 = x;
var y1 = y + (height * (i+1));
var x2 = x + widthP;
var y2 = y + (height * (i+2))
if (!point_in_rectangle(mouse_x, mouse_y, x1, y1, x2, y2)) then continue;
set(i); //поймали клик на элементе i
return;
}
}//если мы тут, то кликнули вникуда
//*******************************************************************
static draw = function()
{
draw_set_hv(fa_left, fa_middle);
draw_set_font(font);
if (get_focus())
{
draw_set_color(color_text);
for(var i = array_length(options)-1; i>=0; i--)
{ draw_set_color(color_backgr_text);
if (point_in_rectangle(mouse_x, mouse_y, x, y + (height * (i+1)), x + widthP, y + (height * (i+2)))) then draw_set_color(color_fill_listbox);
draw_rectangle (x, y + (height * (i+1)), x + widthP+ padding*2, y + (height * (i+2)), false);
draw_set_color(color_text);
draw_text(x + padding, y + (height * (i+1.5)), options[i]);
};
//рамка вокруг развёрнутого элемента
draw_set_color(color_border);
draw_rectangle(x, y + height, x + widthP + padding*2 , y + (height*(array_length(options)+1))-2, true);
//фон за
//основная часть элемента в свёрнутом виде
draw_set_color(color_fill_listbox);
draw_rectangle(x, y, x + string_width(text)+ padding*2, y + height-2, false);
}
draw_set_color(color_text);
draw_set_hv(fa_left, fa_middle);
draw_text(x + padding, y + h2, text);
}
//*******************************************************************
//set(value);
//*******************************************************************
}
Пункты меню расписываются в свойстве объекта:
options =
["Новый", "Загрузить", "Сохранить", "Экспорт кода", "Выход"]