diff --git a/cura/Backups/Backup.py b/cura/Backups/Backup.py index 5fad2ccf19..6128dac320 100644 --- a/cura/Backups/Backup.py +++ b/cura/Backups/Backup.py @@ -166,6 +166,9 @@ class Backup: Logger.log("d", "Moving preferences file from %s to %s", backup_preferences_file, preferences_file) shutil.move(backup_preferences_file, preferences_file) + # Read the preferences from the newly restored configuration (or else the cached Preferences will override the restored ones) + self._application.readPreferencesFromConfiguration() + # Restore the obfuscated settings self._illuminate(**secrets) @@ -191,7 +194,10 @@ class Backup: Resources.factoryReset() Logger.log("d", "Extracting backup to location: %s", target_path) try: - archive.extractall(target_path) + name_list = archive.namelist() + for archive_filename in name_list: + archive.extract(archive_filename, target_path) + CuraApplication.getInstance().processEvents() except (PermissionError, EnvironmentError): Logger.logException("e", "Unable to extract the backup due to permission or file system errors.") return False diff --git a/plugins/CuraDrive/src/DriveApiService.py b/plugins/CuraDrive/src/DriveApiService.py index 754069dc9b..6dd6f02b97 100644 --- a/plugins/CuraDrive/src/DriveApiService.py +++ b/plugins/CuraDrive/src/DriveApiService.py @@ -93,7 +93,7 @@ class DriveApiService: def _onRestoreFinished(self, job: "RestoreBackupJob") -> None: if job.restore_backup_error_message != "": # If the job contains an error message we pass it along so the UI can display it. - self.restoringStateChanged.emit(is_restoring=False) + self.restoringStateChanged.emit(is_restoring = False) else: self.restoringStateChanged.emit(is_restoring = False, error_message = job.restore_backup_error_message) diff --git a/plugins/CuraDrive/src/DrivePluginExtension.py b/plugins/CuraDrive/src/DrivePluginExtension.py index 8de4876f52..6fd55d172e 100644 --- a/plugins/CuraDrive/src/DrivePluginExtension.py +++ b/plugins/CuraDrive/src/DrivePluginExtension.py @@ -34,6 +34,9 @@ class DrivePluginExtension(QObject, Extension): # Signal emitted when preferences changed (like auto-backup). preferencesChanged = pyqtSignal() + # Signal emitted when the id of the backup-to-be-restored is changed + backupIdBeingRestoredChanged = pyqtSignal(arguments = ["backup_id_being_restored"]) + DATE_FORMAT = "%d/%m/%Y %H:%M:%S" def __init__(self) -> None: @@ -45,6 +48,7 @@ class DrivePluginExtension(QObject, Extension): self._backups = [] # type: List[Dict[str, Any]] self._is_restoring_backup = False self._is_creating_backup = False + self._backup_id_being_restored = "" # Initialize services. preferences = CuraApplication.getInstance().getPreferences() @@ -52,6 +56,7 @@ class DrivePluginExtension(QObject, Extension): # Attach signals. CuraApplication.getInstance().getCuraAPI().account.loginStateChanged.connect(self._onLoginStateChanged) + CuraApplication.getInstance().applicationShuttingDown.connect(self._onApplicationShuttingDown) self._drive_api_service.restoringStateChanged.connect(self._onRestoringStateChanged) self._drive_api_service.creatingStateChanged.connect(self._onCreatingStateChanged) @@ -75,6 +80,9 @@ class DrivePluginExtension(QObject, Extension): if self._drive_window: self._drive_window.show() + def _onApplicationShuttingDown(self): + self._drive_window.hide() + def _autoBackup(self) -> None: preferences = CuraApplication.getInstance().getPreferences() if preferences.getValue(Settings.AUTO_BACKUP_ENABLED_PREFERENCE_KEY) and self._isLastBackupTooLongAgo(): @@ -100,10 +108,11 @@ class DrivePluginExtension(QObject, Extension): if logged_in: self.refreshBackups() - def _onRestoringStateChanged(self, is_restoring: bool = False, error_message: str = None) -> None: + def _onRestoringStateChanged(self, is_restoring: bool = False, error_message: Optional[str] = None) -> None: self._is_restoring_backup = is_restoring self.restoringStateChanged.emit() if error_message: + self.backupIdBeingRestored = "" Message(error_message, title = catalog.i18nc("@info:title", "Backup")).show() def _onCreatingStateChanged(self, is_creating: bool = False, error_message: str = None) -> None: @@ -152,6 +161,7 @@ class DrivePluginExtension(QObject, Extension): for backup in self._backups: if backup.get("backup_id") == backup_id: self._drive_api_service.restoreBackup(backup) + self.setBackupIdBeingRestored(backup_id) return Logger.log("w", "Unable to find backup with the ID %s", backup_id) @@ -166,3 +176,12 @@ class DrivePluginExtension(QObject, Extension): def _backupDeletedCallback(self, success: bool): if success: self.refreshBackups() + + def setBackupIdBeingRestored(self, backup_id_being_restored: str) -> None: + if backup_id_being_restored != self._backup_id_being_restored: + self._backup_id_being_restored = backup_id_being_restored + self.backupIdBeingRestoredChanged.emit() + + @pyqtProperty(str, fset = setBackupIdBeingRestored, notify = backupIdBeingRestoredChanged) + def backupIdBeingRestored(self) -> str: + return self._backup_id_being_restored diff --git a/plugins/CuraDrive/src/qml/components/BackupListItem.qml b/plugins/CuraDrive/src/qml/components/BackupListItem.qml index 5cdb500b4e..7b539b03b9 100644 --- a/plugins/CuraDrive/src/qml/components/BackupListItem.qml +++ b/plugins/CuraDrive/src/qml/components/BackupListItem.qml @@ -71,6 +71,7 @@ Item text: catalog.i18nc("@button", "Restore") enabled: !CuraDrive.isCreatingBackup && !CuraDrive.isRestoringBackup onClicked: confirmRestoreDialog.visible = true + busy: CuraDrive.backupIdBeingRestored == modelData.backup_id && CuraDrive.isRestoringBackup } UM.SimpleButton