Skip to content

Commit 0c5277b

Browse files
authored
Merge pull request #312 from jchanvfx/node_port_visibility_#310
updated visibility logic #310
2 parents b7c9810 + 11aa7cf commit 0c5277b

File tree

5 files changed

+119
-26
lines changed

5 files changed

+119
-26
lines changed

NodeGraphQt/base/commands.py

Lines changed: 63 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def __init__(self, node, name, value):
2222
self.old_val = node.get_property(name)
2323
self.new_val = value
2424

25-
def set_node_prop(self, name, value):
25+
def set_node_property(self, name, value):
2626
"""
2727
updates the node view and model.
2828
"""
@@ -47,21 +47,60 @@ def set_node_prop(self, name, value):
4747
name = 'xy_pos'
4848
setattr(view, name, value)
4949

50+
# emit property changed signal.
51+
graph = self.node.graph
52+
graph.property_changed.emit(self.node, self.name, value)
53+
5054
def undo(self):
5155
if self.old_val != self.new_val:
52-
self.set_node_prop(self.name, self.old_val)
53-
54-
# emit property changed signal.
55-
graph = self.node.graph
56-
graph.property_changed.emit(self.node, self.name, self.old_val)
56+
self.set_node_property(self.name, self.old_val)
5757

5858
def redo(self):
5959
if self.old_val != self.new_val:
60-
self.set_node_prop(self.name, self.new_val)
60+
self.set_node_property(self.name, self.new_val)
6161

62-
# emit property changed signal.
63-
graph = self.node.graph
64-
graph.property_changed.emit(self.node, self.name, self.new_val)
62+
63+
class NodeVisibleCmd(QtWidgets.QUndoCommand):
64+
"""
65+
Node visibility changed command.
66+
67+
Args:
68+
node (NodeGraphQt.NodeObject): node.
69+
visible (bool): node visible value.
70+
"""
71+
72+
def __init__(self, node, visible):
73+
QtWidgets.QUndoCommand.__init__(self)
74+
self.node = node
75+
self.visible = visible
76+
self.selected = self.node.selected()
77+
78+
def set_node_visible(self, visible):
79+
model = self.node.model
80+
model.set_property('visible', visible)
81+
82+
node_view = self.node.view
83+
node_view.setVisible(visible)
84+
85+
# redraw the connected pipes in the scene.
86+
ports = node_view.inputs + node_view.outputs
87+
for port in ports:
88+
for pipe in port.connected_pipes:
89+
pipe.update()
90+
91+
# restore the node selected state.
92+
if self.selected != node_view.isSelected():
93+
node_view.setSelected(model.selected)
94+
95+
# emit property changed signal.
96+
graph = self.node.graph
97+
graph.property_changed.emit(self.node, 'visible', visible)
98+
99+
def undo(self):
100+
self.set_node_visible(not self.visible)
101+
102+
def redo(self):
103+
self.set_node_visible(self.visible)
65104

66105

67106
class NodeMovedCmd(QtWidgets.QUndoCommand):
@@ -347,10 +386,14 @@ class PortVisibleCmd(QtWidgets.QUndoCommand):
347386
port (NodeGraphQt.Port): node port.
348387
"""
349388

350-
def __init__(self, port):
389+
def __init__(self, port, visible):
351390
QtWidgets.QUndoCommand.__init__(self)
352391
self.port = port
353-
self.visible = port.visible()
392+
self.visible = visible
393+
if visible:
394+
self.setText('show port {}'.format(self.port.name()))
395+
else:
396+
self.setText('hide port {}'.format(self.port.name()))
354397

355398
def set_visible(self, visible):
356399
self.port.model.visible = visible
@@ -363,7 +406,14 @@ def set_visible(self, visible):
363406
text_item = node_view.get_output_text_item(self.port.view)
364407
if text_item:
365408
text_item.setVisible(visible)
366-
node_view.post_init()
409+
410+
node_view.draw_node()
411+
412+
# redraw the connected pipes in the scene.
413+
ports = node_view.inputs + node_view.outputs
414+
for port in node_view.inputs + node_view.outputs:
415+
for pipe in port.connected_pipes:
416+
pipe.update()
367417

368418
def undo(self):
369419
self.set_visible(not self.visible)

NodeGraphQt/base/port.py

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -107,23 +107,20 @@ def visible(self):
107107
"""
108108
return self.model.visible
109109

