schrodinger.ui.qt.network_views module

schrodinger.ui.qt.network_views.calculateArrow(end_point, arrow_end_point, mag=4, skew=4)

Calculate how to draw an arrow at the end_point of a line, this requires the line’s other endpoint so that we know the angle at which the arrow is to be drawn.

Returns

a QPolygonF containing the arrow

Parameters

mag (int) – controls the magnitude of the arrow head smaller value smaller smaller head

class schrodinger.ui.qt.network_views.NetworkNode(model, network)

Bases: PyQt6.QtWidgets.QGraphicsRectItem

This is an abstract class for the Node’s of the graph, you can subclass from this class to render the data “val”, whatever it may be.

model_scale = 1200
default_size_factor = 50
__init__(model, network)
Parameters
  • model – the model node corresponding to this view node

  • network (NetworkViewer) – the graph view to which this node view belongs

getEdges()

Retrieve all the edges connected to this node.

syncModel()
scalePosToModel(pos)
scalePosFromModel(pos)
contextMenuEvent(e)

This is triggered when right clicking on a node

hoverEnterEvent(self, event: Optional[QGraphicsSceneHoverEvent])
hoverLeaveEvent(self, event: Optional[QGraphicsSceneHoverEvent])
mousePressEvent(e)

Accept mouse events so that selection doesnt get lost (QTBUG-10138)

Without this fix, when context menu is up, mouse events get propagated to the parent and it behaves as if you did not click on a node. This causes th

mouseMoveEvent(e)

Move the item and tell the network to redraw connection lines

mouseDoubleClickEvent(self, event: Optional[QGraphicsSceneMouseEvent])
mouseReleaseEvent(self, event: Optional[QGraphicsSceneMouseEvent])
centerPos()
paint(self, painter: Optional[QPainter], option: Optional[QStyleOptionGraphicsItem], widget: Optional[QWidget] = None)
class schrodinger.ui.qt.network_views.TextNetworkNode(model, network, text_attr=None)

Bases: schrodinger.ui.qt.network_views.NetworkNode

Network node that optionally displays the string representation of a node attribute as text.

text_y_pos = 150
text_size = 100
text_offset = 5
__init__(model, network, text_attr=None)
Parameters
  • model – the model node corresponding to this view node

  • network (NetworkViewer) – the graph view to which this node view belongs

  • text_attr (str or NoneType) – the name of the model node attribute which will be used as the source of the text for this view node (optional)

syncModel()
class schrodinger.ui.qt.network_views.PosTextNetworkNode(model, network, text_attr=None)

Bases: schrodinger.ui.qt.network_views.TextNetworkNode

text_size = 50
syncModel()
mouseMoveEvent(e)

Move the item and tell the network to redraw connection lines

class schrodinger.ui.qt.network_views.SmilesNetworkNode(x, y, val, allow_movement, text='')

Bases: schrodinger.ui.qt.network_views.TextNetworkNode

This renders the input variable ‘val’ as a 2D-Structure, assuming it’s a smiles that can be converted to a 2d structure.

text_y_pos = 10000
text_size = 60
__init__(x, y, val, allow_movement, text='')
Parameters
  • model – the model node corresponding to this view node

  • network (NetworkViewer) – the graph view to which this node view belongs

  • text_attr (str or NoneType) – the name of the model node attribute which will be used as the source of the text for this view node (optional)

class schrodinger.ui.qt.network_views.NetworkConnectionLabel(*args, **kwargs)

Bases: PyQt6.QtWidgets.QGraphicsTextItem

__init__(*args, **kwargs)
class schrodinger.ui.qt.network_views.NetworkEdge(node1, node2, network, dotted=False, opacity=1.0, label=None)

Bases: PyQt6.QtWidgets.QGraphicsPathItem

Right now this is just like a regular line, but will allow for extension to avoid connection/node intersections if so desired in the future.

__init__(node1, node2, network, dotted=False, opacity=1.0, label=None)
property model_edge
Returns

the model edge corresponding with this view edge

Return type

Edge

getOtherNode(node)
syncModel()
setLabel(text, html=False)

Show text along edge :param text: label text :type text: str

setArrowhead(enable, head_node=None)
showBadEdge(is_bad)

