RefNodeSetsWidget.__init__()   A
last analyzed

Complexity

Conditions 1

Size

Total Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 19
rs 9.4285
cc 1
1
import os
2
3
from PyQt5.QtCore import pyqtSignal, Qt, QObject, QModelIndex
4
from PyQt5.QtGui import QStandardItemModel, QStandardItem
5
from PyQt5.QtWidgets import QMenu, QAction, QInputDialog, QFileDialog
6
7
from opcua import ua
8
9
from uawidgets.utils import trycatchslot
10
11
class RefNodeSetsWidget(QObject):
12
13
    error = pyqtSignal(Exception)
14
    nodeset_added = pyqtSignal(str)
15
    nodeset_removed = pyqtSignal(str)
16
17
    def __init__(self, view):
18
        QObject.__init__(self, view)
19
        self.view = view
20
        self.model = QStandardItemModel()
21
        self.view.setModel(self.model)
22
        self.nodesets = []
23
        self.server_mgr = None
24
        self.view.header().setSectionResizeMode(1)
25
        
26
        addNodeSetAction = QAction("Add Reference Node Set", self.model)
27
        addNodeSetAction.triggered.connect(self.add_nodeset)
28
        self.removeNodeSetAction = QAction("Remove Reference Node Set", self.model)
29
        self.removeNodeSetAction.triggered.connect(self.remove_nodeset)
30
31
        self.view.setContextMenuPolicy(Qt.CustomContextMenu)
32
        self.view.customContextMenuRequested.connect(self.showContextMenu)
33
        self._contextMenu = QMenu()
34
        self._contextMenu.addAction(addNodeSetAction)
35
        self._contextMenu.addAction(self.removeNodeSetAction)
36
37
    @trycatchslot
38
    def add_nodeset(self):
39
        path, ok = QFileDialog.getOpenFileName(self.view, caption="Import OPC UA XML Node Set", filter="XML Files (*.xml *.XML)", directory=".")
40
        if not ok:
41
            return None
42
        self.import_nodeset(path)
43
44
    def import_nodeset(self, path):
45
        print("IMPORT", path)
46
        name = os.path.basename(path)
47
        if name in self.nodesets:
48
            return
49
        try:
50
            self.server_mgr.import_xml(path)
51
        except Exception as ex:
52
            self.error.emit(ex)
53
            raise
54
55
        item = QStandardItem(name)
56
        self.model.appendRow([item])
57
        self.nodesets.append(name)
58
        self.view.expandAll()
59
        self.nodeset_added.emit(path)
60
61
    @trycatchslot
62
    def remove_nodeset(self):
63
        idx = self.view.currentIndex()
64
        if not idx.isValid() or idx.row() == 0:
65
            return
66
67
        item = self.model.itemFromIndex(idx)
68
        name = item.text()
69
        self.nodesets.remove(name)
70
        self.model.removeRow(idx.row())
71
        self.nodeset_removed.emit(name)
72
73
    def set_server_mgr(self, server_mgr):
74
        self.server_mgr = server_mgr
75
        self.nodesets = []
76
        self.model.clear()
77
        self.model.setHorizontalHeaderLabels(['Node Sets'])
78
        item = QStandardItem("Opc.Ua.NodeSet2.xml")
79
        item.setFlags(Qt.NoItemFlags)
80
        self.model.appendRow([item])
81
        self.view.expandAll()
82
83
    def clear(self):
84
        self.model.clear()
85
86
    @trycatchslot
87
    def showContextMenu(self, position):
88
        if not self.server_mgr:
89
            return
90
        idx = self.view.currentIndex()
91
        if not idx.isValid() or idx.row() == 0:
92
            self.removeNodeSetAction.setEnabled(False)
93
        else:
94
            self.removeNodeSetAction.setEnabled(True)
95
        self._contextMenu.exec_(self.view.viewport().mapToGlobal(position))
96