This commit is contained in:
2026-04-26 16:06:24 +00:00
parent 737135439d
commit e2646fc888
5 changed files with 438 additions and 0 deletions
+221
View File
@@ -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())
+8
View File
@@ -0,0 +1,8 @@
{
"folders": [
{
"path": "."
}
],
"settings": {}
}
+10
View File
@@ -0,0 +1,10 @@
from PyQt5.QtWidgets import *
class main(QWidget):
def __init__(self):
super().__init__()
app = QApplication([])
window = main()
window.show()
app.exec()
+101
View File
@@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>489</width>
<height>299</height>
</rect>
</property>
<property name="windowTitle">
<string>TestApp</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="QWidget" name="layoutWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>361</width>
<height>181</height>
</rect>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
<number>0</number>
</property>
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="lbl_eins">
<property name="text">
<string>Das Label</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pBtn_laden">
<property name="text">
<string>Laden</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pBtn_schliessen">
<property name="text">
<string>Schließen</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QPushButton" name="pBtn_ok">
<property name="text">
<string>Okay</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pBtn_abbrechen">
<property name="text">
<string>Abbrechen</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>489</width>
<height>22</height>
</rect>
</property>
<widget class="QMenu" name="menuDatei">
<property name="title">
<string>Datei</string>
</property>
<addaction name="action_oeffnen"/>
</widget>
<addaction name="menuDatei"/>
</widget>
<widget class="QStatusBar" name="statusbar"/>
<action name="action_oeffnen">
<property name="text">
<string>&amp;öffnen</string>
</property>
</action>
</widget>
<resources/>
<connections/>
</ui>
+98
View File
@@ -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