11#!/usr/bin/python
2+ # -*- coding: utf-8 -*-
23import json
34import os
45import re
1314from NodeGraphQt .base .model import NodeGraphModel
1415from NodeGraphQt .base .node import NodeObject
1516from NodeGraphQt .base .port import Port
17+ from NodeGraphQt .constants import DRAG_DROP_ID
18+ from NodeGraphQt .widgets .node_list import NodeListWidget
1619from NodeGraphQt .widgets .properties_bin import PropertiesBinWidget
1720from NodeGraphQt .widgets .viewer import NodeViewer
1821
@@ -45,7 +48,9 @@ def __init__(self, parent=None, tab_search_key='tab'):
4548 self ._viewer = NodeViewer (parent )
4649 self ._node_factory = NodeFactory ()
4750 self ._undo_stack = QtWidgets .QUndoStack (self )
48- self ._properties_bin = PropertiesBinWidget ()
51+
52+ self ._properties_bin = None
53+ self ._nodes_list = None
4954
5055 tab = QtWidgets .QAction ('Search Nodes' , self )
5156 tab .setShortcut (tab_search_key )
@@ -65,10 +70,6 @@ def _wire_signals(self):
6570 self ._viewer .node_selected .connect (self ._on_node_selected )
6671 self ._viewer .data_dropped .connect (self ._on_node_data_dropped )
6772
68- # wire up properties bin widget.
69- self ._properties_bin .property_changed .connect (
70- self ._on_property_changed )
71-
7273 def _toggle_tab_search (self ):
7374 """
7475 toggle the tab search widget.
@@ -99,7 +100,8 @@ def _on_node_double_clicked(self, node_id):
99100 node_id (str): node id emitted by the viewer.
100101 """
101102 node = self .get_node_by_id (node_id )
102- self ._properties_bin .add_node (node )
103+ if self ._properties_bin :
104+ self ._properties_bin .add_node (node )
103105
104106 self .node_double_clicked .emit (node )
105107
@@ -122,6 +124,18 @@ def _on_node_data_dropped(self, data, pos):
122124 data (QtCore.QMimeData): mime data.
123125 pos (QtCore.QPoint): scene position relative to the drop.
124126 """
127+
128+ # don't emit signal for internal widget drops.
129+ if data .hasFormat ('text/plain' ):
130+ if data .text ().startswith ('<${}>:' .format (DRAG_DROP_ID )):
131+ node_ids = data .text ()[len ('<${}>:' .format (DRAG_DROP_ID )):]
132+ x , y = pos .x (), pos .y ()
133+ for node_id in node_ids .split (',' ):
134+ self .create_node (node_id , pos = [x , y ])
135+ x += 20
136+ y += 20
137+ return
138+
125139 self .data_dropped .emit (data , pos )
126140
127141 def _on_nodes_moved (self , node_data ):
@@ -222,13 +236,31 @@ def scene(self):
222236
223237 def properties_bin (self ):
224238 """
225- Return the node properties bin widget.
239+ Initializes the node properties bin widget when first called .
226240
227241 Returns:
228- PropBinWidget: widget.
229- """
242+ PropBinWidget: the initialized widget.
243+ """
244+ if self ._properties_bin is None :
245+ self ._properties_bin = PropertiesBinWidget ()
246+ # wire up widget.
247+ self ._properties_bin .property_changed .connect (
248+ self ._on_property_changed
249+ )
230250 return self ._properties_bin
231251
252+ def nodes_list (self ):
253+ """
254+ Initializes the nodes list widget when first called.
255+
256+ Returns:
257+ NodeListWidget: the initialized widget.
258+ """
259+ if self ._nodes_list is None :
260+ self ._nodes_list = NodeListWidget ()
261+ self ._nodes_list .set_node_factory (self ._node_factory )
262+ return self ._nodes_list
263+
232264 def undo_stack (self ):
233265 """
234266 Returns the undo stack used in the node graph
0 commit comments