#!/usr/bin/python3 from PyQt6.QtWidgets import QWidget, QFileDialog, QVBoxLayout from PyQt6.QtGui import QFont from binary_text_edit import BinaryTextEdit 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]) 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 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] 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) 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 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.setFont(QFont("Ubuntu Mono", 12)) self.content_binary_input.textChanged.connect(self.on_edit) 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