diff --git a/app/ui/backup.py b/app/ui/backup.py index 8c1a1188..69c07797 100644 --- a/app/ui/backup.py +++ b/app/ui/backup.py @@ -1,13 +1,21 @@ import os +import shutil +from enum import Enum from app.commons import run_idle from app.ui.dialogs import show_dialog, DialogType from .uicommons import Gtk, Gdk, UI_RESOURCES_PATH +class RestoreType(Enum): + BOUQUETS = 0 + ALL = 1 + + class BackupDialog: - def __init__(self, transient, backup_path): - handlers = {"on_extract": self.on_extract, + def __init__(self, transient, data_path, callback): + handlers = {"on_restore_bouquets": self.on_restore_bouquets, + "on_restore_all": self.on_restore_all, "on_remove": self.on_remove, "on_view_popup_menu": self.on_view_popup_menu, "on_info_bar_close": self.on_info_bar_close} @@ -17,7 +25,9 @@ class BackupDialog: builder.add_from_file(UI_RESOURCES_PATH + "backup_dialog.glade") builder.connect_signals(handlers) - self._backup_path = backup_path + self._data_path = data_path + self._backup_path = data_path + "backup/" + self._open_data_callback = callback self._dialog_window = builder.get_object("dialog_window") self._dialog_window.set_transient_for(transient) self._model = builder.get_object("main_list_store") @@ -38,18 +48,11 @@ class BackupDialog: for file in filter(lambda x: x.endswith(".zip"), files): self._model.append((file.rstrip(".zip"), False)) - def on_extract(self, item): - model, paths = self._main_view.get_selection().get_selected_rows() - if not paths: - show_dialog(DialogType.ERROR, self._dialog_window, "No selected item!") - return + def on_restore_bouquets(self, item): + self.restore(RestoreType.BOUQUETS) - if len(paths) > 1: - show_dialog(DialogType.ERROR, self._dialog_window, "Please, select only one item!") - return - - if show_dialog(DialogType.QUESTION, self._dialog_window) == Gtk.ResponseType.CANCEL: - return + def on_restore_all(self, item): + self.restore(RestoreType.ALL) def on_remove(self, item): model, paths = self._main_view.get_selection().get_selected_rows() @@ -60,15 +63,16 @@ class BackupDialog: if show_dialog(DialogType.QUESTION, self._dialog_window) == Gtk.ResponseType.CANCEL: return - for path in paths: - itr = model.get_iter(path) - file_name = model.get_value(itr, 0) - try: + itrs_to_delete = [] + try: + for itr in map(model.get_iter, paths): + file_name = model.get_value(itr, 0) os.remove("{}{}{}".format(self._backup_path, file_name, ".zip")) - except FileNotFoundError as e: - self.show_info_message(str(e), Gtk.MessageType.ERROR) - else: - model.remove(model.get_iter(path)) + itrs_to_delete.append(itr) + except FileNotFoundError as e: + self.show_info_message(str(e), Gtk.MessageType.ERROR) + else: + list(map(model.remove, itrs_to_delete)) def on_view_popup_menu(self, menu, event): if event.get_event_type() == Gdk.EventType.BUTTON_PRESS and event.button == Gdk.BUTTON_SECONDARY: @@ -83,6 +87,32 @@ class BackupDialog: def on_info_bar_close(self, bar=None, resp=None): self._info_bar.set_visible(False) + def restore(self, restore_type): + model, paths = self._main_view.get_selection().get_selected_rows() + if not paths: + show_dialog(DialogType.ERROR, self._dialog_window, "No selected item!") + return + + if len(paths) > 1: + show_dialog(DialogType.ERROR, self._dialog_window, "Please, select only one item!") + return + + if show_dialog(DialogType.QUESTION, self._dialog_window) == Gtk.ResponseType.CANCEL: + return + + file_name = model.get_value(model.get_iter(paths[0]), 0) + ".zip" + file_name = self._backup_path + file_name + + if restore_type is RestoreType.ALL: + try: + shutil.unpack_archive(file_name, self._data_path) + except FileNotFoundError as e: + self.show_info_message(str(e), Gtk.MessageType.ERROR) + else: + self._open_data_callback(self._data_path) + elif restore_type is RestoreType.BOUQUETS: + show_dialog(DialogType.ERROR, transient=self._dialog_window, text="Not implemented yet!") + if __name__ == "__main__": pass diff --git a/app/ui/backup_dialog.glade b/app/ui/backup_dialog.glade index 4dc5a000..e4c7b91d 100644 --- a/app/ui/backup_dialog.glade +++ b/app/ui/backup_dialog.glade @@ -30,7 +30,7 @@ True True Extract - + True @@ -185,7 +185,7 @@ False restore_popup_menu_item_image False - + @@ -196,6 +196,7 @@ False restore_popup_menu_item_image2 False + diff --git a/app/ui/main_app_window.py b/app/ui/main_app_window.py index 29e70571..9a10149f 100644 --- a/app/ui/main_app_window.py +++ b/app/ui/main_app_window.py @@ -1254,7 +1254,9 @@ class Application(Gtk.Application): def on_backup_tool_show(self, item): """ Shows backup tool dialog """ - BackupDialog(self._main_window, self._options.get(self._profile).get("data_dir_path", "") + "backup/").show() + BackupDialog(self._main_window, + self._options.get(self._profile).get("data_dir_path", ""), + self.open_data).show() # ***************** Player *********************#