Mark this edge as ‘bad’. It will be shown with red color.

Parameters

is_bad (bool) – True or False to indicate whether this edge is ‘bad’.

mouseDoubleClickEvent(self, event: Optional[QGraphicsSceneMouseEvent])
hoverEnterEvent(self, event: Optional[QGraphicsSceneHoverEvent])
hoverLeaveEvent(self, event: Optional[QGraphicsSceneHoverEvent])
contextMenuEvent(e)

This is triggered when right clicking on an edge

boundingRect(self) QRectF
paint(self, painter: Optional[QPainter], option: Optional[QStyleOptionGraphicsItem], widget: Optional[QWidget] = None)
recalculateShape()

This function recalculates the shape (line, perhaps with arrow) to draw for the connection between two nodes.

nodeIntersectionPoint(node)
schrodinger.ui.qt.network_views.intersect_line_and_rect(line, rect)

Returns the intersection point of a line and 4 line segments, if it intersects multiple segments, only one intersection will be returned.

class schrodinger.ui.qt.network_views.NetworkViewer(node_class=<class 'schrodinger.ui.qt.network_views.NetworkNode'>, parent=None, model=None)

Bases: schrodinger.ui.qt.network_visualizer.AbstractNetworkView, PyQt6.QtWidgets.QWidget

A network diagram representation of the model.

pickingModeChanged

pyqtSignal(*types, name: str = …, revision: int = …, arguments: Sequence = …) -> PYQT_SIGNAL

types is normally a sequence of individual types. Each type is either a type object or a string that is the name of a C++ type. Alternatively each type could itself be a sequence of types each describing a different overloaded signal. name is the optional C++ name of the signal. If it is not specified then the name of the class attribute that is bound to the signal is used. revision is the optional revision of the signal that is exported to QML. If it is not specified then 0 is used. arguments is the optional sequence of the names of the signal’s arguments.

stopPickingConnection

pyqtSignal(*types, name: str = …, revision: int = …, arguments: Sequence = …) -> PYQT_SIGNAL

types is normally a sequence of individual types. Each type is either a type object or a string that is the name of a C++ type. Alternatively each type could itself be a sequence of types each describing a different overloaded signal. name is the optional C++ name of the signal. If it is not specified then the name of the class attribute that is bound to the signal is used. revision is the optional revision of the signal that is exported to QML. If it is not specified then 0 is used. arguments is the optional sequence of the names of the signal’s arguments.

__init__(node_class=<class 'schrodinger.ui.qt.network_views.NetworkNode'>, parent=None, model=None)
getSignalsAndSlots(model)

Get a list of signal/slot pairs for a model. This list will be used when setting a new model to disconnect the old model signals from their slots and connect the new model’s signals to those slots.

Override this method to modify or extend signals/slots in derived classes.

Parameters

model (Graph) – the graph model

setModel(model, fit=True)
Parameters

fit (bool) – whether to fit the zoom to the new model

makeNodes(nodes)

Create new view nodes and return a dictionary mapping supplied model nodes to corresponding view nodes. Do not add new view nodes to the view.

By default this method returns an “identity dictionary” that maps nodes to themselves. Subclasses should override this method to implement their own view nodes.

Parameters

nodes (list(Node)) – model nodes

Returns

a dictionary mapping supplied nodes to view nodes

Return type

dict(Node, object)

addNodes(viewnodes)

Takes view nodes and adds them to the view if that makes sense (eg. add graphics items to scene, add rows to table, etc.) It should not add the view node to self.nodes; that is handled in _addNodes().

Parameters

viewnodes (list(object)) – view nodes to add to the view

removeNodes(viewnodes)

Removes view nodes from the view if that makes sense (eg. remove graphics items from scene, remove table rows, etc.) It should not remove view nodes from self.nodes; that is handled in _removeNodes().

Parameters

viewnodes (list(object)) – a list of view nodes

updateNodes(nodes)

Performs any operations necessary to update the view to the current model state. Note that this method takes model nodes, not view nodes.

Parameters

nodes (list(Node)) – model nodes which must have their views updated

makeEdges(edges)

Given a list of model edges, return a dictionary mapping them to corresponding view edges. Does not add view edges to the view.

