Skip to content

Commit

Permalink
Add scene items dock and history dock, and test scene history
Browse files Browse the repository at this point in the history
  • Loading branch information
don4get committed Apr 15, 2020
1 parent 6b279c7 commit f7adaee
Show file tree
Hide file tree
Showing 11 changed files with 268 additions and 47 deletions.
2 changes: 1 addition & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ repos:
pass_filenames: false
- id: typing
name: run typing checks
entry: tox -e type
entry: tox -e mypy
language: system
types: [python]
stages: [commit]
Expand Down
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ jobs:
- python: 3.6
env: TOXENV=black
- python: 3.6
env: TOXENV=type
env: TOXENV=mypy
- python: 3.6
env: TOXENV=py36
- python: 3.7
Expand Down
21 changes: 11 additions & 10 deletions nodedge/edge.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
# -*- coding: utf-8 -*-
"""
Edge module containing :class:`~nodedge.edge.Edge` and :class:`~nodedge.edge.EdgeType` class.
"""
"""Edge module containing :class:`~nodedge.edge.Edge` and
:class:`~nodedge.edge.EdgeType` class. """

import logging
from collections import OrderedDict
Expand All @@ -27,7 +26,7 @@ class Edge(Serializable):
"""
Edge class.
The edge is the component connecting two :class:`~nodedge.node.Node`s.
The edge is the component connecting two :class:`~nodedge.node.Node` s.
[NODE 1]------EDGE------[NODE 2]
"""
Expand All @@ -51,10 +50,10 @@ def __init__(
:Instance Attributes:
- **scene** - reference to the :class:`~nodedge.scene.Scene` -
**graphicsEdge** - Instance of
:class:`~nodedge.graphics_edge.GraphicsEdge` subclass handling graphical
representation in the ``QGraphicsScene``.
- **scene** - reference to the :class:`~nodedge.scene.Scene`
- **graphicsEdge**
- Instance of :class:`~nodedge.graphics_edge.GraphicsEdge` subclass
handling graphical representation in the ``QGraphicsScene``.
"""

super().__init__()
Expand Down Expand Up @@ -214,7 +213,8 @@ def updatePos(self) -> None:

def getOtherSocket(self, knownSocket: "Socket"):
"""
Return the opposite :class:`~nodedge.socket.Socket` on this :class:`~nodedge.edge.Edge`.
Return the opposite :class:`~nodedge.socket.Socket` on this
:class:`~nodedge.edge.Edge`.
:param knownSocket: Provide known :class:`~nodedge.socket.Socket` to be able
to determine the opposite one
Expand Down Expand Up @@ -259,7 +259,8 @@ def remove(self, silentForSocket: Optional[Socket] = None, silent: bool = False)

# ugly hack, since I noticed that even when you remove grEdge from scene,
# sometimes it stays there! How dare you Qt!
self.graphicsEdge.hide()
if self.graphicsEdge is not None:
self.graphicsEdge.hide()

self.__logger.debug(f"Removing {self} from all sockets.")
self.removeFromSockets()
Expand Down
8 changes: 4 additions & 4 deletions nodedge/editor_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ def initUI(self):
def hasName(self) -> bool:
"""
:getter: Return if a file has been loaded in this
:class:`~nodedge.editor_widget.EditorWidget` or not.
:class:`~nodedge.editor_widget.EditorWidget` or not.
:rtype: ``bool``
"""
Expand All @@ -82,7 +82,7 @@ def hasName(self) -> bool:
def shortName(self) -> str:
"""
:getter: Return the short name of this
:class:`~nodedge.editor_widget.EditorWidget`.
:class:`~nodedge.editor_widget.EditorWidget`.
:rtype: ``str``
"""
Expand Down Expand Up @@ -115,7 +115,7 @@ def isModified(self) -> bool:
def canUndo(self) -> bool:
"""
:getter: Return whether previously executed operations are saved in history
or not.
or not.
:rtype: ``bool``
"""
Expand All @@ -142,7 +142,7 @@ def selectedItems(self) -> List[QGraphicsItem]:
def hasSelectedItems(self) -> bool:
"""
:getter: Return ``True`` if there is selected items in the
:class:`nodedge.node_scene.Scene`.
:class:`nodedge.node_scene.Scene`.
:rtype: ``bool``
"""
return self.selectedItems != []
Expand Down
2 changes: 1 addition & 1 deletion nodedge/graphics_edge.py
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ def paint(self, painter, QStyleOptionGraphicsItem, widget=None):
Qt's overridden method to paint the edge.
.. note:: The path is calculated in
:func:`~nodedge.graphics_edge.GraphicsEdge.calcPath` method
:func:`~nodedge.graphics_edge.GraphicsEdge.calcPath` method.
"""
self.setPath(self.calcPath())

Expand Down
76 changes: 76 additions & 0 deletions nodedge/mdi_window.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,18 @@
from PyQt5.QtCore import QSignalMapper, Qt
from PyQt5.QtGui import QIcon, QKeySequence
from PyQt5.QtWidgets import (
QAbstractItemView,
QAction,
QDockWidget,
QFileDialog,
QHeaderView,
QListWidget,
QListWidgetItem,
QMdiArea,
QMenu,
QMessageBox,
QTableWidget,
QTableWidgetItem,
QWidget,
)

Expand Down Expand Up @@ -93,6 +99,8 @@ def initUI(self):
self.windowMapper.mapped[QWidget].connect(self.setActiveSubWindow)

self.createNodesDock()
self.createHistoryDock()
self.createSceneItemsDock()

self.createActions()
self.createMenus()
Expand Down Expand Up @@ -318,6 +326,8 @@ def _createMdiSubWindow(self, childWidget=None):
icon = QIcon(".")
subWindow.setWindowIcon(icon)
editor.scene.history.addHistoryModifiedListener(self.updateEditMenu)
editor.scene.history.addHistoryModifiedListener(self.updateHistoryDock)
editor.scene.history.addHistoryModifiedListener(self.updateSceneItemsDock)
editor.addCloseEventListener(self.onSubWindowClosed)

return subWindow
Expand Down Expand Up @@ -352,6 +362,71 @@ def createNodesDock(self):

self.addDockWidget(Qt.RightDockWidgetArea, self.nodesDock)

# noinspection PyAttributeOutsideInit
def createHistoryDock(self):
self.historyListWidget = QListWidget()

self.historyDock = QDockWidget("History")
self.historyDock.setWidget(self.historyListWidget)
self.historyDock.setFloating(False)

self.addDockWidget(Qt.RightDockWidgetArea, self.historyDock)

def updateHistoryDock(self):
if self.currentEditorWidget is not None:
self.historyListWidget.clear()
for stamp in self.currentEditorWidget.scene.history.stack:
item = QListWidgetItem(stamp["desc"], self.historyListWidget)

item.setFlags(
Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsDragEnabled
)

# noinspection PyAttributeOutsideInit
def createSceneItemsDock(self):
self.sceneItemsTableWidget = QTableWidget(0, 3)
self.sceneItemsTableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)

headerNames = ("Item Name", "Type", "Position")
self.sceneItemsTableWidget.setHorizontalHeaderLabels(headerNames)
# self.sceneItemsTableWidget.horizontalHeader().setSectionResizeMode(
# 0, QHeaderView.Stretch
# )
self.sceneItemsTableWidget.verticalHeader().hide()
self.sceneItemsTableWidget.setShowGrid(True)

self.sceneItemsDock = QDockWidget("Scene items")
self.sceneItemsDock.setWidget(self.sceneItemsTableWidget)
self.sceneItemsDock.setFloating(False)

self.addDockWidget(Qt.BottomDockWidgetArea, self.sceneItemsDock)

# self.sceneItemsTableWidget.cellActivated.connect()

def updateSceneItemsDock(self):
if self.currentEditorWidget is not None:
self.sceneItemsTableWidget.setRowCount(0)
for item in self.currentEditorWidget.scene.nodes:

itemNameItem = QTableWidgetItem(item.title)
itemNameItem.setFlags(itemNameItem.flags() ^ Qt.ItemIsEditable)

typeItem = QTableWidgetItem(f"{item.__class__.__name__}")
typeItem.setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
typeItem.setFlags(typeItem.flags() ^ Qt.ItemIsEditable)

positionItem = QTableWidgetItem(f"[{item.pos.x()}, {item.pos.y()}]")
positionItem.setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
positionItem.setFlags(positionItem.flags() ^ Qt.ItemIsEditable)

row = self.sceneItemsTableWidget.rowCount()
self.sceneItemsTableWidget.insertRow(row)
self.sceneItemsTableWidget.setItem(row, 0, itemNameItem)
self.sceneItemsTableWidget.setItem(row, 1, typeItem)
self.sceneItemsTableWidget.setItem(row, 2, positionItem)

self.sceneItemsTableWidget.resizeColumnsToContents()

def closeEvent(self, event):
self.mdiArea.closeAllSubWindows()
if self.mdiArea.currentSubWindow():
Expand Down Expand Up @@ -401,6 +476,7 @@ def openFile(self, filenames):
editor.updateTitle()
subWindow = self._createMdiSubWindow(editor)
subWindow.show()
self.updateSceneItemsDock()
else:
self.__logger.debug("Loading fail")
editor.close()
Expand Down
2 changes: 1 addition & 1 deletion nodedge/scene.py
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ def onItemsDeselected(self, silent: bool = False):
Handle Items deselection and trigger event `Items Deselected`
:param silent: If ``True`` scene's onItemsDeselected won't be called and
history stamp not stored.
history stamp not stored.
:type silent: ``bool``
"""
self.resetLastSelectedStates()
Expand Down

0 comments on commit f7adaee

Please sign in to comment.