Mercurial > lcfOS
diff python/hexviewer.py @ 104:ed230e947dc6
Added hexviewer
author | windel |
---|---|
date | Sun, 30 Dec 2012 22:31:55 +0100 |
parents | |
children | 6a303f835c6d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/python/hexviewer.py Sun Dec 30 22:31:55 2012 +0100 @@ -0,0 +1,78 @@ +#!/usr/bin/python + +from PyQt4.QtCore import * +from PyQt4.QtGui import * +import sys +import hexfile + +class BinViewer(QWidget): + """ + The binviewer consists of a hex view, a ascii view + and perhaps others.. + """ + def __init__(self): + super().__init__() + self.setFont(QFont('Courier')) + self.fontHeight = self.fontMetrics().height() + self.fontWidth = self.fontMetrics().width('x') + self.hexfile = hexfile.HexFile() + def paintEvent(self, event): + painter = QPainter(self) + br = QBrush(Qt.lightGray) + painter.setBrush(br) + h = self.height() + addressWidth = self.fontWidth * 8 + painter.drawRect(2, 2, addressWidth, h) + br2 = QBrush(Qt.yellow) + painter.setBrush(br2) + w = self.width() + byteWidth = self.fontWidth * 16 * 3 + painter.drawRect(addressWidth + 4, 2, byteWidth, h) + asciiWidth = self.fontWidth * 16 + br2 = QBrush(Qt.gray) + painter.setBrush(br2) + painter.drawRect(addressWidth + byteWidth + 4, 2, asciiWidth, h) + for r in range(1, 10): + addr = '{0:08X}'.format(r << 16) + painter.drawText(2, 2 + self.fontHeight * r, addr) + bts = bytes(range(16)) + x = addressWidth + 4 + for b in bts: + b = '{0:02X}'.format(b) + painter.drawText(x, 2 + self.fontHeight * r, b) + x += 3 * self.fontWidth + x = addressWidth + byteWidth + 4 + for b in bts: + b = '{0}'.format(chr(b)) + painter.drawText(x, 2 + self.fontHeight * r, b) + x += 1 * self.fontWidth + def setHexFile(self, hf): + self.hexFile = hf + self.update() + +class BinViewMain(QMainWindow): + def __init__(self): + super().__init__() + self.bv = BinViewer() + self.setCentralWidget(self.bv) + self.bv.setHexFile(hexfile.HexFile('audio.hex')) + mb = self.menuBar() + fileMenu = mb.addMenu("File") + + def addMenuEntry(name, menu, callback, shortcut=None): + a = QAction(name, self) + menu.addAction(a) + a.triggered.connect(callback) + if shortcut: a.setShortcut(shortcut) + addMenuEntry("Open", fileMenu, self.openFile, QKeySequence(QKeySequence.Open)) + def openFile(self): + filename = QFileDialog.getOpenFileName(self, "Open hex file...", "*.hex", "Intel hexfiles (*.hex)") + if filename: + h = hexfile.HexFile(filename) + +if __name__ == '__main__': + app = QApplication(sys.argv) + bv = BinViewMain() + bv.show() + app.exec_() +