From 2d503714f27eeb3a3125c1f86ea9652838a6809e Mon Sep 17 00:00:00 2001 From: Johnny Chan Date: Wed, 16 Dec 2020 17:32:20 +1300 Subject: [PATCH 1/2] addressed issue #173 - pep8 clean up. - added more doc strings. - updated docs. --- NodeGraphQt/base/graph.py | 24 ++++++++++--- NodeGraphQt/base/port.py | 3 ++ NodeGraphQt/constants.py | 3 ++ NodeGraphQt/widgets/node_publish_widget.py | 3 +- NodeGraphQt/widgets/viewer.py | 37 ++++++++++++++++++++- README.md | 4 +++ docs/_images/menu_hotkeys.png | Bin 64647 -> 64647 bytes docs/_images/pipe_layout_menu.png | Bin 0 -> 4218 bytes docs/_images/pipe_layout_types.gif | Bin 0 -> 37086 bytes docs/conf.py | 2 +- docs/examples/ex_node.rst | 2 ++ docs/examples/ex_pipe.rst | 35 +++++++++++++++++++ docs/index.rst | 1 + docs/node_widgets.rst | 25 ++++++++++++-- 14 files changed, 130 insertions(+), 9 deletions(-) create mode 100644 docs/_images/pipe_layout_menu.png create mode 100644 docs/_images/pipe_layout_types.gif create mode 100644 docs/examples/ex_pipe.rst diff --git a/NodeGraphQt/base/graph.py b/NodeGraphQt/base/graph.py index 932b8247..913a109e 100644 --- a/NodeGraphQt/base/graph.py +++ b/NodeGraphQt/base/graph.py @@ -502,7 +502,7 @@ def close(self): def viewer(self): """ - Returns the view interface used by the node graph. + Returns the internal view interface used by the node graph. Warnings: Methods in the ``NodeViewer`` are used internally @@ -572,8 +572,17 @@ def set_grid_mode(self, mode=VIEWER_GRID_LINES): """ Set node graph grid mode. + Note: + By default grid mode is set to "VIEWER_GRID_LINES". + + Node graph background types: + + * :attr:`NodeGraphQt.constants.VIEWER_GRID_NONE` + * :attr:`NodeGraphQt.constants.VIEWER_GRID_DOTS` + * :attr:`NodeGraphQt.constants.VIEWER_GRID_LINES` + Args: - mode: VIEWER_GRID_LINES/VIEWER_GRID_DOTS/VIEWER_GRID_NONE. + mode (int): background styles. """ self.scene().grid_mode = mode self._viewer.force_update() @@ -734,8 +743,11 @@ def set_pipe_style(self, style=PIPE_LAYOUT_CURVED): """ Set node graph pipes to be drawn as straight, curved or angled. + .. image:: _images/pipe_layout_types.gif + :width: 80% + Note: - By default all pipes are set curved. + By default pipe layout is set to "PIPE_LAYOUT_CURVED". Pipe Layout Styles: @@ -1239,6 +1251,7 @@ def _deserialize(self, data, relative_pos=False, pos=None, set_parent=True): Args: data (dict): node data. relative_pos (bool): position node relative to the cursor. + pos (tuple or list): custom x, y position. set_parent (bool): set node parent to current node space. Returns: @@ -1280,7 +1293,10 @@ def _deserialize(self, data, relative_pos=False, pos=None, set_parent=True): self.add_node(node, n_data.get('pos'), unique_name=set_parent) if n_data.get('dynamic_port', None): - node.set_ports({'input_ports': n_data['input_ports'], 'output_ports': n_data['output_ports']}) + node.set_ports({ + 'input_ports': n_data['input_ports'], + 'output_ports': n_data['output_ports'] + }) # build the connections. for connection in data.get('connections', []): diff --git a/NodeGraphQt/base/port.py b/NodeGraphQt/base/port.py index 29aaeee3..05122efc 100644 --- a/NodeGraphQt/base/port.py +++ b/NodeGraphQt/base/port.py @@ -145,6 +145,9 @@ def connect_to(self, port=None): if not port: return + if self in port.connected_ports(): + return + graph = self.node().graph viewer = graph.viewer() diff --git a/NodeGraphQt/constants.py b/NodeGraphQt/constants.py index b2ebc962..317ea4a5 100644 --- a/NodeGraphQt/constants.py +++ b/NodeGraphQt/constants.py @@ -88,8 +88,11 @@ # === NODE VIEWER === +#: Style to render the node graph background with nothing. VIEWER_GRID_NONE = 0 +#: Style to render the node graph background with dots. VIEWER_GRID_DOTS = 1 +#: Style to render the node graph background with grid lines. VIEWER_GRID_LINES = 2 VIEWER_BG_COLOR = (35, 35, 35) diff --git a/NodeGraphQt/widgets/node_publish_widget.py b/NodeGraphQt/widgets/node_publish_widget.py index c46a9cb0..4c5ebb9f 100644 --- a/NodeGraphQt/widgets/node_publish_widget.py +++ b/NodeGraphQt/widgets/node_publish_widget.py @@ -1,6 +1,7 @@ +import os + from .properties import PropFileSavePath from .. import QtWidgets -import os class _element_widget(QtWidgets.QWidget): diff --git a/NodeGraphQt/widgets/viewer.py b/NodeGraphQt/widgets/viewer.py index 6fe3708d..e9801ecf 100644 --- a/NodeGraphQt/widgets/viewer.py +++ b/NodeGraphQt/widgets/viewer.py @@ -23,7 +23,7 @@ class NodeViewer(QtWidgets.QGraphicsView): """ The widget interface used for displaying the scene and nodes. - functions in this class are called by the + functions in this class should mainly be called by the class:`NodeGraphQt.NodeGraph` class. """ @@ -665,6 +665,13 @@ def apply_live_connection(self, event): self.end_live_connection() return + # end connection if starting port is already connected. + if self._start_port.multi_connection and \ + self._start_port in end_port.connected_ports: + self._detached_port = None + self.end_live_connection() + return + # register as disconnected if not acyclic. if self.acyclic and not self.acyclic_check(self._start_port, end_port): if self._detached_port: @@ -814,6 +821,16 @@ def message_dialog(text, title='Node Graph'): BaseDialog.message_dialog(text, title) def load_dialog(self, current_dir=None, ext=None): + """ + Prompt node viewer file load dialog widget. + + Args: + current_dir (str): directory path starting point. (optional) + ext (str): custom file extension filter type. (optional) + + Returns: + str: selected file path. + """ ext = '*{} '.format(ext) if ext else '' ext_filter = ';;'.join([ 'Node Graph ({}*json)'.format(ext), 'All Files (*)' @@ -824,6 +841,16 @@ def load_dialog(self, current_dir=None, ext=None): return file def save_dialog(self, current_dir=None, ext=None): + """ + Prompt node viewer file save dialog widget. + + Args: + current_dir (str): directory path starting point. (optional) + ext (str): custom file extension filter type. (optional) + + Returns: + str: selected file path. + """ ext_label = '*{} '.format(ext) if ext else '' ext_type = '.{}'.format(ext) if ext else '.json' ext_map = {'Node Graph ({}*json)'.format(ext_label): ext_type, @@ -924,6 +951,14 @@ def remove_node(node): node.delete() def move_nodes(self, nodes, pos=None, offset=None): + """ + Globally move specified nodes. + + Args: + nodes (list[AbstractNodeItem]): node items. + pos (tuple or list): custom x, y position. + offset (tuple or list): x, y position offset. + """ group = self.scene().createItemGroup(nodes) group_rect = group.boundingRect() if pos: diff --git a/README.md b/README.md index 6a5e8baf..8b32e586 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,10 @@ applications that supports PySide2. #### Vertical Layout +#### Pipe Layout + + + #### Example ```python diff --git a/docs/_images/menu_hotkeys.png b/docs/_images/menu_hotkeys.png index 00824e1fa5395659097a6e560660c2ce7d1700b9..cf3b312aab881b82965846963ceeb7898949307d 100644 GIT binary patch delta 23016 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 delta 23016 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 BN|OKp literal 0 HcmV?d00001 diff --git a/docs/_images/pipe_layout_types.gif b/docs/_images/pipe_layout_types.gif new file mode 100644 index 0000000000000000000000000000000000000000..4bd6b54e7055a5274eb279d82f48635dc5faf923 GIT binary patch literal 37086 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 literal 0 HcmV?d00001 diff --git a/docs/conf.py b/docs/conf.py index 434c88ba..b9a4ae05 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -162,7 +162,7 @@ # author, documentclass [howto, manual, or own class]). latex_documents = [ (master_doc, 'NodeGraphQT.tex', 'NodeGraphQt Documentation', - 'Johnny Chan', 'manual'), + author, 'manual'), ] diff --git a/docs/examples/ex_node.rst b/docs/examples/ex_node.rst index 710afe8c..0c6e74a9 100644 --- a/docs/examples/ex_node.rst +++ b/docs/examples/ex_node.rst @@ -75,6 +75,8 @@ To you update the widget you can call the :meth:`NodeGraphQt.NodeObject.set_prop - ``QCheckBox``: :meth:`NodeGraphQt.BaseNode.add_checkbox` - ``QLineEdit``: :meth:`NodeGraphQt.BaseNode.add_text_input` +See: :ref:`Node Widgets` for more node widget types. + Connecting Nodes **************** diff --git a/docs/examples/ex_pipe.rst b/docs/examples/ex_pipe.rst new file mode 100644 index 00000000..152bd477 --- /dev/null +++ b/docs/examples/ex_pipe.rst @@ -0,0 +1,35 @@ +Pipe Examples +############# + +Example Pipe Layouts +******************** + +.. image:: ../_images/pipe_layout_types.gif + :width: 650px + +The :class:`NodeGraphQt.NodeGraph` class has 3 different pipe layout styles as +shown above this can be set easily with the :meth:`NodeGraphQt.NodeGraph.set_pipe_style` +function. + +Here's a super simple example snippet for setting the pipe layout style to be angled. + +.. code-block:: python + :linenos: + + from NodeGraphQt import NodeGraph + from NodeGraphQt.constants import PIPE_LAYOUT_ANGLE + + graph = NodeGraph() + graph.set_pipe_style(PIPE_LAYOUT_ANGLE) + +Constants variables for the 3 different pipe layout styles: + + - ``Curved``: :attr:`NodeGraphQt.constants.PIPE_LAYOUT_CURVED` + - ``Straight``: :attr:`NodeGraphQt.constants.PIPE_LAYOUT_STRAIGHT` + - ``Angle``: :attr:`NodeGraphQt.constants.PIPE_LAYOUT_ANGLE` + +Note: if you've set up your node graph with the ``NodeGraphQt.setup_context_menu`` +is a convenience function then you'll already have the actions to set the pipe +layout under "Edit>Pipe". + +.. image:: ../_images/pipe_layout_menu.png \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index 409a3abd..4d1e9bbc 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -30,4 +30,5 @@ GitHub Project: https://github.com/jchanvfx/NodeGraphQt examples/ex_overview examples/ex_node examples/ex_port + examples/ex_pipe examples/ex_menu diff --git a/docs/node_widgets.rst b/docs/node_widgets.rst index 5e90e77f..a0d957dd 100644 --- a/docs/node_widgets.rst +++ b/docs/node_widgets.rst @@ -11,6 +11,13 @@ NodeBaseWidget :members: :exclude-members: node, setToolTip, type_, value, widget +NodeCheckBox +************ + +.. autoclass:: NodeGraphQt.widgets.node_widgets.NodeCheckBox + :members: + :exclude-members: widget, type_ + NodeComboBox ************ @@ -25,9 +32,23 @@ NodeLineEdit :members: :exclude-members: widget, type_ -NodeCheckBox +NodeFilePath ************ -.. autoclass:: NodeGraphQt.widgets.node_widgets.NodeCheckBox +.. autoclass:: NodeGraphQt.widgets.node_widgets.NodeFilePath + :members: + :exclude-members: widget, type_ + +NodeFloatEdit +************* + +.. autoclass:: NodeGraphQt.widgets.node_widgets.NodeFloatEdit + :members: + :exclude-members: widget, type_ + +NodeIntEdit +*********** + +.. autoclass:: NodeGraphQt.widgets.node_widgets.NodeIntEdit :members: :exclude-members: widget, type_ From 736dad0297240529e4139a5f296c9ac0c216b6f9 Mon Sep 17 00:00:00 2001 From: jchanvfx Date: Wed, 16 Dec 2020 21:34:53 +1300 Subject: [PATCH 2/2] image sizing fix. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8b32e586..624d515e 100644 --- a/README.md +++ b/README.md @@ -38,11 +38,11 @@ applications that supports PySide2. #### Vertical Layout - + #### Pipe Layout - + #### Example