-
Notifications
You must be signed in to change notification settings - Fork 5
/
EcuZoneComboBox.py
111 lines (92 loc) · 3.66 KB
/
EcuZoneComboBox.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
"""
EcuZoneComboBox.py
Copyright (C) 2024 - 2025 Marc Postema (mpostema09 -at- gmail.com)
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Or, point your browser to http://www.gnu.org/copyleft/gpl.html
"""
from PySide6.QtGui import QKeyEvent
from PySide6.QtCore import Qt, QEvent
from PySide6.QtWidgets import QComboBox
class EcuZoneComboBox(QComboBox):
"""
"""
value = 0
zoneObject = {}
def __init__(self, parent, zoneObject: dict):
super(EcuZoneComboBox, self).__init__(parent)
self.setStyleSheet("combobox-popup: 3;")
self.setFocusPolicy(Qt.StrongFocus)
self.zoneObject = zoneObject
# Fill Combo Box
for paramObject in self.zoneObject["params"]:
if "mask" in paramObject:
self.addItem(paramObject["name"], int(paramObject["mask"], 2))
else:
self.addItem(paramObject["name"], int(paramObject["value"], 16))
self.setCurrentIndex(0)
def event(self, event: QEvent):
if event.type() == QEvent.KeyPress:
keyEvent = QKeyEvent(event)
# When ESC -> Clear focus
if keyEvent.key() == Qt.Key_Escape:
# @TODO: Maybe give option to undo changes?
self.clearFocus()
return True
return super().event(event)
# Prevent scrolling without focus
def wheelEvent(self, e):
if self.hasFocus():
super().wheelEvent(e);
def getCorrespondingByte(self):
return self.zoneObject["byte"]
def setCurrentIndex(self, val):
self.value = val;
super().setCurrentIndex(val)
def isComboBoxChanged(self):
return self.isEnabled() and self.value != self.currentIndex()
def getValuesAsCSV(self):
value = "Disabled"
if self.isEnabled():
index = self.currentIndex()
value = "%0.2X" % self.itemData(index)
return value
def getZoneAndHex(self):
value = "None"
if self.isComboBoxChanged():
index = self.currentIndex()
value = "%0.2X" % self.itemData(index)
return value
def update(self, byte: str):
index = self.currentIndex()
mask = int(self.zoneObject["mask"], 2)
value = (int(byte, 16) & ~mask) | self.itemData(index)
byte = "%0.2X" % value
return byte
def changeZoneOption(self, data: str, valueType: str):
byte = int(data, 16)
if "mask" in self.zoneObject:
byteData = []
for i in range(0, len(data), 2):
byteData.append(data[i:i + 2])
byteNr = self.zoneObject["byte"]
mask = int(self.zoneObject["mask"], 2)
if byteNr < len(byteData):
byte = int(byteData[byteNr], 16) & mask
else:
# Integrity wrong, size does not match
return False
for i in range(self.count()):
if self.itemData(i) == byte:
self.setCurrentIndex(i)
break
return True