From 284798f604bd44dce0005dab3c29f17d09392a99 Mon Sep 17 00:00:00 2001 From: Heliguy Date: Mon, 23 Sep 2024 00:21:45 -0400 Subject: [PATCH] Add loading status and make it like work and whatnot --- src/gtk/loading_status.blp | 20 +++++++++++++++++ src/gtk/loading_status.py | 14 ++++++++++-- src/snapshot_page/new_snapshot_dialog.py | 27 +++++++++++++++++++---- src/snapshot_page/snapshot_page.blp | 7 ++++++ src/snapshot_page/snapshot_page.py | 28 ++++++++++++++++++------ 5 files changed, 83 insertions(+), 13 deletions(-) diff --git a/src/gtk/loading_status.blp b/src/gtk/loading_status.blp index 7b78c18..a74d058 100644 --- a/src/gtk/loading_status.blp +++ b/src/gtk/loading_status.blp @@ -28,6 +28,26 @@ template $LoadingStatus : ScrolledWindow { justify: center; styles ["description", "body"] } + Adw.Clamp progress_clamp { + margin-start: 24; + margin-end: 24; + margin-top: 12; + margin-bottom: 12; + maximum-size: 400; + Box { + halign: fill; + hexpand: true; + spacing: 12; + ProgressBar progress_bar { + halign: fill; + hexpand: true; + valign: center; + } + Label progress_label { + valign: center; + } + } + } Button button { label: "No Label Set"; styles ["pill"] diff --git a/src/gtk/loading_status.py b/src/gtk/loading_status.py index 96ec0c1..0cfe7ad 100644 --- a/src/gtk/loading_status.py +++ b/src/gtk/loading_status.py @@ -8,14 +8,24 @@ class LoadingStatus(Gtk.ScrolledWindow): title_label = gtc() description_label = gtc() + progress_clamp = gtc() + progress_bar = gtc() + progress_label = gtc() button = gtc() + + def set_progress_label(self, *args): + text = self.progress_bar.get_fraction() * 100 + self.progress_label.set_label(f"{text:.0f}%") - def __init__(self, title, description, on_cancel=None, **kwargs): + def __init__(self, title, description, show_progress=False, on_cancel=None, **kwargs): super().__init__(**kwargs) self.title_label.set_label(GLib.markup_escape_text(title)) self.description_label.set_label(GLib.markup_escape_text(description)) + self.progress_clamp.set_visible(show_progress) if on_cancel is None: self.button.set_visible(False) else: - self.button.connect("clicked", on_cancel) + self.button.connect("clicked", lambda *_: on_cancel) + + # self.progress_bar.connect("notify::fraction", self.set_progress_label) diff --git a/src/snapshot_page/new_snapshot_dialog.py b/src/snapshot_page/new_snapshot_dialog.py index 1ac507e..698b868 100644 --- a/src/snapshot_page/new_snapshot_dialog.py +++ b/src/snapshot_page/new_snapshot_dialog.py @@ -37,8 +37,12 @@ class NewSnapshotDialog(Adw.Dialog): def generate_list(self, *args): for package in HostInfo.flatpaks: + if "io.github.flattool.Warehouse" in package.info["id"]: + continue + if package.is_runtime or not os.path.exists(package.data_path): continue + row = AppRow(package, self.row_gesture_handler) row.check_button.set_visible(True) row.check_button.connect("toggled", lambda *_, row=row: self.row_select_handler(row)) @@ -58,7 +62,7 @@ class NewSnapshotDialog(Adw.Dialog): def on_close(self, *args): self.search_button.set_active(False) for row in self.selected_rows.copy(): - row.check_button.set_active(False) + GLib.idle_add(lambda *_, row=row: row.check_button.set_active(False)) def valid_checker(self): valid = len(self.selected_rows) > 0 and len(self.name_entry.get_text().strip()) > 0 @@ -71,17 +75,28 @@ class NewSnapshotDialog(Adw.Dialog): total += worker.fraction if worker.stop: stopped_workers_amount += 1 - + if stopped_workers_amount == len(self.workers): + self.loading_status.progress_bar.set_fraction(1) + self.loading_status.progress_label.set_label(f"{len(self.workers)} / {len(self.workers)}") print("1.00") + if self.on_done: + self.on_done() + return False + + self.loading_status.progress_label.set_label(f"{stopped_workers_amount} / {len(self.workers)}") - print(f"{total / len(self.workers):.2f}") + print(total / len(self.workers)) + self.loading_status.progress_bar.set_fraction(total / len(self.workers)) return True def on_create(self, button): self.workers.clear() for row in self.selected_rows: + if "io.github.flattool.Warehouse" in row.package.info["id"]: + continue + package = row.package worker = TarWorker( existing_path=package.data_path, @@ -91,7 +106,9 @@ class NewSnapshotDialog(Adw.Dialog): ) self.workers.append(worker) worker.compress() + GLib.timeout_add(10, self.get_total_fraction) + self.close() def on_invalidate(self, search_entry): self.listbox.invalidate_filter() @@ -112,10 +129,12 @@ class NewSnapshotDialog(Adw.Dialog): super().present(*args, **kwargs) self.name_entry.grab_focus() - def __init__(self, parent_page, package=None, **kwargs): + def __init__(self, parent_page, loading_status, on_done=None, package=None, **kwargs): super().__init__(**kwargs) # Extra Object Creations + self.loading_status = loading_status + self.on_done = on_done self.rows = [] self.selected_rows = [] self.workers = [] diff --git a/src/snapshot_page/snapshot_page.blp b/src/snapshot_page/snapshot_page.blp index 9a562fd..64e2778 100644 --- a/src/snapshot_page/snapshot_page.blp +++ b/src/snapshot_page/snapshot_page.blp @@ -165,6 +165,13 @@ template $SnapshotPage : Adw.BreakpointBin { $SidebarButton {} } } + Adw.ToolbarView snapshotting_view { + [top] + Adw.HeaderBar { + [start] + $SidebarButton {} + } + } } } } diff --git a/src/snapshot_page/snapshot_page.py b/src/snapshot_page/snapshot_page.py index 70ec911..77f923e 100644 --- a/src/snapshot_page/snapshot_page.py +++ b/src/snapshot_page/snapshot_page.py @@ -50,6 +50,7 @@ class SnapshotPage(Adw.BreakpointBin): new_button = gtc() status_stack = gtc() loading_view = gtc() + snapshotting_view = gtc() # Referred to in the main window # It is used to determine if a new page should be made or not @@ -141,15 +142,16 @@ class SnapshotPage(Adw.BreakpointBin): self.leftover_select_handler(None, row, False, True) def start_loading(self): + self.status_stack.set_visible_child(self.loading_view) self.active_box.set_visible(True) self.active_listbox.remove_all() self.leftover_box.set_visible(True) self.leftover_listbox.remove_all() - self.status_stack.set_visible_child(self.loading_view) def end_loading(self): def callback(*args): - self.new_snapshot_dialog = NewSnapshotDialog(self) + self.new_snapshot_dialog = NewSnapshotDialog(self, self.snapshotting_status, self.refresh) + self.new_snapshot_dialog.create_button.connect("clicked", lambda *_: self.status_stack.set_visible_child(self.snapshotting_view)) self.generate_active_list() self.generate_leftover_list() if (not self.active_box.get_visible()) and (not self.leftover_box.get_visible()): @@ -158,7 +160,7 @@ class SnapshotPage(Adw.BreakpointBin): self.select_first_row() GLib.idle_add(lambda *_: self.stack.set_visible_child(self.scrolled_window)) GLib.idle_add(lambda *_: self.status_stack.set_visible_child(self.split_view)) - + Gio.Task.new(None, None, callback).run_in_thread(self.sort_snapshots) def open_snapshots_folder(self, button, overlay): @@ -167,10 +169,20 @@ class SnapshotPage(Adw.BreakpointBin): overlay.add_toast(Adw.Toast.new(_("Opened snapshots folder"))) except Exception as e: overlay.add_toast(ErrorToast(_("Could not open folder"), str(e)).toast) - + + def on_cancel(self): + pass + + def on_new(self, *args): + self.new_snapshot_dialog.present(HostInfo.main_window) + + def refresh(self): + self.start_loading() + self.end_loading() + def __init__(self, main_window, **kwargs): super().__init__(**kwargs) - + # Extra Object Creation self.__class__.instance = self self.main_window = main_window @@ -179,15 +191,17 @@ class SnapshotPage(Adw.BreakpointBin): self.leftover_snapshots = [] # self.leftover_rows = [] self.list_page = SnapshotsListPage(self) + self.snapshotting_status = LoadingStatus(_("Creating Snapshots"), _("This might take a while"), True, self.on_cancel) # Connections self.active_listbox.connect("row-activated", self.active_select_handler) self.leftover_listbox.connect("row-activated", self.leftover_select_handler) self.open_button.connect("clicked", self.open_snapshots_folder, self.toast_overlay) self.status_open_button.connect("clicked", self.open_snapshots_folder, self.no_snapshots_toast) - self.status_new_button.connect("clicked", lambda *_: self.new_snapshot_dialog.present(HostInfo.main_window)) - self.new_button.connect("clicked", lambda *_: self.new_snapshot_dialog.present(HostInfo.main_window)) + self.status_new_button.connect("clicked", self.on_new) + self.new_button.connect("clicked", self.on_new) # Apply self.loading_view.set_content(LoadingStatus(_("Loading Snapshots"), _("This should only take a moment"))) + self.snapshotting_view.set_content(self.snapshotting_status) self.split_view.set_content(self.list_page)