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
-
+
@@ -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 *********************#