# HG changeset patch # User Windel Bouwman # Date 1359285369 -3600 # Node ID 104037b292cceb7cbc60fbb6b31c6ff571fe74be # Parent 2ec4d4332b7aab26a6ebe096752404885eadfcd2 Added ui file for hexeditor diff -r 2ec4d4332b7a -r 104037b292cc python/hexedit.py --- a/python/hexedit.py Sat Jan 26 19:44:36 2013 +0100 +++ b/python/hexedit.py Sun Jan 27 12:16:09 2013 +0100 @@ -1,8 +1,9 @@ import sys from PyQt4.QtCore import * from PyQt4.QtGui import * +from PyQt4 import uic -BYTES_PER_LINE, GAP = 8, 12 +BYTES_PER_LINE, GAP = 16, 12 def clamp(minimum, x, maximum): return max(minimum, min(x, maximum)) @@ -18,7 +19,7 @@ def __init__(self, scrollArea): super().__init__(scrollArea) self.scrollArea = scrollArea - self.setFont(QFont('Courier', 18)) + self.setFont(QFont('Courier', 16)) self.setFocusPolicy(Qt.StrongFocus) self.blinkcursor = False self.cursorX = self.cursorY = 0 @@ -70,12 +71,18 @@ painter.setPen(Qt.black) ypos = yposStart for index in range(firstIndex, lastIndex, BYTES_PER_LINE): + painter.setPen(Qt.black) painter.drawText(self.xposAddr, ypos, '{0:08X}'.format(index + self.Offset)) xpos = self.xposHex xposAscii = self.xposAscii for colIndex in range(BYTES_PER_LINE): if index + colIndex < len(self.Data): b = self.Data[index + colIndex] + bo = self.originalData[index + colIndex] + if b == bo: + painter.setPen(Qt.black) + else: + painter.setPen(Qt.red) painter.drawText(xpos, ypos, '{0:02X}'.format(b)) painter.drawText(xposAscii, ypos, asciiChar(b)) xpos += 3 * chw @@ -136,7 +143,8 @@ self.scrollArea.setMinimumHeight(self.charHeight * 8) self.update() def setData(self, d): - self.data = d + self.data = bytearray(d) + self.originalData = bytearray(d) self.adjust() self.setCursorPosition(0) Data = property(lambda self: self.data, setData) @@ -150,10 +158,42 @@ self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) self.setFocusPolicy(Qt.NoFocus) +class HexEditor(QMainWindow): + def __init__(self): + super().__init__() + uic.loadUi('hexeditor.ui', baseinstance=self) + self.he = HexEdit() + self.setCentralWidget(self.he) + self.actionOpen.triggered.connect(self.doOpen) + self.actionSave.triggered.connect(self.doSave) + self.actionSaveAs.triggered.connect(self.doSaveAs) + self.fileName = None + self.updateControls() + def updateControls(self): + s = True if self.fileName else False + self.actionSave.setEnabled(s) + self.actionSaveAs.setEnabled(s) + def doOpen(self): + filename = QFileDialog.getOpenFileName(self) + if filename: + with open(filename, 'rb') as f: + self.he.bv.Data = f.read() + self.fileName = filename + self.updateControls() + def doSave(self): + self.updateControls() + def doSaveAs(self): + filename = QFileDialog.getSaveFileName(self) + if filename: + with open(filename, 'wb') as f: + f.write(self.he.bv.Data) + self.fileName = filename + self.updateControls() + if __name__ == '__main__': app = QApplication(sys.argv) - he = HexEdit() + he = HexEditor() he.show() - he.bv.Data = bytearray(range(100)) * 8 + b'x' + #he.bv.Data = bytearray(range(100)) * 8 + b'x' app.exec() diff -r 2ec4d4332b7a -r 104037b292cc python/hexeditor.ui --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/python/hexeditor.ui Sun Jan 27 12:16:09 2013 +0100 @@ -0,0 +1,78 @@ + + + MainWindow + + + + 0 + 0 + 617 + 503 + + + + HexEditor + + + + + + 0 + 0 + 617 + 25 + + + + + File + + + + + + + + + + + toolBar + + + TopToolBarArea + + + false + + + + + + + + Open + + + Opens a file for editing + + + Ctrl+O + + + + + Save + + + Ctrl+S + + + + + Save As + + + + + +