diff --git a/src/beanify/gui/mainwindow.py b/src/beanify/gui/mainwindow.py index 9c2a0b2..7286ecd 100644 --- a/src/beanify/gui/mainwindow.py +++ b/src/beanify/gui/mainwindow.py @@ -1,3 +1,4 @@ +import pickle import tkinter as tk from tkinter import StringVar, filedialog, messagebox, ttk @@ -73,6 +74,9 @@ class MainWindow(ThemedTk): menu_file.add_command(label="Save Rules", command=self.do_save_rules) menu_file.add_command(label="Reload Rules", command=self.do_reload_rules) menu_file.add_separator() + menu_file.add_command(label="Save Partial Transactions", command=self.do_save_partial) + menu_file.add_command(label="Load Partial Transactions", command=self.do_load_partial) + menu_file.add_separator() menu_file.add_command(label="Exit", command=lambda: self.destroy()) self.menubar.add_cascade(menu=menu_file, label="File") @@ -359,3 +363,49 @@ class MainWindow(ThemedTk): """ self.ruleset.reload_rules() self.regenerate_rows() + + def do_save_partial(self): + """ + Save all partial entries to be loaded later. + """ + flattened = { + "converter": self.converter.qual_name(), + "rows": self.rows, + "custom": self.custom, + } + result = pickle.dumps(flattened) + path = filedialog.asksaveasfilename( + defaultextension=".pickle", + filetypes=[ + ("All Files", "*.*"), + ], + ) + if path: + with open(path, "wb") as f: + f.write(result) + message = f"Saved progress to {path}" + else: + message = "Save cancelled" + self.update_status(message) + + def do_load_partial(self): + # Prompt for file to ingest + path = filedialog.askopenfilename( + defaultextension=".pickle", + filetypes=[("Pickle Files", ".pickle"), ("All Files", "*.*")], + ) + with open(path, "rb") as f: + result = pickle.load(f) + + if result["converter"] != self.converter.qual_name(): + messagebox.showerror( + "Load Error", + f"Cannot load partial data for converter '{result['converter']}'" + ) + return + self.rows |= result["rows"] + self.custom |= result["custom"] + + self.rowtree.update_rows(self.rows) + self.show_ingest_summary([path], self.rows) + self.rebuild_account_cache()