#macro CHECK_PANEL_PRESETS if(!is_instanceof(FOCUS_CONTENT, Panel_Presets)) return;

function panel_preset_replace()	{ CHECK_PANEL_PRESETS CALL("panel_preset_replace");	FOCUS_CONTENT.replacePreset(FOCUS_CONTENT.selecting_preset.path);					}
function panel_preset_delete()	{ CHECK_PANEL_PRESETS CALL("panel_preset_delete");	file_delete(FOCUS_CONTENT.selecting_preset.path); FOCUS_CONTENT.__initPresets();	}
function panel_preset_reset()	{ CHECK_PANEL_PRESETS CALL("panel_preset_reset");	FOCUS_CONTENT.newPresetFromNode("_default");										}

function __fnInit_Presets() {
	registerFunction("Presets", "Replace",			"",	   MOD_KEY.none,	panel_preset_replace).setMenu("preset_replace").hidePalette();
	registerFunction("Presets", "Delete",			"",	   MOD_KEY.none,	panel_preset_delete	).setMenu("preset_delete", THEME.cross).hidePalette();
	registerFunction("Presets", "Reset To Default",	"",	   MOD_KEY.none,	panel_preset_reset	).setMenu("preset_reset")
}

function Panel_Presets(_node) : PanelContent() constructor {
	title   = __txt("Presets");
	padding = 8;
	
	w = ui(240);
	h = ui(400);
	anchor = ANCHOR.left | ANCHOR.top;
	
	defPres = noone;
	node    = _node;
	adding  = false;
	add_txt = "";
	tb_add  = new textBox(TEXTBOX_INPUT.text, function(txt) /*=>*/ { 
			adding  = false; 
			add_txt = txt; 
			if(txt == "") return;
			
			newPresetFromNode(txt); 
		});
	
	selecting_preset = noone; 
	
	directory_verify($"{DIRECTORY}Presets/{instanceof(node)}/");
	__initPresets();
	
	context_menu = [
		MENU_ITEMS.preset_replace,
		MENU_ITEMS.preset_delete,
	];
	
	context_def = [
		MENU_ITEMS.preset_reset,
	];
	
	thumbnail_mask = surface_create(1, 1);
	
	function replacePreset(path) {
		if(node == noone) return;
		
		file_delete(path);
		var map = node.serialize(true, true);
		var thm = node.getPreviewValues();
		if(is_surface(thm)) map.thumbnail = surface_encode(thm, false);
		
		json_save_struct(path, map);
		__initPresets();
	}
	
	function newPresetFromNode(name) {
		if(node == noone) return;
		var dir = $"{DIRECTORY}Presets/{instanceof(node)}/";
		var pth = dir + name + ".json";
		
		var map = node.serialize(true, true);
		var thm = node.getPreviewValues();
		if(is_surface(thm)) map.thumbnail = surface_encode(thm, false);
		
		json_save_struct(pth, map);
		__initPresets();
		
		adding = false;
	}
	
	function onResize() { sc_presets.resize(w - ui(padding + padding), h - ui(padding + padding) - ui(28)); }
	
	sc_presets = new scrollPane(w - ui(padding + padding), h - ui(padding + padding) - ui(28), function(_y, _m) {
		draw_clear_alpha(COLORS.panel_bg_clear_inner, 1);
		
		var _ww = sc_presets.surface_w;
		var _h  = 0;
		if(node == noone) return _h;
		
		var folder = instanceof(node);
		if(!ds_map_exists(global.PRESETS_MAP, folder)) return 0;
		
		draw_set_text(f_p1, fa_left, fa_center, COLORS._main_text);
		
		var pres = global.PRESETS_MAP[? folder];
		var amo  = array_length(pres);
		var _hh  = line_get_height() + ui(10);
		    _h  += amo * (_hh + ui(4)) + ui(32);
		
		var _yy = _y;
		
		if(defPres != noone) {
			var preset = defPres;
			
			if(pHOVER && sc_presets.hover && point_in_rectangle(_m[0], _m[1], 0, _yy, _ww, _yy + _hh)) {
				draw_sprite_stretched_ext(THEME.node_bg, 1, 0, _yy, _ww, _hh, COLORS._main_icon, 1);
				sc_presets.hover_content = true;
				
				if(mouse_press(mb_left, pFOCUS)) {
					LOADING_VERSION = SAVE_VERSION;
					
					node.deserialize(loadPreset(preset), true, true);
					if(in_dialog && panel.destroy_on_click_out) close();
				}
				
				if(mouse_press(mb_right, pFOCUS)) {
					selecting_preset = preset;
					menuCall("preset_window_menu", context_menu);
				}
			}
			
			draw_set_text(f_p1, fa_left, fa_center, COLORS._main_text);
			draw_text_add(ui(8), _yy + _hh / 2, "_default");
			
		} else {
			var aa = .5;
			
			if(pHOVER && sc_presets.hover && point_in_rectangle(_m[0], _m[1], 0, _yy, _ww, _yy + _hh)) {
				aa = .75;
				sc_presets.hover_content = true;
				
				if(mouse_press(mb_left, pFOCUS)) {
					node.resetDefault();
					if(in_dialog && panel.destroy_on_click_out) close();
				}
				
				if(mouse_press(mb_right, pFOCUS))
					menuCall("preset_window_menu", context_def);
			}
			
			draw_set_text(f_p1, fa_left, fa_center, COLORS._main_text, aa);
			draw_text_add(ui(8), _yy + _hh / 2, "_default");
			draw_set_alpha(1);
		}
		
		_yy += _hh + ui(4);
		_h  += _hh + ui(4);
		
		var _sz = _hh - ui(8);
		thumbnail_mask = surface_create(_sz, _sz);
		
		defPres = noone;
		for( var i = 0; i < amo; i++ ) {
			var preset = pres[i];
			if(preset.name == "_default") {
				defPres = preset;
				continue;
			}
			
			draw_sprite_stretched(THEME.ui_panel_bg, 3, 0, _yy, _ww, _hh);
			
			if(pHOVER && sc_presets.hover && point_in_rectangle(_m[0], _m[1], 0, _yy, _ww, _yy + _hh)) {
				draw_sprite_stretched_ext(THEME.node_bg, 1, 0, _yy, _ww, _hh, COLORS._main_accent, 1);
				sc_presets.hover_content = true;
				
				if(mouse_press(mb_left, pFOCUS)) {
					LOADING_VERSION = SAVE_VERSION;
					
					node.deserialize(loadPreset(preset), true, true);
					if(in_dialog && panel.destroy_on_click_out) close();
				}
				
				if(mouse_press(mb_right, pFOCUS)) {
					selecting_preset = preset;
					dia = menuCall("preset_window_menu", context_menu);
				}
			}
			
			loadPreset(preset);
			var _thm = preset.getThumbnail();
			var _xx  = ui(8);
			
			if(is_surface(_thm)) {
				_xx = 0;
				
				var _sw = surface_get_width(_thm);
				var _sh = surface_get_height(_thm);
				
				var _ss = _sz / max(_sw, _sh);
				var _sx = _sz / 2 - _sw * _ss / 2;
				var _sy = _sz / 2 - _sh * _ss / 2;
				
				surface_set_target(thumbnail_mask);
					DRAW_CLEAR
					
					draw_surface_ext(_thm, _sx, _sy, _ss, _ss, 0, c_white, 1);
					BLEND_MULTIPLY
					draw_sprite_stretched(THEME.palette_mask, 1, _sx, _sy, _sw * _ss, _sh * _ss);
					BLEND_NORMAL
				surface_reset_target();
				
				draw_surface(thumbnail_mask, _xx + ui(4), _yy + ui(4));
				_xx += _sz + ui(12);
			}
			
			draw_set_text(f_p1, fa_left, fa_center, COLORS._main_text);
			draw_text_add(_xx, _yy + _hh / 2, preset.name);
			
			_yy += _hh + ui(4);
		}
		
		return _h;
	});
	
	function drawContent(panel) {
		draw_clear_alpha(COLORS.panel_bg_clear, 0);
		
		var px = ui(padding);
		var py = ui(padding);
		var pw = w - ui(padding + padding);
		var ph = h - ui(padding + padding) - ui(28);
		
		draw_sprite_stretched(THEME.ui_panel_bg, 1, px - ui(8), py - ui(8), pw + ui(16), ph + ui(16));
		
		sc_presets.setFocusHover(pFOCUS, pHOVER);
		sc_presets.draw(px, py, mx - px, my - py);
		
		var _add_h = ui(24);
		var _bx    = 0;
		var _by    = h - _add_h;
		var _ww    = w;
		
		if(adding) {
			tb_add.setFocusHover(sc_presets.active, sc_presets.hover);
			tb_add.font = f_p2;
			tb_add.draw(_bx, _by, _ww, _add_h, add_txt);
			
		} else {
			var _hov   = pHOVER && point_in_rectangle(mx, my, _bx, _by, _bx + _ww, _by + _add_h);
			
			draw_sprite_stretched_ext(THEME.ui_panel, 0, _bx, _by, _ww, _add_h, _hov? COLORS._main_value_positive : COLORS._main_icon, .3 + _hov * .1);
			draw_sprite_stretched_ext(THEME.ui_panel, 1, _bx, _by, _ww, _add_h, _hov? COLORS._main_value_positive : COLORS._main_icon, .6 + _hov * .25);
			draw_set_text(f_p2, fa_center, fa_center, _hov? COLORS._main_value_positive : COLORS._main_icon);
			draw_text_add(_ww / 2, _by + _add_h / 2, __txt("New preset"));
			
			if(mouse_press(mb_left, pFOCUS && _hov)) {
				if(!adding) tb_add.activate(); 
				adding = true;
			}
			
		}
	}
}