1import logging 2import os 3 4from PyQt5 import uic 5from PyQt5.QtCore import QObject, pyqtSignal, Qt, QSettings 6from PyQt5.QtWidgets import QUndoCommand, QUndoStack 7 8from urh.util.Logger import logger 9 10 11class Plugin(QObject): 12 enabled_changed = pyqtSignal() 13 14 def __init__(self, name: str): 15 super().__init__() 16 self.__enabled = Qt.Unchecked 17 self.name = name 18 self.plugin_path = "" 19 self.description = "" 20 self.__settings_frame = None 21 self.qsettings = QSettings(QSettings.IniFormat, QSettings.UserScope, "urh", self.name + "-plugin") 22 23 @property 24 def settings_frame(self): 25 if self.__settings_frame is None: 26 logging.getLogger().setLevel(logging.WARNING) 27 self.__settings_frame = uic.loadUi(os.path.join(self.plugin_path, "settings.ui")) 28 logging.getLogger().setLevel(logger.level) 29 30 self.create_connects() 31 return self.__settings_frame 32 33 @property 34 def enabled(self) -> bool: 35 return self.__enabled 36 37 @enabled.setter 38 def enabled(self, value: bool): 39 if value != self.__enabled: 40 self.__enabled = Qt.Checked if value else Qt.Unchecked 41 self.enabled_changed.emit() 42 43 def load_description(self): 44 descr_file = os.path.join(self.plugin_path, "descr.txt") 45 try: 46 with open(descr_file, "r") as f: 47 self.description = f.read() 48 except Exception as e: 49 print(e) 50 51 def destroy_settings_frame(self): 52 self.__settings_frame = None 53 54 def create_connects(self): 55 pass 56 57 58class ProtocolPlugin(Plugin): 59 def __init__(self, name: str): 60 Plugin.__init__(self, name) 61 62 def get_action(self, parent, undo_stack: QUndoStack, sel_range, groups, 63 view: int) -> QUndoCommand: 64 """ 65 :type parent: QTableView 66 :type undo_stack: QUndoStack 67 :type groups: list of ProtocolGroups 68 """ 69 raise NotImplementedError("Abstract Method.") 70 71 72class SDRPlugin(Plugin): 73 def __init__(self, name: str): 74 Plugin.__init__(self, name) 75 76 77class SignalEditorPlugin(Plugin): 78 def __init__(self, name: str): 79 Plugin.__init__(self, name) 80