Add loading status and make it like work and whatnot

This commit is contained in:
Heliguy
2024-09-23 00:21:45 -04:00
parent e28e2e7f32
commit 284798f604
5 changed files with 83 additions and 13 deletions

View File

@@ -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"]

View File

@@ -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)

View File

@@ -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 = []

View File

@@ -165,6 +165,13 @@ template $SnapshotPage : Adw.BreakpointBin {
$SidebarButton {}
}
}
Adw.ToolbarView snapshotting_view {
[top]
Adw.HeaderBar {
[start]
$SidebarButton {}
}
}
}
}
}

View File

@@ -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)