Skip to content

Commit

Permalink
Link scene items list to scene
Browse files Browse the repository at this point in the history
  • Loading branch information
don4get committed May 3, 2020
1 parent d699a7d commit 77dde1d
Show file tree
Hide file tree
Showing 5 changed files with 126 additions and 44 deletions.
10 changes: 10 additions & 0 deletions nodedge/blocks/graphics_input_block_content.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ def initUI(self):
self.edit.setAlignment(Qt.AlignRight)
self.edit.setObjectName(self.node.contentLabelObjectName)

self.edit.editingFinished.connect(self.onEditingFinished)

def serialize(self):
res = super().serialize()
res["value"] = self.edit.text()
Expand All @@ -29,3 +31,11 @@ def deserialize(self, data, hashmap=None, restoreId=False):
dumpException(e)

return res

def onEditingFinished(self):
if (
self.node is not None
and self.node.scene is not None
and self.node.scene.history is not None
):
self.node.scene.history.store("Change input content")
65 changes: 23 additions & 42 deletions nodedge/mdi_window.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,12 @@
from PyQt5.QtCore import QSignalMapper, Qt
from PyQt5.QtGui import QIcon, QKeySequence
from PyQt5.QtWidgets import (
QAbstractItemView,
QAction,
QDockWidget,
QFileDialog,
QListWidget,
QListWidgetItem,
QMdiArea,
QMenu,
QMessageBox,
QTableWidget,
QTableWidgetItem,
QWidget,
)

Expand All @@ -27,6 +22,7 @@
from nodedge.history_list_widget import HistoryListWidget
from nodedge.mdi_widget import MdiWidget
from nodedge.node_list_widget import NodeListWidget
from nodedge.scene_items_table_widget import SceneItemsTableWidget
from nodedge.utils import dumpException, loadStyleSheets


Expand Down Expand Up @@ -98,11 +94,11 @@ def initUI(self):
self.setCentralWidget(self.mdiArea)

self.addCurrentEditorWidgetChangedListener(self.updateMenus)
self.addCurrentEditorWidgetChangedListener(self.updateSceneItemsDock)

self.mdiArea.subWindowActivated.connect(self.onSubWindowActivated)

self.windowMapper = QSignalMapper(self)
# noinspection PyUnresolvedReferences
self.windowMapper.mapped[QWidget].connect(self.setActiveSubWindow)

self.createNodesDock()
Expand Down Expand Up @@ -334,7 +330,9 @@ def _createMdiSubWindow(self, childWidget=None):
subWindow.setWindowIcon(icon)
editor.scene.history.addHistoryModifiedListener(self.updateEditMenu)
editor.scene.history.addHistoryModifiedListener(self.historyListWidget.update)
editor.scene.history.addHistoryModifiedListener(self.updateSceneItemsDock)
editor.scene.history.addHistoryModifiedListener(
self.sceneItemsTableWidget.update
)
editor.addCloseEventListener(self.onSubWindowClosed)

return subWindow
Expand Down Expand Up @@ -382,16 +380,19 @@ def createHistoryDock(self):

# 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.sceneItemsTableWidget = QTableWidget(0, 4)
# self.sceneItemsTableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)
#
# headerNames = ("Name", "Type", "PosX", "PosY")
# self.sceneItemsTableWidget.setHorizontalHeaderLabels(headerNames)
# # self.sceneItemsTableWidget.horizontalHeader().setSectionResizeMode(
# # 0, QHeaderView.Stretch
# # )
# self.sceneItemsTableWidget.verticalHeader().hide()
# self.sceneItemsTableWidget.setShowGrid(True)

self.sceneItemsTableWidget = SceneItemsTableWidget(self)
self.addCurrentEditorWidgetChangedListener(self.sceneItemsTableWidget.update)

self.sceneItemsDock = QDockWidget("Scene items")
self.sceneItemsDock.setWidget(self.sceneItemsTableWidget)
Expand All @@ -401,30 +402,6 @@ def createSceneItemsDock(self):

