Update litegraph from upstream.
This commit is contained in:
parent
68d12b530e
commit
84ea21c815
|
@ -5880,13 +5880,13 @@ LGraphNode.prototype.executeAction = function(action)
|
||||||
|
|
||||||
//when clicked on top of a node
|
//when clicked on top of a node
|
||||||
//and it is not interactive
|
//and it is not interactive
|
||||||
if (node && this.allow_interaction && !skip_action && !this.read_only) {
|
if (node && (this.allow_interaction || node.flags.allow_interaction) && !skip_action && !this.read_only) {
|
||||||
if (!this.live_mode && !node.flags.pinned) {
|
if (!this.live_mode && !node.flags.pinned) {
|
||||||
this.bringToFront(node);
|
this.bringToFront(node);
|
||||||
} //if it wasn't selected?
|
} //if it wasn't selected?
|
||||||
|
|
||||||
//not dragging mouse to connect two slots
|
//not dragging mouse to connect two slots
|
||||||
if ( !this.connecting_node && !node.flags.collapsed && !this.live_mode ) {
|
if ( this.allow_interaction && !this.connecting_node && !node.flags.collapsed && !this.live_mode ) {
|
||||||
//Search for corner for resize
|
//Search for corner for resize
|
||||||
if ( !skip_action &&
|
if ( !skip_action &&
|
||||||
node.resizable !== false && node.inResizeCorner(e.canvasX, e.canvasY)
|
node.resizable !== false && node.inResizeCorner(e.canvasX, e.canvasY)
|
||||||
|
@ -6033,7 +6033,7 @@ LGraphNode.prototype.executeAction = function(action)
|
||||||
}
|
}
|
||||||
|
|
||||||
//double clicking
|
//double clicking
|
||||||
if (is_double_click && this.selected_nodes[node.id]) {
|
if (this.allow_interaction && is_double_click && this.selected_nodes[node.id]) {
|
||||||
//double click node
|
//double click node
|
||||||
if (node.onDblClick) {
|
if (node.onDblClick) {
|
||||||
node.onDblClick( e, pos, this );
|
node.onDblClick( e, pos, this );
|
||||||
|
@ -6307,6 +6307,9 @@ LGraphNode.prototype.executeAction = function(action)
|
||||||
this.dirty_canvas = true;
|
this.dirty_canvas = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//get node over
|
||||||
|
var node = this.graph.getNodeOnPos(e.canvasX,e.canvasY,this.visible_nodes);
|
||||||
|
|
||||||
if (this.dragging_rectangle)
|
if (this.dragging_rectangle)
|
||||||
{
|
{
|
||||||
this.dragging_rectangle[2] = e.canvasX - this.dragging_rectangle[0];
|
this.dragging_rectangle[2] = e.canvasX - this.dragging_rectangle[0];
|
||||||
|
@ -6336,14 +6339,11 @@ LGraphNode.prototype.executeAction = function(action)
|
||||||
this.ds.offset[1] += delta[1] / this.ds.scale;
|
this.ds.offset[1] += delta[1] / this.ds.scale;
|
||||||
this.dirty_canvas = true;
|
this.dirty_canvas = true;
|
||||||
this.dirty_bgcanvas = true;
|
this.dirty_bgcanvas = true;
|
||||||
} else if (this.allow_interaction && !this.read_only) {
|
} else if ((this.allow_interaction || (node && node.flags.allow_interaction)) && !this.read_only) {
|
||||||
if (this.connecting_node) {
|
if (this.connecting_node) {
|
||||||
this.dirty_canvas = true;
|
this.dirty_canvas = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//get node over
|
|
||||||
var node = this.graph.getNodeOnPos(e.canvasX,e.canvasY,this.visible_nodes);
|
|
||||||
|
|
||||||
//remove mouseover flag
|
//remove mouseover flag
|
||||||
for (var i = 0, l = this.graph._nodes.length; i < l; ++i) {
|
for (var i = 0, l = this.graph._nodes.length; i < l; ++i) {
|
||||||
if (this.graph._nodes[i].mouseOver && node != this.graph._nodes[i] ) {
|
if (this.graph._nodes[i].mouseOver && node != this.graph._nodes[i] ) {
|
||||||
|
@ -9911,7 +9911,7 @@ LGraphNode.prototype.executeAction = function(action)
|
||||||
event,
|
event,
|
||||||
active_widget
|
active_widget
|
||||||
) {
|
) {
|
||||||
if (!node.widgets || !node.widgets.length) {
|
if (!node.widgets || !node.widgets.length || (!this.allow_interaction && !node.flags.allow_interaction)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10300,6 +10300,119 @@ LGraphNode.prototype.executeAction = function(action)
|
||||||
canvas.graph.add(group);
|
canvas.graph.add(group);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines the furthest nodes in each direction
|
||||||
|
* @param nodes {LGraphNode[]} the nodes to from which boundary nodes will be extracted
|
||||||
|
* @return {{left: LGraphNode, top: LGraphNode, right: LGraphNode, bottom: LGraphNode}}
|
||||||
|
*/
|
||||||
|
LGraphCanvas.getBoundaryNodes = function(nodes) {
|
||||||
|
let top = null;
|
||||||
|
let right = null;
|
||||||
|
let bottom = null;
|
||||||
|
let left = null;
|
||||||
|
for (const nID in nodes) {
|
||||||
|
const node = nodes[nID];
|
||||||
|
const [x, y] = node.pos;
|
||||||
|
const [width, height] = node.size;
|
||||||
|
|
||||||
|
if (top === null || y < top.pos[1]) {
|
||||||
|
top = node;
|
||||||
|
}
|
||||||
|
if (right === null || x + width > right.pos[0] + right.size[0]) {
|
||||||
|
right = node;
|
||||||
|
}
|
||||||
|
if (bottom === null || y + height > bottom.pos[1] + bottom.size[1]) {
|
||||||
|
bottom = node;
|
||||||
|
}
|
||||||
|
if (left === null || x < left.pos[0]) {
|
||||||
|
left = node;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
"top": top,
|
||||||
|
"right": right,
|
||||||
|
"bottom": bottom,
|
||||||
|
"left": left
|
||||||
|
};
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Determines the furthest nodes in each direction for the currently selected nodes
|
||||||
|
* @return {{left: LGraphNode, top: LGraphNode, right: LGraphNode, bottom: LGraphNode}}
|
||||||
|
*/
|
||||||
|
LGraphCanvas.prototype.boundaryNodesForSelection = function() {
|
||||||
|
return LGraphCanvas.getBoundaryNodes(Object.values(this.selected_nodes));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {LGraphNode[]} nodes a list of nodes
|
||||||
|
* @param {"top"|"bottom"|"left"|"right"} direction Direction to align the nodes
|
||||||
|
* @param {LGraphNode?} align_to Node to align to (if null, align to the furthest node in the given direction)
|
||||||
|
*/
|
||||||
|
LGraphCanvas.alignNodes = function (nodes, direction, align_to) {
|
||||||
|
if (!nodes) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const canvas = LGraphCanvas.active_canvas;
|
||||||
|
let boundaryNodes = []
|
||||||
|
if (align_to === undefined) {
|
||||||
|
boundaryNodes = LGraphCanvas.getBoundaryNodes(nodes)
|
||||||
|
} else {
|
||||||
|
boundaryNodes = {
|
||||||
|
"top": align_to,
|
||||||
|
"right": align_to,
|
||||||
|
"bottom": align_to,
|
||||||
|
"left": align_to
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const [_, node] of Object.entries(canvas.selected_nodes)) {
|
||||||
|
switch (direction) {
|
||||||
|
case "right":
|
||||||
|
node.pos[0] = boundaryNodes["right"].pos[0] + boundaryNodes["right"].size[0] - node.size[0];
|
||||||
|
break;
|
||||||
|
case "left":
|
||||||
|
node.pos[0] = boundaryNodes["left"].pos[0];
|
||||||
|
break;
|
||||||
|
case "top":
|
||||||
|
node.pos[1] = boundaryNodes["top"].pos[1];
|
||||||
|
break;
|
||||||
|
case "bottom":
|
||||||
|
node.pos[1] = boundaryNodes["bottom"].pos[1] + boundaryNodes["bottom"].size[1] - node.size[1];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
canvas.dirty_canvas = true;
|
||||||
|
canvas.dirty_bgcanvas = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
LGraphCanvas.onNodeAlign = function(value, options, event, prev_menu, node) {
|
||||||
|
new LiteGraph.ContextMenu(["Top", "Bottom", "Left", "Right"], {
|
||||||
|
event: event,
|
||||||
|
callback: inner_clicked,
|
||||||
|
parentMenu: prev_menu,
|
||||||
|
});
|
||||||
|
|
||||||
|
function inner_clicked(value) {
|
||||||
|
LGraphCanvas.alignNodes(LGraphCanvas.active_canvas.selected_nodes, value.toLowerCase(), node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LGraphCanvas.onGroupAlign = function(value, options, event, prev_menu) {
|
||||||
|
new LiteGraph.ContextMenu(["Top", "Bottom", "Left", "Right"], {
|
||||||
|
event: event,
|
||||||
|
callback: inner_clicked,
|
||||||
|
parentMenu: prev_menu,
|
||||||
|
});
|
||||||
|
|
||||||
|
function inner_clicked(value) {
|
||||||
|
LGraphCanvas.alignNodes(LGraphCanvas.active_canvas.selected_nodes, value.toLowerCase());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
LGraphCanvas.onMenuAdd = function (node, options, e, prev_menu, callback) {
|
LGraphCanvas.onMenuAdd = function (node, options, e, prev_menu, callback) {
|
||||||
|
|
||||||
var canvas = LGraphCanvas.active_canvas;
|
var canvas = LGraphCanvas.active_canvas;
|
||||||
|
@ -12900,6 +13013,14 @@ LGraphNode.prototype.executeAction = function(action)
|
||||||
options.push({ content: "Options", callback: that.showShowGraphOptionsPanel });
|
options.push({ content: "Options", callback: that.showShowGraphOptionsPanel });
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
|
if (Object.keys(this.selected_nodes).length > 1) {
|
||||||
|
options.push({
|
||||||
|
content: "Align",
|
||||||
|
has_submenu: true,
|
||||||
|
callback: LGraphCanvas.onGroupAlign,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
if (this._graph_stack && this._graph_stack.length > 0) {
|
if (this._graph_stack && this._graph_stack.length > 0) {
|
||||||
options.push(null, {
|
options.push(null, {
|
||||||
content: "Close subgraph",
|
content: "Close subgraph",
|
||||||
|
@ -13014,6 +13135,14 @@ LGraphNode.prototype.executeAction = function(action)
|
||||||
callback: LGraphCanvas.onMenuNodeToSubgraph
|
callback: LGraphCanvas.onMenuNodeToSubgraph
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (Object.keys(this.selected_nodes).length > 1) {
|
||||||
|
options.push({
|
||||||
|
content: "Align Selected To",
|
||||||
|
has_submenu: true,
|
||||||
|
callback: LGraphCanvas.onNodeAlign,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
options.push(null, {
|
options.push(null, {
|
||||||
content: "Remove",
|
content: "Remove",
|
||||||
disabled: !(node.removable !== false && !node.block_delete ),
|
disabled: !(node.removable !== false && !node.block_delete ),
|
||||||
|
|
Loading…
Reference in New Issue