DropDown Menu

Класс меню наследует базовый класс 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 = 
["Новый", "Загрузить", "Сохранить",  "Экспорт кода", "Выход"]