Pixel-Composer/scripts/panel_graph/panel_graph.gml

1924 lines
60 KiB
Plaintext
Raw Normal View History

2023-07-06 19:49:16 +02:00
/// @desc Panel for displaying node graph
/// @param {Struct.Project}
function Panel_Graph(project = PROJECT) : PanelContent() constructor {
2023-06-04 18:28:29 +02:00
title = __txt("Graph");
2022-01-13 05:24:03 +01:00
context_str = "Graph";
2023-03-21 03:01:53 +01:00
icon = THEME.panel_graph;
2022-01-13 05:24:03 +01:00
2023-07-06 19:49:16 +02:00
static setProject = function(project) {
self.project = project;
nodes_list = project.nodes;
}
setProject(project);
2023-04-11 20:29:20 +02:00
scale = [ 0.01, 0.02, 0.05, 0.10, 0.15, 0.20, 0.25, 0.33, 0.5, 0.65, 0.8, 1, 1.2, 1.35, 1.5, 2.0];
graph_s_index = array_find(scale, 1);
graph_s = 1;
2022-01-13 05:24:03 +01:00
graph_s_to = graph_s;
2022-09-21 06:09:40 +02:00
graph_line_s = 32;
2022-12-16 09:18:09 +01:00
grid_color = c_white;
grid_opacity = 0.05;
2022-01-13 05:24:03 +01:00
2023-04-21 19:08:10 +02:00
graph_dragging_key = false;
2023-03-05 07:16:44 +01:00
graph_draggable= true;
2022-01-13 05:24:03 +01:00
graph_dragging = false;
graph_drag_mx = 0;
graph_drag_my = 0;
graph_drag_sx = 0;
graph_drag_sy = 0;
2023-03-26 07:13:36 +02:00
drag_key = mb_middle;
drag_locking = false;
2022-01-13 05:24:03 +01:00
mouse_graph_x = 0;
mouse_graph_y = 0;
mouse_grid_x = 0;
mouse_grid_y = 0;
2022-09-21 06:09:40 +02:00
mouse_on_graph = false;
2022-01-13 05:24:03 +01:00
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;
2022-09-21 06:09:40 +02:00
node_drag_snap = true;
2022-01-13 05:24:03 +01:00
selection_block = 0;
nodes_select_list = ds_list_create();
nodes_select_drag = false;
nodes_select_mx = 0;
nodes_select_my = 0;
2023-03-02 07:59:14 +01:00
nodes_junction_d = noone;
nodes_junction_dx = 0;
nodes_junction_dy = 0;
2022-01-13 05:24:03 +01:00
node_hovering = noone;
node_hover = noone;
node_focus = noone;
2023-03-05 07:16:44 +01:00
junction_hovering = noone;
_junction_hovering = noone;
add_node_draw_junc = false;
2023-01-25 06:49:00 +01:00
add_node_draw_x_fix = 0;
add_node_draw_y_fix = 0;
add_node_draw_x = 0;
add_node_draw_y = 0;
2022-09-21 06:09:40 +02:00
value_focus = noone;
2022-01-13 05:24:03 +01:00
value_dragging = noone;
2022-09-21 06:09:40 +02:00
minimap_show = false;
2022-11-03 11:44:49 +01:00
minimap_w = ui(160);
minimap_h = ui(160);
2022-09-21 06:09:40 +02:00
minimap_surface = -1;
minimap_panning = false;
minimap_dragging = false;
minimap_drag_sx = 0;
minimap_drag_sy = 0;
minimap_drag_mx = 0;
minimap_drag_my = 0;
2022-12-16 09:18:09 +01:00
context_framing = false;
context_frame_progress = 0;
context_frame_direct = 0;
context_frame_sx = 0; context_frame_ex = 0;
context_frame_sy = 0; context_frame_ey = 0;
2023-01-25 06:49:00 +01:00
show_grid = true;
show_dimension = true;
show_compute = true;
2022-11-01 03:06:03 +01:00
2023-03-05 07:16:44 +01:00
connection_aa = 2;
connection_surface = surface_create(1, 1);
2023-03-24 05:55:34 +01:00
toolbar_height = ui(40);
2023-03-21 03:01:53 +01:00
function toCenterNode() {
if(ds_list_empty(nodes_list)) {
graph_x = round(w / 2 / graph_s);
graph_y = round(h / 2 / graph_s);
return;
}
var minx = 99999;
var maxx = -99999;
var miny = 99999;
var maxy = -99999;
for(var i = 0; i < ds_list_size(nodes_list); i++) {
2023-07-25 20:12:40 +02:00
var _node = nodes_list[| i];
minx = min(_node.x - 32, minx);
maxx = max(_node.x + _node.w + 32, maxx);
2023-03-21 03:01:53 +01:00
2023-07-25 20:12:40 +02:00
miny = min(_node.y - 32, miny);
maxy = max(_node.y + _node.h + 32, maxy);
2023-03-21 03:01:53 +01:00
}
graph_x = w / 2 / graph_s - (minx + maxx) / 2;
graph_y = (h - toolbar_height) / 2 / graph_s - (miny + maxy) / 2;
graph_x = round(graph_x);
graph_y = round(graph_y);
//print(title + ": Center " + string(graph_x) + ", " + string(graph_y));
}
2023-06-23 15:39:24 +02:00
static initSize = function() { toCenterNode(); }
2023-03-21 03:01:53 +01:00
initSize();
2022-09-21 06:09:40 +02:00
toolbars = [
2023-05-29 13:06:05 +02:00
[
THEME.icon_preview_export,
function() { return 0; },
2023-06-04 18:28:29 +02:00
function() { return __txtx("panel_graph_export_image", "Export graph as image"); },
2023-05-29 13:06:05 +02:00
function() { dialogPanelCall(new Panel_Graph_Export_Image(self)); }
],
2022-09-21 06:09:40 +02:00
[
2022-11-18 03:20:31 +01:00
THEME.icon_center_canvas,
2022-09-21 06:09:40 +02:00
function() { return 0; },
2023-06-04 18:28:29 +02:00
function() { return __txtx("panel_graph_center_to_nodes", "Center to nodes"); },
2022-09-21 06:09:40 +02:00
function() { toCenterNode(); }
],
[
2022-11-18 03:20:31 +01:00
THEME.icon_minimap,
2022-09-21 06:09:40 +02:00
function() { return minimap_show; },
2023-06-04 18:28:29 +02:00
function() { return minimap_show? __txtx("panel_graph_minimap_enabled", "Minimap enabled") : __txtx("panel_graph_minimap_disabled", "Minimap disabled"); },
2022-09-21 06:09:40 +02:00
function() { minimap_show = !minimap_show; }
],
[
2022-11-18 03:20:31 +01:00
THEME.icon_curve_connection,
2022-09-21 06:09:40 +02:00
function() { return PREF_MAP[? "curve_connection_line"]; },
2023-06-04 18:28:29 +02:00
function() { return __txtx("panel_graph_connection_line", "Connection render settings"); },
2023-03-05 07:16:44 +01:00
function(param) {
var gs = dialogCall(o_dialog_graph_connection, param.x, param.y);
gs.anchor = ANCHOR.bottom | ANCHOR.left;
}
2022-09-21 06:09:40 +02:00
],
[
2022-11-18 03:20:31 +01:00
THEME.icon_grid_setting,
2022-09-21 06:09:40 +02:00
function() { return 0; },
2023-06-04 18:28:29 +02:00
function() { return __txtx("grid_title", "Grid settings"); },
2022-09-21 06:09:40 +02:00
function(param) {
2022-11-03 11:44:49 +01:00
var gs = dialogCall(o_dialog_graph_grid, param.x, param.y);
2022-09-21 06:09:40 +02:00
gs.anchor = ANCHOR.bottom | ANCHOR.left;
}
],
2023-01-25 06:49:00 +01:00
[
THEME.icon_visibility,
function() { return 0; },
2023-06-04 18:28:29 +02:00
function() { return __txtx("graph_visibility_title", "Visibility settings"); },
2023-01-25 06:49:00 +01:00
function(param) {
var gs = dialogCall(o_dialog_graph_view, param.x, param.y);
gs.anchor = ANCHOR.bottom | ANCHOR.left;
}
],
2022-09-21 06:09:40 +02:00
];
2022-01-13 05:24:03 +01:00
2023-03-21 03:01:53 +01:00
addHotkey("Graph", "Add node", "A", MOD_KEY.none, function() { PANEL_GRAPH.callAddDialog(); });
addHotkey("Graph", "Focus content", "F", MOD_KEY.none, function() { PANEL_GRAPH.fullView(); });
addHotkey("Graph", "Preview focusing node", "P", MOD_KEY.none, function() { PANEL_GRAPH.setCurrentPreview(); });
2023-06-13 14:42:06 +02:00
addHotkey("Graph", "Preview window", "P", MOD_KEY.ctrl, function() { create_preview_window(PANEL_GRAPH.node_focus); });
2023-03-21 03:01:53 +01:00
addHotkey("Graph", "Import image", "I", MOD_KEY.none, function() { nodeBuild("Node_Image", PANEL_GRAPH.mouse_grid_x, PANEL_GRAPH.mouse_grid_y); });
addHotkey("Graph", "Import image array", "I", MOD_KEY.shift, function() { nodeBuild("Node_Image_Sequence", PANEL_GRAPH.mouse_grid_x, PANEL_GRAPH.mouse_grid_y); });
addHotkey("Graph", "Add number", "1", MOD_KEY.none, function() { nodeBuild("Node_Number", PANEL_GRAPH.mouse_grid_x, PANEL_GRAPH.mouse_grid_y); });
addHotkey("Graph", "Add vector2", "2", MOD_KEY.none, function() { nodeBuild("Node_Vector2", PANEL_GRAPH.mouse_grid_x, PANEL_GRAPH.mouse_grid_y); });
addHotkey("Graph", "Add vector3", "3", MOD_KEY.none, function() { nodeBuild("Node_Vector3", PANEL_GRAPH.mouse_grid_x, PANEL_GRAPH.mouse_grid_y); });
addHotkey("Graph", "Add vector4", "4", MOD_KEY.none, function() { nodeBuild("Node_Vector4", PANEL_GRAPH.mouse_grid_x, PANEL_GRAPH.mouse_grid_y); });
function addNodeTransform() {
2022-01-13 05:24:03 +01:00
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) {
2022-12-13 09:20:36 +01:00
var tr = nodeBuild("Node_Transform", node_focus.x + node_focus.w + 64, node_focus.y);
2022-01-13 05:24:03 +01:00
tr.inputs[| 0].setFrom(_o);
}
}
2022-11-01 03:06:03 +01:00
} else {
for( var i = 0; i < ds_list_size(nodes_select_list); i++ ) {
var node = nodes_select_list[| i];
if(ds_list_empty(node.outputs)) continue;
var _o = node.outputs[| 0];
if(_o.type == VALUE_TYPE.surface) {
2022-12-13 09:20:36 +01:00
var tr = nodeBuild("Node_Transform", node.x + node.w + 64, node.y);
2022-11-01 03:06:03 +01:00
tr.inputs[| 0].setFrom(_o);
}
}
2022-01-13 05:24:03 +01:00
}
2022-11-01 03:06:03 +01:00
}
2023-03-21 03:01:53 +01:00
addHotkey("Graph", "Transform node", "T", MOD_KEY.ctrl, function() { PANEL_GRAPH.addNodeTransform(); });
2022-01-13 05:24:03 +01:00
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]);
}
});
2022-12-12 09:08:03 +01:00
2023-03-21 03:01:53 +01:00
addHotkey("Graph", "Toggle grid", "G", MOD_KEY.none, function() { PANEL_GRAPH.show_grid = !PANEL_GRAPH.show_grid; });
addHotkey("Graph", "Toggle preview", "H", MOD_KEY.none, function() { PANEL_GRAPH.setTriggerPreview(); });
addHotkey("Graph", "Toggle render", "R", MOD_KEY.none, function() { PANEL_GRAPH.setTriggerRender(); });
2022-01-13 05:24:03 +01:00
2023-02-14 02:51:14 +01:00
if(!DEMO)
2023-03-21 03:01:53 +01:00
addHotkey("Graph", "Export", "E", MOD_KEY.ctrl, function() { PANEL_GRAPH.setCurrentExport(); });
2022-01-13 05:24:03 +01:00
2023-03-21 03:01:53 +01:00
addHotkey("Graph", "Blend", "B", MOD_KEY.ctrl, function() { PANEL_GRAPH.doBlend(); });
addHotkey("Graph", "Compose", "B", MOD_KEY.ctrl | MOD_KEY.shift, function() { PANEL_GRAPH.doCompose(); });
addHotkey("Graph", "Array", "A", MOD_KEY.ctrl | MOD_KEY.shift, function() { PANEL_GRAPH.doArray(); });
2022-01-13 05:24:03 +01:00
2023-03-21 03:01:53 +01:00
addHotkey("Graph", "Group", "G", MOD_KEY.ctrl, function() { PANEL_GRAPH.doGroup(); });
addHotkey("Graph", "Ungroup", "G", MOD_KEY.ctrl | MOD_KEY.shift, function() { PANEL_GRAPH.doUngroup(); });
2022-01-23 04:08:16 +01:00
2023-03-21 03:01:53 +01:00
addHotkey("Graph", "Loop", "L", MOD_KEY.ctrl, function() { PANEL_GRAPH.doLoop(); });
2022-01-13 05:24:03 +01:00
2023-03-21 03:01:53 +01:00
addHotkey("Graph", "Canvas", "C", MOD_KEY.ctrl | MOD_KEY.shift, function() { PANEL_GRAPH.setCurrentCanvas(); });
addHotkey("Graph", "Canvas blend", "C", MOD_KEY.ctrl | MOD_KEY.alt, function() { PANEL_GRAPH.setCurrentCanvasBlend(); });
2022-01-13 05:24:03 +01:00
2023-03-21 03:01:53 +01:00
addHotkey("Graph", "Frame", "F", MOD_KEY.ctrl, function() { PANEL_GRAPH.doFrame(); });
2022-01-13 05:24:03 +01:00
2023-03-21 03:01:53 +01:00
addHotkey("Graph", "Delete (break)", vk_delete, MOD_KEY.shift, function() { PANEL_GRAPH.doDelete(false); });
addHotkey("Graph", "Delete (merge)", vk_delete, MOD_KEY.none, function() { PANEL_GRAPH.doDelete(true); });
2023-01-25 06:49:00 +01:00
2023-03-21 03:01:53 +01:00
addHotkey("Graph", "Duplicate", "D", MOD_KEY.ctrl, function() { PANEL_GRAPH.doDuplicate(); });
addHotkey("Graph", "Copy", "C", MOD_KEY.ctrl, function() { PANEL_GRAPH.doCopy(); });
addHotkey("Graph", "Paste", "V", MOD_KEY.ctrl, function() { PANEL_GRAPH.doPaste(); });
2023-03-05 07:16:44 +01:00
2023-04-21 19:08:10 +02:00
addHotkey("Graph", "Pan", "", MOD_KEY.alt, function() { PANEL_GRAPH.graph_dragging_key = true; });
2023-03-21 03:01:53 +01:00
function onFocusBegin() {
PANEL_GRAPH = self;
2023-07-06 19:49:16 +02:00
PROJECT = project;
2023-03-21 03:01:53 +01:00
PANEL_ANIMATION.updatePropertyList();
}
2023-03-13 10:45:56 +01:00
2022-01-13 05:24:03 +01:00
function stepBegin() {
2022-12-16 09:18:09 +01:00
var gr_x = graph_x * graph_s;
var gr_y = graph_y * graph_s;
2022-01-13 05:24:03 +01:00
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;
2022-09-21 06:09:40 +02:00
mouse_grid_x = round(m_x / graph_line_s) * graph_line_s;
mouse_grid_y = round(m_y / graph_line_s) * graph_line_s;
}
2023-01-25 06:49:00 +01:00
function focusNode(_node) {
node_focus = _node;
if(_node == noone) return;
var cx = node_focus.x + node_focus.w / 2;
var cy = node_focus.y + node_focus.h / 2;
graph_x = w / 2 / graph_s - cx;
graph_y = (h - toolbar_height) / 2 / graph_s - cy;
graph_x = round(graph_x);
graph_y = round(graph_y);
}
2023-03-21 03:01:53 +01:00
function fullView() {
if(node_focus == noone) {
toCenterNode();
2022-09-21 06:09:40 +02:00
return;
}
2023-03-21 03:01:53 +01:00
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;
2022-09-21 06:09:40 +02:00
2023-01-17 08:11:55 +01:00
graph_x = round(graph_x);
graph_y = round(graph_y);
2022-01-13 05:24:03 +01:00
}
function dragGraph() {
if(graph_dragging) {
2022-12-23 04:45:52 +01:00
if(!MOUSE_WRAPPING) {
var dx = mx - graph_drag_mx;
var dy = my - graph_drag_my;
graph_x += dx / graph_s;
graph_y += dy / graph_s;
}
2022-01-13 05:24:03 +01:00
graph_drag_mx = mx;
graph_drag_my = my;
2022-12-23 04:45:52 +01:00
setMouseWrap();
2022-01-13 05:24:03 +01:00
2022-12-10 05:06:01 +01:00
if(mouse_release(drag_key))
2022-01-13 05:24:03 +01:00
graph_dragging = false;
}
2023-03-05 07:16:44 +01:00
if(mouse_on_graph && pFOCUS && graph_draggable) {
2022-01-19 03:05:13 +01:00
var _doDragging = false;
2022-12-10 05:06:01 +01:00
if(mouse_press(mb_middle)) {
2022-01-19 03:05:13 +01:00
_doDragging = true;
drag_key = mb_middle;
2023-04-21 19:08:10 +02:00
} else if(mouse_press(mb_left) && graph_dragging_key) {
2022-01-19 03:05:13 +01:00
_doDragging = true;
drag_key = mb_left;
}
if(_doDragging) {
2022-01-13 05:24:03 +01:00
graph_dragging = true;
graph_drag_mx = mx;
graph_drag_my = my;
graph_drag_sx = graph_x;
graph_drag_sy = graph_y;
}
}
2023-03-05 07:16:44 +01:00
if(mouse_on_graph && pHOVER && graph_draggable) {
2022-01-13 05:24:03 +01:00
var _s = graph_s;
if(mouse_wheel_down()) {
graph_s_index = max(0, graph_s_index - 1);
2022-11-03 11:44:49 +01:00
graph_s_to = ui(scale[graph_s_index]);
2022-01-13 05:24:03 +01:00
}
if(mouse_wheel_up()) {
graph_s_index = min(array_length(scale) - 1, graph_s_index + 1);
2022-11-03 11:44:49 +01:00
graph_s_to = ui(scale[graph_s_index]);
2022-01-13 05:24:03 +01:00
}
2022-12-10 05:06:01 +01:00
graph_s = lerp_float(graph_s, graph_s_to, PREF_MAP[? "graph_zoom_smoooth"]);
2022-01-13 05:24:03 +01:00
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;
}
}
2023-03-05 07:16:44 +01:00
graph_draggable = true;
2022-01-13 05:24:03 +01:00
graph_x = round(graph_x);
graph_y = round(graph_y);
}
function drawGrid() {
2023-04-11 20:29:20 +02:00
var gls = graph_line_s;
if(graph_s <= 0.15) gls *= 10;
2022-01-13 05:24:03 +01:00
var gr_x = graph_x * graph_s;
var gr_y = graph_y * graph_s;
2023-04-11 20:29:20 +02:00
var gr_ls = gls * graph_s;
2022-01-13 05:24:03 +01:00
var xx = -gr_ls, xs = safe_mod(gr_x, gr_ls);
var yy = -gr_ls, ys = safe_mod(gr_y, gr_ls);
2022-11-21 06:38:44 +01:00
draw_set_color(grid_color);
2022-11-01 03:06:03 +01:00
draw_set_alpha(grid_opacity * (graph_s >= 1? 1 : 0.5));
2022-01-13 05:24:03 +01:00
while(xx < w + gr_ls) {
draw_line(xx + xs, 0, xx + xs, h);
2023-05-29 13:06:05 +02:00
if(xx + xs - gr_x == 0)
2022-01-13 05:24:03 +01:00
draw_line_width(xx + xs, 0, xx + xs, h, 3);
xx += gr_ls;
}
while(yy < h + gr_ls) {
draw_line(0, yy + ys, w, yy + ys);
2023-05-29 13:06:05 +02:00
if(yy + ys - gr_y == 0)
2022-01-13 05:24:03 +01:00
draw_line_width(0, yy + ys, w, yy + ys, 3);
yy += gr_ls;
}
draw_set_alpha(1);
}
function drawNodes() {
if(selection_block-- > 0) return;
2023-02-14 02:51:14 +01:00
//print("==== DRAW NODES ====");
2022-01-13 05:24:03 +01:00
var gr_x = graph_x * graph_s;
var gr_y = graph_y * graph_s;
2023-06-17 14:30:49 +02:00
var log = false;
var t = current_time;
2023-07-06 19:49:16 +02:00
2023-06-17 14:30:49 +02:00
for(var i = 0; i < ds_list_size(nodes_list); i++) {
nodes_list[| i].cullCheck(gr_x, gr_y, graph_s, -32, -32, w + 32, h + 64);
nodes_list[| i].preDraw(gr_x, gr_y, graph_s, gr_x, gr_y);
}
printIf(log, "Predraw time: " + string(current_time - t)); t = current_time;
2022-01-26 06:57:34 +01:00
#region draw frame
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);
}
#endregion
2023-06-17 14:30:49 +02:00
printIf(log, "Frame draw time: " + string(current_time - t)); t = current_time;
2022-01-26 06:57:34 +01:00
2022-01-13 05:24:03 +01:00
#region hover
node_hovering = noone;
2022-12-12 09:08:03 +01:00
if(pHOVER)
2022-01-13 05:24:03 +01:00
for(var i = 0; i < ds_list_size(nodes_list); i++) {
2023-07-25 20:12:40 +02:00
var _node = nodes_list[| i];
if(_node.pointIn(gr_x, gr_y, mx, my, graph_s))
node_hovering = _node;
2022-01-13 05:24:03 +01:00
}
2023-03-13 10:45:56 +01:00
2023-05-03 21:42:17 +02:00
if(node_hovering != noone)
_HOVERING_ELEMENT = node_hovering;
2023-07-15 20:01:29 +02:00
if(node_hovering != noone && pFOCUS && struct_has(node_hovering, "onDoubleClick") && DOUBLE_CLICK) {
node_hovering.onDoubleClick(self);
2023-03-13 10:45:56 +01:00
DOUBLE_CLICK = false;
node_hovering = noone;
}
if(node_hovering) node_hovering.onDrawHover(gr_x, gr_y, mx, my, graph_s);
2022-01-13 05:24:03 +01:00
#endregion
2023-06-17 14:30:49 +02:00
printIf(log, "Hover time: " + string(current_time - t)); t = current_time;
if(mouse_on_graph && pHOVER) {
if(NODE_DROPPER_TARGET != noone && node_hovering) {
node_hovering.draw_droppable = true;
if(mouse_press(mb_left, NODE_DROPPER_TARGET_CAN)) {
NODE_DROPPER_TARGET.expression += node_hovering.internalName;
NODE_DROPPER_TARGET.expressionUpdate();
}
} else if(mouse_press(mb_left, pFOCUS) && !key_mod_press(ALT)) {
2023-02-14 02:51:14 +01:00
if(key_mod_press(SHIFT)) {
2022-01-13 05:24:03 +01:00
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 {
2023-03-05 07:16:44 +01:00
var _prevFocus = node_focus;
node_focus = node_hovering;
2022-01-13 05:24:03 +01:00
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;
2023-01-25 06:49:00 +01:00
2022-01-13 05:24:03 +01:00
ds_list_clear(nodes_select_list);
2023-01-25 06:49:00 +01:00
2023-03-05 07:16:44 +01:00
if(!key_mod_press(CTRL))
for(var i = 0; i < ds_list_size(nodes_list); i++) { //select content
2022-01-13 05:24:03 +01:00
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;
2022-11-03 11:44:49 +01:00
2022-01-13 05:24:03 +01:00
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);
2023-01-17 08:11:55 +01:00
} else if(DOUBLE_CLICK) {
PANEL_PREVIEW.setNodePreview(node_focus);
2022-01-13 05:24:03 +01:00
} else {
2023-03-05 07:16:44 +01:00
if(_prevFocus != node_focus)
bringNodeToFront(node_focus);
2022-01-13 05:24:03 +01:00
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);
2023-02-14 02:51:14 +01:00
2023-03-13 10:45:56 +01:00
if(DOUBLE_CLICK && !PANEL_INSPECTOR.locked)
2023-02-14 02:51:14 +01:00
PANEL_INSPECTOR.inspecting = noone;
2022-01-13 05:24:03 +01:00
}
}
}
2023-06-17 14:30:49 +02:00
if(mouse_press(mb_right, pFOCUS)) {
2022-01-13 05:24:03 +01:00
node_hover = node_hovering;
if(node_hover) {
var menu = [];
array_push(menu,
2023-06-04 18:28:29 +02:00
menuItem(__txtx("panel_graph_send_to_preview", "Send to preview"), function() {
2022-01-13 05:24:03 +01:00
setCurrentPreview(node_hover);
2023-02-19 02:13:19 +01:00
}));
2023-02-28 09:43:01 +01:00
array_push(menu,
2023-06-04 18:28:29 +02:00
menuItem(__txtx("panel_graph_preview_window", "Send to preview window"), function() {
2023-06-13 14:42:06 +02:00
create_preview_window(node_hover);
2023-02-28 09:43:01 +01:00
}, noone, ["Graph", "Preview window"]));
2023-03-21 03:01:53 +01:00
array_push(menu,
2023-06-04 18:28:29 +02:00
menuItem(__txtx("panel_graph_inspector_panel", "Send to new inspector"), function() {
2023-03-21 03:01:53 +01:00
var pan = panelAdd("Panel_Inspector", true);
pan.destroy_on_click_out = false;
2023-06-19 20:28:30 +02:00
pan.content.setInspecting(node_hover);
2023-03-21 03:01:53 +01:00
pan.content.locked = true;
}));
2023-02-28 09:43:01 +01:00
2023-02-14 02:51:14 +01:00
if(DEMO) {
array_push(menu,
2023-06-04 18:28:29 +02:00
menuItem(__txtx("panel_graph_send_to_export", "Send to export"), function() {
2023-02-14 02:51:14 +01:00
setCurrentExport(node_hover);
2023-02-19 02:13:19 +01:00
}, noone, ["Graph", "Export"]));
2023-02-14 02:51:14 +01:00
}
2023-02-28 09:43:01 +01:00
2022-01-13 05:24:03 +01:00
array_push(menu,
2023-06-04 18:28:29 +02:00
menuItem(__txtx("panel_graph_toggle_preview", "Toggle node preview"), function() {
2023-01-17 08:11:55 +01:00
setTriggerPreview();
2023-02-19 02:13:19 +01:00
}, noone, ["Graph", "Toggle preview"]));
2023-02-19 13:49:20 +01:00
array_push(menu,
2023-06-04 18:28:29 +02:00
menuItem(__txtx("panel_graph_toggle_render", "Toggle node render"), function() {
2023-02-19 13:49:20 +01:00
setTriggerRender();
}, noone, ["Graph", "Toggle render"]));
2023-02-28 09:43:01 +01:00
if(struct_has(node_hover, "nodes")) {
2023-03-21 03:01:53 +01:00
array_push(menu, -1);
2023-02-28 09:43:01 +01:00
array_push(menu,
2023-06-04 18:28:29 +02:00
menuItem(__txtx("panel_graph_enter_group", "Open group"), function() {
2023-02-28 09:43:01 +01:00
PANEL_GRAPH.addContext(node_hover);
}, THEME.group));
2023-03-21 03:01:53 +01:00
array_push(menu,
2023-06-04 18:28:29 +02:00
menuItem(__txtx("panel_graph_enter_group_new_tab", "Open group in new tab"), function() {
2023-07-06 19:49:16 +02:00
var graph = new Panel_Graph(project);
2023-03-21 03:01:53 +01:00
panel.setContent(graph, true);
for( var i = 0; i < ds_list_size(node_context); i++ )
graph.addContext(node_context[| i]);
graph.addContext(node_hover);
setFocus(panel);
}, THEME.group));
array_push(menu,
2023-06-04 18:28:29 +02:00
menuItem(__txt("Ungroup"), function() {
2023-03-21 03:01:53 +01:00
doUngroup();
}, THEME.group, ["Graph", "Ungroup"]));
2023-02-28 09:43:01 +01:00
}
2023-07-17 19:58:33 +02:00
if(node_hover.group != noone) {
array_push(menu,
menuItem(__txt("Set as group tool"), function() {
node_hover.setTool(!node_hover.isTool);
}));
}
2023-03-21 03:01:53 +01:00
array_push(menu, -1);
2022-01-13 05:24:03 +01:00
array_push(menu,
2023-06-04 18:28:29 +02:00
menuItem(__txtx("panel_graph_delete_and_merge_connection", "Delete and merge connection"), function() {
2022-11-01 03:06:03 +01:00
doDelete(true);
2023-02-19 02:13:19 +01:00
}, THEME.cross, ["Graph", "Delete (merge)"]));
2022-01-13 05:24:03 +01:00
array_push(menu,
2023-06-04 18:28:29 +02:00
menuItem(__txtx("panel_graph_delete_and_cut_connection", "Delete and cut connection"), function() {
2022-11-01 03:06:03 +01:00
doDelete(false);
2023-02-19 02:13:19 +01:00
}, THEME.cross, ["Graph", "Delete (break)"]));
2022-12-12 09:08:03 +01:00
array_push(menu,
2023-06-04 18:28:29 +02:00
menuItem(__txt("Duplicate"), function() {
2022-12-12 09:08:03 +01:00
doDuplicate();
2023-02-19 02:13:19 +01:00
}, THEME.duplicate, ["Graph", "Duplicate"]));
2023-02-28 09:43:01 +01:00
array_push(menu,
2023-06-04 18:28:29 +02:00
menuItem(__txt("Copy"), function() {
2023-02-28 09:43:01 +01:00
doCopy();
}, THEME.copy, ["Graph", "Copy"]));
2022-11-01 03:06:03 +01:00
array_push(menu, -1);
2023-06-04 18:28:29 +02:00
array_push(menu, menuItem(__txtx("panel_graph_add_transform", "Add transform"), addNodeTransform, noone, ["Graph", "Transform node"]));
array_push(menu, menuItem(__txtx("panel_graph_canvas", "Canvas"),
function(_dat) {
return submenuCall(_dat, [
2023-06-04 18:28:29 +02:00
menuItem(__txtx("panel_graph_copy_to_canvas", "Copy to canvas"), function() {
2022-11-01 03:06:03 +01:00
setCurrentCanvas(node_hover);
2023-02-19 02:13:19 +01:00
}, noone, ["Graph", "Canvas"]),
2023-06-04 18:28:29 +02:00
menuItem(__txtx("panel_graph_overlay_canvas", "Overlay canvas"), function() {
2022-11-01 03:06:03 +01:00
setCurrentCanvasBlend(node_hover);
2023-02-19 02:13:19 +01:00
}, noone, ["Graph", "Canvas blend"])
2022-11-01 03:06:03 +01:00
]);
2023-02-19 02:13:19 +01:00
}).setIsShelf()
);
2022-01-13 05:24:03 +01:00
2023-03-19 09:17:39 +01:00
if(ds_list_size(nodes_select_list) >= 2) {
2022-11-01 03:06:03 +01:00
array_push(menu, -1);
2023-05-08 10:50:42 +02:00
array_push(menu,
2023-06-04 18:28:29 +02:00
menuItem(__txtx("panel_graph_align_nodes", "Align nodes"), function(_dat) {
2023-05-08 10:50:42 +02:00
return submenuCall(_dat, [
2023-06-04 18:28:29 +02:00
menuItemGroup(__txtx("horizontal", "Horizontal"), [
2023-05-08 10:50:42 +02:00
[ [THEME.inspector_surface_halign, 0], function() { node_halign(nodes_select_list, fa_left); } ],
[ [THEME.inspector_surface_halign, 1], function() { node_halign(nodes_select_list, fa_center); } ],
[ [THEME.inspector_surface_halign, 2], function() { node_halign(nodes_select_list, fa_right); } ],
]),
2023-06-04 18:28:29 +02:00
menuItemGroup(__txtx("vertical", "Vertical"), [
2023-05-08 10:50:42 +02:00
[ [THEME.inspector_surface_valign, 0], function() { node_valign(nodes_select_list, fa_top); } ],
[ [THEME.inspector_surface_valign, 1], function() { node_valign(nodes_select_list, fa_middle); } ],
[ [THEME.inspector_surface_valign, 2], function() { node_valign(nodes_select_list, fa_bottom); } ],
2023-05-08 19:14:30 +02:00
]),
2023-06-04 18:28:29 +02:00
menuItemGroup(__txtx("distribute", "Distribute"), [
2023-05-08 19:14:30 +02:00
[ [THEME.obj_distribute_h, 0], function() { node_hdistribute(nodes_select_list); } ],
2023-05-08 10:50:42 +02:00
[ [THEME.obj_distribute_v, 0], function() { node_vdistribute(nodes_select_list); } ],
]),
]);
}).setIsShelf());
2022-01-13 05:24:03 +01:00
array_push(menu,
2023-06-04 18:28:29 +02:00
menuItem(__txtx("panel_graph_blend_nodes", "Blend nodes"), function() {
2022-01-13 05:24:03 +01:00
doBlend();
2023-02-19 02:13:19 +01:00
}, noone, ["Graph", "Blend"]));
2022-01-13 05:24:03 +01:00
array_push(menu,
2023-06-04 18:28:29 +02:00
menuItem(__txtx("panel_graph_compose_nodes", "Compose nodes"), function() {
2022-01-13 05:24:03 +01:00
doCompose();
2023-02-19 02:13:19 +01:00
}, noone, ["Graph", "Compose"]));
2023-01-25 06:49:00 +01:00
array_push(menu,
2023-06-04 18:28:29 +02:00
menuItem(__txtx("panel_graph_array_from_nodes", "Array from nodes"), function() {
2023-01-25 06:49:00 +01:00
doArray();
2023-02-19 02:13:19 +01:00
}, noone, ["Graph", "Array"]));
2022-01-13 05:24:03 +01:00
array_push(menu,
2023-06-04 18:28:29 +02:00
menuItem(__txtx("panel_graph_group_nodes", "Group nodes"), function() {
2022-01-13 05:24:03 +01:00
doGroup();
2023-02-19 02:13:19 +01:00
}, THEME.group, ["Graph", "Group"]));
2022-11-01 03:06:03 +01:00
array_push(menu,
2023-06-04 18:28:29 +02:00
menuItem(__txtx("panel_graph_frame_nodes", "Frame nodes"), function() {
2022-11-01 03:06:03 +01:00
doFrame();
2023-02-19 02:13:19 +01:00
}, noone, ["Graph", "Frame"]));
2022-01-13 05:24:03 +01:00
}
2023-05-03 21:42:17 +02:00
menuCall("graph_node_selected_multiple_menu",,, menu );
2023-02-28 09:43:01 +01:00
} else {
var menu = [];
2023-03-02 07:59:14 +01:00
array_push(menu,
2023-06-04 18:28:29 +02:00
menuItem(__txt("Copy"), function() {
2023-03-02 07:59:14 +01:00
doCopy();
}, THEME.copy, ["Graph", "Copy"]).setActive(node_focus != noone || ds_list_size(nodes_select_list))
);
array_push(menu,
2023-06-04 18:28:29 +02:00
menuItem(__txt("Paste"), function() {
2023-03-02 07:59:14 +01:00
doPaste();
}, THEME.paste, ["Graph", "Paste"]).setActive(clipboard_get_text() != "")
);
2023-02-28 09:43:01 +01:00
2022-01-13 05:24:03 +01:00
callAddDialog();
2023-05-03 21:42:17 +02:00
menuCall("graph_node_selected_menu",o_dialog_add_node.dialog_x - ui(8), o_dialog_add_node.dialog_y + ui(4), menu, fa_right );
2023-02-28 09:43:01 +01:00
setFocus(o_dialog_add_node.id, "Dialog");
}
2022-01-13 05:24:03 +01:00
}
}
2023-06-17 14:30:49 +02:00
printIf(log, "Node selection time: " + string(current_time - t)); t = current_time;
2022-01-13 05:24:03 +01:00
2022-12-19 13:35:30 +01:00
if(node_focus)
2022-01-13 05:24:03 +01:00
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];
2023-02-19 13:49:20 +01:00
if(!_node) continue;
2022-01-13 05:24:03 +01:00
_node.drawActive(gr_x, gr_y, graph_s);
}
2023-06-17 14:30:49 +02:00
printIf(log, "Draw active: " + string(current_time - t)); t = current_time;
2022-01-13 05:24:03 +01:00
2023-03-05 07:16:44 +01:00
var aa = PREF_MAP[? "connection_line_aa"];
connection_surface = surface_verify(connection_surface, w * aa, h * aa);
surface_set_target(connection_surface);
2023-03-19 09:17:39 +01:00
DRAW_CLEAR
2023-03-05 07:16:44 +01:00
var hov = noone;
2023-01-04 02:30:04 +01:00
var hoverable = !bool(node_dragging) && pHOVER;
2022-01-13 05:24:03 +01:00
for(var i = 0; i < ds_list_size(nodes_list); i++) {
2023-06-17 14:30:49 +02:00
var _hov = nodes_list[| i].drawConnections(gr_x, gr_y, graph_s, mx, my, hoverable, aa, -64, -64, w + 64, h + 64);
2023-05-03 21:42:17 +02:00
if(_hov != noone && is_struct(_hov)) hov = _hov;
2022-01-13 05:24:03 +01:00
}
2023-06-17 14:30:49 +02:00
printIf(log, "Draw connection: " + string(current_time - t)); t = current_time;
2023-03-05 07:16:44 +01:00
surface_reset_target();
2023-03-26 07:13:36 +02:00
shader_set(sh_downsample);
shader_set_f("down", aa);
shader_set_f("dimension", surface_get_width(connection_surface), surface_get_height(connection_surface));
draw_surface(connection_surface, 0, 0);
shader_reset();
2022-12-19 13:35:30 +01:00
2023-05-03 21:42:17 +02:00
junction_hovering = (node_hovering == noone && !is_struct(node_hovering))? hov : noone;
2022-01-13 05:24:03 +01:00
value_focus = noone;
#region draw node
2023-06-17 14:30:49 +02:00
var t = current_time;
2023-03-02 07:59:14 +01:00
for(var i = 0; i < ds_list_size(nodes_list); i++)
nodes_list[| i].onDrawNodeBehind(gr_x, gr_y, mx, my, graph_s);
2022-01-13 05:24:03 +01:00
for(var i = 0; i < ds_list_size(nodes_list); i++) {
2023-07-25 20:12:40 +02:00
var _node = nodes_list[| i];
if(instanceof(_node) == "Node_Frame") continue;
var val = _node.drawNode(gr_x, gr_y, mx, my, graph_s);
2023-01-25 06:49:00 +01:00
if(val) {
if(key_mod_press(SHIFT))
TOOLTIP = [ val.getValue(), val.type ];
if(key_mod_press(CTRL) && val.value_from != noone) {
value_focus = val.value_from;
if(mouse_press(mb_left))
val.removeFrom();
} else
value_focus = val;
}
2022-01-13 05:24:03 +01:00
}
2023-03-05 07:16:44 +01:00
_junction_hovering = value_focus;
2022-09-27 06:37:28 +02:00
2023-03-12 02:28:21 +01:00
for(var i = 0; i < ds_list_size(nodes_list); i++)
2022-01-13 05:24:03 +01:00
nodes_list[| i].drawBadge(gr_x, gr_y, graph_s);
2023-06-17 14:30:49 +02:00
printIf(log, "Draw node: " + string(current_time - t)); t = current_time;
2022-01-13 05:24:03 +01:00
#endregion
#region dragging
2023-02-14 13:44:46 +01:00
if(mouse_press(mb_left))
2022-12-13 09:20:36 +01:00
node_dragging = noone;
2023-02-14 02:51:14 +01:00
2022-01-13 05:24:03 +01:00
if(node_dragging) {
node_focus = node_dragging;
2023-02-14 02:51:14 +01:00
2023-02-28 09:43:01 +01:00
// TODO: Mode node(s) into group.
2023-01-25 06:49:00 +01:00
//for(var i = 0; i < ds_list_size(nodes_list); i++) { //drag node to group
// var _node = nodes_list[| i];
2022-01-13 05:24:03 +01:00
2023-01-25 06:49:00 +01:00
// if(!_node.pointIn(gr_x, gr_y, mx, my, graph_s) || !variable_struct_exists(_node, "nodes"))
// continue;
2022-01-13 05:24:03 +01:00
2023-01-25 06:49:00 +01:00
// 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)
// continue;
// _node.drawActive(gr_x, gr_y, graph_s, 1);
// if(mouse_release(mb_left) && key_mod_press(ALT)) {
// 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();
// }
// }
//}
2023-02-14 02:51:14 +01:00
2023-02-28 09:43:01 +01:00
if(ds_list_size(nodes_select_list) == 0) { // move single node
2022-01-13 05:24:03 +01:00
var nx = node_drag_sx + (mouse_graph_x - node_drag_mx);
var ny = node_drag_sy + (mouse_graph_y - node_drag_my);
2022-12-22 03:09:55 +01:00
if(!key_mod_press(CTRL) && node_drag_snap) {
2022-09-21 06:09:40 +02:00
nx = round(nx / graph_line_s) * graph_line_s;
ny = round(ny / graph_line_s) * graph_line_s;
2022-01-13 05:24:03 +01:00
}
node_dragging.move(nx, ny);
2023-02-14 02:51:14 +01:00
if(mouse_release(mb_left) && (nx != node_drag_sx || ny != node_drag_sy)) {
recordAction(ACTION_TYPE.var_modify, node_dragging, [ node_drag_sx, "x", "node x position" ]);
recordAction(ACTION_TYPE.var_modify, node_dragging, [ node_drag_sy, "y", "node y position" ]);
2022-01-13 05:24:03 +01:00
}
2023-02-28 09:43:01 +01:00
} else { // move multiple nodes
2022-01-13 05:24:03 +01:00
var nx = node_drag_sx + (mouse_graph_x - node_drag_mx);
var ny = node_drag_sy + (mouse_graph_y - node_drag_my);
2022-12-22 03:09:55 +01:00
if(!key_mod_press(CTRL) && node_drag_snap) {
2022-09-21 06:09:40 +02:00
nx = round(nx / graph_line_s) * graph_line_s;
ny = round(ny / graph_line_s) * graph_line_s;
2022-01-13 05:24:03 +01:00
}
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;
2022-12-12 09:08:03 +01:00
2022-01-13 05:24:03 +01:00
for(var i = 0; i < ds_list_size(nodes_select_list); i++) {
var _node = nodes_select_list[| i];
2022-12-12 09:08:03 +01:00
var _nx = _node.x + dx;
var _ny = _node.y + dy;
2022-12-22 03:09:55 +01:00
if(!key_mod_press(CTRL) && node_drag_snap) {
2022-12-12 09:08:03 +01:00
_nx = round(_nx / graph_line_s) * graph_line_s;
_ny = round(_ny / graph_line_s) * graph_line_s;
}
_node.move(_nx, _ny);
2022-01-13 05:24:03 +01:00
}
node_drag_ox = nx;
node_drag_oy = ny;
}
2023-02-14 02:51:14 +01:00
if(mouse_release(mb_left) && (nx != node_drag_sx || ny != node_drag_sy)) {
var shfx = node_drag_sx - nx;
var shfy = node_drag_sy - ny;
for(var i = 0; i < ds_list_size(nodes_select_list); i++) {
var _n = nodes_select_list[| i];
2023-03-19 09:17:39 +01:00
if(_n == noone) continue;
2023-02-14 02:51:14 +01:00
recordAction(ACTION_TYPE.var_modify, _n, [ _n.x + shfx, "x", "node x position" ]);
recordAction(ACTION_TYPE.var_modify, _n, [ _n.y + shfy, "y", "node y position" ]);
}
}
2022-01-13 05:24:03 +01:00
}
}
2023-06-17 14:30:49 +02:00
printIf(log, "Drag node time : " + string(current_time - t)); t = current_time;
2023-02-14 02:51:14 +01:00
if(mouse_release(mb_left))
node_dragging = noone;
2022-01-13 05:24:03 +01:00
#endregion
2022-11-14 03:16:15 +01:00
if(mouse_on_graph && pFOCUS) {
2023-03-05 07:16:44 +01:00
if(node_focus && node_focus.draggable && value_focus == noone) {
2023-01-25 06:49:00 +01:00
if(mouse_press(mb_left) && !key_mod_press(ALT)) {
2022-01-26 06:57:34 +01:00
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;
2022-01-13 05:24:03 +01:00
2022-01-26 06:57:34 +01:00
node_drag_ox = -1;
node_drag_oy = -1;
}
2022-01-13 05:24:03 +01:00
}
2022-01-26 06:57:34 +01:00
if(DOUBLE_CLICK && junction_hovering != noone) {
2022-09-21 06:09:40 +02:00
var _mx = round(mouse_graph_x / graph_line_s) * graph_line_s;
var _my = round(mouse_graph_y / graph_line_s) * graph_line_s;
2022-01-26 06:57:34 +01:00
2023-01-17 08:11:55 +01:00
var _pin = nodeBuild("Node_Pin", _mx, _my);
2022-01-26 06:57:34 +01:00
_pin.inputs[| 0].setFrom(junction_hovering.value_from);
junction_hovering.setFrom(_pin.outputs[| 0]);
2022-01-13 05:24:03 +01:00
}
}
#region draw selection frame
if(nodes_select_drag) {
if(point_distance(nodes_select_mx, nodes_select_my, mx, my) > 16) {
2023-06-10 13:59:45 +02:00
draw_sprite_stretched_points(THEME.ui_selection, 0, nodes_select_mx, nodes_select_my, mx, my);
2023-01-25 06:49:00 +01:00
//ds_list_clear(nodes_select_list);
2022-01-13 05:24:03 +01:00
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;
2023-01-25 06:49:00 +01:00
var _sel = rectangle_in_rectangle(_x, _y, _x + _w, _y + _h, nodes_select_mx, nodes_select_my, mx, my);
if(!ds_list_exist(nodes_select_list, _node) && _sel)
2022-01-13 05:24:03 +01:00
ds_list_add(nodes_select_list, _node);
2023-01-25 06:49:00 +01:00
if(ds_list_exist(nodes_select_list, _node) && !_sel)
ds_list_remove(nodes_select_list, _node);
2022-01-13 05:24:03 +01:00
}
}
2022-12-10 05:06:01 +01:00
if(mouse_release(mb_left))
2022-01-13 05:24:03 +01:00
nodes_select_drag = false;
}
2023-03-02 07:59:14 +01:00
if(nodes_junction_d != noone) {
var shx = nodes_junction_dx + (mx - nodes_select_mx) / graph_s;
var shy = nodes_junction_dy + (my - nodes_select_my) / graph_s;
shx = value_snap(shx, key_mod_press(CTRL)? 1 : 4);
shy = value_snap(shy, key_mod_press(CTRL)? 1 : 4);
nodes_junction_d.draw_line_shift_x = shx;
nodes_junction_d.draw_line_shift_y = shy;
if(mouse_release(mb_left))
nodes_junction_d = noone;
}
2022-01-13 05:24:03 +01:00
2023-04-21 19:08:10 +02:00
if(mouse_on_graph && mouse_press(mb_left, pFOCUS) && !graph_dragging_key) {
2023-03-02 07:59:14 +01:00
if(junction_hovering && junction_hovering.draw_line_shift_hover) {
nodes_select_mx = mx;
nodes_select_my = my;
nodes_junction_d = junction_hovering;
nodes_junction_dx = junction_hovering.draw_line_shift_x;
nodes_junction_dy = junction_hovering.draw_line_shift_y;
} else if(!node_focus && !value_focus && !drag_locking) {
2022-01-13 05:24:03 +01:00
nodes_select_drag = true;
nodes_select_mx = mx;
nodes_select_my = my;
}
2022-11-01 03:06:03 +01:00
drag_locking = false;
2022-01-13 05:24:03 +01:00
}
#endregion
2023-02-14 02:51:14 +01:00
2023-06-17 14:30:49 +02:00
printIf(log, "Draw selection frame : " + string(current_time - t)); t = current_time;
2022-01-13 05:24:03 +01:00
}
2022-12-12 09:08:03 +01:00
function doDuplicate() {
2023-02-28 09:43:01 +01:00
var nodeArray = [];
2022-12-12 09:08:03 +01:00
if(ds_list_empty(nodes_select_list)) {
if(node_focus == noone) return;
2023-02-28 09:43:01 +01:00
nodeArray = [node_focus];
} else {
for(var i = 0; i < ds_list_size(nodes_select_list); i++)
nodeArray[i] = nodes_select_list[| i];
2022-12-12 09:08:03 +01:00
}
2023-06-13 14:42:06 +02:00
var _map = {};
var _node = [];
2023-02-28 09:43:01 +01:00
for(var i = 0; i < array_length(nodeArray); i++)
2023-03-26 07:13:36 +02:00
SAVE_NODE(_node, nodeArray[i],,,, getCurrentContext());
2023-06-13 14:42:06 +02:00
_map.nodes = _node;
2022-12-12 09:08:03 +01:00
2023-03-07 14:29:47 +01:00
APPENDING = true;
CLONING = true;
2023-02-28 09:43:01 +01:00
var _app = __APPEND_MAP(_map);
2023-03-07 14:29:47 +01:00
APPENDING = false;
CLONING = false;
2023-02-28 09:43:01 +01:00
if(ds_list_size(_app) == 0) {
ds_list_destroy(_app);
return;
2022-12-12 09:08:03 +01:00
}
2023-02-14 13:44:46 +01:00
2023-02-28 09:43:01 +01:00
var x0 = 99999999;
var y0 = 99999999;
for(var i = 0; i < ds_list_size(_app); i++) {
var _node = _app[| i];
x0 = min(x0, _node.x);
y0 = min(y0, _node.y);
2022-12-12 09:08:03 +01:00
}
2023-02-28 09:43:01 +01:00
node_dragging = _app[| 0];
node_drag_mx = x0; node_drag_my = y0;
node_drag_sx = x0; node_drag_sy = y0;
node_drag_ox = x0; node_drag_oy = y0;
2022-12-12 09:08:03 +01:00
ds_list_destroy(nodes_select_list);
2023-02-28 09:43:01 +01:00
nodes_select_list = _app;
}
function doInstance() {
if(node_focus == noone) return;
if(!struct_has(node_focus, "nodes")) return;
if(node_focus.instanceBase == noone) {
node_focus.isInstancer = true;
CLONING = true;
var _type = instanceof(node_focus);
var _node = nodeBuild(_type, x, y);
CLONING = false;
_node.setInstance(node_focus);
}
2022-12-12 09:08:03 +01:00
2023-07-25 20:12:40 +02:00
var _nodeNew = _node.clone();
2022-12-18 03:20:38 +01:00
2023-07-25 20:12:40 +02:00
node_dragging = _nodeNew;
node_drag_mx = _nodeNew.x; node_drag_my = _nodeNew.y;
node_drag_sx = _nodeNew.x; node_drag_sy = _nodeNew.y;
node_drag_ox = _nodeNew.x; node_drag_oy = _nodeNew.y;
2023-02-28 09:43:01 +01:00
}
function doCopy() {
clipboard_set_text("");
var nodeArray = [];
if(ds_list_empty(nodes_select_list)) {
if(node_focus == noone) return;
nodeArray = [node_focus];
} else {
for(var i = 0; i < ds_list_size(nodes_select_list); i++) {
var _node = nodes_select_list[| i];
nodeArray[i] = _node;
}
}
2023-06-13 14:42:06 +02:00
var _map = {};
var _node = [];
2023-02-28 09:43:01 +01:00
for(var i = 0; i < array_length(nodeArray); i++)
2023-03-26 07:13:36 +02:00
SAVE_NODE(_node, nodeArray[i],,,, getCurrentContext());
2023-06-13 14:42:06 +02:00
_map.nodes = _node;
2023-02-28 09:43:01 +01:00
clipboard_set_text(json_encode_minify(_map));
}
2023-03-02 07:59:14 +01:00
function doPaste() {
var txt = clipboard_get_text();
2023-07-05 15:09:52 +02:00
var _map = json_try_parse(txt, noone);
2023-06-13 14:42:06 +02:00
if(_map != noone) {
2023-02-28 09:43:01 +01:00
ds_map_clear(APPEND_MAP);
2023-03-07 14:29:47 +01:00
APPENDING = true;
CLONING = true;
2023-02-28 09:43:01 +01:00
var _app = __APPEND_MAP(_map);
2023-03-07 14:29:47 +01:00
APPENDING = false;
CLONING = false;
2023-02-28 09:43:01 +01:00
if(_app == noone)
return;
if(ds_list_size(_app) == 0) {
ds_list_destroy(_app);
return;
}
var x0 = 99999999;
var y0 = 99999999;
for(var i = 0; i < ds_list_size(_app); i++) {
var _node = _app[| i];
x0 = min(x0, _node.x);
y0 = min(y0, _node.y);
}
node_dragging = _app[| 0];
node_drag_mx = x0; node_drag_my = y0;
node_drag_sx = x0; node_drag_sy = y0;
node_drag_ox = x0; node_drag_oy = y0;
ds_list_destroy(nodes_select_list);
nodes_select_list = _app;
return;
}
2023-07-05 15:09:52 +02:00
if(filename_ext(txt) == ".pxc")
APPEND(txt);
else if(filename_ext(txt) == ".pxcc")
APPEND(txt);
else if(filename_ext(txt) == ".png") {
2023-02-28 09:43:01 +01:00
if(file_exists(txt)) {
Node_create_Image_path(0, 0, txt);
return;
}
2023-03-08 12:14:01 +01:00
var path = DIRECTORY + "temp/url_pasted_" + string(irandom_range(100000, 999999)) + ".png";
2023-02-28 09:43:01 +01:00
var img = http_get_file(txt, path);
CLONING = true;
var node = Node_create_Image(0, 0);
CLONING = false;
var args = [node, path];
global.FILE_LOAD_ASYNC[? img] = [ function(args) {
args[0].inputs[| 0].setValue(args[1]);
args[0].doUpdate();
}, args];
}
2022-12-12 09:08:03 +01:00
}
2022-01-13 05:24:03 +01:00
function doBlend() {
if(ds_list_empty(nodes_select_list)) return;
if(ds_list_size(nodes_select_list) != 2) return;
2023-04-10 20:02:59 +02:00
var cx = nodes_select_list[| 0].x;
2022-01-13 05:24:03 +01:00
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;
2023-01-17 08:11:55 +01:00
var _blend = new Node_Blend(cx, cy, getCurrentContext());
2022-01-13 05:24:03 +01:00
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;
2023-04-10 20:02:59 +02:00
var cx = nodes_select_list[| 0].x;
2022-01-13 05:24:03 +01:00
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;
2022-12-23 04:45:52 +01:00
var _compose = nodeBuild("Node_Composite", cx, cy);
2022-01-13 05:24:03 +01:00
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) {
2023-01-25 06:49:00 +01:00
_compose.addInput(_node.outputs[| 0]);
2022-01-13 05:24:03 +01:00
}
}
ds_list_clear(nodes_select_list);
}
2023-01-25 06:49:00 +01:00
function doArray() {
if(ds_list_empty(nodes_select_list)) return;
2023-04-10 20:02:59 +02:00
var cx = nodes_select_list[| 0].x;
2023-01-25 06:49:00 +01:00
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 _array = nodeBuild("Node_Array", 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;
_array.addInput(_node.outputs[| 0]);
}
ds_list_clear(nodes_select_list);
}
2022-01-13 05:24:03 +01:00
function doGroup() {
if(ds_list_empty(nodes_select_list) && node_focus != noone)
ds_list_add(nodes_select_list, node_focus);
2022-01-25 10:58:11 +01:00
node_focus = noone;
2022-01-13 05:24:03 +01:00
2022-12-13 09:20:36 +01:00
if(ds_list_empty(nodes_select_list)) return;
2023-02-14 02:51:14 +01:00
groupNodes(array_create_from_list(nodes_select_list));
2022-01-13 05:24:03 +01:00
}
function doUngroup() {
2022-12-13 09:20:36 +01:00
if(node_focus == noone) return;
if(!variable_struct_exists(node_focus, "nodes")) return;
if(!node_focus.ungroupable) return;
2023-02-14 02:51:14 +01:00
upgroupNode(node_focus);
2022-01-13 05:24:03 +01:00
}
2022-01-23 04:08:16 +01:00
function doLoop() {
if(ds_list_empty(nodes_select_list) && node_focus != noone)
ds_list_add(nodes_select_list, node_focus);
2022-12-13 09:20:36 +01:00
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 += _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;
2023-01-17 08:11:55 +01:00
var _group = new Node_Iterate(cx, cy, getCurrentContext());
2022-12-13 09:20:36 +01:00
for(var i = 0; i < ds_list_size(nodes_select_list); i++) {
_group.add(nodes_select_list[| i]);
2022-01-23 04:08:16 +01:00
}
2022-12-13 09:20:36 +01:00
for(var i = 0; i < ds_list_size(nodes_select_list); i++) {
nodes_select_list[| i].checkConnectGroup("loop");
}
ds_list_clear(nodes_select_list);
2022-01-23 04:08:16 +01:00
}
2022-01-13 05:24:03 +01:00
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++ ) {
2023-07-25 20:12:40 +02:00
var _node = nodes_select_list[| i];
x0 = min(x0, _node.x);
y0 = min(y0, _node.y);
x1 = max(x1, _node.x + _node.w);
y1 = max(y1, _node.y + _node.h);
2022-01-13 05:24:03 +01:00
}
}
x0 -= 64;
y0 -= 64;
x1 += 64;
y1 += 64;
2023-01-17 08:11:55 +01:00
var f = new Node_Frame(x0, y0, getCurrentContext());
2022-01-13 05:24:03 +01:00
f.inputs[| 0].setValue([x1 - x0, y1 - y0]);
}
2022-01-26 06:57:34 +01:00
function doDelete(_merge = false) {
2023-02-14 13:44:46 +01:00
if(node_focus != noone && node_focus.manual_deletable)
2022-01-26 06:57:34 +01:00
nodeDelete(node_focus, _merge);
2022-01-13 05:24:03 +01:00
for(var i = 0; i < ds_list_size(nodes_select_list); i++) {
2023-02-14 11:40:24 +01:00
if(nodes_select_list[| i].manual_deletable)
nodeDelete(nodes_select_list[| i], _merge);
2022-01-13 05:24:03 +01:00
}
ds_list_clear(nodes_select_list);
}
function setCurrentPreview(_node = node_focus) {
if(!_node) return;
PANEL_PREVIEW.setNodePreview(_node);
2022-01-13 05:24:03 +01:00
}
function setCurrentExport(_node = node_focus) {
2023-02-14 02:51:14 +01:00
if(DEMO) return;
2022-01-13 05:24:03 +01:00
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;
2022-12-19 13:35:30 +01:00
var _export = nodeBuild("Node_Export", _node.x + _node.w + 64, _node.y);
if(_path != -1)
2022-01-13 05:24:03 +01:00
_export.inputs[| 1].setFrom(_path);
_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;
2022-12-13 09:20:36 +01:00
var _canvas = nodeBuild("Node_Canvas", _node.x + _node.w + 64, _node.y);
2022-01-13 05:24:03 +01:00
_canvas.inputs[| 0].setValue([surface_get_width(surf), surface_get_height(surf)]);
2023-05-22 20:31:55 +02:00
_canvas.canvas_surface = surface_clone(surf);
_canvas.apply_surface();
2022-01-13 05:24:03 +01:00
}
2023-01-17 08:11:55 +01:00
function setTriggerPreview() {
if(node_focus != noone)
node_focus.previewable = !node_focus.previewable;
var show = false;
for(var i = 0; i < ds_list_size(nodes_select_list); i++) {
if(i == 0) show = !nodes_select_list[| i].previewable;
nodes_select_list[| i].previewable = show;
}
}
2023-02-19 13:49:20 +01:00
function setTriggerRender() {
if(node_focus != noone)
node_focus.renderActive = !node_focus.renderActive;
var show = false;
for(var i = 0; i < ds_list_size(nodes_select_list); i++) {
if(i == 0) show = !nodes_select_list[| i].renderActive;
nodes_select_list[| i].renderActive = show;
}
}
2022-01-13 05:24:03 +01:00
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;
2022-12-13 09:20:36 +01:00
var _canvas = nodeBuild("Node_Canvas", _node.x, _node.y + _node.h + 64);
2022-01-13 05:24:03 +01:00
_canvas.inputs[| 0].setValue([surface_get_width(surf), surface_get_height(surf)]);
_canvas.inputs[| 5].setValue(true);
2023-01-17 08:11:55 +01:00
var _blend = new Node_Blend(_node.x + _node.w + 64, _node.y, getCurrentContext());
2022-01-13 05:24:03 +01:00
_blend.inputs[| 0].setFrom(_outp);
_blend.inputs[| 1].setFrom(_canvas.outputs[| 0]);
}
function drawJunctionConnect() {
if(value_dragging) {
2022-01-26 06:57:34 +01:00
var xx = value_dragging.x;
2022-01-13 05:24:03 +01:00
var yy = value_dragging.y;
2023-01-25 06:49:00 +01:00
var _mx = mx;
var _my = my;
var target = noone;
if(value_focus && value_focus != value_dragging && value_focus.connect_type != value_dragging.connect_type)
target = value_focus;
2023-02-14 02:51:14 +01:00
if(key_mod_press(CTRL) && node_hovering != noone) {
if(value_dragging.connect_type == JUNCTION_CONNECT.input) {
target = node_hovering.getOutput(value_dragging);
if(target != noone)
node_hovering.active_draw_index = 1;
} else {
target = node_hovering.getInput(value_dragging);
if(target != noone)
node_hovering.active_draw_index = 1;
}
2023-01-25 06:49:00 +01:00
}
2023-03-28 06:58:28 +02:00
var drawCorner = value_dragging.type == VALUE_TYPE.action;
2023-01-25 06:49:00 +01:00
if(target != noone) {
_mx = target.x;
_my = target.y;
2023-03-28 06:58:28 +02:00
drawCorner |= target.type == VALUE_TYPE.action;
2023-01-25 06:49:00 +01:00
}
2022-01-13 05:24:03 +01:00
2023-03-05 07:16:44 +01:00
var col = value_color(value_dragging.type);
var corner = PREF_MAP[? "connection_line_corner"] * graph_s;
draw_set_color(col);
2023-01-25 06:49:00 +01:00
var th = PREF_MAP[? "connection_line_width"] * graph_s;
2022-09-21 06:09:40 +02:00
switch(PREF_MAP[? "curve_connection_line"]) {
2023-03-28 06:58:28 +02:00
case 0 :
draw_line_width(xx, yy, _mx, _my, th);
break;
2023-03-05 07:16:44 +01:00
case 1 :
2023-03-28 06:58:28 +02:00
if(drawCorner) {
if(value_dragging.type == VALUE_TYPE.action)
draw_line_curve_corner(_mx, _my, xx, yy, graph_s, th, col, col);
else
draw_line_curve_corner(xx, yy, _mx, _my, graph_s, th, col, col);
} else {
if(value_dragging.connect_type == JUNCTION_CONNECT.output)
draw_line_curve_color(_mx, _my, xx, yy,,, graph_s, th, col, col);
else
draw_line_curve_color(xx, yy, _mx, _my,,, graph_s, th, col, col);
}
2023-03-05 07:16:44 +01:00
break;
case 2 :
2023-03-28 06:58:28 +02:00
if(drawCorner) {
if(value_dragging.type == VALUE_TYPE.action)
draw_line_elbow_corner(_mx, _my, xx, yy, graph_s, th, col, col, corner);
else
draw_line_elbow_corner(xx, yy, _mx, _my, graph_s, th, col, col, corner);
} else {
if(value_dragging.connect_type == JUNCTION_CONNECT.output)
draw_line_elbow_color(xx, yy, _mx, _my,,, graph_s, th, col, col, corner);
else
draw_line_elbow_color(_mx, _my, xx, yy,,, graph_s, th, col, col, corner);
}
2023-03-05 07:16:44 +01:00
break;
case 3 :
2023-03-28 06:58:28 +02:00
if(drawCorner) {
if(value_dragging.type == VALUE_TYPE.action)
draw_line_elbow_diag_corner(_mx, _my, xx, yy, graph_s, th, col, col, corner);
else
draw_line_elbow_diag_corner(xx, yy, _mx, _my, graph_s, th, col, col, corner);
} else {
if(value_dragging.connect_type == JUNCTION_CONNECT.output)
draw_line_elbow_diag_color(xx, yy, _mx, _my,,, graph_s, th, col, col, corner);
else
draw_line_elbow_diag_color(_mx, _my, xx, yy,,, graph_s, th, col, col, corner);
}
2023-03-05 07:16:44 +01:00
break;
2022-09-21 06:09:40 +02:00
}
2022-01-13 05:24:03 +01:00
2023-01-25 06:49:00 +01:00
value_dragging.drawJunction(graph_s, value_dragging.x, value_dragging.y);
if(target)
target.drawJunction(graph_s, target.x, target.y);
2022-12-10 05:06:01 +01:00
if(mouse_release(mb_left)) {
2022-01-13 05:24:03 +01:00
if(value_focus && value_focus != value_dragging) {
if(value_focus.connect_type == JUNCTION_CONNECT.input)
2023-03-28 06:58:28 +02:00
var res = value_focus.setFrom(value_dragging);
2022-01-13 05:24:03 +01:00
else
value_dragging.setFrom(value_focus);
2023-02-14 02:51:14 +01:00
} else if(target != noone && value_dragging.connect_type == JUNCTION_CONNECT.input) {
value_dragging.setFrom(target);
2023-01-25 06:49:00 +01:00
} else if(target != noone && value_dragging.connect_type == JUNCTION_CONNECT.output) {
node_hovering.addInput(value_dragging);
2022-01-13 05:24:03 +01:00
} else {
if(value_dragging.connect_type == JUNCTION_CONNECT.input)
value_dragging.removeFrom();
2022-12-10 05:06:01 +01:00
value_dragging.node.triggerRender();
2022-01-13 05:24:03 +01:00
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;
}
2023-01-25 06:49:00 +01:00
} else if(!value_dragging && value_focus && mouse_press(mb_left, pFOCUS) && !key_mod_press(ALT))
value_dragging = value_focus;
2023-03-12 02:28:21 +01:00
#region draw junction name
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].drawJunctionNames(gr_x, gr_y, mx, my, graph_s);
}
#endregion
2022-01-13 05:24:03 +01:00
}
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;
junction_hovering = other.junction_hovering;
2022-01-13 05:24:03 +01:00
2023-02-28 09:43:01 +01:00
resetPosition();
2022-01-13 05:24:03 +01:00
alarm[0] = 1;
2023-01-25 06:49:00 +01:00
}
2022-01-13 05:24:03 +01:00
}
function drawContext() {
2022-11-18 03:20:31 +01:00
draw_set_text(f_p0, fa_left, fa_center);
2022-11-03 11:44:49 +01:00
var xx = ui(16), tt, tw, th;
2022-11-14 03:16:15 +01:00
var bh = toolbar_height - ui(12);
2022-09-21 06:09:40 +02:00
var tbh = h - toolbar_height / 2;
2022-01-13 05:24:03 +01:00
for(var i = -1; i < ds_list_size(node_context); i++) {
if(i == -1) {
2023-06-04 18:28:29 +02:00
tt = __txt("Global");
2022-01-13 05:24:03 +01:00
} else {
var _cnt = node_context[| i];
2023-02-28 09:43:01 +01:00
tt = _cnt.display_name == ""? _cnt.name : _cnt.display_name;
2022-01-13 05:24:03 +01:00
}
tw = string_width(tt);
th = string_height(tt);
if(i < ds_list_size(node_context) - 1) {
2022-11-18 03:20:31 +01:00
if(buttonInstant(THEME.button_hide_fill, xx - ui(6), tbh - bh / 2, tw + ui(12), bh, [mx, my], pFOCUS, pHOVER) == 2) {
2022-09-21 06:09:40 +02:00
node_hover = noone;
node_focus = noone;
2023-07-17 19:58:33 +02:00
PANEL_PREVIEW.resetNodePreview();
2022-12-16 09:18:09 +01:00
setContextFrame(true, node_context[| i + 1]);
2022-11-03 11:44:49 +01:00
2022-01-13 05:24:03 +01:00
if(i == -1) {
ds_list_clear(node_context);
2023-06-04 18:28:29 +02:00
title = __txt("Graph");
2023-07-06 19:49:16 +02:00
nodes_list = project.nodes;
2022-09-21 06:09:40 +02:00
toCenterNode();
2022-01-13 05:24:03 +01:00
PANEL_ANIMATION.updatePropertyList();
} else {
for(var j = ds_list_size(node_context) - 1; j > i; j--)
ds_list_delete(node_context, j);
2023-02-28 09:43:01 +01:00
nodes_list = node_context[| i].getNodeList();
2022-09-21 06:09:40 +02:00
toCenterNode();
2023-03-21 03:01:53 +01:00
var node = getCurrentContext();
title = node.display_name == ""? node.name : node.display_name;
2022-01-13 05:24:03 +01:00
PANEL_ANIMATION.updatePropertyList();
break;
}
}
2022-11-18 03:20:31 +01:00
draw_sprite_ui_uniform(THEME.arrow, 0, xx + tw + ui(16), tbh, 1, COLORS._main_icon);
2022-01-13 05:24:03 +01:00
}
2022-11-03 11:44:49 +01:00
2022-12-16 09:18:09 +01:00
draw_set_color(COLORS._main_text);
draw_set_alpha(i < ds_list_size(node_context) - 1? 0.33 : 1);
2022-11-01 03:06:03 +01:00
draw_text(xx, tbh - 2, tt);
2022-01-13 05:24:03 +01:00
draw_set_alpha(1);
xx += tw;
2022-11-03 11:44:49 +01:00
xx += ui(32);
2022-01-13 05:24:03 +01:00
}
}
2022-09-21 06:09:40 +02:00
function drawToolBar() {
2022-11-03 11:44:49 +01:00
toolbar_height = ui(40);
2022-09-21 06:09:40 +02:00
var ty = h - toolbar_height;
2022-12-10 05:06:01 +01:00
if(pHOVER && point_in_rectangle(mx, my, 0, ty, w, h))
2022-09-21 06:09:40 +02:00
mouse_on_graph = false;
2023-06-10 13:59:45 +02:00
draw_sprite_stretched(THEME.toolbar, 0, 0, ty, w, h);
2022-09-21 06:09:40 +02:00
drawContext();
var tbx = w - toolbar_height / 2;
var tby = ty + toolbar_height / 2;
2023-07-25 20:12:40 +02:00
for( var i = 0, n = array_length(toolbars); i < n; i++ ) {
2022-09-21 06:09:40 +02:00
var tb = toolbars[i];
var tbSpr = tb[0];
var tbInd = tb[1]();
var tbTooltip = tb[2]();
2022-11-18 03:20:31 +01:00
var b = buttonInstant(THEME.button_hide, tbx - ui(14), tby - ui(14), ui(28), ui(28), [mx, my], pFOCUS, pHOVER, tbTooltip, tbSpr, tbInd);
2022-11-03 11:44:49 +01:00
if(b == 2) tb[3]( { x: x + tbx - ui(14), y: y + tby - ui(14) } );
2022-09-21 06:09:40 +02:00
2022-11-03 11:44:49 +01:00
tbx -= ui(32);
2022-09-21 06:09:40 +02:00
}
2022-11-18 03:20:31 +01:00
draw_set_color(COLORS.panel_toolbar_separator);
2022-11-03 11:44:49 +01:00
draw_line_width(tbx + ui(12), tby - toolbar_height / 2 + ui(8), tbx + ui(12), tby + toolbar_height / 2 - ui(8), 2);
2022-09-21 06:09:40 +02:00
}
function drawMinimap() {
2022-11-03 11:44:49 +01:00
var mx1 = w - ui(8);
var my1 = h - toolbar_height - ui(8);
2022-09-21 06:09:40 +02:00
var mx0 = mx1 - minimap_w;
var my0 = my1 - minimap_h;
2022-11-03 11:44:49 +01:00
minimap_w = min(minimap_w, w - ui(16));
minimap_h = min(minimap_h, h - ui(16) - toolbar_height);
2022-09-21 06:09:40 +02:00
2022-12-22 03:09:55 +01:00
var mini_hover = false;
if(pHOVER && point_in_rectangle(mx, my, mx0, my0, mx1, my1)) {
2022-09-21 06:09:40 +02:00
mouse_on_graph = false;
2022-12-22 03:09:55 +01:00
mini_hover = true;
}
var hover = mini_hover && !point_in_rectangle(mx, my, mx0, my0, mx0 + ui(16), my0 + ui(16)) && !minimap_dragging;
2022-09-21 06:09:40 +02:00
if(!is_surface(minimap_surface) || surface_get_width(minimap_surface) != minimap_w || surface_get_height(minimap_surface) != minimap_h) {
2022-11-03 11:44:49 +01:00
minimap_surface = surface_create_valid(minimap_w, minimap_h);
2022-09-21 06:09:40 +02:00
}
surface_set_target(minimap_surface);
2022-12-27 04:00:50 +01:00
draw_clear_alpha(COLORS.panel_bg_clear_inner, 0.75);
2022-09-21 06:09:40 +02:00
if(!ds_list_empty(nodes_list)) {
var minx = 99999;
var maxx = -99999;
var miny = 99999;
var maxy = -99999;
for(var i = 0; i < ds_list_size(nodes_list); i++) {
2023-07-25 20:12:40 +02:00
var _node = nodes_list[| i];
minx = min(_node.x - 32, minx);
maxx = max(_node.x + _node.w + 32, maxx);
2022-09-21 06:09:40 +02:00
2023-07-25 20:12:40 +02:00
miny = min(_node.y - 32, miny);
maxy = max(_node.y + _node.h + 32, maxy);
2022-09-21 06:09:40 +02:00
}
var cx = (minx + maxx) / 2;
var cy = (miny + maxy) / 2;
var spw = maxx - minx;
var sph = maxy - miny;
var ss = min(minimap_w / spw, minimap_h / sph);
2022-12-22 03:09:55 +01:00
draw_set_alpha(0.4);
2022-09-21 06:09:40 +02:00
for(var i = 0; i < ds_list_size(nodes_list); i++) {
2023-07-25 20:12:40 +02:00
var _node = nodes_list[| i];
2022-09-21 06:09:40 +02:00
2023-07-25 20:12:40 +02:00
var nx = minimap_w / 2 + (_node.x - cx) * ss;
var ny = minimap_h / 2 + (_node.y - cy) * ss;
var nw = _node.w * ss;
var nh = _node.h * ss;
2022-09-21 06:09:40 +02:00
2022-12-22 03:09:55 +01:00
draw_set_color(n.color);
2023-04-08 20:06:27 +02:00
draw_roundrect_ext(nx, ny, nx + nw, ny + nh, THEME_VALUE.minimap_corner_radius, THEME_VALUE.minimap_corner_radius, false);
2022-09-21 06:09:40 +02:00
}
2022-12-22 03:09:55 +01:00
draw_set_alpha(1);
2022-09-21 06:09:40 +02:00
var gx = minimap_w / 2 - (graph_x + cx) * ss;
var gy = minimap_h / 2 - (graph_y + cy) * ss;
var gw = w / graph_s * ss;
var gh = h / graph_s * ss;
2022-11-18 03:20:31 +01:00
draw_set_color(COLORS.panel_graph_minimap_focus);
2022-09-21 06:09:40 +02:00
draw_rectangle(gx, gy, gx + gw, gy + gh, 1);
if(minimap_panning) {
graph_x = -((mx - mx0 - gw / 2) - minimap_w / 2) / ss - cx;
graph_y = -((my - my0 - gh / 2) - minimap_h / 2) / ss - cy;
2023-01-17 08:11:55 +01:00
graph_x = round(graph_x);
graph_y = round(graph_y);
2022-12-10 05:06:01 +01:00
if(mouse_release(mb_left))
2022-09-21 06:09:40 +02:00
minimap_panning = false;
}
2022-12-10 05:06:01 +01:00
if(mouse_click(mb_left, hover))
2022-09-21 06:09:40 +02:00
minimap_panning = true;
}
surface_reset_target();
2022-12-27 04:00:50 +01:00
draw_surface_ext(minimap_surface, mx0, my0, 1, 1, 0, c_white, 0.5 + 0.35 * hover);
2022-11-18 03:20:31 +01:00
draw_set_color(COLORS.panel_graph_minimap_outline);
2022-09-21 06:09:40 +02:00
draw_rectangle(mx0, my0, mx1 - 1, my1 - 1, true);
if(minimap_dragging) {
mouse_on_graph = false;
var sw = minimap_drag_sx + minimap_drag_mx - mx;
var sh = minimap_drag_sy + minimap_drag_my - my;
2022-11-03 11:44:49 +01:00
minimap_w = max(ui(64), sw);
minimap_h = max(ui(64), sh);
2022-09-21 06:09:40 +02:00
2022-12-10 05:06:01 +01:00
if(mouse_release(mb_left))
2022-09-21 06:09:40 +02:00
minimap_dragging = false;
}
2022-12-10 05:06:01 +01:00
if(pHOVER && point_in_rectangle(mx, my, mx0, my0, mx0 + ui(16), my0 + ui(16))) {
2023-01-25 06:49:00 +01:00
draw_sprite_ui(THEME.node_resize, 0, mx0 + ui(2), my0 + ui(2), 1, 1, 180, c_white, 0.75);
2022-12-10 05:06:01 +01:00
if(mouse_press(mb_left, pFOCUS)) {
2022-09-21 06:09:40 +02:00
minimap_dragging = true;
minimap_drag_sx = minimap_w;
minimap_drag_sy = minimap_h;
minimap_drag_mx = mx;
minimap_drag_my = my;
}
} else
2023-01-25 06:49:00 +01:00
draw_sprite_ui(THEME.node_resize, 0, mx0 + ui(2), my0 + ui(2), 1, 1, 180, c_white, 0.3);
2022-09-21 06:09:40 +02:00
}
2022-12-16 09:18:09 +01:00
function drawContextFrame() {
if(!context_framing) return;
context_frame_progress = lerp_float(context_frame_progress, 1, 5);
if(context_frame_progress == 1)
context_framing = false;
var _fr_x0 = 0, _fr_y0 = 0;
var _fr_x1 = w, _fr_y1 = h;
2023-02-28 09:43:01 +01:00
var _to_x0 = context_frame_sx;
var _to_y0 = context_frame_sy;
var _to_x1 = context_frame_ex;
var _to_y1 = context_frame_ey;
2022-12-16 09:18:09 +01:00
var prog = context_frame_direct? context_frame_progress : 1 - context_frame_progress;
var frm_x0 = lerp(_fr_x0, _to_x0, prog);
var frm_y0 = lerp(_fr_y0, _to_y0, prog);
var frm_x1 = lerp(_fr_x1, _to_x1, prog);
var frm_y1 = lerp(_fr_y1, _to_y1, prog);
draw_set_color(COLORS._main_accent);
draw_set_alpha(0.5);
2023-04-08 20:06:27 +02:00
draw_roundrect_ext(frm_x0, frm_y0, frm_x1, frm_y1, THEME_VALUE.panel_corner_radius, THEME_VALUE.panel_corner_radius, true);
2022-12-16 09:18:09 +01:00
draw_set_alpha(1);
}
2022-01-13 05:24:03 +01:00
function addContext(node) {
2023-03-21 03:01:53 +01:00
title = node.display_name == ""? node.name : node.display_name;
2023-02-28 09:43:01 +01:00
var _node = node.getNodeBase();
setContextFrame(false, _node);
nodes_list = _node.nodes;
ds_list_add(node_context, _node);
2022-01-13 05:24:03 +01:00
node_dragging = noone;
ds_list_clear(nodes_select_list);
selection_block = 1;
2022-09-21 06:09:40 +02:00
toCenterNode();
2022-01-13 05:24:03 +01:00
PANEL_ANIMATION.updatePropertyList();
2022-12-16 09:18:09 +01:00
}
function setContextFrame(dirr, node) {
context_framing = true;
context_frame_direct = dirr;
context_frame_progress = 0;
2023-02-28 09:43:01 +01:00
context_frame_sx = w / 2 - 8;
context_frame_sy = h / 2 - 8;
context_frame_ex = context_frame_sx + 16;
context_frame_ey = context_frame_sy + 16;
2022-01-13 05:24:03 +01:00
}
function getCurrentContext() {
2023-02-28 09:43:01 +01:00
if(ds_list_empty(node_context)) return noone;
2022-01-13 05:24:03 +01:00
return node_context[| ds_list_size(node_context) - 1];
}
2022-12-13 09:20:36 +01:00
function getNodeList(cont = getCurrentContext()) {
2023-07-06 19:49:16 +02:00
return cont == noone? project.nodes : cont.getNodeList();
2022-12-13 09:20:36 +01:00
}
2022-01-13 05:24:03 +01:00
function dropFile(path) {
if(node_hovering && node_hovering.on_dragdrop_file != -1)
return node_hovering.on_dragdrop_file(path);
return false;
}
2023-02-14 02:51:14 +01:00
function drawContent(panel) {
2023-07-23 21:15:45 +02:00
if(!project.active) return;
2022-01-13 05:24:03 +01:00
dragGraph();
2023-07-06 19:49:16 +02:00
if(project.path == "") title = "New project";
else title = filename_name_only(project.path);
title += project.modified? "*" : "";
2022-12-16 09:18:09 +01:00
var bg = COLORS.panel_bg_clear;
2023-02-14 02:51:14 +01:00
var context = instanceof(getCurrentContext());
2022-12-16 09:18:09 +01:00
switch(context) {
2023-02-14 02:51:14 +01:00
case "Node_Group" : bg = merge_color(COLORS.panel_bg_clear, COLORS.node_blend_collection, 0.05); break;
2023-05-28 20:57:54 +02:00
case "Node_Iterate" : bg = merge_color(COLORS.panel_bg_clear, COLORS.node_blend_loop, 0.05); break;
case "Node_Iterate_Each" : bg = merge_color(COLORS.panel_bg_clear, COLORS.node_blend_loop, 0.05); break;
case "Node_VFX_Group" : bg = merge_color(COLORS.panel_bg_clear, COLORS.node_blend_vfx, 0.05); break;
case "Node_Feedback" : bg = merge_color(COLORS.panel_bg_clear, COLORS.node_blend_feedback, 0.05); break;
2023-02-14 02:51:14 +01:00
case "Node_Rigid_Group" : bg = merge_color(COLORS.panel_bg_clear, COLORS.node_blend_simulation, 0.05); break;
2023-05-28 20:57:54 +02:00
case "Node_Fluid_Group" : bg = merge_color(COLORS.panel_bg_clear, COLORS.node_blend_fluid, 0.05); break;
case "Node_Strand_Group" : bg = merge_color(COLORS.panel_bg_clear, COLORS.node_blend_strand, 0.05); break;
2023-07-21 12:40:20 +02:00
case "Node_Pixel_Builder" : bg = merge_color(COLORS.panel_bg_clear, COLORS.node_blend_feedback, 0.05); break;
2022-12-16 09:18:09 +01:00
}
draw_clear(bg);
2022-01-13 05:24:03 +01:00
2022-09-21 06:09:40 +02:00
if(show_grid) drawGrid();
2022-01-13 05:24:03 +01:00
2022-11-18 03:20:31 +01:00
draw_set_text(f_p0, fa_right, fa_top, COLORS._main_text_sub);
2022-11-03 11:44:49 +01:00
draw_text(w - ui(8), ui(8), "x" + string(graph_s_to));
2022-01-13 05:24:03 +01:00
drawNodes();
drawJunctionConnect();
2022-12-16 09:18:09 +01:00
drawContextFrame();
2022-01-13 05:24:03 +01:00
2022-09-21 06:09:40 +02:00
mouse_on_graph = true;
drawToolBar();
if(minimap_show)
drawMinimap();
2022-01-13 05:24:03 +01:00
2023-02-14 02:51:14 +01:00
if(pFOCUS && node_focus) node_focus.focusStep();
2022-12-10 05:06:01 +01:00
if(UPDATE == RENDER_TYPE.full)
2023-06-04 18:28:29 +02:00
draw_text(w - ui(8), ui(28), __txtx("panel_graph_rendering", "Rendering") + "...");
2022-12-10 05:06:01 +01:00
else if(UPDATE == RENDER_TYPE.full)
2023-06-04 18:28:29 +02:00
draw_text(w - ui(8), ui(28), __txtx("panel_graph_rendering_partial", "Rendering partial") + "...");
2023-03-25 12:27:04 +01:00
if(DRAGGING && pHOVER) {
2023-03-26 07:13:36 +02:00
if(node_hovering && node_hovering.droppable(DRAGGING)) {
node_hovering.draw_droppable = true;
2023-03-25 12:27:04 +01:00
if(mouse_release(mb_left))
2023-03-26 07:13:36 +02:00
node_hovering.onDrop(DRAGGING);
2023-03-25 12:27:04 +01:00
} else {
draw_sprite_stretched_ext(THEME.ui_panel_active, 0, 2, 2, w - 4, h - 4, COLORS._main_value_positive, 1);
if(mouse_release(mb_left))
checkDropItem();
}
}
2023-04-21 19:08:10 +02:00
graph_dragging_key = false;
2023-03-25 12:27:04 +01:00
}
static checkDropItem = function() {
2023-03-26 07:13:36 +02:00
var node = noone;
2023-03-25 12:27:04 +01:00
switch(DRAGGING.type) {
case "Color":
2023-03-26 07:13:36 +02:00
node = nodeBuild("Node_Color", mouse_grid_x, mouse_grid_y, getCurrentContext());
2023-03-25 12:27:04 +01:00
node.inputs[| 0].setValue(DRAGGING.data);
break;
case "Palette":
2023-03-26 07:13:36 +02:00
node = nodeBuild("Node_Palette", mouse_grid_x, mouse_grid_y, getCurrentContext());
node.inputs[| 0].setValue(DRAGGING.data);
break;
case "Gradient":
node = nodeBuild("Node_Gradient_Out", mouse_grid_x, mouse_grid_y, getCurrentContext());
node.inputs[| 0].setValue(DRAGGING.data);
break;
case "Number":
if(is_array(DRAGGING.data) && array_length(DRAGGING.data) <= 4) {
switch(array_length(DRAGGING.data)) {
case 2 : node = nodeBuild("Node_Vector2", mouse_grid_x, mouse_grid_y, getCurrentContext()); break;
case 3 : node = nodeBuild("Node_Vector3", mouse_grid_x, mouse_grid_y, getCurrentContext()); break;
case 4 : node = nodeBuild("Node_Vector4", mouse_grid_x, mouse_grid_y, getCurrentContext()); break;
}
2023-07-25 20:12:40 +02:00
for( var i = 0, n = array_length(DRAGGING.data); i < n; i++ )
2023-03-26 07:13:36 +02:00
node.inputs[| i].setValue(DRAGGING.data[i]);
} else {
node = nodeBuild("Node_Number", mouse_grid_x, mouse_grid_y, getCurrentContext());
node.inputs[| 0].setValue(DRAGGING.data);
}
break;
case "Bool":
node = nodeBuild("Node_Boolean", mouse_grid_x, mouse_grid_y, getCurrentContext());
node.inputs[| 0].setValue(DRAGGING.data);
break;
case "Text":
node = nodeBuild("Node_String", mouse_grid_x, mouse_grid_y, getCurrentContext());
2023-03-25 12:27:04 +01:00
node.inputs[| 0].setValue(DRAGGING.data);
break;
2023-03-26 07:13:36 +02:00
case "Path":
node = nodeBuild("Node_Path", mouse_grid_x, mouse_grid_y, getCurrentContext());
break;
case "Struct":
node = nodeBuild("Node_Struct", mouse_grid_x, mouse_grid_y, getCurrentContext());
break;
2023-03-25 12:53:29 +01:00
case "Asset":
var app = Node_create_Image_path(mouse_grid_x, mouse_grid_y, DRAGGING.data.path);
break;
case "Collection":
var path = DRAGGING.data.path;
ds_list_clear(nodes_select_list);
var app = APPEND(DRAGGING.data.path, getCurrentContext());
if(!is_struct(app) && ds_exists(app, ds_type_list)) {
var cx = 0;
var cy = 0;
for( var i = 0; i < ds_list_size(app); i++ ) {
cx += app[| i].x;
cy += app[| i].y;
}
cx /= ds_list_size(app);
cy /= ds_list_size(app);
for( var i = 0; i < ds_list_size(app); i++ ) {
app[| i].x = app[| i].x - cx + mouse_grid_x;
app[| i].y = app[| i].y - cy + mouse_grid_y;
}
ds_list_destroy(app);
} else {
app.x = mouse_grid_x;
app.y = mouse_grid_y;
}
break;
2023-03-25 12:27:04 +01:00
}
2023-03-26 07:13:36 +02:00
2023-07-15 20:01:29 +02:00
if(!key_mod_press(SHIFT) && node && struct_has(DRAGGING, "from") && DRAGGING.from.value_from == noone) {
for( var i = 0; i < ds_list_size(node.outputs); i++ )
if(DRAGGING.from.setFrom(node.outputs[| i])) break;
}
2022-01-13 05:24:03 +01:00
}
2023-03-05 07:16:44 +01:00
static bringNodeToFront = function(node) {
if(!ds_list_exist(nodes_list, node)) return;
ds_list_remove(nodes_list, node);
ds_list_add(nodes_list, node);
}
2023-07-06 19:49:16 +02:00
function close() {
2023-07-23 21:15:45 +02:00
if(nodes_list != project.nodes) {
panel.remove(self);
return;
}
2023-07-06 19:49:16 +02:00
if(!project.modified || project.readonly) {
closeProject(project);
return;
}
var dia = dialogCall(o_dialog_save);
dia.project = project;
}
2022-01-13 05:24:03 +01:00
}