#!/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(): for file_path in dialog.selectedFiles(): if not file_path in self.app.open_files: # dont open file twice if os.path.getsize(file_path) > MAX_FILE_SIZE: self.app.utils.ftb_popup.exec() return self.app.open_files[file_path] = File(self.app, file_path, file_path.split("/")[-1]) 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() 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.settings.last_opened_file = self.path 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