From c0b74de74c0ae40f908fab19f04f4450931b9b83 Mon Sep 17 00:00:00 2001 From: Heliguy Date: Sat, 28 Sep 2024 19:57:48 -0400 Subject: [PATCH] Allow batch creation of new snapshots for already snapshotted apps --- src/snapshot_page/new_snapshot_dialog.py | 23 +++++++++++++---------- src/snapshot_page/snapshot_page.py | 15 +++++++++++++-- src/snapshot_page/snapshots_list_page.py | 2 +- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/snapshot_page/new_snapshot_dialog.py b/src/snapshot_page/new_snapshot_dialog.py index 4d768ed..dfa1190 100644 --- a/src/snapshot_page/new_snapshot_dialog.py +++ b/src/snapshot_page/new_snapshot_dialog.py @@ -143,17 +143,18 @@ class NewSnapshotDialog(Adw.Dialog): i += 1 row.check_button.set_active(True) - def set_single(self, package): - row = AppRow(package) - row.set_activatable(False) - self.selected_rows.append(row) - self.listbox.append(row) + def set_packages(self, packages): + for package in packages: + row = AppRow(package) + row.set_activatable(False) + self.selected_rows.append(row) + self.listbox.append(row) def enter_handler(self, *args): if self.create_button.get_sensitive(): self.create_button.activate() - def __init__(self, snapshot_page, loading_status, on_done=None, package=None, **kwargs): + def __init__(self, snapshot_page, loading_status, on_done=None, packages=None, **kwargs): super().__init__(**kwargs) # Extra Object Creations @@ -177,13 +178,15 @@ class NewSnapshotDialog(Adw.Dialog): # Apply self.listbox.set_sort_func(self.sort_func) self.listbox.set_filter_func(self.filter_func) - if not package is None: + self.name_entry.set_title(_("Name these Snapshots")) + if not packages is None: self.search_entry.set_editable(False) self.search_button.set_visible(False) self.nav_page.set_title(_("New Snapshot")) - self.name_entry.set_title(_("Name this Snapshot")) - self.set_single(package) + if len(packages) == 1: + self.name_entry.set_title(_("Name this Snapshot")) + self.set_packages(packages) + self.no_results.set_visible(False) else: self.nav_page.set_title(_("New Snapshots")) - self.name_entry.set_title(_("Name these Snapshots")) self.generate_list() diff --git a/src/snapshot_page/snapshot_page.py b/src/snapshot_page/snapshot_page.py index c271d92..99c5835 100644 --- a/src/snapshot_page/snapshot_page.py +++ b/src/snapshot_page/snapshot_page.py @@ -6,6 +6,7 @@ from .snapshots_list_page import SnapshotsListPage from .sidebar_button import SidebarButton from .loading_status import LoadingStatus from .new_snapshot_dialog import NewSnapshotDialog +from .tar_worker import TarWorker import os, subprocess class LeftoverSnapshotRow(Adw.ActionRow): @@ -183,7 +184,7 @@ class SnapshotPage(Adw.BreakpointBin): self.toast_overlay.add_toast(Adw.Toast(title=_("Showing snapshots for {}").format(package.info['name']))) break else: - dialog = NewSnapshotDialog(self, self.snapshotting_status, self.refresh, package) + dialog = NewSnapshotDialog(self, self.snapshotting_status, self.refresh, [package]) toast = Adw.Toast(title=_("No snapshots for {}").format(package.info['name']), button_label=_("New")) toast.connect("button-clicked", lambda *_: dialog.present(HostInfo.main_window)) self.toast_overlay.add_toast(toast) @@ -347,17 +348,27 @@ class SnapshotPage(Adw.BreakpointBin): except subprocess.CalledProcessError as cpe: self.toast_overlay.add_toast(ErrorToast(_("Could not trash snapshots"), cpe.stderr).toast) - dialog = Adw.AlertDialog(heading=_("Trash Snapshots?"), body=_("These snapshots will be sent to the trash")) + dialog = Adw.AlertDialog(heading=_("Trash Snapshots?"), body=_("These apps' snapshots will be sent to the trash")) dialog.add_response("cancel", _("Cancel")) dialog.add_response("continue", _("Trash")) dialog.set_response_appearance("continue", Adw.ResponseAppearance.DESTRUCTIVE) dialog.connect("response", on_response) dialog.present(HostInfo.main_window) + def select_new_handler(self): + packages = [] + for row in self.selected_active_rows: + if os.path.exists(row.package.data_path): + packages.append(row.package) + + NewSnapshotDialog(self, self.snapshotting_status, self.refresh, packages).present(HostInfo.main_window) + def more_menu_handler(self, listbox, row): self.more_popover.popdown() row = row.get_child() match row: + case self.new_snapshots: + self.select_new_handler() case self.trash_snapshots: self.select_trash_handler() diff --git a/src/snapshot_page/snapshots_list_page.py b/src/snapshot_page/snapshots_list_page.py index 1015230..22424d1 100644 --- a/src/snapshot_page/snapshots_list_page.py +++ b/src/snapshot_page/snapshots_list_page.py @@ -71,7 +71,7 @@ class SnapshotsListPage(Adw.NavigationPage): self.set_snapshots(self.package_or_folder, refresh=True) def on_new(self, button): - dialog = NewSnapshotDialog(self.parent_page, self.parent_page.snapshotting_status, self.on_done, self.package_or_folder) + dialog = NewSnapshotDialog(self.parent_page, self.parent_page.snapshotting_status, self.on_done, [self.package_or_folder]) dialog.present(HostInfo.main_window) def sort_func(self, row1, row2):