110-
def set_visible(self, visible=True):
110+
def set_visible(self, visible=True, push_undo=True):
111111
"""
112112
Sets weather the port should be visible or not.
113113
114114
Args:
115115
visible (bool): true if visible.
116+
push_undo (bool): register the command to the undo stack. (default: True)
116117
"""
117-
self.model.visible = visible
118-
label = 'show' if visible else 'hide'
119-
undo_stack = self.node().graph.undo_stack()
120-
undo_stack.beginMacro('{} port {}'.format(label, self.name()))
121-
122-
for port in self.connected_ports():
123-
undo_stack.push(PortDisconnectedCmd(self, port))
124-
125-
undo_stack.push(PortVisibleCmd(self))
126-
undo_stack.endMacro()
118+
undo_cmd = PortVisibleCmd(self, visible)
119+
if push_undo:
120+
undo_stack = self.node().graph.undo_stack()
121+
undo_stack.push(undo_cmd)
122+
else:
123+
undo_cmd.redo()
127124

128125
def locked(self):
129126
"""

NodeGraphQt/nodes/base_node.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#!/usr/bin/python
22
from collections import OrderedDict
33

4+
from NodeGraphQt.base.commands import NodeVisibleCmd
45
from NodeGraphQt.base.node import NodeObject
56
from NodeGraphQt.base.port import Port
67
from NodeGraphQt.constants import NodePropWidgetEnum, PortTypeEnum
@@ -68,6 +69,34 @@ def update_model(self):
6869
for name, widget in self.view.widgets.items():
6970
self.model.set_property(name, widget.get_value())
7071

72+
def set_property(self, name, value, push_undo=True):
73+
"""
74+
Set the value on the node custom property.
75+
76+
Note:
77+
When setting the `"visible"` property to `False` all node
78+
connections will be disconnected.
79+
80+
Args:
81+
name (str): name of the property.
82+
value (object): property data (python built in types).
83+
push_undo (bool): register the command to the undo stack. (default: True)
84+
"""
85+
# prevent signals from causing a infinite loop.
86+
if self.get_property(name) == value:
87+
return
88+
89+
if name == 'visible':
90+
if self.graph:
91+
undo_cmd = NodeVisibleCmd(self, value)
92+
if push_undo:
93+
undo_stack = self.graph.undo_stack()
94+
undo_stack.push(undo_cmd)
95+
else:
96+
undo_cmd.redo()
97+
return
98+
super(BaseNode, self).set_property(name, value, push_undo)
99+
71100
def set_layout_direction(self, value=0):
72101
"""
73102
Sets the node layout direction to either horizontal or vertical on

NodeGraphQt/qgraphics/node_base.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -640,9 +640,11 @@ def _draw_node_horizontal(self):
640640

641641
# update port text items in visibility.
642642
for port, text in self._input_items.items():
643-
text.setVisible(port.display_name)
643+
if port.isVisible():
644+
text.setVisible(port.display_name)
644645
for port, text in self._output_items.items():
645-
text.setVisible(port.display_name)
646+
if port.isVisible():
647+
text.setVisible(port.display_name)
646648

647649
# setup initial base size.
648650
self._set_base_size(add_h=height)

NodeGraphQt/qgraphics/pipe.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,21 @@ def paint(self, painter, option, widget):
7373
used to describe the parameters needed to draw.
7474
widget (QtWidgets.QWidget): not used.
7575
"""
76+
77+
# only draw if a port or node is visible.
78+
is_visible = all([
79+
self._input_port.isVisible(),
80+
self._output_port.isVisible(),
81+
self._input_port.node.isVisible(),
82+
self._output_port.node.isVisible()
83+
])
84+
if not is_visible:
85+
painter.save()
86+
painter.setBrush(QtCore.Qt.NoBrush)
87+
painter.setPen(QtCore.Qt.NoPen)
88+
painter.restore()
89+
return
90+
7691
color = QtGui.QColor(*self._color)
7792
pen_style = PIPE_STYLES.get(self.style)
7893
pen_width = PipeEnum.WIDTH.value

0 commit comments

Comments
 (0)