Completed
Pull Request — master (#51)
by Olivier
24s
created

RefNodeSetsWidget.clear()   A

Complexity

Conditions 1

Size

Total Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 2
rs 10
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
        name = os.path.basename(path)
46
        if name in self.nodesets:
47
            return
48
        try:
49
            self.server_mgr.import_xml(path)
50
        except Exception as ex:
51
            self.error.emit(ex)
52
            raise
53
54
        item = QStandardItem(name)
55
        self.model.appendRow([item])
56
        self.nodesets.append(name)
57
        self.view.expandAll()
58
        self.nodeset_added.emit(path)
59
60
    @trycatchslot
61
    def remove_nodeset(self):
62
        idx = self.view.currentIndex()
63
        if not idx.isValid() or idx.row() == 0:
64
            return
65
66
        item = self.model.itemFromIndex(idx)
67
        name = item.text()
68
        self.nodesets.remove(name)
69
        self.model.removeRow(idx.row())
70
        self.nodeset_removed.emit(name)
71
72
    def set_server_mgr(self, server_mgr):
73
        self.server_mgr = server_mgr
74
        self.nodesets = []
75
        self.model.clear()
76
        self.model.setHorizontalHeaderLabels(['Node Sets'])
77
        item = QStandardItem("Opc.Ua.NodeSet2.xml")
78
        item.setFlags(Qt.NoItemFlags)
79
        self.model.appendRow([item])
80
        self.view.expandAll()
81
82
    def clear(self):
83
        self.model.clear()
84
85
    @trycatchslot
86
    def showContextMenu(self, position):
87
        if not self.server_mgr:
88
            return
89
        idx = self.view.currentIndex()
90
        if not idx.isValid() or idx.row() == 0:
91
            self.removeNodeSetAction.setEnabled(False)
92
        else:
93
            self.removeNodeSetAction.setEnabled(True)
94
        self._contextMenu.exec_(self.view.viewport().mapToGlobal(position))
95