# 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 @@ -470,7 +447,7 @@ def openFile(self, filenames):
editor.updateTitle()
subWindow = self._createMdiSubWindow(editor)
subWindow.show()
self.updateSceneItemsDock()
self.sceneItemsTableWidget.update()
else:
self.__logger.debug("Loading fail")
editor.close()
Expand Down Expand Up @@ -505,3 +482,7 @@ def onSubWindowActivated(self):
and self.currentEditorWidget.scene.history is not None
):
self.historyListWidget.history = self.currentEditorWidget.scene.history
self.sceneItemsTableWidget.scene = self.currentEditorWidget.scene
# self.currentEditorWidget.scene.graphicsScene.itemSelected.connect(
# self.sceneItemsTableWidget.onSceneItemSelected
# )
7 changes: 6 additions & 1 deletion nodedge/node.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

import logging
from collections import OrderedDict
from typing import Collection, List, Optional, Tuple, TypeVar, cast
from typing import Callable, Collection, List, Optional, Tuple, TypeVar, cast

from PyQt5.QtCore import QPoint, QPointF
from PyQt5.QtWidgets import QGraphicsSceneMouseEvent
Expand Down Expand Up @@ -73,6 +73,8 @@ def __init__(
self._isDirty: bool = False
self._isInvalid: bool = False

self.selectedListeners: List[Callable] = []

def __str__(self):
return (
f"0x{hex(id(self))[-4:]} {self.__class__.__name__}({self.title}, "
Expand Down Expand Up @@ -723,3 +725,6 @@ def getSocketScenePosition(self, socket: Socket) -> QPointF:
socket.index, socket.location, socket.countOnThisNodeSide
)
return QPointF(nodePos.x() + socketPos.x(), nodePos.y() + socketPos.y())

def addSelectedListener(self, callback):
self.selectedListeners.append(callback)
86 changes: 86 additions & 0 deletions nodedge/scene_items_table_widget.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
# -*- coding: utf-8 -*-
"""
Scene items table widget module containing
:class:`~nodedge.scene_items_table_widget.SceneItemsTableWidget` class.
"""

from typing import Optional

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (
QAbstractItemView,
QMainWindow,
QTableWidget,
QTableWidgetItem,
)

from nodedge.scene import Scene


class SceneItemsTableWidget(QTableWidget):
""":class:`~nodedge.scene_items_table_widget.SceneItemsTableWidget` class ."""

def __init__(self, parent: Optional[QMainWindow] = None):
super().__init__(parent)

self.setColumnCount(4)
self.setSelectionBehavior(QAbstractItemView.SelectRows)

self.scene: Optional[Scene] = None

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

self.cellClicked.connect(self.onCellClicked) # type: ignore
self.cellDoubleClicked.connect(self.onCellDoubleClicked) # type: ignore

def update(self, *__args) -> None:
if self.scene is not None:
self.setRowCount(0)
for node in self.scene.nodes:

nameItem = QTableWidgetItem(node.title)
nameItem.setFlags(nameItem.flags() ^ Qt.ItemIsEditable) # type: ignore

typeItem = QTableWidgetItem(f"{node.__class__.__name__}")
typeItem.setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
typeItem.setFlags(typeItem.flags() ^ Qt.ItemIsEditable) # type: ignore

posXItem = QTableWidgetItem(f"{node.pos.x()}")
posXItem.setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
posXItem.setFlags(posXItem.flags() ^ Qt.ItemIsEditable) # type: ignore

posYItem = QTableWidgetItem(f"{node.pos.y()}")
posYItem.setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
posYItem.setFlags(posYItem.flags() ^ Qt.ItemIsEditable) # type: ignore

row = self.rowCount()
self.insertRow(row)
self.setItem(row, 0, nameItem)
self.setItem(row, 1, typeItem)
self.setItem(row, 2, posXItem)
self.setItem(row, 3, posYItem)

if node.graphicsNode in self.scene.selectedItems:
nameItem.setSelected(True)
typeItem.setSelected(True)
posXItem.setSelected(True)
posYItem.setSelected(True)

self.resizeColumnsToContents()

def onCellClicked(self, row: int, column: int):
if self.scene is not None:
self.scene.doDeselectItems(True)
self.scene.nodes[row].isSelected = True
self.item(row, column).setSelected(True)

def onCellDoubleClicked(self, row, column):
self.scene.view.centerOn(
float(self.item(row, 2).text()), float(self.item(row, 3).text())
)
2 changes: 1 addition & 1 deletion tox.ini
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ deps =
description = Check typing with mypy.
basepython = {[default]basepython}
commands =
mypy -v -p nodedge -p tests
mypy -p nodedge -p tests

[testenv:black]
description = Check that format follows Black recommendations.
Expand Down

0 comments on commit 77dde1d

Please sign in to comment.