Completed
Push — master ( 207079...2d2260 )
by Olivier
57s
created

MyDelegate   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 31
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 7
c 1
b 0
f 0
dl 0
loc 31
rs 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
A createEditor() 0 6 3
A __init__() 0 3 1
A setModelData() 0 15 3
1
from PyQt5.QtCore import pyqtSignal, Qt, QObject
2
from PyQt5.QtGui import QStandardItemModel, QStandardItem
3
from PyQt5.QtWidgets import QMenu, QAction, QInputDialog, QStyledItemDelegate
4
5
from opcua import ua
6
7
from uawidgets.utils import trycatch
8
9
10
class NamespaceWidget(QObject):
11
12
    error = pyqtSignal(str)
13
14 View Code Duplication
    def __init__(self, view):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
15
        QObject.__init__(self, view)
16
        self.view = view
17
        self.model = QStandardItemModel()
18
        self.view.setModel(self.model)
19
        delegate = MyDelegate(self.view, self)
20
        delegate.error.connect(self.error.emit)
21
        self.view.setItemDelegate(delegate)
22
        self.node = None
23
        self._namespace_to_delete = None
24
        self.view.header().setSectionResizeMode(1)
25
        
26
        addNamespaceAction = QAction("Add Namespace", self.model)
27
        addNamespaceAction.triggered.connect(self.add_namespace)
28
        self.removeNamespaceAction = QAction("Remove Namespace", self.model)
29
        self.removeNamespaceAction.triggered.connect(self.remove_namespace)
30
31
        self.view.setContextMenuPolicy(Qt.CustomContextMenu)
32
        self.view.customContextMenuRequested.connect(self.showContextMenu)
33
        self._contextMenu = QMenu()
34
        self._contextMenu.addAction(addNamespaceAction)
35
        self._contextMenu.addAction(self.removeNamespaceAction)
36
37
    def add_namespace(self):
38
        uries = self.node.get_value()
39
        newidx = len(uries)
40
        it = self.model.item(0, 0)
41
        uri_it = QStandardItem("")
42
        it.appendRow([QStandardItem(), QStandardItem(str(newidx)), uri_it])
43
        idx = self.model.indexFromItem(uri_it)
44
        self.view.edit(idx)
45
        #uri, ok = QInputDialog.getText(self.view, "Enter new namespace URI", "URI:")
46
        #uries = self.node.get_value()
47
        #if uri in uries:
48
            #return uries.index(uri)
49
        #uries.append(uri)
50
        #self.node.set_value(uries)
51
        #self.reload()
52
        #it = self.model.item(0, 0)
53
        #it.appendRow([QStandardItem(), QStandardItem(str(len(uries)+1)), QStandardItem(uri)])
54
55
    def remove_namespace(self):
56
        uries = self.node.get_value()
57
        uries.remove(self._namespace_to_delete)
58
        self.node.set_value(uries)
59
        self.reload()
60
61
    def set_node(self, node):
62
        self.model.clear()
63
        self.node = node
64
        self.show_array()
65
66
    def reload(self):
67
        self.set_node(self.node)
68
69
    def show_array(self):
70
        self.model.setHorizontalHeaderLabels(['Browse Name', 'Index', 'Value'])
71
72
        name_item = QStandardItem(self.node.get_browse_name().Name)
73
        self.model.appendRow([name_item, QStandardItem(""), QStandardItem()])
74
        it = self.model.item(0, 0)
75
        val = self.node.get_value()
76
        for idx, url in enumerate(val):
77
            it.appendRow([QStandardItem(), QStandardItem(str(idx)), QStandardItem(url)])
78
        self.view.expandAll()
79
80
    def clear(self):
81
        self.model.clear()
82
83
    def showContextMenu(self, position):
84
        self.removeNamespaceAction.setEnabled(False)
85
        idx = self.view.currentIndex()
86
        if not idx.isValid():
87
            return
88
        if idx.parent().isValid() and idx.row() >= 1:
89
            uri_it = self.model.itemFromIndex(idx.sibling(idx.row(), 2))
90
            self._namespace_to_delete = uri_it.text()
91
            self.removeNamespaceAction.setEnabled(True)
92
        self._contextMenu.exec_(self.view.viewport().mapToGlobal(position))
93
94
95
class MyDelegate(QStyledItemDelegate):
96
97
    error = pyqtSignal(Exception)
98
    attr_written = pyqtSignal(ua.AttributeIds, ua.DataValue)
99
100
    def __init__(self, parent, widget):
101
        QStyledItemDelegate.__init__(self, parent)
102
        self.widget = widget
103
104
    @trycatch
105
    def createEditor(self, parent, option, idx):
106
        print("EDITOR", idx.column())
107
        if idx.column() != 2 or idx.row() == 0:
108
            return None
109
        return QStyledItemDelegate.createEditor(self, parent, option, idx)
110
111
    @trycatch
112
    def setModelData(self, editor, model, idx):
113
        print("SET DATA", editor.text())
114
        QStyledItemDelegate.setModelData(self, editor, model, idx)
115
        root = model.item(0, 0)
116
        uries = []
117
        count = 0
118
        while True:
119
            child = root.child(count, 2)
120
            count += 1
121
            if not child:
122
                break
123
            uries.append(child.text())
124
        print("Writting namespace array: ", uries)
125
        self.widget.node.set_value(uries)
126
127
128