By default this method returns an identity dictionary, mapping model edges to themselves. Subclasses should override this method if they want to implement their own view edges.

Parameters

edges – a list model nodes

Returns

a dictionary mapping model edges to view edges

Return type

dict(Edge, object)

addEdges(viewedges)

Adds view edges to the view. Does not add view edges to self.edges.

Parameters

viewedges (list(object)) – view edges to add to the view

removeEdges(viewedges)

Removes view edges from the view. Does not remove view edges from self.edges.

Parameters

viewedges (list(object)) – view edges to remove from the view

updateEdges(edges)

Performs any operations necessary to update the view to the current model state.

Parameters

edges (list(Edge)) – a list of model edges corresponding to view edges that should be updated

selectItems(selected_view_objects)

Selects view objects in the view. Currently only view nodes will be requested, but may be expanded to allow a combination of nodes and edges to be selected.

Parameters

selected_view_objects (list(object)) – a list of view objects to be selected

nodeMenu(e, node)

Override this to create a node context menu

edgeMenu(e, edge)

Shows edge context menu. Override this function in derived class.

edgeHovered(edge)

Override this for connection hover behavior

edgeUnhovered(edge)

Override this for connection hover behavior

exploreEdge(edge)

Override this for edge context menu behavior.

nodeHovered(hovered_node)

When a node is hovered, the all nodes with degree of separation greater than 1 are dimmed in order to highlight the immediate neighbors.

nodeUnhovered(hovered_node)

When a node is unhovered, return the dimmed nodes to the normal state.

setNodesOpacity(nodes, opacity)

Change the opacity of a set of nodes and their edges.

Parameters
  • nodes (iterable of NetworkNode) – the nodes to change opacity

  • opacity (float) – opacity value from 0 to 1.

calcItemZoomFactor(item)

Calculates the raw zoom factor necessary for the specified item to fill most of the view

Parameters

item (QtWidgets.QGraphicsItem) – the item to fit in the view

calcFitZoomFactor()

Calculates a raw zoom factor for the view to fit all the items in the scene

zoomItem(item)

Zoom into a specific item with animation. :param item: item to zoom :type item: QGraphicsItem

mouseMoveEvent(e)

If we’re picking and the mouse is moving then update the path of the arrow which is used for picking.

createEdge(vnode1, vnode2)

MVC “controller” function to add a new edge to the graph between node1 and node2. This can be overridden to implement other edge creation functionality.

Parameters
selectedNodes()

Get a list of currently selected view nodes

selectedEdges()

Get a list of currently selected view edges

onSelectionChanged()

This is used to process UI changes in selection and updating the model from the view selection. This is not for synchronizing the view to the model selection. For that, use self.syncSelection().

setPickingMode(state)

Begins picking nodes to add connections, can be connected to a checkbox. If a python checkbox is connected with “toggled(bool)” to this, the checkbox also needs to have a slot to turn the checkbox off which will be connected to the signal: SIGNAL(“stopPickingConnection()”) This is emitted once a connection has been created and the checkbox should be turned off.

deleteSelectedItems()

Process item deletion request. Deletions are done in the model only; the view is not modified here. Changing the model will automatically result in a corresponding update to the view.

onKeyPressed(e)
setAllowMovement(val)

Allow nodes to be moved with click+drag

setNodeDeletion(val)

Enable deletion of nodes

setNetworkNodeDefaultClass(cl)

Set the default view node class for

getFitRect(node_set=None)

Calculate the rectangle that contains the nodes. If a node_set is specified, only those nodes will be considered. Otherwise, all nodes will be used. This function takes into account the size of the nodes.

Parameters

node_set (iterable) – a subset of nodes to fit

expandToNodes()

Expand the scene to fit all nodes

setDefaultScale()

This zooms to fits all nodes and sets the default scale

scaleSmoother(val)

Sets the scale between self.start_scale and self.finish_scale, based on ‘val’, which goes from 0->1 as the animation proceeds.

setRawScale(scale)

Sets the scale using the actual multipliers QT does. We use a QTimeLine to do this as an animation. The “finish_scale” is always set here, whether the timeline is already zooming or not, so that it’ll always zoom as far as the users last scroll desired.

setScale(val)

Accepts any scale value in [0, 100]