Pixel-Composer/scripts/panel_graph/panel_graph.gml

893 lines
25 KiB
Plaintext

function Panel_Graph(_panel) : PanelContent(_panel) constructor {
context_str = "Graph";
scale = [ 0.25, 0.33, 0.5, 0.65, 0.8, 1, 1.2, 1.35, 1.5];
graph_s_index = 5;
graph_s = scale[graph_s_index];
graph_s_to = graph_s;
function toOrigin() {
graph_x = round(w / 2 / graph_s);
graph_y = round(h / 2 / graph_s);
}
toOrigin();
graph_dragging = false;
graph_drag_mx = 0;
graph_drag_my = 0;
graph_drag_sx = 0;
graph_drag_sy = 0;
mouse_graph_x = 0;
mouse_graph_y = 0;
mouse_grid_x = 0;
mouse_grid_y = 0;
nodes_list = NODES;
node_context = ds_list_create();
node_dragging = noone;
node_drag_mx = 0;
node_drag_my = 0;
node_drag_sx = 0;
node_drag_sy = 0;
node_drag_ox = 0;
node_drag_oy = 0;
graph_line_s = 32;
selection_block = 0;
nodes_select_list = ds_list_create();
nodes_select_drag = false;
nodes_select_mx = 0;
nodes_select_my = 0;
node_hovering = noone;
node_hover = noone;
node_focus = noone;
node_previewing = noone;
value_focus = noone;
value_dragging = noone;
show_grid = true;
addHotkey("Graph", "Add node", "A", MOD_KEY.none, function() { callAddDialog(); });
addHotkey("Graph", "Focus content", "F", MOD_KEY.none, function() { fullView(); });
addHotkey("Graph", "Preview focusing node", "P", MOD_KEY.none, function() { setCurrentPreview(); });
addHotkey("Graph", "Import image", "I", MOD_KEY.none, function() { nodeBuild("Image", mouse_grid_x, mouse_grid_y); });
addHotkey("Graph", "Import image array", "I", MOD_KEY.shift, function() { nodeBuild("Image array", mouse_grid_x, mouse_grid_y); });
addHotkey("Graph", "Add number", "1", MOD_KEY.none, function() { nodeBuild("Number", mouse_grid_x, mouse_grid_y); });
addHotkey("Graph", "Add vector2", "2", MOD_KEY.none, function() { nodeBuild("Vector2", mouse_grid_x, mouse_grid_y); });
addHotkey("Graph", "Add vector3", "3", MOD_KEY.none, function() { nodeBuild("Vector3", mouse_grid_x, mouse_grid_y); });
addHotkey("Graph", "Add vector4", "4", MOD_KEY.none, function() { nodeBuild("Vector4", mouse_grid_x, mouse_grid_y); });
addHotkey("Graph", "Transform node", "T", MOD_KEY.ctrl, function() {
if(ds_list_empty(nodes_select_list)) {
if(node_focus != noone && !ds_list_empty(node_focus.outputs)) {
var _o = node_focus.outputs[| 0];
if(_o.type == VALUE_TYPE.surface) {
var tr = nodeBuild("Transform", node_focus.x + node_focus.w + 64, node_focus.y);
tr.inputs[| 0].setFrom(_o);
}
}
}
});
addHotkey("Graph", "Select all", "A", MOD_KEY.ctrl, function() {
ds_list_clear(nodes_select_list);
for(var i = 0; i < ds_list_size(nodes_list); i++) {
ds_list_add(nodes_select_list, nodes_list[| i]);
}
});
addHotkey("Graph", "Toggle grid", "G", MOD_KEY.none, function() { show_grid = !show_grid; });
addHotkey("Graph", "Export", "E", MOD_KEY.ctrl, function() { setCurrentExport(); });
addHotkey("Graph", "Blend", "B", MOD_KEY.ctrl, function() { doBlend(); });
addHotkey("Graph", "Compose", "B", MOD_KEY.ctrl | MOD_KEY.shift, function() { doCompose(); });
addHotkey("Graph", "Group", "G", MOD_KEY.ctrl, function() { doGroup(); });
addHotkey("Graph", "Ungroup", "G", MOD_KEY.ctrl | MOD_KEY.shift, function() { doUngroup(); });
addHotkey("Graph", "Canvas", "C", MOD_KEY.ctrl | MOD_KEY.shift, function() { setCurrentCanvas(); });
addHotkey("Graph", "Canvas blend", "C", MOD_KEY.ctrl | MOD_KEY.alt, function() { setCurrentCanvasBlend(); });
addHotkey("Graph", "Frame", "F", MOD_KEY.ctrl, function() { doFrame(); });
addHotkey("Graph", "Delete", vk_delete, MOD_KEY.none, function() { doDelete(); });
function stepBegin() {
var gr_x = graph_x * graph_s;
var gr_y = graph_y * graph_s;
var m_x = (mx - gr_x) / graph_s;
var m_y = (my - gr_y) / graph_s;
mouse_graph_x = m_x;
mouse_graph_y = m_y;
var snap = PREF_MAP[? "node_snapping"];
mouse_grid_x = round(m_x / snap) * snap;
mouse_grid_y = round(m_y / snap) * snap;
}
function dragGraph() {
if(graph_dragging) {
var dx = mx - graph_drag_mx;
var dy = my - graph_drag_my;
graph_drag_mx = mx;
graph_drag_my = my;
graph_x += dx / graph_s;
graph_y += dy / graph_s;
if(mouse_check_button_released(mb_middle))
graph_dragging = false;
}
if(FOCUS == panel) {
if(mouse_check_button_pressed(mb_middle)) {
graph_dragging = true;
graph_drag_mx = mx;
graph_drag_my = my;
graph_drag_sx = graph_x;
graph_drag_sy = graph_y;
}
}
if(HOVER == panel) {
var _s = graph_s;
if(mouse_wheel_down()) {
graph_s_index = max(0, graph_s_index - 1);
graph_s_to = scale[graph_s_index];
}
if(mouse_wheel_up()) {
graph_s_index = min(array_length(scale) - 1, graph_s_index + 1);
graph_s_to = scale[graph_s_index];
}
graph_s = lerp_float(graph_s, graph_s_to, 3);
if(_s != graph_s) {
var mb_x = (mx - graph_x * _s) / _s;
var ma_x = (mx - graph_x * graph_s) / graph_s;
var md_x = ma_x - mb_x;
graph_x += md_x;
var mb_y = (my - graph_y * _s) / _s;
var ma_y = (my - graph_y * graph_s) / graph_s;
var md_y = ma_y - mb_y;
graph_y += md_y;
}
}
graph_x = round(graph_x);
graph_y = round(graph_y);
}
function drawGrid() {
var gr_x = graph_x * graph_s;
var gr_y = graph_y * graph_s;
var gr_ls = graph_line_s * graph_s;
var xx = -gr_ls, xs = safe_mod(gr_x, gr_ls);
var yy = -gr_ls, ys = safe_mod(gr_y, gr_ls);
draw_set_color(c_ui_blue_dkgrey);
draw_set_text(f_p0, fa_center, fa_top);
draw_set_alpha(graph_s >= 1? 1 : 0.5);
while(xx < w + gr_ls) {
draw_line(xx + xs, 0, xx + xs, h);
if(xx + xs - gr_x == 0) {
draw_line_width(xx + xs, 0, xx + xs, h, 3);
}
xx += gr_ls;
}
draw_set_alpha(1);
draw_set_text(f_p0, fa_left, fa_center);
draw_set_alpha(graph_s >= 1? 1 : 0.5);
while(yy < h + gr_ls) {
draw_line(0, yy + ys, w, yy + ys);
if(yy + ys - gr_y == 0) {
draw_line_width(0, yy + ys, w, yy + ys, 3);
}
yy += gr_ls;
}
draw_set_alpha(1);
}
function drawNodes() {
if(selection_block-- > 0) return;
var gr_x = graph_x * graph_s;
var gr_y = graph_y * graph_s;
for(var i = 0; i < ds_list_size(nodes_list); i++) {
nodes_list[| i].preDraw(gr_x, gr_y, graph_s);
}
#region hover
node_hovering = noone;
for(var i = 0; i < ds_list_size(nodes_list); i++) {
var n = nodes_list[| i];
if(n.pointIn(mouse_grid_x, mouse_grid_y))
node_hovering = n;
}
#endregion
if(FOCUS == panel) {
if(mouse_check_button_pressed(mb_left)) {
if(keyboard_check(vk_shift)) {
if(ds_list_empty(nodes_select_list) && node_focus)
ds_list_add(nodes_select_list, node_focus);
if(node_focus != node_hovering)
ds_list_add(nodes_select_list, node_hovering);
} else {
node_focus = node_hovering;
if(node_focus) {
if(instanceof(node_focus) == "Node_Frame") {
var fx0 = (node_focus.x + graph_x) * graph_s;
var fy0 = (node_focus.y + graph_y) * graph_s;
var fx1 = fx0 + node_focus.w * graph_s;
var fy1 = fy0 + node_focus.h * graph_s;
ds_list_clear(nodes_select_list);
for(var i = 0; i < ds_list_size(nodes_list); i++) {
var _node = nodes_list[| i];
if(instanceof(_node) == "Node_Frame") continue;
var _x = (_node.x + graph_x) * graph_s;
var _y = (_node.y + graph_y) * graph_s;
var _w = _node.w * graph_s;
var _h = _node.h * graph_s;
if(rectangle_inside_rectangle(fx0, fy0, fx1, fy1, _x, _y, _x + _w, _y + _h))
ds_list_add(nodes_select_list, _node);
}
ds_list_add(nodes_select_list, node_focus);
} else if(node_focus.previewable && DOUBLE_CLICK) {
node_previewing = node_focus;
if(PREF_MAP[? "reset_display"])
PANEL_PREVIEW.do_fullView = true;
} else {
var hover_selected = false;
for( var i = 0; i < ds_list_size(nodes_select_list); i++ ) {
if(nodes_select_list[| i] == node_focus) {
hover_selected = true;
break;
}
}
if(!hover_selected)
ds_list_clear(nodes_select_list);
}
} else {
ds_list_clear(nodes_select_list);
}
}
}
if(mouse_check_button_pressed(mb_right)) {
node_hover = node_hovering;
if(node_hover) {
var dia = dialogCall(o_dialog_menubox, mouse_mx + 8, mouse_my + 8);
var menu = [];
array_push(menu,
[ "Send to preview", function() {
setCurrentPreview(node_hover);
}]);
array_push(menu,
[ "Send to export", function() {
setCurrentExport(node_hover);
}, ["Graph", "Export"] ]);
array_push(menu,
[ "Copy to canvas", function() {
setCurrentCanvas(node_hover);
}, ["Graph", "Canvas"] ]);
array_push(menu,
[ "Overlay canvas", function() {
setCurrentCanvasBlend(node_hover);
}, ["Graph", "Canvas blend"] ]);
array_push(menu,
[ "Delete", function() {
doDelete();
}, ["Graph", "Delete"] ]);
if(!ds_list_empty(nodes_select_list)) {
array_push(menu,
[ "Blend nodes", function() {
doBlend();
}, ["Graph", "Blend"] ]);
array_push(menu,
[ "Compose nodes", function() {
doCompose();
}, ["Graph", "Compose"] ]);
array_push(menu,
[ "Group nodes", function() {
doGroup();
}, ["Graph", "Group"] ]);
} else if(variable_struct_exists(node_hover, "nodes")) {
array_push(menu,
[ "Ungroup", function() {
doUngroup();
}, ["Graph", "Ungroup"] ]);
}
dia.setMenu( menu );
} else {
callAddDialog();
}
}
}
if(node_hovering && node_hovering.on_dragdrop_file != -1) {
node_hovering.drawActive(gr_x, gr_y, graph_s, 1);
}
if(node_focus) {
node_focus.drawActive(gr_x, gr_y, graph_s);
}
for(var i = 0; i < ds_list_size(nodes_select_list); i++) {
var _node = nodes_select_list[| i];
_node.drawActive(gr_x, gr_y, graph_s);
}
for(var i = 0; i < ds_list_size(nodes_list); i++) {
nodes_list[| i].drawConnections(gr_x, gr_y, mx, my, graph_s);
}
value_focus = noone;
#region draw node
for(var i = 0; i < ds_list_size(nodes_list); i++) {
if(instanceof(nodes_list[| i]) != "Node_Frame") continue;
nodes_list[| i].drawNode(gr_x, gr_y, mx, my, graph_s);
}
for(var i = 0; i < ds_list_size(nodes_list); i++) {
var n = nodes_list[| i];
if(instanceof(n) == "Node_Frame") continue;
var val = n.drawNode(gr_x, gr_y, mx, my, graph_s);
if(val) value_focus = val;
}
for(var i = 0; i < ds_list_size(nodes_list); i++) {
nodes_list[| i].drawBadge(gr_x, gr_y, graph_s);
}
#endregion
#region dragging
if(node_dragging) {
node_focus = node_dragging;
for(var i = 0; i < ds_list_size(nodes_list); i++) {
var _node = nodes_list[| i];
if(_node.pointIn(mouse_grid_x, mouse_grid_y) && variable_struct_exists(_node, "nodes")) {
var _recur = false;
if(ds_list_size(nodes_select_list) == 0) {
if(_node == node_dragging) _recur = true;
} else {
for(var j = 0; j < ds_list_size(nodes_select_list); j++) {
var _n = nodes_select_list[| j];
if(_node == _n) _recur = true;
}
}
if(!_recur) {
_node.drawActive(gr_x, gr_y, graph_s, 1);
if(mouse_check_button_released(mb_left)) {
if(ds_list_size(nodes_select_list) == 0) {
_node.add(node_dragging);
node_dragging.checkConnectGroup();
} else {
for(var j = 0; j < ds_list_size(nodes_select_list); j++) {
_node.add(nodes_select_list[| j]);
}
for(var j = 0; j < ds_list_size(nodes_select_list); j++) {
nodes_select_list[| j].checkConnectGroup();
}
}
}
}
}
}
if(ds_list_size(nodes_select_list) == 0) {
var nx = node_drag_sx + (mouse_graph_x - node_drag_mx);
var ny = node_drag_sy + (mouse_graph_y - node_drag_my);
if(!keyboard_check(vk_control)) {
var snap = PREF_MAP[? "node_snapping"];
nx = round(nx / snap) * snap;
ny = round(ny / snap) * snap;
}
node_dragging.move(nx, ny);
if(mouse_check_button_released(mb_left)) {
if(nx != node_drag_sx || ny != node_drag_sy) {
recordAction(ACTION_TYPE.var_modify, node_dragging, [ node_drag_sx, "x" ]);
recordAction(ACTION_TYPE.var_modify, node_dragging, [ node_drag_sy, "y" ]);
}
}
} else {
var nx = node_drag_sx + (mouse_graph_x - node_drag_mx);
var ny = node_drag_sy + (mouse_graph_y - node_drag_my);
if(!keyboard_check(vk_control)) {
var snap = PREF_MAP[? "node_snapping"];
nx = round(nx / snap) * snap;
ny = round(ny / snap) * snap;
}
if(node_drag_ox == -1 || node_drag_oy == -1) {
node_drag_ox = nx;
node_drag_oy = ny;
} else if(nx != node_drag_ox || ny != node_drag_oy) {
var dx = nx - node_drag_ox;
var dy = ny - node_drag_oy;
for(var i = 0; i < ds_list_size(nodes_select_list); i++) {
var _node = nodes_select_list[| i];
_node.move(_node.x + dx, _node.y + dy);
}
node_drag_ox = nx;
node_drag_oy = ny;
}
}
if(mouse_check_button_released(mb_left)) {
node_dragging = noone;
}
}
#endregion
if(FOCUS == panel && node_focus && value_focus == noone) {
if(mouse_check_button_pressed(mb_left)) {
node_dragging = node_focus;
node_drag_mx = mouse_graph_x;
node_drag_my = mouse_graph_y;
node_drag_sx = node_focus.x;
node_drag_sy = node_focus.y;
node_drag_ox = -1;
node_drag_oy = -1;
}
if(keyboard_check_pressed(vk_f5)) {
node_focus.updateForward();
}
}
#region draw selection frame
if(nodes_select_drag) {
if(point_distance(nodes_select_mx, nodes_select_my, mx, my) > 16) {
draw_set_color(c_ui_orange);
draw_rectangle(nodes_select_mx, nodes_select_my, mx, my, true);
draw_set_alpha(0.05);
draw_rectangle(nodes_select_mx, nodes_select_my, mx, my, false);
draw_set_alpha(1);
ds_list_clear(nodes_select_list);
for(var i = 0; i < ds_list_size(nodes_list); i++) {
var _node = nodes_list[| i];
if(instanceof(_node) == "Node_Frame") continue;
var _x = (_node.x + graph_x) * graph_s;
var _y = (_node.y + graph_y) * graph_s;
var _w = _node.w * graph_s;
var _h = _node.h * graph_s;
if(rectangle_in_rectangle(_x, _y, _x + _w, _y + _h, nodes_select_mx, nodes_select_my, mx, my))
ds_list_add(nodes_select_list, _node);
}
}
if(mouse_check_button_released(mb_left))
nodes_select_drag = false;
}
if(FOCUS == panel && mouse_check_button_pressed(mb_left)) {
if(!node_focus && !value_focus && node_hovering != -1) {
nodes_select_drag = true;
nodes_select_mx = mx;
nodes_select_my = my;
}
}
#endregion
}
function doBlend() {
if(ds_list_empty(nodes_select_list)) return;
if(ds_list_size(nodes_select_list) != 2) return;
var cx = 0;
var cy = 0;
for(var i = 0; i < ds_list_size(nodes_select_list); i++) {
var _node = nodes_select_list[| i];
cx = max(cx, _node.x);
cy += _node.y;
}
cx = cx + 160;
cy = round(cy / ds_list_size(nodes_select_list) / 32) * 32;
var _blend = Node_create_Blend(cx, cy);
var index = 0;
for( var i = 0; i < ds_list_size(nodes_select_list); i++ ) {
var _node = nodes_select_list[| i];
if(ds_list_size(_node.outputs) == 0) continue;
if(_node.outputs[| 0].type == VALUE_TYPE.surface) {
_blend.inputs[| index].setFrom(_node.outputs[| 0]);
index++;
}
}
ds_list_clear(nodes_select_list);
}
function doCompose() {
if(ds_list_empty(nodes_select_list)) return;
var cx = 0;
var cy = 0;
for(var i = 0; i < ds_list_size(nodes_select_list); i++) {
var _node = nodes_select_list[| i];
cx = max(cx, _node.x);
cy += _node.y;
}
cx = cx + 160;
cy = round(cy / ds_list_size(nodes_select_list) / 32) * 32;
var _compose = Node_create_Composite(cx, cy);
for( var i = 0; i < ds_list_size(nodes_select_list); i++ ) {
var _node = nodes_select_list[| i];
if(ds_list_size(_node.outputs) == 0) continue;
if(_node.outputs[| 0].type == VALUE_TYPE.surface) {
_compose.addFrom(_node.outputs[| 0]);
}
}
ds_list_clear(nodes_select_list);
}
function doGroup() {
if(ds_list_empty(nodes_select_list) && node_focus != noone)
ds_list_add(nodes_select_list, node_focus);
if(!ds_list_empty(nodes_select_list)) {
var cx = 0;
var cy = 0;
for(var i = 0; i < ds_list_size(nodes_select_list); i++) {
var _node = nodes_select_list[| i];
cx += _node.x;
cy += _node.y;
}
cx = round(cx / ds_list_size(nodes_select_list) / 32) * 32;
cy = round(cy / ds_list_size(nodes_select_list) / 32) * 32;
var _group = Node_create_Group(cx, cy);
for(var i = 0; i < ds_list_size(nodes_select_list); i++) {
_group.add(nodes_select_list[| i]);
}
for(var i = 0; i < ds_list_size(nodes_select_list); i++) {
nodes_select_list[| i].checkConnectGroup();
}
ds_list_clear(nodes_select_list);
}
}
function doUngroup() {
if(node_focus && variable_struct_exists(node_focus, "nodes")) {
while(!ds_list_empty(node_focus.nodes)) {
node_focus.remove(node_focus.nodes[| 0]);
}
node_delete(node_focus);
}
}
function doFrame() {
var x0 = 999999, y0 = 999999, x1 = -999999, y1 = -999999;
if(ds_list_empty(nodes_select_list)) {
if(node_focus != noone) {
x0 = node_focus.x;
y0 = node_focus.y;
x1 = node_focus.x + node_focus.w;
y1 = node_focus.y + node_focus.h;
} else
return;
} else {
for( var i = 0; i < ds_list_size(nodes_select_list); i++ ) {
var n = nodes_select_list[| i];
x0 = min(x0, n.x);
y0 = min(y0, n.y);
x1 = max(x1, n.x + n.w);
y1 = max(y1, n.y + n.h);
}
}
x0 -= 64;
y0 -= 64;
x1 += 64;
y1 += 64;
var f = Node_create_Frame(x0, y0);
f.inputs[| 0].setValue([x1 - x0, y1 - y0]);
}
function doDelete() {
if(node_focus != noone)
node_delete(node_focus);
for(var i = 0; i < ds_list_size(nodes_select_list); i++) {
node_delete(nodes_select_list[| i]);
}
ds_list_clear(nodes_select_list);
}
function setCurrentPreview(_node = node_focus) {
if(_node) {
node_previewing = _node;
if(PREF_MAP[? "reset_display"])
PANEL_PREVIEW.do_fullView = true;
}
}
function setCurrentExport(_node = node_focus) {
if(!_node) return;
var _outp = -1;
var _path = -1;
for( var i = 0; i < ds_list_size(_node.outputs); i++ ) {
if(_node.outputs[| i].type == VALUE_TYPE.path)
_path = _node.outputs[| i];
if(_node.outputs[| i].type == VALUE_TYPE.surface && _outp == -1)
_outp = _node.outputs[| i];
}
if(_outp == -1) return;
var _export;
if(_path == -1)
_export = nodeBuild("Export", _node.x + _node.w + 64, _node.y);
else {
_export = new Node_Export(_node.x + _node.w + 64, _node.y);
_export.inputs[| 1].setFrom(_path);
ds_list_add(PANEL_GRAPH.nodes_list, _export);
}
_export.inputs[| 0].setFrom(_outp);
}
function setCurrentCanvas(_node = node_focus) {
if(!_node) return;
var _outp = -1;
var surf = -1;
for( var i = 0; i < ds_list_size(_node.outputs); i++ ) {
if(_node.outputs[| i].type == VALUE_TYPE.surface) {
_outp = _node.outputs[| i];
var _val = _node.outputs[| i].getValue();
if(is_array(_val))
surf = _val[_node.preview_index];
else
surf = _val;
break;
}
}
if(_outp == -1) return;
var _canvas = nodeBuild("Canvas", _node.x + _node.w + 64, _node.y);
_canvas.inputs[| 0].setValue([surface_get_width(surf), surface_get_height(surf)]);
var _surf = surface_clone(surf);
_canvas.outputs[| 0].setValue(_surf);
_canvas.surface_update();
}
function setCurrentCanvasBlend(_node = node_focus) {
if(!_node) return;
var _outp = -1;
var surf = -1;
for( var i = 0; i < ds_list_size(_node.outputs); i++ ) {
if(_node.outputs[| i].type == VALUE_TYPE.surface) {
_outp = _node.outputs[| i];
var _val = _node.outputs[| i].getValue();
if(is_array(_val))
surf = _val[_node.preview_index];
else
surf = _val;
break;
}
}
if(_outp == -1) return;
var _canvas = nodeBuild("Canvas", _node.x, _node.y + _node.h + 64);
_canvas.inputs[| 0].setValue([surface_get_width(surf), surface_get_height(surf)]);
_canvas.inputs[| 5].setValue(true);
_canvas.surface_update();
var _blend = Node_create_Blend(_node.x + _node.w + 64, _node.y);
_blend.inputs[| 0].setFrom(_outp);
_blend.inputs[| 1].setFrom(_canvas.outputs[| 0]);
}
function drawJunctionConnect() {
if(value_dragging) {
draw_set_color(c_ui_orange);
var xx = value_dragging.node.x + graph_x + (value_dragging.connect_type == JUNCTION_CONNECT.input? 0 : value_dragging.node.w);
xx *= graph_s;
var yy = value_dragging.y;
if(PREF_MAP[? "curve_connection_line"])
draw_line_curve(xx, yy, mx, my);
else
draw_line(xx, yy, mx, my);
if(mouse_check_button_released(mb_left)) {
if(value_focus && value_focus != value_dragging) {
if(value_focus.connect_type == JUNCTION_CONNECT.input)
value_focus.setFrom(value_dragging);
else
value_dragging.setFrom(value_focus);
} else {
if(value_dragging.connect_type == JUNCTION_CONNECT.input)
value_dragging.removeFrom();
value_dragging.node.updateForward();
if(value_focus != value_dragging) {
with(dialogCall(o_dialog_add_node, mouse_mx + 8, mouse_my + 8)) {
node_target_x = other.mouse_grid_x;
node_target_y = other.mouse_grid_y;
node_called = other.value_dragging;
alarm[0] = 1;
}
}
}
value_dragging = noone;
}
} else {
if(value_focus) {
if(FOCUS == panel && mouse_check_button_pressed(mb_left)) {
value_dragging = value_focus;
}
}
}
}
function callAddDialog() {
with(dialogCall(o_dialog_add_node, mouse_mx + 8, mouse_my + 8)) {
node_target_x = other.mouse_grid_x;
node_target_y = other.mouse_grid_y;
alarm[0] = 1;
}
}
function drawContext() {
draw_set_text(f_h5, fa_left, fa_top, c_ui_blue_ltgrey);
var xx = 24, tt, tw, th;
for(var i = -1; i < ds_list_size(node_context); i++) {
if(i == -1) {
tt = "Global";
} else {
var _cnt = node_context[| i];
tt = _cnt.name;
}
tw = string_width(tt);
th = string_height(tt);
if(i < ds_list_size(node_context) - 1) {
if(buttonInstant(s_button_hide, xx - 10, 16 - 4, tw + 20, th + 8, [mx, my], FOCUS == panel, HOVER == panel) == 2) {
if(i == -1) {
ds_list_clear(node_context);
nodes_list = NODES;
node_hover = noone;
node_focus = noone;
node_previewing = noone;
toOrigin();
PANEL_ANIMATION.updatePropertyList();
} else {
for(var j = ds_list_size(node_context) - 1; j > i; j--)
ds_list_delete(node_context, j);
nodes_list = node_context[| i].nodes;
node_hover = noone;
node_focus = noone;
node_previewing = noone;
toOrigin();
PANEL_ANIMATION.updatePropertyList();
break;
}
}
draw_sprite_ext(s_arrow_16, 0, xx + tw + 16, 30, 1, 1, 0, c_ui_blue_grey, 1);
}
draw_set_alpha(i < ds_list_size(node_context) - 1? 0.5 : 1);
draw_text(xx, 16, tt);
draw_set_alpha(1);
xx += tw;
xx += 32;
}
}
function addContext(node) {
recordAction(ACTION_TYPE.var_modify, self, [nodes_list, "nodes_list"]);
recordAction(ACTION_TYPE.list_insert, node_context, [node, ds_list_size(node_context)]);
nodes_list = node.nodes;
ds_list_add(node_context, node);
node_dragging = noone;
ds_list_clear(nodes_select_list);
selection_block = 1;
toOrigin();
PANEL_ANIMATION.updatePropertyList();
}
function getCurrentContext() {
if(ds_list_empty(node_context)) return -1;
return node_context[| ds_list_size(node_context) - 1];
}
function dropFile(path) {
if(node_hovering && node_hovering.on_dragdrop_file != -1)
return node_hovering.on_dragdrop_file(path);
return false;
}
function fullView() {
if(node_focus) {
graph_x = -(node_focus.x + node_focus.w / 2) + w / 2 / graph_s;
graph_y = -(node_focus.y + node_focus.h / 2) + h / 2 / graph_s;
return;
}
toOrigin();
return;
}
function drawContent() {
dragGraph();
draw_clear(c_ui_blue_black);
#region BG
if(show_grid)
drawGrid();
draw_set_text(f_p0, fa_right, fa_top, c_ui_blue_ltgrey);
draw_text(w - 8, 08, "x" + string(graph_s_to));
#endregion
draw_set_text(f_p0, fa_right, fa_top, c_ui_blue_ltgrey);
drawNodes();
drawJunctionConnect();
if(!ds_list_empty(node_context))
drawContext();
if(FOCUS == panel) {
if(node_focus) node_focus.focusStep();
}
}
}