Skip to content

Commit 986e210

Browse files
authored
Merge pull request #198 from jchanvfx/backdrop_updates
backdrop node wrap updates.
2 parents fe6279f + 78bf7dc commit 986e210

File tree

8 files changed

+103
-50
lines changed

8 files changed

+103
-50
lines changed

NodeGraphQt/base/graph.py

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from .factory import NodeFactory
1616
from .menu import NodeGraphMenu, NodesMenu
1717
from .model import NodeGraphModel
18-
from .node import NodeObject, BaseNode
18+
from .node import NodeObject, BaseNode, BackdropNode
1919
from .port import Port
2020
from ..constants import (DRAG_DROP_ID,
2121
PIPE_LAYOUT_CURVED,
@@ -182,15 +182,17 @@ def _wire_signals(self):
182182
self._viewer.moved_nodes.connect(self._on_nodes_moved)
183183
self._viewer.node_double_clicked.connect(self._on_node_double_clicked)
184184
self._viewer.node_name_changed.connect(self._on_node_name_changed)
185-
self._viewer.insert_node.connect(self._insert_node)
185+
self._viewer.node_backdrop_updated.connect(
186+
self._on_node_backdrop_updated)
187+
self._viewer.insert_node.connect(self._on_insert_node)
186188

187189
# pass through translated signals.
188190
self._viewer.node_selected.connect(self._on_node_selected)
189191
self._viewer.node_selection_changed.connect(
190192
self._on_node_selection_changed)
191193
self._viewer.data_dropped.connect(self._on_node_data_dropped)
192194

193-
def _insert_node(self, pipe, node_id, prev_node_pos):
195+
def _on_insert_node(self, pipe, node_id, prev_node_pos):
194196
"""
195197
Slot function triggered when a selected node has collided with a pipe.
196198
@@ -344,6 +346,18 @@ def _on_nodes_moved(self, node_data):
344346
self._undo_stack.push(NodeMovedCmd(node, node.pos(), prev_pos))
345347
self._undo_stack.endMacro()
346348

349+
def _on_node_backdrop_updated(self, node_id, update_property, value):
350+
"""
351+
called when a BackdropNode is updated.
352+
353+
Args:
354+
node_id (str): backdrop node id.
355+
value (str): update type.
356+
"""
357+
backdrop = self.get_node_by_id(node_id)
358+
if backdrop and isinstance(backdrop, BackdropNode):
359+
backdrop.on_backdrop_updated(update_property, value)
360+
347361
def _on_search_triggered(self, node_type, pos):
348362
"""
349363
called when the tab search widget is triggered in the viewer.
@@ -859,7 +873,7 @@ def create_node(self, node_type, name=None, selected=True, color=None,
859873
pos (list[int, int]): initial x, y position for the node (default: ``(0, 0)``).
860874
861875
Returns:
862-
NodeGraphQt.BaseNode: the created instance of the node.
876+
NodeGraphQt.NodeObject: the created instance of the node.
863877
"""
864878
if not self._editable:
865879
return
@@ -903,6 +917,7 @@ def format_color(clr):
903917
else:
904918
node.set_parent(None)
905919

920+
# update the node view from model.
906921
node.update()
907922

908923
undo_cmd = NodeAddedCmd(self, node, node.model.pos)

NodeGraphQt/base/model.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,7 @@ def set_property(self, name, value):
160160
elif name in self._custom_prop.keys():
161161
self._custom_prop[name] = value
162162
else:
163-
self.add_property(name, value)
164-
# raise NodePropertyError('No property "{}"'.format(name))
163+
raise NodePropertyError('No property "{}"'.format(name))
165164

166165
def get_property(self, name):
167166
if name in self.properties.keys():

NodeGraphQt/base/node.py

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
#!/usr/bin/python
2+
from collections import OrderedDict
3+
24
from .commands import PropertyChangedCmd
35
from .model import NodeModel
46
from .port import Port
@@ -1107,7 +1109,7 @@ def connected_input_nodes(self):
11071109
Returns:
11081110
dict: {<input_port>: <node_list>}
11091111
"""
1110-
nodes = {}
1112+
nodes = OrderedDict()
11111113
for p in self.input_ports():
11121114
nodes[p] = [cp.node() for cp in p.connected_ports()]
11131115
return nodes
@@ -1119,7 +1121,7 @@ def connected_output_nodes(self):
11191121
Returns:
11201122
dict: {<output_port>: <node_list>}
11211123
"""
1122-
nodes = {}
1124+
nodes = OrderedDict()
11231125
for p in self.output_ports():
11241126
nodes[p] = [cp.node() for cp in p.connected_ports()]
11251127
return nodes
@@ -1212,20 +1214,54 @@ def __init__(self):
12121214
self.create_property('backdrop_text', '',
12131215
widget_type=NODE_PROP_QTEXTEDIT, tab='Backdrop')
12141216

1217+
def on_backdrop_updated(self, update_prop, value=None):
1218+
"""
1219+
Slot triggered by the "on_backdrop_updated" signal from
1220+
the node graph.
1221+
1222+
Args:
1223+
update_prop (str): update property type.
1224+
value (object): update value (optional)
1225+
"""
1226+
if update_prop == 'sizer_mouse_release':
1227+
self.graph.begin_undo('resized "{}"'.format(self.name()))
1228+
self.set_property('width', value['width'])
1229+
self.set_property('height', value['height'])
1230+
self.set_pos(*value['pos'])
1231+
self.graph.end_undo()
1232+
elif update_prop == 'sizer_double_clicked':
1233+
self.graph.begin_undo('"{}" auto resize'.format(self.name()))
1234+
self.set_property('width', value['width'])
1235+
self.set_property('height', value['height'])
1236+
self.set_pos(*value['pos'])
1237+
self.graph.end_undo()
1238+
12151239
def auto_size(self):
12161240
"""
12171241
Auto resize the backdrop node to fit around the intersecting nodes.
12181242
"""
1219-
self.view.auto_resize()
1243+
self.graph.begin_undo('"{}" auto resize'.format(self.name()))
1244+
size = self.view.calc_backdrop_size()
1245+
self.set_property('width', size['width'])
1246+
self.set_property('height', size['height'])
1247+
self.set_pos(*size['pos'])
1248+
self.graph.end_undo()
12201249

12211250
def wrap_nodes(self, nodes):
12221251
"""
1223-
Wrap backdrop size to fit around specified nodes.
1252+
Set the backdrop size to fit around specified nodes.
12241253
12251254
Args:
12261255
nodes (list[NodeGraphQt.NodeObject]): list of nodes.
12271256
"""
1228-
self.view.auto_resize([n.view for n in nodes])
1257+
if not nodes:
1258+
return
1259+
self.graph.begin_undo('"{}" wrap nodes'.format(self.name()))
1260+
size = self.view.calc_backdrop_size([n.view for n in nodes])
1261+
self.set_property('width', size['width'])
1262+
self.set_property('height', size['height'])
1263+
self.set_pos(*size['pos'])
1264+
self.graph.end_undo()
12291265

12301266
def nodes(self):
12311267
"""

NodeGraphQt/base/utils.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,10 @@ def setup_context_menu(graph):
8686

8787
edit_menu.add_separator()
8888

89-
edit_menu.add_command('Layout Graph Up Stream', _layout_graph_up, 'L')
90-
edit_menu.add_command('Layout Graph Down Stream', _layout_graph_down, 'Ctrl+L')
89+
edit_menu.add_command(
90+
'Layout Nodes Up Stream', _layout_graph_up, 'L')
91+
edit_menu.add_command(
92+
'Layout Nodes Down Stream', _layout_graph_down, 'Ctrl+L')
9193

9294
edit_menu.add_separator()
9395

NodeGraphQt/qgraphics/node_backdrop.py

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,19 @@ def itemChange(self, change, value):
5353
def mouseDoubleClickEvent(self, event):
5454
item = self.parentItem()
5555
item.on_sizer_double_clicked()
56+
super(BackdropSizer, self).mouseDoubleClickEvent(event)
57+
58+
def mousePressEvent(self, event):
59+
self.__prev_xy = (self.pos().x(), self.pos().y())
60+
super(BackdropSizer, self).mousePressEvent(event)
61+
62+
def mouseReleaseEvent(self, event):
63+
current_xy = (self.pos().x(), self.pos().y())
64+
if current_xy != self.__prev_xy:
65+
item = self.parentItem()
66+
item.on_sizer_pos_mouse_release()
67+
del self.__prev_xy
68+
super(BackdropSizer, self).mouseReleaseEvent(event)
5669

5770
def paint(self, painter, option, widget):
5871
"""
@@ -143,8 +156,18 @@ def on_sizer_pos_changed(self, pos):
143156
self._width = pos.x() + self._sizer.size
144157
self._height = pos.y() + self._sizer.size
145158

159+
def on_sizer_pos_mouse_release(self):
160+
size = {
161+
'pos': self.xy_pos,
162+
'width': self._width,
163+
'height': self._height}
164+
self.viewer().node_backdrop_updated.emit(
165+
self.id, 'sizer_mouse_release', size)
166+
146167
def on_sizer_double_clicked(self):
147-
self.auto_resize()
168+
size = self.calc_backdrop_size()
169+
self.viewer().node_backdrop_updated.emit(
170+
self.id, 'sizer_double_clicked', size)
148171

149172
def paint(self, painter, option, widget):
150173
"""
@@ -217,39 +240,17 @@ def get_nodes(self, inc_intersects=False):
217240
nodes.append(item)
218241
return nodes
219242

220-
def auto_resize(self, nodes=None):
243+
def calc_backdrop_size(self, nodes=None):
221244
nodes = nodes or self.get_nodes(True)
222-
if nodes:
223-
padding = 40
224-
nodes_rect = self._combined_rect(nodes)
225-
self.xy_pos = [nodes_rect.x() - padding, nodes_rect.y() - padding]
226-
self._sizer.set_pos(nodes_rect.width() + (padding * 2),
227-
nodes_rect.height() + (padding * 2))
228-
return
229-
230-
width, height = self._min_size
231-
self._sizer.set_pos(width, height)
232-
233-
def pre_init(self, viewer, pos=None):
234-
"""
235-
Called before node has been added into the scene.
236-
237-
Args:
238-
viewer (NodeGraphQt.widgets.viewer.NodeViewer): main viewer.
239-
pos (tuple): cursor pos.
240-
"""
241-
nodes = viewer.selected_nodes()
242-
if nodes:
243-
padding = 40
244-
scene = viewer.scene()
245-
group = scene.createItemGroup(nodes)
246-
rect = group.boundingRect()
247-
scene.destroyItemGroup(group)
248-
self.xy_pos = [rect.x() - padding, rect.y() - padding]
249-
self._sizer.set_pos(rect.width() + (padding * 2),
250-
rect.height() + (padding * 2))
251-
else:
252-
self.xy_pos = pos
245+
padding = 40
246+
nodes_rect = self._combined_rect(nodes)
247+
return {
248+
'pos': [
249+
nodes_rect.x() - padding, nodes_rect.y() - padding
250+
],
251+
'width': nodes_rect.width() + (padding * 2),
252+
'height': nodes_rect.height() + (padding * 2)
253+
}
253254

254255
@property
255256
def minimum_size(self):

NodeGraphQt/widgets/dialogs.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,5 +64,5 @@ def question_dialog(text, title):
6464
dlg.setStandardButtons(
6565
QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No
6666
)
67-
dlg.exec_()
68-
return bool(dlg == QtWidgets.QMessageBox.Yes)
67+
result = dlg.exec_()
68+
return bool(result == QtWidgets.QMessageBox.Yes)

NodeGraphQt/widgets/stylesheet.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,8 +195,7 @@
195195
'''
196196

197197
STYLE_MESSAGEBOX = '''
198-
QLabel{
199-
min-width:500 px;
198+
QLabel{
200199
font-size: 18px;
201200
background-color: transparent;
202201
color: rgb(200 ,200, 200);

NodeGraphQt/widgets/viewer.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class NodeViewer(QtWidgets.QGraphicsView):
3838
insert_node = QtCore.Signal(object, str, dict)
3939
need_show_tab_search = QtCore.Signal()
4040
node_name_changed = QtCore.Signal(str, str)
41+
node_backdrop_updated = QtCore.Signal(str, str, object)
4142

4243
# pass through signals that are translated into "NodeGraph()" signals.
4344
node_selected = QtCore.Signal(str)

0 commit comments

Comments
 (0)