Skip to content

Commit a397fb8

Browse files
committed
node pos bug fix.
1 parent 9940627 commit a397fb8

File tree

11 files changed

+69
-55
lines changed

11 files changed

+69
-55
lines changed

NodeGraphQt/base/commands.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ def set_node_prop(self, name, value):
4141

4242
# view properties.
4343
if name in view.properties.keys():
44+
# remap "pos" to "xy_pos" node view has pre-existing pos method.
45+
if name == 'pos':
46+
name = 'xy_pos'
4447
setattr(view, name, value)
4548

4649
def undo(self):
@@ -69,13 +72,13 @@ def __init__(self, node, pos, prev_pos):
6972
self.prev_pos = prev_pos
7073

7174
def undo(self):
72-
self.node.view.pos = self.prev_pos
75+
self.node.view.xy_pos = self.prev_pos
7376
self.node.model.pos = self.prev_pos
7477

7578
def redo(self):
7679
if self.pos == self.prev_pos:
7780
return
78-
self.node.view.pos = self.pos
81+
self.node.view.xy_pos = self.pos
7982
self.node.model.pos = self.pos
8083

8184

NodeGraphQt/base/graph.py

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from PySide2 import QtCore
77
from PySide2.QtWidgets import QUndoStack, QAction, QApplication
88

