From e2646fc888ffde129254ab95a36b4d4d818f42cf Mon Sep 17 00:00:00 2001 From: torsten Date: Sun, 26 Apr 2026 16:06:24 +0000 Subject: [PATCH] Initial --- Byteswap.py | 221 ++++++++++++++++++++++++++++++++++++++++++ Python.code-workspace | 8 ++ pyqt5.py | 10 ++ pyqt5.ui | 101 +++++++++++++++++++ pyqt5_gui.py | 98 +++++++++++++++++++ 5 files changed, 438 insertions(+) create mode 100644 Byteswap.py create mode 100644 Python.code-workspace create mode 100644 pyqt5.py create mode 100644 pyqt5.ui create mode 100644 pyqt5_gui.py diff --git a/Byteswap.py b/Byteswap.py new file mode 100644 index 0000000..67a6a05 --- /dev/null +++ b/Byteswap.py @@ -0,0 +1,221 @@ +import sys, os + +from PyQt6 import QtWidgets, QtCore, QtGui +from QHexEdit import QHexEdit +import qhexedit_rc + +class MainWindow(QtWidgets.QMainWindow): + + def __init__(self, fileName=None): + super(MainWindow, self).__init__() + self.init() + self.setCurrentFile('') + + def about(self): + QtWidgets.QMessageBox.about(self, "About ByteSwap", + "ByteSwap is a simple GUI for byteswaping an Amiga Kickstart Rom"); + + def closeEvent(self, event): + self.writeSettings() + self.close() + + def createActions(self): + self.openAct = QtGui.QAction(QtGui.QIcon(':/images/open.png'), + "&Open...", self, shortcut=QtGui.QKeySequence.StandardKey.Open, + statusTip="Open an existing file", triggered=self.open) + + self.saveAct = QtGui.QAction(QtGui.QIcon(':/images/save.png'), + "&Save", self, shortcut=QtGui.QKeySequence.StandardKey.Save, + statusTip="Save the document to disk", triggered=self.save) + + self.saveAsAct = QtGui.QAction("Save &As...", self, + shortcut=QtGui.QKeySequence.StandardKey.SaveAs, + statusTip="Save the document under a new name", triggered=self.saveAs) + + self.saveReadable = QtGui.QAction("Save as &Readable...", self, + statusTip="Save in a readable format", triggered=self.saveToReadableFile) + + self.exitAct = QtGui.QAction("E&xit", self, shortcut="Ctrl+Q", + statusTip="Exit the application", triggered=self.close) + + self.undoAct = QtGui.QAction(QtGui.QIcon(':/images/undo.png'), + "&Undo", self, shortcut=QtGui.QKeySequence.StandardKey.Undo, triggered=self.hexEdit.undo) + + self.redoAct = QtGui.QAction(QtGui.QIcon(':/images/redo.png'), + "&Redo", self, shortcut=QtGui.QKeySequence.StandardKey.Redo, triggered=self.hexEdit.redo) + + self.saveSelectionReadable = QtGui.QAction("Save Selection Readable...", self, + statusTip="Save selection in a readable format", + triggered=self.saveSelectionToReadableFile) + + self.aboutAct = QtGui.QAction("&About", self, + statusTip="Show the application's About box", triggered=self.about) + + def createMenus(self): + self.fileMenu = self.menuBar().addMenu("&File") + self.fileMenu.addAction(self.openAct) + self.fileMenu.addAction(self.saveAct) + self.fileMenu.addAction(self.saveAsAct) + self.fileMenu.addAction(self.saveReadable) + self.fileMenu.addSeparator() + self.fileMenu.addAction(self.exitAct) + + self.editMenu = self.menuBar().addMenu("&Edit") + self.editMenu.addAction(self.undoAct) + self.editMenu.addAction(self.redoAct) + self.editMenu.addAction(self.saveSelectionReadable) + + self.helpMenu = self.menuBar().addMenu("&Help") + self.helpMenu.addAction(self.aboutAct) + + def createStatusBar(self): + # Address Label + self.lbAddressName = QtWidgets.QLabel() + self.lbAddressName.setText("Address:") + self.statusBar().addPermanentWidget(self.lbAddressName) + self.lbAddress = QtWidgets.QLabel() + self.lbAddress.setFrameShape(QtWidgets.QFrame.Shape.Panel) + self.lbAddress.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.lbAddress.setMinimumWidth(70) + self.statusBar().addPermanentWidget(self.lbAddress) + self.hexEdit.currentAddressChanged.connect(self.setAddress) + + # Address Size + self.lbSizeName = QtWidgets.QLabel() + self.lbSizeName.setText("Size:") + self.statusBar().addPermanentWidget(self.lbSizeName) + self.lbSize = QtWidgets.QLabel() + self.lbSize.setFrameShape(QtWidgets.QFrame.Shape.Panel) + self.lbSize.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.lbSize.setMinimumWidth(70) + self.statusBar().addPermanentWidget(self.lbSize) + self.hexEdit.currentSizeChanged.connect(self.setSize) + + # Overwrite Mode label + self.lbOverwriteModeName = QtWidgets.QLabel() + self.lbOverwriteModeName.setText("Mode:") + self.statusBar().addPermanentWidget(self.lbOverwriteModeName) + self.lbOverwriteMode = QtWidgets.QLabel() + self.lbOverwriteMode.setFrameShape(QtWidgets.QFrame.Shape.Panel) + self.lbOverwriteMode.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.lbOverwriteMode.setMinimumWidth(70) + self.statusBar().addPermanentWidget(self.lbOverwriteMode) + self.setOverwriteMode(self.hexEdit.overwriteMode()) + + self.statusBar().showMessage("Ready") + + def createToolBars(self): + self.fileToolBar = self.addToolBar("File") + self.fileToolBar.addAction(self.openAct) + self.fileToolBar.addAction(self.saveAct) + self.fileToolBar.addAction(self.undoAct) + self.fileToolBar.addAction(self.redoAct) + + def init(self): + self.setAttribute(QtCore.Qt.WidgetAttribute.WA_DeleteOnClose) + self.isUntitled = True + + self.hexEdit = QHexEdit() + self.setCentralWidget(self.hexEdit) + self.hexEdit.overwriteModeChanged.connect(self.setOverwriteMode) + + self.createActions() + self.createMenus() + self.createToolBars() + self.createStatusBar() + + self.readSettings() + + def loadFile(self, fileName): + QtWidgets.QApplication.setOverrideCursor(QtCore.Qt.CursorShape.WaitCursor) + with open(fileName, 'rb') as f: + self.hexEdit.setData(f.read()) + QtWidgets.QApplication.restoreOverrideCursor() + + self.setCurrentFile(fileName) + self.statusBar().showMessage("File loaded", 2000) + + def open(self): + fileName, _filter = QtWidgets.QFileDialog.getOpenFileName(self) + if fileName: + self.loadFile(fileName) + + def readSettings(self): + settings = QtCore.QSettings() + + pos = settings.value('pos', QtCore.QPoint(200, 200)) + size = settings.value('size', QtCore.QSize(610, 460)) + self.move(pos) + self.resize(size) + + def save(self): + if self.isUntitled: + self.saveAs() + else: + self.saveFile(self.curFile) + + def saveAs(self): + fileName, _filter = QtWidgets.QFileDialog.getSaveFileName(self, "Save As", self.curFile) + if fileName != "": + self.saveFile(fileName) + + def setAddress(self, address): + self.lbAddress.setText('%x' % address) + + def setOverwriteMode(self, mode): + settings = QtCore.QSettings() + settings.setValue("OverwriteMode", mode) + if mode: + self.lbOverwriteMode.setText("Overwrite") + else: + self.lbOverwriteMode.setText("Insert") + + def setSize(self, size): + self.lbSize.setText('%d' % size) + + def saveFile(self, fileName): + QtWidgets.QApplication.setOverrideCursor(QtCore.Qt.CursorShape.WaitCursor) + with open(fileName, 'wb') as f: + f.write(self.hexEdit.data()) + QtWidgets.QApplication.restoreOverrideCursor() + + self.setCurrentFile(fileName) + self.statusBar().showMessage("File saved", 2000) + + def saveToReadableFile(self): + fileName, _filter = QtWidgets.QFileDialog.getSaveFileName(self, "Save To Readable File") + if fileName != "": + QtWidgets.QApplication.setOverrideCursor(QtCore.Qt.CursorShape.WaitCursor) + with open(fileName, "w") as f: + f.write(self.hexEdit.toReadableString()) + QtWidgets.QApplication.restoreOverrideCursor() + self.statusBar().showMessage("File saved", 2000); + + def saveSelectionToReadableFile(self): + fileName, _filter = QtWidgets.QFileDialog.getSaveFileName(self, "Save To Readable File") + if fileName != "": + QtWidgets.QApplication.setOverrideCursor(QtCore.Qt.CursorShape.WaitCursor) + with open(fileName, 'w') as f: + f.write(self.hexEdit.selectionToReadableString()) + QtWidgets.QApplication.restoreOverrideCursor() + self.statusBar().showMessage("File saved", 2000); + + def setCurrentFile(self, fileName): + self.curFile = fileName + self.isUntitled = (fileName == "") + self.setWindowModified(False) + basename = os.path.basename(self.curFile) + self.setWindowTitle("%s[*] - ByteSwap " % basename) + + def writeSettings(self): + settings = QtCore.QSettings() + settings.setValue('pos', self.pos()) + settings.setValue('size', self.size()) + +if __name__ == '__main__': + app = QtWidgets.QApplication(sys.argv) + app.setApplicationName("ByteSwap"); + app.setOrganizationName("ByteSwap"); + mainWin = MainWindow() + mainWin.show() + sys.exit(app.exec()) \ No newline at end of file diff --git a/Python.code-workspace b/Python.code-workspace new file mode 100644 index 0000000..9017da0 --- /dev/null +++ b/Python.code-workspace @@ -0,0 +1,8 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": {} +} \ No newline at end of file diff --git a/pyqt5.py b/pyqt5.py new file mode 100644 index 0000000..d1dab33 --- /dev/null +++ b/pyqt5.py @@ -0,0 +1,10 @@ +from PyQt5.QtWidgets import * + +class main(QWidget): + def __init__(self): + super().__init__() + +app = QApplication([]) +window = main() +window.show() +app.exec() \ No newline at end of file diff --git a/pyqt5.ui b/pyqt5.ui new file mode 100644 index 0000000..573cec8 --- /dev/null +++ b/pyqt5.ui @@ -0,0 +1,101 @@ + + + MainWindow + + + + 0 + 0 + 489 + 299 + + + + TestApp + + + + + + 0 + 0 + 361 + 181 + + + + + 0 + + + + + + + Das Label + + + Qt::AlignCenter + + + + + + + Laden + + + + + + + Schließen + + + + + + + + + Okay + + + + + + + Abbrechen + + + + + + + + + + 0 + 0 + 489 + 22 + + + + + Datei + + + + + + + + + &öffnen + + + + + + diff --git a/pyqt5_gui.py b/pyqt5_gui.py new file mode 100644 index 0000000..a834e4f --- /dev/null +++ b/pyqt5_gui.py @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- + +################################################################################ +## Form generated from reading UI file 'pyqt5.ui' +## +## Created by: Qt User Interface Compiler version 6.6.0 +## +## WARNING! All changes made in this file will be lost when recompiling UI file! +################################################################################ + +from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, + QMetaObject, QObject, QPoint, QRect, + QSize, QTime, QUrl, Qt) +from PySide6.QtGui import (QAction, QBrush, QColor, QConicalGradient, + QCursor, QFont, QFontDatabase, QGradient, + QIcon, QImage, QKeySequence, QLinearGradient, + QPainter, QPalette, QPixmap, QRadialGradient, + QTransform) +from PySide6.QtWidgets import (QApplication, QHBoxLayout, QLabel, QMainWindow, + QMenu, QMenuBar, QPushButton, QSizePolicy, + QStatusBar, QVBoxLayout, QWidget) + +class Ui_MainWindow(object): + def setupUi(self, MainWindow): + if not MainWindow.objectName(): + MainWindow.setObjectName(u"MainWindow") + MainWindow.resize(489, 299) + self.action_oeffnen = QAction(MainWindow) + self.action_oeffnen.setObjectName(u"action_oeffnen") + self.centralwidget = QWidget(MainWindow) + self.centralwidget.setObjectName(u"centralwidget") + self.layoutWidget = QWidget(self.centralwidget) + self.layoutWidget.setObjectName(u"layoutWidget") + self.layoutWidget.setGeometry(QRect(0, 0, 361, 181)) + self.horizontalLayout = QHBoxLayout(self.layoutWidget) + self.horizontalLayout.setObjectName(u"horizontalLayout") + self.horizontalLayout.setContentsMargins(0, 0, 0, 0) + self.verticalLayout = QVBoxLayout() + self.verticalLayout.setObjectName(u"verticalLayout") + self.lbl_eins = QLabel(self.layoutWidget) + self.lbl_eins.setObjectName(u"lbl_eins") + self.lbl_eins.setAlignment(Qt.AlignCenter) + + self.verticalLayout.addWidget(self.lbl_eins) + + self.pBtn_laden = QPushButton(self.layoutWidget) + self.pBtn_laden.setObjectName(u"pBtn_laden") + + self.verticalLayout.addWidget(self.pBtn_laden) + + self.pBtn_schliessen = QPushButton(self.layoutWidget) + self.pBtn_schliessen.setObjectName(u"pBtn_schliessen") + + self.verticalLayout.addWidget(self.pBtn_schliessen) + + + self.horizontalLayout.addLayout(self.verticalLayout) + + self.pBtn_ok = QPushButton(self.layoutWidget) + self.pBtn_ok.setObjectName(u"pBtn_ok") + + self.horizontalLayout.addWidget(self.pBtn_ok) + + self.pBtn_abbrechen = QPushButton(self.layoutWidget) + self.pBtn_abbrechen.setObjectName(u"pBtn_abbrechen") + + self.horizontalLayout.addWidget(self.pBtn_abbrechen) + + MainWindow.setCentralWidget(self.centralwidget) + self.menubar = QMenuBar(MainWindow) + self.menubar.setObjectName(u"menubar") + self.menubar.setGeometry(QRect(0, 0, 489, 22)) + self.menuDatei = QMenu(self.menubar) + self.menuDatei.setObjectName(u"menuDatei") + MainWindow.setMenuBar(self.menubar) + self.statusbar = QStatusBar(MainWindow) + self.statusbar.setObjectName(u"statusbar") + MainWindow.setStatusBar(self.statusbar) + + self.menubar.addAction(self.menuDatei.menuAction()) + self.menuDatei.addAction(self.action_oeffnen) + + self.retranslateUi(MainWindow) + + QMetaObject.connectSlotsByName(MainWindow) + # setupUi + + def retranslateUi(self, MainWindow): + MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"TestApp", None)) + self.action_oeffnen.setText(QCoreApplication.translate("MainWindow", u"&\u00f6ffnen", None)) + self.lbl_eins.setText(QCoreApplication.translate("MainWindow", u"Das Label", None)) + self.pBtn_laden.setText(QCoreApplication.translate("MainWindow", u"Laden", None)) + self.pBtn_schliessen.setText(QCoreApplication.translate("MainWindow", u"Schlie\u00dfen", None)) + self.pBtn_ok.setText(QCoreApplication.translate("MainWindow", u"Okay", None)) + self.pBtn_abbrechen.setText(QCoreApplication.translate("MainWindow", u"Abbrechen", None)) + self.menuDatei.setTitle(QCoreApplication.translate("MainWindow", u"Datei", None)) + # retranslateUi +