From 12dc6fc9f3695b7094ae9e47c4603be9f47d1181 Mon Sep 17 00:00:00 2001
From: thomahl <thomahl@stud.ntnu.no>
Date: Fri, 6 Mar 2020 12:47:44 +0100
Subject: [PATCH] =?UTF-8?q?#32=20shortcuts=20fungerer=20n=C3=A5=20ved=20fl?=
 =?UTF-8?q?ere=20TableModules=20i=20samme=20scene?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Å legge til noen rader, for så å fjerne noen rader fungerer ikke, men dette er trolig ikke et problem med keyPressEvent

Under følger en snippet som viser hva som ikke fungerte før:
```python
from PySide2.QtWidgets import QVBoxLayout, QApplication, QWidget, QGraphicsScene, QGraphicsView, QTableWidget, QShortcut, QHBoxLayout
from PySide2.QtGui import QKeySequence
from PySide2.QtCore import Qt

class QTableWidthWithShortcuts(QTableWidget):
    def __init__(self, *args, **kwargs):
        super(QTableWidthWithShortcuts, self).__init__(*args, **kwargs)
        shortcut = QShortcut(QKeySequence("Shift++"), self, context=Qt.WidgetWithChildrenShortcut)
        shortcut.activated.connect(self.say_hello)

    def say_hello(self):
        print("Hello")

app = QApplication()

# inside QGrahpicsScene
# shortcuts don't work..
scene = QGraphicsScene()
view = QGraphicsView(scene)
t1 = QTableWidthWithShortcuts(2,2)
t1.move(0,0)
scene.addWidget(t1)
t2 = QTableWidthWithShortcuts(2,2)
t2.move(300,0)
scene.addWidget(t2)
view.show()

# inside QHBoxLayout
# shortcuts work!!
layout = QHBoxLayout()
t1 = QTableWidthWithShortcuts(2,2)
layout.addWidget(t1)
t2 = QTableWidthWithShortcuts(2,2)
layout.addWidget(t2)
wrapper_widget = QWidget()
wrapper_widget.setLayout(layout)
wrapper_widget.show()

app.exec_()
```

Her er en snippet som viser hvordan denne løsningen unngår problemet over:
```python
from PySide2.QtWidgets import QVBoxLayout, QApplication, QWidget, QGraphicsScene, QGraphicsView, QTableWidget, QShortcut, QHBoxLayout
from PySide2.QtGui import QKeySequence
from PySide2.QtCore import Qt

class QTableWidthWithShortcuts(QTableWidget):
    def __init__(self, uid, *args, **kwargs):
        super(QTableWidthWithShortcuts, self).__init__(*args, **kwargs)
        self.uid = uid

    def keyPressEvent(self, event):
        if event.key() == Qt.Key_Question:
            print("{}: Shift and plus!".format(self.uid))
        elif event.modifiers() == Qt.ShiftModifier and event.key() == Qt.Key_Underscore:
            print("{}: Shift and minus!".format(self.uid))
        elif event.modifiers() == Qt.ControlModifier and event.key() == Qt.Key_Plus:
            print("{}: Ctrl and plus!".format(self.uid))
        elif event.modifiers() == Qt.ControlModifier and event.key() == Qt.Key_Underscore:
            print("{}: Ctrl and minus!".format(self.uid))
        else:
            super(QTableWidthWithShortcuts, self).keyPressEvent(event)

app = QApplication()

scene = QGraphicsScene()
view = QGraphicsView(scene)
t1 = QTableWidthWithShortcuts("A", 2,2)
t1.move(0,0)
scene.addWidget(t1)
t2 = QTableWidthWithShortcuts("B", 2,2)
t2.move(300,0)
scene.addWidget(t2)
view.show()

app.exec_()
```
---
 soitool/modules/module_table.py | 40 ++++++++++++++++++++-------------
 1 file changed, 25 insertions(+), 15 deletions(-)

diff --git a/soitool/modules/module_table.py b/soitool/modules/module_table.py
index e9d06a7..e4c3b98 100644
--- a/soitool/modules/module_table.py
+++ b/soitool/modules/module_table.py
@@ -58,7 +58,31 @@ class TableModule(ModuleBase, QTableWidget, metaclass=Meta):
 
         self.cellChanged.connect(self.resize)
 
-        self.set_shortcuts()
+    def keyPressEvent(self, event):
+        """Launch actions when specific combinations of keys are pressed.
+
+        If the keys pressed are not related to a shortcut on this custom widget
+        the event is sent on to be handled by the superclass (for navigation
+        with arrow-keys for.eg.)
+
+        The combinations used below work on Thomas' machine, but are not
+        guaranteed to work on all machines. This needs to be checked.
+        
+        Paramters
+        ---------
+        event : QKeyEvent
+            event sent by Qt for us to handle
+        """
+        if event.key() == QtCore.Qt.Key_Question:
+            self.add_column()
+        elif event.modifiers() == QtCore.Qt.ShiftModifier and event.key() == QtCore.Qt.Key_Underscore:
+            self.remove_column()
+        elif event.modifiers() == QtCore.Qt.ControlModifier and event.key() == QtCore.Qt.Key_Plus:
+            self.add_row()
+        elif event.modifiers() == QtCore.Qt.ControlModifier and event.key() == QtCore.Qt.Key_Underscore:
+            self.remove_row()
+        else:
+            super(TableModule, self).keyPressEvent(event)
 
     def set_header_item(self, column, text):
         """Insert item with header-style.
@@ -77,20 +101,6 @@ class TableModule(ModuleBase, QTableWidget, metaclass=Meta):
         item.setFont(HEADER_FONT)
         self.setItem(0, column, item)
 
-    def set_shortcuts(self):
-        """Set shortcuts for adding and removing rows and columns."""
-        # Create shortcuts
-        shortcut_add_col = QShortcut(QtGui.QKeySequence("Shift++"), self)
-        shortcut_rem_col = QShortcut(QtGui.QKeySequence("Shift+-"), self)
-        shortcut_add_row = QShortcut(QtGui.QKeySequence("Ctrl++"), self)
-        shortcut_rem_row = QShortcut(QtGui.QKeySequence("Ctrl+-"), self)
-
-        # Connect shortcuts to functions
-        shortcut_add_col.activated.connect(self.add_column)
-        shortcut_rem_col.activated.connect(self.remove_column)
-        shortcut_add_row.activated.connect(self.add_row)
-        shortcut_rem_row.activated.connect(self.remove_row)
-
     def add_column(self):
         """Add column to the right of selected column."""
         self.insertColumn(self.currentColumn() + 1)
-- 
GitLab