Completed
Push — master ( 9dff57...6f1d28 )
by Olivier
01:51 queued 53s
created

RefNodeSetsWidget   A

Complexity

Total Complexity 15

Size/Duplication

Total Lines 82
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
wmc 15
c 1
b 0
f 1
dl 0
loc 82
rs 10

7 Methods

Rating   Name   Duplication   Size   Complexity  
A get_nodesets() 0 2 1
A showContextMenu() 0 9 4
A clear() 0 2 1
A remove_nodeset() 0 10 3
A add_nodeset() 0 18 4
A __init__() 0 20 1
A set_server_mgr() 0 9 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
10
class RefNodeSetsWidget(QObject):
11
12
    error = pyqtSignal(str)
13
    nodeset_added = pyqtSignal(str)
14
    nodeset_removed = pyqtSignal(str)
15
16
    def __init__(self, view):
17
        QObject.__init__(self, view)
18
        self.view = view
19
        self.model = QStandardItemModel()
20
        self.view.setModel(self.model)
21
        self.nodesets = []
22
        self.server_mgr = None
23
        self._nodeset_to_delete = 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
    def add_nodeset(self):
38
        path, ok = QFileDialog.getOpenFileName(self.view, caption="Import OPC UA XML Node Set", filter="XML Files (*.xml *.XML)", directory=".")
39
        if not ok:
40
            return None
41
        name = os.path.basename(path)
42
        if name in self.nodesets:
43
            return
44
        try:
45
            self.server_mgr.import_xml(path)
46
        except Exception as ex:
47
            self.error.emit(ex)
48
            raise
49
50
        item = QStandardItem(name)
51
        self.model.appendRow([item])
52
        self.nodesets.append(name)
53
        self.view.expandAll()
54
        self.nodeset_added.emit(path)
55
56
    def get_nodesets(self):
57
        return self.nodesets
58
59
    def remove_nodeset(self):
60
        idx = self.view.currentIndex()
61
        if not idx.isValid() or idx.row() == 0:
62
            return
63
64
        item = self.model.itemFromIndex(idx)
65
        name = item.text()
66
        self.nodesets.remove(name)
67
        self.model.removeRow(idx.row())
68
        self.nodeset_removed.emit(name)
69
70
    def set_server_mgr(self, server_mgr):
71
        self.server_mgr = server_mgr
72
        self.nodesets = []
73
        self.model.clear()
74
        self.model.setHorizontalHeaderLabels(['Node Sets'])
75
        item = QStandardItem("Opc.Ua.NodeSet2.xml")
76
        item.setFlags(Qt.NoItemFlags)
77
        self.model.appendRow([item])
78
        self.view.expandAll()
79
80
    def clear(self):
81
        self.model.clear()
82
83
    def showContextMenu(self, position):
84
        if not self.server_mgr:
85
            return
86
        idx = self.view.currentIndex()
87
        if not idx.isValid() or idx.row() == 0:
88
            self.removeNodeSetAction.setEnabled(False)
89
        else:
90
            self.removeNodeSetAction.setEnabled(True)
91
        self._contextMenu.exec_(self.view.viewport().mapToGlobal(position))
92