Initial
This commit is contained in:
+221
@@ -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())
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"folders": [
|
||||
{
|
||||
"path": "."
|
||||
}
|
||||
],
|
||||
"settings": {}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
from PyQt5.QtWidgets import *
|
||||
|
||||
class main(QWidget):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
app = QApplication([])
|
||||
window = main()
|
||||
window.show()
|
||||
app.exec()
|
||||
@@ -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>&öffnen</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user