diff --git a/data/icons/cross-filled-symbolic.svg b/data/icons/cross-filled-symbolic.svg new file mode 100644 index 0000000..3c671d6 --- /dev/null +++ b/data/icons/cross-filled-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/data/icons/important-small-symbolic.svg b/data/icons/important-small-symbolic.svg new file mode 100644 index 0000000..1cfffd7 --- /dev/null +++ b/data/icons/important-small-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/data/ui/window.blp b/data/ui/window.blp index 66847f4..7f268b3 100644 --- a/data/ui/window.blp +++ b/data/ui/window.blp @@ -174,13 +174,13 @@ template $WarehouseWindow: Adw.ApplicationWindow { [end] Button batch_uninstall_button { - icon-name: "user-trash-symbolic"; + icon-name: "cross-filled-symbolic"; tooltip-text: _("Uninstall Selected Apps"); } [end] Button batch_clean_button { - icon-name: "brush-symbolic"; + icon-name: "user-trash-symbolic"; tooltip-text: _("Send Selected Apps' Data to the Trash"); } diff --git a/src/app_row_widget.py b/src/app_row_widget.py index b67c754..8ab717f 100644 --- a/src/app_row_widget.py +++ b/src/app_row_widget.py @@ -132,20 +132,23 @@ class AppRow(Adw.ActionRow): uninstall_item = Gio.MenuItem.new(_("Uninstall"), f"win.uninstall{index}") row_menu_model.append_item(uninstall_item) - if os.path.exists(parent_window.user_data_path + self.app_id): - data_menu_model = Gio.Menu() + data_menu_model = Gio.Menu() - parent_window.create_action(("open-data" + str(index)), lambda *_, path=(parent_window.user_data_path + self.app_id): parent_window.openDataFolder(path)) - open_data_item = Gio.MenuItem.new(_("Open User Data Folder"), f"win.open-data{index}") - open_data_item.set_attribute_value("hidden-when", GLib.Variant.new_string("action-disabled")) - data_menu_model.append_item(open_data_item) + parent_window.create_action(("open-data" + str(index)), lambda *_, path=(parent_window.user_data_path + self.app_id): parent_window.openDataFolder(path)) + open_data_item = Gio.MenuItem.new(_("Open User Data Folder"), f"win.open-data{index}") + open_data_item.set_attribute_value("hidden-when", GLib.Variant.new_string("action-disabled")) + data_menu_model.append_item(open_data_item) - parent_window.create_action(("trash" + str(index)), lambda *_, name=self.app_name, id=self.app_id, index=index: parent_window.trashData(name, id, index)) - trash_item = Gio.MenuItem.new(_("Trash User Data"), f"win.trash{index}") - trash_item.set_attribute_value("hidden-when", GLib.Variant.new_string("action-disabled")) - data_menu_model.append_item(trash_item) + parent_window.create_action(("trash" + str(index)), lambda *_, name=self.app_name, id=self.app_id, index=index: parent_window.trashData(name, id, index)) + trash_item = Gio.MenuItem.new(_("Trash User Data"), f"win.trash{index}") + trash_item.set_attribute_value("hidden-when", GLib.Variant.new_string("action-disabled")) + data_menu_model.append_item(trash_item) - row_menu_model.append_section(None, data_menu_model) + row_menu_model.append_section(None, data_menu_model) + + if not os.path.exists(parent_window.user_data_path + self.app_id): + parent_window.lookup_action(f"open-data{self.index}").set_enabled(False) + parent_window.lookup_action(f"trash{self.index}").set_enabled(False) parent_window.create_action(("mask" + str(index)), lambda *_, id=self.app_id, type=self.install_type, index=index: parent_window.maskFlatpak(self)) mask_item = Gio.MenuItem.new(_("Disable Updates"), f"win.mask{index}") diff --git a/src/warehouse.gresource.xml b/src/warehouse.gresource.xml index 71c6b91..844eb65 100644 --- a/src/warehouse.gresource.xml +++ b/src/warehouse.gresource.xml @@ -31,5 +31,7 @@ ../data/icons/arrow2-top-right-symbolic.svg ../data/icons/software-update-available-symbolic.svg ../data/icons/software-update-urgent-symbolic.svg + ../data/icons/cross-filled-symbolic.svg + ../data/icons/important-small-symbolic.svg diff --git a/src/window.py b/src/window.py index 24c354e..ab771c9 100644 --- a/src/window.py +++ b/src/window.py @@ -156,10 +156,13 @@ class WarehouseWindow(Adw.ApplicationWindow): dialog = Adw.MessageDialog.new(self, _("Uninstall Selected Apps?"), _("It will not be possible to use these apps after removal.")) # Check to see if at least one app in the list has user data - for i in range(len(self.flatpak_rows)): - if not self.flatpak_rows[1]: - continue # Skip if not selected - if os.path.exists(f"{self.user_data_path}{self.flatpak_rows[i][6][2]}"): + i = 0 + while(True): + current = self.flatpaks_list_box.get_row_at_index(i) + i += 1 + if(current == None): + break + if current.tickbox.get_active() and os.path.exists(f"{self.user_data_path}{current.app_id}"): has_user_data = True break @@ -304,6 +307,8 @@ class WarehouseWindow(Adw.ApplicationWindow): def refresh_list_of_flatpaks(self, widget, should_toast): if self.currently_uninstalling: return + if should_toast: + self.toast_overlay.add_toast(Adw.Toast.new(_("List refreshed"))) self.flatpaks_list_box.remove_all() self.generate_list_of_flatpaks() self.batch_mode_button.set_active(False) @@ -415,25 +420,24 @@ class WarehouseWindow(Adw.ApplicationWindow): self.batch_uninstall_button.set_sensitive(should_enable) def onBatchCleanResponse(self, dialog, response, _a): - if response == "cancel": - return 1 - show_success = True - for i in range(len(self.flatpak_rows)): - if not self.flatpak_rows[i][1]: - continue # Skip if not selected - app_id = self.flatpak_rows[i][6][2] - app_name = self.flatpak_rows[i][6][0] - path = f"{self.user_data_path}{app_id}" - trash = self.my_utils.trashFolder(path) + i = 0 + trashReturnCodes = 0 + while(True): + current = self.flatpaks_list_box.get_row_at_index(i) + i += 1 + if current == None: + break + if current.tickbox.get_active() == False: + continue + trash = self.my_utils.trashFolder(f"{self.user_data_path}{current.app_id}") if trash == 1: - show_success = False - self.toast_overlay.add_toast(Adw.Toast.new(_("No user data for {}").format(app_name))) - elif trash == 2: - show_success = False - self.toast_overlay.add_toast(Adw.Toast.new(_("Could not trash user data"))) - if show_success: - self.toast_overlay.add_toast(Adw.Toast.new(_("Trashed user data"))) - #self.refresh_list_of_flatpaks(_a, False) + self.toast_overlay.add_toast(Adw.Toast.new(_("{} has no data to trash").format(current.app_name))) + continue + if trash == 2: + self.toast_overlay.add_toast(Adw.Toast.new(_("Could not trash {}'s data").format(current.app_name))) + continue + self.lookup_action(f"open-data{current.index}").set_enabled(False) # Disable the Open User Data dropdown option when the data was deleted + self.lookup_action(f"trash{current.index}").set_enabled(False) # Disable the Trash User Data dropdown option when the data was deleted def batchCleanHandler(self, widget): dialog = Adw.MessageDialog.new(self, _("Trash Selected Apps' User Data?"), _("Your files and data for these apps will be sent to the trash.")) @@ -444,10 +448,6 @@ class WarehouseWindow(Adw.ApplicationWindow): dialog.connect("response", self.onBatchCleanResponse, dialog.choose_finish) Gtk.Window.present(dialog) - - - - def batchSelectAllButtonHandler(self, widget): self.set_select_all(widget.get_active()) @@ -490,25 +490,40 @@ class WarehouseWindow(Adw.ApplicationWindow): def copyNames(self, widget, _a): to_copy = "" - for i in range(len(self.flatpak_rows)): - if self.flatpak_rows[i][1]: - to_copy += f"{(self.flatpak_rows[i][6][0])}\n" + i = 0 + while(True): + current = self.flatpaks_list_box.get_row_at_index(i) + i += 1 + if(current == None): + break + if current.tickbox.get_active(): + to_copy += f"{current.app_name}\n" self.clipboard.set(to_copy) self.toast_overlay.add_toast(Adw.Toast.new(_("Copied selected app names"))) def copyIDs(self, widget, _a): to_copy = "" - for i in range(len(self.flatpak_rows)): - if self.flatpak_rows[i][1]: - to_copy += f"{(self.flatpak_rows[i][6][2])}\n" + i = 0 + while(True): + current = self.flatpaks_list_box.get_row_at_index(i) + i += 1 + if(current == None): + break + if current.tickbox.get_active(): + to_copy += f"{current.app_id}\n" self.clipboard.set(to_copy) self.toast_overlay.add_toast(Adw.Toast.new(_("Copied selected app IDs"))) def copyRefs(self, widget, _a): to_copy = "" - for i in range(len(self.flatpak_rows)): - if self.flatpak_rows[i][1]: - to_copy += f"{(self.flatpak_rows[i][6][8])}\n" + i = 0 + while(True): + current = self.flatpaks_list_box.get_row_at_index(i) + i += 1 + if(current == None): + break + if current.tickbox.get_active(): + to_copy += f"{current.app_ref}\n" self.clipboard.set(to_copy) self.toast_overlay.add_toast(Adw.Toast.new(_("Copied selected app refs")))