9-
from NodeGraphQt.base.actions import setup_context_menu
109
from NodeGraphQt.base.commands import (NodeAddedCmd,
1110
NodeRemovedCmd,
1211
NodeMovedCmd,
@@ -338,14 +337,15 @@ def create_node(self, node_type, name=None, selected=True, color=None, pos=None)
338337
name (str): set name of the node.
339338
selected (bool): set created node to be selected.
340339
color (tuple or str): node color (255, 255, 255) or '#FFFFFF'.
341-
pos (tuple): set position of the node (x, y).
340+
pos (list[int, int]): initial x, y position for the node (default: (0, 0)).
342341
343342
Returns:
344343
NodeGraphQt.Node: the created instance of the node.
345344
"""
346345
NodeCls = self._vendor.create_node_instance(node_type)
347346
if NodeCls:
348347
node = NodeCls()
348+
349349
node._graph = self
350350
node.model._graph_model = self.model
351351

@@ -360,21 +360,22 @@ def create_node(self, node_type, name=None, selected=True, color=None, pos=None)
360360
for pname, pattrs in prop_attrs.items():
361361
graph_attrs[node.type][pname].update(pattrs)
362362

363-
node.update()
364-
365-
self._undo_stack.beginMacro('created node')
366-
self._undo_stack.push(NodeAddedCmd(self, node, pos))
367-
if name:
368-
node.set_name(name)
369-
else:
370-
node.set_name(node.NODE_NAME)
363+
node.NODE_NAME = self.get_unique_name(name or node.NODE_NAME)
364+
node.model.name = node.NODE_NAME
365+
node.model.selected = selected
371366
if color:
372367
if isinstance(color, str):
373368
color = color[1:] if color[0] is '#' else color
374369
color = tuple(int(color[i:i + 2], 16) for i in (0, 2, 4))
375-
node.set_color(*color)
376-
node.set_selected(selected)
377-
self._undo_stack.endMacro()
370+
node.model.color = color
371+
if pos:
372+
node.model.pos = [float(pos[0]), float(pos[1])]
373+
374+
node.update()
375+
376+
undo_cmd = NodeAddedCmd(self, node, node.model.pos)
377+
undo_cmd.setText('created node')
378+
self._undo_stack.push(undo_cmd)
378379
self.node_created.emit(node)
379380
return node
380381
raise Exception('\n\n>> Cannot find node:\t"{}"\n'.format(node_type))

NodeGraphQt/base/model.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def __init__(self):
5757
self.selected = False
5858
self.width = 100.0
5959
self.height = 80.0
60-
self.pos = (0.0, 0.0)
60+
self.pos = [0.0, 0.0]
6161
self.inputs = {}
6262
self.outputs = {}
6363
self._custom_prop = {}
@@ -99,7 +99,7 @@ def add_property(self, name, value, items=None, range=None, widget_type=NODE_PRO
9999
widget_type (int): widget type flag.
100100
"""
101101
if name in self.properties.keys():
102-
raise AssertionError('"{}" reserved for defaults.'.format(name))
102+
raise AssertionError('"{}" reserved for default property.'.format(name))
103103
if name in self._custom_prop.keys():
104104
raise AssertionError('"{}" property already exists.'.format(name))
105105

NodeGraphQt/base/node.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -297,36 +297,36 @@ def has_property(self, name):
297297
"""
298298
return name in self.model.properties.keys()
299299

300-
def set_x_pos(self, x=0.0):
300+
def set_x_pos(self, x):
301301
"""
302302
Set the node horizontal X position in the node graph.
303303
304304
Args:
305-
x (float): node x position:
305+
x (float or int): node X position:
306306
"""
307307
y = self.pos()[1]
308-
self.set_pos(x, y)
308+
self.set_pos(float(x), y)
309309

310-
def set_y_pos(self, y=0.0):
310+
def set_y_pos(self, y):
311311
"""
312312
Set the node horizontal Y position in the node graph.
313313
314314
Args:
315-
y (float): node x position:
315+
y (float or int): node Y position:
316316
"""
317317

318318
x = self.pos()[0]
319-
self.set_pos(x, y)
319+
self.set_pos(x, float(y))
320320

321-
def set_pos(self, x=0.0, y=0.0):
321+
def set_pos(self, x, y):
322322
"""
323323
Set the node X and Y position in the node graph.
324324
325325
Args:
326-
x (float): node X position.
327-
y (float): node Y position.
326+
x (float or int): node X position.
327+
y (float or int): node Y position.
328328
"""
329-
self.set_property('pos', (x, y))
329+
self.set_property('pos', [float(x), float(y)])
330330

331331
def x_pos(self):
332332
"""
@@ -351,10 +351,10 @@ def pos(self):
351351
Get the node XY position in the node graph.
352352
353353
Returns:
354-
tuple(float, float): x, y position.
354+
list[float, float]: x, y position.
355355
"""
356-
if self.view.pos and self.view.pos != self.model.pos:
357-
self.model.pos = self.view.pos
356+
if self.view.xy_pos and self.view.xy_pos != self.model.pos:
357+
self.model.pos = self.view.xy_pos
358358

359359
return self.model.pos
360360

NodeGraphQt/widgets/node_abstract.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -143,11 +143,11 @@ def selected(self, selected=False):
143143
self.setSelected(selected)
144144

145145
@property
146-
def pos(self):
147-
return float(self.scenePos().x()), float(self.scenePos().y())
146+
def xy_pos(self):
147+
return [float(self.scenePos().x()), float(self.scenePos().y())]
148148

149-
@pos.setter
150-
def pos(self, pos=None):
149+
@xy_pos.setter
150+
def xy_pos(self, pos=None):
151151
pos = pos or [0.0, 0.0]
152152
self.setPos(pos[0], pos[1])
153153

@@ -170,7 +170,7 @@ def properties(self):
170170
"""
171171
props = {'width': self.width,
172172
'height': self.height,
173-
'pos': self.pos}
173+
'pos': self.xy_pos}
174174
props.update(self._properties)
175175
return props
176176

