Bread_Editor/file.py

112 lines
3.8 KiB
Python
Raw Normal View History

#!/usr/bin/python3
from PyQt6.QtWidgets import QWidget, QFileDialog, QVBoxLayout
from PyQt6.QtGui import QFont, QTextCharFormat, QColor
from binary_text_edit import BinaryTextEdit
from highlighting import Higlighter
class FileActions:
def __init__(self, app):
self.app = app
def open_files(self):
dialog = QFileDialog(self.app.QTMainWindow)
dialog.setDirectory(self.app.utils.home_path)
dialog.setFileMode(QFileDialog.FileMode.ExistingFiles)
dialog.setNameFilters(["Binary (*.bin)", "Any (*)"])
dialog.setViewMode(QFileDialog.ViewMode.List)
if dialog.exec():
for file_path in dialog.selectedFiles():
if not file_path in self.app.open_files: # dont open file twice
self.app.open_files[file_path] = File(self.app, file_path, file_path.split("/")[-1])
2024-11-19 18:32:52 +01:00
def save_file(self, path):
oz_string = self.app.open_files[path].content_binary_input.toPlainText()
data = self.app.utils.oz_string_to_bstring(oz_string)
file = open(path, "wb")
file.write(data)
file.close()
self.app.open_files[path].not_saved = False
2024-11-19 18:32:52 +01:00
def save_current_file(self):
current_tab = self.app.main_window.openFileTabs.currentWidget()
current_file_path = current_tab.objectName()
self.save_file(current_file_path)
def close_file(self, path, tab_index):
self.app.main_window.openFileTabs.removeTab(tab_index)
del self.app.open_files[path]
2024-11-19 19:05:28 +01:00
def close_current_file(self):
tab_index = self.app.main_window.openFileTabs.currentIndex()
current_file_path = self.app.main_window.openFileTabs.currentWidget().objectName()#
if self.app.open_files[current_file_path].not_saved:
save_or_not = self.app.utils.unsaved_changes_popup()
match save_or_not:
case "save":
self.save_file(current_file_path)
case "cancel":
return
self.close_file(current_file_path, tab_index)
2024-11-19 19:05:28 +01:00
def save_all_files(self):
for file_path in self.app.open_files:
file = self.app.open_files[file_path]
self.save_file(file.path)
class File:
def __init__(self, app, path, name):
self.app = app
self.path = path
self.name = name
self.not_saved = False
file = open(path, "rb")
file_content = file.read()
file.close()
self.content = file_content
# the widget that contains all the file content
2024-11-19 18:32:52 +01:00
self.content_widget = QWidget(self.app.main_window.openFileTabs, objectName=path)
self.content_widget_layout = QVBoxLayout()
self.content_binary_input = BinaryTextEdit()
self.content_binary_input.setOverwriteMode(True)
self.content_widget_layout.addWidget(self.content_binary_input)
self.content_binary_input.setPlainText(self.app.utils.bstring_to_oz(file_content))
self.content_binary_input.textChanged.connect(self.on_edit)
2024-11-21 16:40:37 +01:00
self.binary_font = QFont("Ubuntu Mono", 12)
self.binary_font.setKerning(True)
self.binary_font.setLetterSpacing(QFont.SpacingType.PercentageSpacing, 200)
self.content_binary_input.setFont(self.binary_font)
self.bit_highlighter = Higlighter()
self.one_format = QTextCharFormat()
self.one_format.setBackground(QColor(200, 150, 100))
self.bit_highlighter.add_mapping("1", self.one_format)
self.bit_highlighter.setDocument(self.content_binary_input.document())
self.content_widget.setLayout(self.content_widget_layout)
self.app.main_window.openFileTabs.addTab( # add a tab for the file in the top files list
self.content_widget,
self.name
)
def on_edit(self):
self.not_saved = True