#region
	#macro cmdLine   new __cmdLine
	#macro cmdLineIn new __cmdLineIn
	
	function __cmdLine(txt, color) constructor {
		self.txt   = txt;
		self.color = color;
	}
	
	function __cmdLineIn(txt, color = COLORS._main_text) : __cmdLine(txt, color) constructor {}
#endregion

function Panel_Console() : PanelContent() constructor {
	title = __txtx("panel_debug_console", "Console");
	w     = ui(640);
	h     = ui(320);
	
	auto_pin  = true;
	command   = "";
	cmd_index = 0;
	
	scroll_y  = 0;
	prevFocus = false;
	
	function drawHistory(_y) { #region
		var _x = ui(32 + 8);
		var _w = w - ui(16 + 32);
		
		draw_set_text(f_code, fa_left, fa_bottom, COLORS._main_text_sub);
		
		for( var i = array_length(CMD) - 1 - scroll_y; i >= 0; i-- ) {
			var his = CMD[i];
			
			if(is_instanceof(his, __cmdLine)) {
				var txt = his.txt;
				draw_set_color(his.color);
				
				if(is_instanceof(his, __cmdLineIn)) {
					draw_sprite_ext(THEME.icon_cmd_enter, 0, _x + ui(8), _y - line_get_height() / 2, 1, 1, 0, his.color, 1);
					draw_text_line(_x + ui(20), _y, txt, -1, _w);
				} else 
					draw_text_line(_x, _y, txt, -1, _w);
				
				_y -= string_height_ext(txt, -1, _w);
			
			} else if(is_instanceof(his, notification)) {
				var txt = his.txt;
				
				draw_set_color(his.txtclr);
				draw_text_line(_x, _y, txt, -1, _w);
				_y -= string_height_ext(txt, -1, _w);
				
			} else {
				draw_set_color(COLORS._main_text_sub);
				draw_text_line(_x, _y, his, -1, _w);
				_y -= string_height_ext(his, -1, _w);
			}
			
			draw_set_color(CDEF.main_dkgrey);
			draw_set_halign(fa_right);
			draw_text(_x - ui(12), _y + line_get_height(), i);
			draw_set_halign(fa_left);
			
			_y -= ui(2);
			if(_y <= 0) break;
		}
		
		if(pHOVER) {
			if(mouse_wheel_up())    scroll_y = clamp(scroll_y + 1, 0, array_length(CMD) - 1);
			if(mouse_wheel_down())  scroll_y = clamp(scroll_y - 1, 0, array_length(CMD) - 1);
		}
	} #endregion
	
	function drawContent(panel) { #region
		if(pFOCUS) {
			if(prevFocus == false)
				keyboard_string = command;
			
			HOTKEY_BLOCK = true;
			command = keyboard_string;
		}
		
		prevFocus = pFOCUS;
		
		draw_clear(merge_color(c_black, CDEF.main_dkblack, 0.75));
		
		draw_set_color(merge_color(c_black, CDEF.main_dkblack, 0.60));
		draw_rectangle(0, 0, ui(32), h, false);
		
		draw_set_color(merge_color(c_black, CDEF.main_dkblack, 0.25));
		draw_rectangle(0, h - ui(28), w, h, false);
		
		var hy = h - ui(32);
		drawHistory(hy);
			
		draw_set_text(f_code, fa_right, fa_bottom, CDEF.main_dkgrey);
		draw_text(ui(32 - 4), h - ui(4), ">");
		
		draw_set_text(f_code, fa_left, fa_bottom, COLORS._main_text);
		draw_text(ui(32 + 8), h - ui(4), command);
		
		draw_set_color(COLORS._main_text_sub);
		draw_text(ui(32 + 8) + string_width(command), h - ui(4), "_");
		
		if(pFOCUS) {
			if(keyboard_check_pressed(vk_enter)) { 
				cmd_submit(command);
				
				command = "";
				keyboard_string = "";
				
			} else if(keyboard_check_pressed(vk_up)) {
				cmd_index = max(0, cmd_index - 1); 
			
				var his = array_safe_get_fast(CMDIN, cmd_index, "");
				command = is_instanceof(his, __cmdLine)? his.txt : his;
				keyboard_string = command;
			
			} else if(keyboard_check_pressed(vk_escape)) {
				command = "";
				keyboard_string = "";
				
			} else if(keyboard_check_pressed(vk_anykey)) {
				cmd_index = array_length(CMDIN);
			}
		}
	} #endregion
}