@@ -198,7 +198,9 @@ def from_dict(self, node_dict):
198198
Args:
199199
node_dict (dict): serialized node dict.
200200
"""
201-
node_attrs = list(self._properties.keys()) + ['width', 'height']
201+
node_attrs = list(self._properties.keys()) + ['width', 'height', 'pos']
202202
for name, value in node_dict.items():
203203
if name in node_attrs:
204+
if name == 'pos':
205+
name = 'xy_pos'
204206
setattr(self, name, value)

NodeGraphQt/widgets/node_backdrop.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ def auto_resize(self, nodes=None):
207207
if nodes:
208208
padding = 40
209209
nodes_rect = self._combined_rect(nodes)
210-
self.pos = [nodes_rect.x() - padding, nodes_rect.y() - padding]
210+
self.xy_pos = [nodes_rect.x() - padding, nodes_rect.y() - padding]
211211
self._sizer.set_pos(nodes_rect.width() + (padding * 2),
212212
nodes_rect.height() + (padding * 2))
213213
return
@@ -230,11 +230,11 @@ def pre_init(self, viewer, pos=None):
230230
group = scene.createItemGroup(nodes)
231231
rect = group.boundingRect()
232232
scene.destroyItemGroup(group)
233-
self.pos = [rect.x() - padding, rect.y() - padding]
233+
self.xy_pos = [rect.x() - padding, rect.y() - padding]
234234
self._sizer.set_pos(rect.width() + (padding * 2),
235235
rect.height() + (padding * 2))
236236
else:
237-
self.pos = pos
237+
self.xy_pos = pos
238238

239239
@property
240240
def minimum_size(self):

NodeGraphQt/widgets/node_base.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -480,19 +480,14 @@ def post_init(self, viewer=None, pos=None):
480480
viewer (NodeGraphQt.widgets.viewer.NodeViewer): not used
481481
pos (tuple): cursor position.
482482
"""
483-
# set initial node position.
484-
if pos:
485-
self.setPos(pos[0], pos[1])
486-
487483
# setup initial base size.
488484
self._set_base_size()
489485
# set text color when node is initialized.
490486
self._set_text_color(self.text_color)
491487
# set the tooltip
492488
self._tooltip_disable(self.disabled)
493489

494-
# setup node layout
495-
# =================
490+
# --- setup node layout ---
496491

497492
# arrange label text
498493
self.arrange_label()
@@ -510,6 +505,10 @@ def post_init(self, viewer=None, pos=None):
510505
self.arrange_ports(padding_y=35.0)
511506
self.offset_ports(0.0, 15.0)
512507

508+
# set initial node position.
509+
if pos:
510+
self.xy_pos = pos
511+
513512
@property
514513
def icon(self):
515514
return self._properties['icon']

NodeGraphQt/widgets/viewer.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,9 @@ def mousePressEvent(self, event):
166166
node.selected = not node.selected
167167

168168
# update the recorded node positions.
169-
self._node_positions.update({n: n.pos for n in self.selected_nodes()})
169+
self._node_positions.update(
170+
{n: n.xy_pos for n in self.selected_nodes()}
171+
)
170172

171173
# show selection selection marquee
172174
if self.LMB_state and not items:
@@ -197,7 +199,9 @@ def mouseReleaseEvent(self, event):
197199

198200
# find position changed nodes and emit signal.
199201
moved_nodes = {
200-
n: pos for n, pos in self._node_positions.items() if n.pos != pos}
202+
n: xy_pos for n, xy_pos in self._node_positions.items()
203+
if n.xy_pos != xy_pos
204+
}
201205
if moved_nodes:
202206
self.moved_nodes.emit(moved_nodes)
203207

@@ -313,7 +317,7 @@ def sceneMousePressEvent(self, event):
313317

314318
# record the node positions at selection time.
315319
for n in node_items:
316-
self._node_positions[n] = n.pos
320+
self._node_positions[n] = n.xy_pos
317321

318322
# emit selected node id with LMB.
319323
if event.button() == QtCore.Qt.LeftButton:

docs/_images/example_result.png

35.9 KB
Loading

docs/overview.rst

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,12 @@ see also: :ref:`Menu & Commands`
5454
Example
5555
=======
5656

57-
A basic example snippet.
57+
Here's a basic example for creating two nodes and connecting them together.
58+
59+
.. image:: _images/example_result.png
60+
:width: 60%
61+
62+
example code:
5863

5964
.. code-block:: python
6065
:linenos:
@@ -101,7 +106,7 @@ A basic example snippet.
101106
102107
# create two nodes.
103108
node_a = graph.create_node('com.chantasticvfx.FooNode', name='node A')
104-
node_b = graph.create_node('com.chantasticvfx.FooNode', name='node B')
109+
node_b = graph.create_node('com.chantasticvfx.FooNode', name='node B', pos=(300, 50))
105110
106111
# connect node_a to node_b
107112
node_a.set_output(0, node_b.input(2))

0 commit comments

Comments
 (0)