-
Notifications
You must be signed in to change notification settings - Fork 0
/
Hexwidget.py
99 lines (78 loc) · 3.02 KB
/
Hexwidget.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
from PySide6.QtCore import *
from PySide6.QtWidgets import *
from PySide6.QtGui import *
from PySide6.QtNetwork import *
from overrides import override
from EditWidget import EditWidget
from OffsetArea import OffsetArea
from ByteIndexArea import ByteIndexArea
class Hexwidget(EditWidget):
def __init__(self, dataStore):
super().__init__(dataStore, 48, 3)
# Custom Property
self.editProgress = False
# Widget Settings
self.marginSize = QSize(50, 20)
# Child Widgets
self.lineNumberArea = OffsetArea(self)
self.byteIndexArea = ByteIndexArea(self)
# Event Connections
self.blockCountChanged.connect(self.updateLineNumberWidth)
self.verticalScrollBar().valueChanged.connect(self.lineNumberArea.scrollHandler)
self.indexChanged.connect(self.clearProgress)
# Final Setup
self.updateLineNumberWidth()
self.refreshWidgets()
@override
def applyInput(self, input, index):
data = self.dataStore.getData()
if self.editProgress:
self.dataStore.setData(index, (data[index] & 0xF0) | (input & 0x0F))
self.editProgress = False
else:
self.dataStore.setData(index, (input << 4) | (data[index] & 0xF))
self.editProgress = True
def clearProgress(self):
self.editProgress = False
@override
def translateData(self, data: list):
text = ""
for b in data:
text += f"{b:02X} "
return text
@override
def translateInput(self, key: str):
if key.isnumeric():
return int(key)
elif key.isalpha():
value = ord(key.upper()[0]) - 0x41
if value < 0 or value > 5: return None
return value + 0xA
else:
return None
# Maybe merge up
@override
def cursorPosChanged(self):
linePos = self.textCursor().positionInBlock()
if (linePos % self.itemSize) == (self.itemSize - 1):
self.itemRight()
self.updateCursor()
return super().cursorPosChanged()
@override
def highlightText(self):
lineSelection = QTextEdit.ExtraSelection()
lineSelection.format.setBackground(Qt.gray)
lineSelection.cursor = self.textCursor()
lineSelection.format.setProperty(QTextFormat.FullWidthSelection, True)
byteSelection = QTextEdit.ExtraSelection()
byteSelection.format.setBackground(Qt.yellow)
byteSelection.format.setForeground(Qt.red)
byteSelection.cursor = self.textCursor()
byteSelection.cursor.movePosition(QTextCursor.StartOfWord, QTextCursor.MoveAnchor)
byteSelection.cursor.movePosition(QTextCursor.EndOfWord, QTextCursor.KeepAnchor)
self.setExtraSelections([lineSelection, byteSelection])
def updateLineNumberWidth(self):
# Set the margins Size
self.setViewportMargins(self.marginSize.width(), self.marginSize.height(), 0, 0)
def refreshWidgets(self):
self.lineNumberArea.update()