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