Bread_Editor/file.py

119 lines
3.8 KiB
Python

#!/usr/bin/python3
import os.path
from PyQt6.QtWidgets import QFileDialog, QTabWidget
from editor import BitEditor
MAX_FILE_SIZE = 262144 # 2^18
class FileActions:
def __init__(self, app):
self.app = app
def open_files(self):
dialog = QFileDialog(self.app.gui.QTMainWindow)
dialog.setWindowTitle("Open File")
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():
self.open_multiple_files(dialog.selectedFiles())
def create_file(self, content: bin=b""):
file_path, extension = QFileDialog.getSaveFileName(
caption="New File",
directory=self.app.utils.home_path,
filter="Binary (*.bin);;Any (*)",
)
if file_path == "":
return
if "Binary" in extension:
file_path = file_path.split(".")[0] + ".bin" # make sure it has the right extension
file = open(file_path, "bw") # create new empty file
file.write(content)
file.close()
self.app.open_files[file_path] = File(self.app, file_path, file_path.split("/")[-1]) # open file
def save_current_file(self):
current_tab = self.app.gui.main_window.openFileTabs.currentWidget()
current_file_path = current_tab.objectName()
self.app.open_files[current_file_path].save()
def save_current_file_as(self):
current_tab = self.app.gui.main_window.openFileTabs.currentWidget() # get currently open file
current_file_path = current_tab.objectName()
file = self.app.open_files[current_file_path]
oz_content = file.bit_editor.input.toPlainText() # convert user input to binary data
file_content = self.app.utils.oz_string_to_bstring(oz_content)
self.create_file(file_content)
def close_current_file(self):
current_file_path = self.app.gui.main_window.openFileTabs.currentWidget().objectName()
if self.app.open_files[current_file_path].bit_editor.not_saved:
save_or_not = self.app.utils.unsaved_changes_popup()
match save_or_not:
case "save":
self.app.open_files[current_file_path].save()
case "cancel":
return
self.app.open_files[current_file_path].close()
def save_all_files(self):
for file_path in self.app.open_files:
self.app.open_files[file_path].save()
def open_multiple_files(self, file_paths):
for file_path in file_paths:
if not file_path in self.app.open_files and os.path.isfile(file_path):
if os.path.getsize(file_path) > MAX_FILE_SIZE:
self.app.utils.ftb_popup.exec()
return
file = File(self.app, file_path, file_path.split("/")[-1])
self.app.open_files[file_path] = file
class File:
def __init__(self, app, path, name):
self.app = app
self.path = path
self.name = name
file = open(path, "rb")
file_content = file.read()
file.close()
self.content = file_content
self.bit_editor = BitEditor(self.app, self)
self.app.gui.main_window.openFileTabs.setCurrentIndex(self.app.gui.main_window.openFileTabs.count() - 1)
def close(self):
self.app.gui.main_window.openFileTabs.removeTab(self.bit_editor.tab_index)
del self.app.open_files[self.path]
def save(self):
oz_string = self.bit_editor.input.toPlainText()
data = self.app.utils.oz_string_to_bstring(oz_string)
file = open(self.path, "wb")
file.write(data)
file.close()
self.app.open_files[self.path].bit_editor.not_saved = False