From 72029bbefaf061461968b12372e1553f6bc4d388 Mon Sep 17 00:00:00 2001
From: Jacob Wahlman <jacwa448@student.liu.se>
Date: Thu, 30 Apr 2020 18:34:51 +0200
Subject: [PATCH] added initial solution to error messages

---
 b_asic/GUI/drag_button.py          | 18 ++++++++++--------
 b_asic/GUI/improved_main_window.py |  4 +++-
 b_asic/GUI/utils.py                | 19 +++++++++++++++++++
 3 files changed, 32 insertions(+), 9 deletions(-)
 create mode 100644 b_asic/GUI/utils.py

diff --git a/b_asic/GUI/drag_button.py b/b_asic/GUI/drag_button.py
index 9f10c1ce..e31c6b5a 100644
--- a/b_asic/GUI/drag_button.py
+++ b/b_asic/GUI/drag_button.py
@@ -3,23 +3,25 @@ Drag button class.
 This class creates a dragbutton which can be clicked, dragged and dropped.
 """
 
-
 import os.path
 
 from PyQt5.QtWidgets import QPushButton
 from PyQt5.QtCore import Qt, QSize
 from PyQt5.QtGui import QIcon
 
+from utils import decorate_class, handle_error
+
 
+@decorate_class(handle_error)
 class DragButton(QPushButton):
     def __init__(self, name, operation, operation_path_name, window, parent = None):
         self.name = name
-        self.__window = window
+        self._window = window
         self.operation = operation
         self.operation_path_name = operation_path_name
         self.clicked = 0
         self.pressed = False
-        super(DragButton, self).__init__(self.__window)
+        super(DragButton, self).__init__(self._window)
 
     def mousePressEvent(self, event):
         self._mouse_press_pos = None
@@ -29,7 +31,7 @@ class DragButton(QPushButton):
             self._mouse_press_pos = event.globalPos()
             self._mouse_move_pos = event.globalPos()
 
-            for signal in self.__window.signalList:
+            for signal in self._window.signalList:
                 signal.update()
 
             self.clicked += 1
@@ -40,7 +42,7 @@ class DragButton(QPushButton):
                 path_to_image = os.path.join('operation_icons', self.operation_path_name + '_grey.png')
                 self.setIcon(QIcon(path_to_image))
                 self.setIconSize(QSize(50, 50))
-                self.__window.pressed_button.append(self)
+                self._window.pressed_button.append(self)
 
             elif self.clicked == 2:
                 self.clicked = 0
@@ -50,7 +52,7 @@ class DragButton(QPushButton):
                 path_to_image = os.path.join('operation_icons', self.operation_path_name + '.png')
                 self.setIcon(QIcon(path_to_image))
                 self.setIconSize(QSize(50, 50))
-                self.__window.pressed_button.remove(self)
+                self._window.pressed_button.remove(self)
 
         super(DragButton, self).mousePressEvent(event)
 
@@ -63,8 +65,8 @@ class DragButton(QPushButton):
             self.move(new_pos)
 
             self._mouse_move_pos = global_pos
-        
-        self.__window.update()
+
+        self._window.update()
         super(DragButton, self).mouseMoveEvent(event)
 
     def mouseReleaseEvent(self, event):
diff --git a/b_asic/GUI/improved_main_window.py b/b_asic/GUI/improved_main_window.py
index fb580eb9..2696de25 100644
--- a/b_asic/GUI/improved_main_window.py
+++ b/b_asic/GUI/improved_main_window.py
@@ -14,6 +14,7 @@ from port_button import PortButton
 from b_asic import Operation
 import b_asic.core_operations as c_oper
 import b_asic.special_operations as s_oper
+from utils import decorate_class, handle_error
 
 from numpy import linspace
 
@@ -25,6 +26,7 @@ from PyQt5.QtCore import Qt, QSize
 from PyQt5.QtGui import QIcon, QFont, QPainter, QPen, QBrush, QKeySequence
 
 
+@decorate_class(handle_error)
 class MainWindow(QMainWindow):
     def __init__(self):
         super(MainWindow, self).__init__()
@@ -41,6 +43,7 @@ class MainWindow(QMainWindow):
         self.portList = []
         self.pressed_ports = []
         self.source = None
+        self._window = self
 
         self.init_ui()
         self.add_operations_from_namespace(c_oper, self.ui.core_operations_list)
@@ -141,7 +144,6 @@ class MainWindow(QMainWindow):
         self.add_operations_from_namespace(c_oper, self.ui.core_operations_list)
         self.add_operations_from_namespace(s_oper, self.ui.special_operations_list)
 
-
     def print_input_port_1(self):
         print("Input port 1")
 
diff --git a/b_asic/GUI/utils.py b/b_asic/GUI/utils.py
new file mode 100644
index 00000000..721496c7
--- /dev/null
+++ b/b_asic/GUI/utils.py
@@ -0,0 +1,19 @@
+from PyQt5.QtWidgets import QErrorMessage
+from traceback import format_exc
+
+def handle_error(fn):
+    def wrapper(self, *args, **kwargs):
+        try:
+            return fn(self, *args, **kwargs)
+        except Exception as e:
+            QErrorMessage(self._window).showMessage(f"Unexpected error: {format_exc()}")
+
+    return wrapper
+
+def decorate_class(decorator):
+    def decorate(cls):
+        for attr in cls.__dict__:
+            if callable(getattr(cls, attr)):
+                setattr(cls, attr, decorator(getattr(cls, attr)))
+        return cls
+    return decorate
\ No newline at end of file
-- 
GitLab