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