From aa2c7db6979924637c5231ca3ef880f9e51988ff Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Wed, 25 Oct 2023 15:10:20 +0200 Subject: [PATCH 01/11] add reset local changes --- Mergin/project_status_dialog.py | 24 +++++++++++++++++++++++- Mergin/ui/ui_status_dialog.ui | 13 ++++++++++--- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/Mergin/project_status_dialog.py b/Mergin/project_status_dialog.py index bb8fc51c..b1e71a62 100644 --- a/Mergin/project_status_dialog.py +++ b/Mergin/project_status_dialog.py @@ -17,7 +17,7 @@ from qgis.utils import OverrideCursor from .diff_dialog import DiffViewerDialog from .validation import MultipleLayersWarning, warning_display_string, MerginProjectValidator -from .utils import is_versioned_file, icon_path, unsaved_project_check, UnsavedChangesStrategy +from .utils import is_versioned_file, icon_path, unsaved_project_check, UnsavedChangesStrategy, create_mergin_client from .repair import fix_datum_shift_grids @@ -83,6 +83,13 @@ def __init__( self.validate_project() + self.btn_reset_local_changes.clicked.connect(self.reset_local_changes) + + if len(push_changes["added"]) > 0 or len(push_changes["removed"]) > 0 or len(push_changes["updated"]) > 0: + self.btn_reset_local_changes.setEnabled(True) + else: + self.btn_reset_local_changes.setEnabled(False) + def _get_info_text(self, has_files_to_replace, has_write_permissions, has_unfinished_pull): msg = [] if not has_write_permissions: @@ -231,3 +238,18 @@ def validate_project(self): else: self.show_validation_results(results) self.btn_sync.setStyleSheet("background-color: #ffc800") + + def reset_local_changes(self): + btn_reply = QMessageBox.question( + None, + "Remove local changes", + "Local changes will be reverted to previous uploaded version. Some files might be removed or modified! Do you want to proceed?", + QMessageBox.Yes | QMessageBox.No, + QMessageBox.Yes, + ) + if btn_reply == QMessageBox.No: + return + mc = create_mergin_client() + mc.reset_local_changes(self.mp.dir) + QMessageBox.information(None, "Remove local changes", "Local changes have been reverted.") + self.close() diff --git a/Mergin/ui/ui_status_dialog.ui b/Mergin/ui/ui_status_dialog.ui index 3750c43e..ade09d01 100644 --- a/Mergin/ui/ui_status_dialog.ui +++ b/Mergin/ui/ui_status_dialog.ui @@ -14,7 +14,7 @@ Project status - + QFrame::StyledPanel @@ -24,7 +24,7 @@ - + QAbstractItemView::NoEditTriggers @@ -41,7 +41,7 @@ - + true @@ -62,6 +62,13 @@ + + + Reset Local Changes + + + + Qt::Horizontal From 4f4efa21de25321715ac55e058fbbe64c91bbf9e Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Thu, 26 Oct 2023 15:37:03 +0200 Subject: [PATCH 02/11] Update Mergin/project_status_dialog.py Co-authored-by: Martin Dobias --- Mergin/project_status_dialog.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mergin/project_status_dialog.py b/Mergin/project_status_dialog.py index b1e71a62..ff1d9f04 100644 --- a/Mergin/project_status_dialog.py +++ b/Mergin/project_status_dialog.py @@ -242,8 +242,8 @@ def validate_project(self): def reset_local_changes(self): btn_reply = QMessageBox.question( None, - "Remove local changes", - "Local changes will be reverted to previous uploaded version. Some files might be removed or modified! Do you want to proceed?", + "Reset changes", + "All changes in your project directory will be reverted. Do you want to proceed?", QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes, ) From f38cfe1d6b75fab3a438193e2de2f6500324c232 Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Thu, 26 Oct 2023 15:39:15 +0200 Subject: [PATCH 03/11] fix comparison --- Mergin/project_status_dialog.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mergin/project_status_dialog.py b/Mergin/project_status_dialog.py index ff1d9f04..dc54ae8f 100644 --- a/Mergin/project_status_dialog.py +++ b/Mergin/project_status_dialog.py @@ -247,7 +247,7 @@ def reset_local_changes(self): QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes, ) - if btn_reply == QMessageBox.No: + if btn_reply != QMessageBox.Yes: return mc = create_mergin_client() mc.reset_local_changes(self.mp.dir) From 8660d2b75baa000b80c2c806c842cfb9ca9f71b6 Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Thu, 26 Oct 2023 15:45:03 +0200 Subject: [PATCH 04/11] change label --- Mergin/ui/ui_status_dialog.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mergin/ui/ui_status_dialog.ui b/Mergin/ui/ui_status_dialog.ui index ade09d01..f6365034 100644 --- a/Mergin/ui/ui_status_dialog.ui +++ b/Mergin/ui/ui_status_dialog.ui @@ -64,7 +64,7 @@ - Reset Local Changes + Reset Changes From 30d8f1f0831b9edcf7f88975e44590c66c86fc23 Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Thu, 26 Oct 2023 15:45:15 +0200 Subject: [PATCH 05/11] add icon --- Mergin/project_status_dialog.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Mergin/project_status_dialog.py b/Mergin/project_status_dialog.py index dc54ae8f..5b252aa1 100644 --- a/Mergin/project_status_dialog.py +++ b/Mergin/project_status_dialog.py @@ -83,6 +83,7 @@ def __init__( self.validate_project() + self.btn_reset_local_changes.setIcon(QIcon(icon_path("trash.svg"))) self.btn_reset_local_changes.clicked.connect(self.reset_local_changes) if len(push_changes["added"]) > 0 or len(push_changes["removed"]) > 0 or len(push_changes["updated"]) > 0: From a4b211e2bb78e9e3a0e0e708e2a8a668c44ef37e Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Thu, 26 Oct 2023 15:46:44 +0200 Subject: [PATCH 06/11] add tooltip --- Mergin/ui/ui_status_dialog.ui | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Mergin/ui/ui_status_dialog.ui b/Mergin/ui/ui_status_dialog.ui index f6365034..1a8cf3fb 100644 --- a/Mergin/ui/ui_status_dialog.ui +++ b/Mergin/ui/ui_status_dialog.ui @@ -63,6 +63,9 @@ + + This will revert all changes in your local project directory. + Reset Changes From 7322c270d896711b09f4e436c1b24b795fe9f554 Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Wed, 8 Nov 2023 09:55:25 +0100 Subject: [PATCH 07/11] return custom value if reset changes was triggered --- Mergin/project_status_dialog.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Mergin/project_status_dialog.py b/Mergin/project_status_dialog.py index 5b252aa1..b68ed4dd 100644 --- a/Mergin/project_status_dialog.py +++ b/Mergin/project_status_dialog.py @@ -33,6 +33,9 @@ class ProjectStatusDialog(QDialog): "table": "table.svg", } + # custom return value + RESET_CHANGES = 3 + def __init__( self, pull_changes, @@ -250,7 +253,4 @@ def reset_local_changes(self): ) if btn_reply != QMessageBox.Yes: return - mc = create_mergin_client() - mc.reset_local_changes(self.mp.dir) - QMessageBox.information(None, "Remove local changes", "Local changes have been reverted.") - self.close() + return self.done(self.RESET_CHANGES) From 2c57e9f869e4f92c8ca99af5d652f035019f9efd Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Wed, 8 Nov 2023 09:57:30 +0100 Subject: [PATCH 08/11] add reset_local_changes --- Mergin/projects_manager.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/Mergin/projects_manager.py b/Mergin/projects_manager.py index bc9667cc..676a3bf3 100644 --- a/Mergin/projects_manager.py +++ b/Mergin/projects_manager.py @@ -215,6 +215,32 @@ def check_project_server(self, project_dir, inform_user=True): QMessageBox.critical(None, "Mergin Maps", info) return False + def reset_local_changes(self, project_dir: str): + if not project_dir: + return + if not self.check_project_server(project_dir): + return + mp = MerginProject(project_dir) + try: + project_name = mp.metadata["name"] + except InvalidProject as e: + msg = f"Failed to reset local changes for project:\n\n{str(e)}" + QMessageBox.critical(None, "Project reset local changes", msg, QMessageBox.Close) + return + + current_project_filename = QgsProject.instance().fileName() + current_project_path = os.path.normpath(QgsProject.instance().absolutePath()) + if current_project_path == os.path.normpath(project_dir): + QgsProject.instance().clear() + + try: + self.mc.reset_local_changes(project_dir) + except Exception as e: + msg = f"Failed to reset local changes:\n\n{str(e)}" + QMessageBox.critical(None, "Project reset local changes", msg, QMessageBox.Close) + + QgsProject.instance().read(current_project_filename) + def sync_project(self, project_dir, project_name=None): if not project_dir: return From a4f0e51a3e4de3647c8264103ad6e78e76f59330 Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Wed, 8 Nov 2023 09:57:59 +0100 Subject: [PATCH 09/11] sync or reset base on return value of the dialog --- Mergin/projects_manager.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Mergin/projects_manager.py b/Mergin/projects_manager.py index 676a3bf3..56b0e389 100644 --- a/Mergin/projects_manager.py +++ b/Mergin/projects_manager.py @@ -177,8 +177,12 @@ def project_status(self, project_dir): # Sync button in the status dialog returns QDialog.Accepted # and Close button retuns QDialog::Rejected, so it dialog was # accepted we start sync - if dlg.exec_(): + return_value = dlg.exec_() + + if return_value == ProjectStatusDialog.Accepted: self.sync_project(project_dir) + elif return_value == ProjectStatusDialog.RESET_CHANGES: + self.reset_local_changes(project_dir) except (URLError, ClientError, InvalidProject) as e: msg = f"Failed to get status for project {project_name}:\n\n{str(e)}" From cd2da0affa356e4edf0ff257dc04b509defcb10c Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Wed, 6 Dec 2023 14:15:56 +0100 Subject: [PATCH 10/11] review suggestions --- Mergin/project_status_dialog.py | 2 +- Mergin/projects_manager.py | 9 +-------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/Mergin/project_status_dialog.py b/Mergin/project_status_dialog.py index b68ed4dd..71079501 100644 --- a/Mergin/project_status_dialog.py +++ b/Mergin/project_status_dialog.py @@ -17,7 +17,7 @@ from qgis.utils import OverrideCursor from .diff_dialog import DiffViewerDialog from .validation import MultipleLayersWarning, warning_display_string, MerginProjectValidator -from .utils import is_versioned_file, icon_path, unsaved_project_check, UnsavedChangesStrategy, create_mergin_client +from .utils import is_versioned_file, icon_path, unsaved_project_check, UnsavedChangesStrategy from .repair import fix_datum_shift_grids diff --git a/Mergin/projects_manager.py b/Mergin/projects_manager.py index 56b0e389..3a28a704 100644 --- a/Mergin/projects_manager.py +++ b/Mergin/projects_manager.py @@ -224,13 +224,6 @@ def reset_local_changes(self, project_dir: str): return if not self.check_project_server(project_dir): return - mp = MerginProject(project_dir) - try: - project_name = mp.metadata["name"] - except InvalidProject as e: - msg = f"Failed to reset local changes for project:\n\n{str(e)}" - QMessageBox.critical(None, "Project reset local changes", msg, QMessageBox.Close) - return current_project_filename = QgsProject.instance().fileName() current_project_path = os.path.normpath(QgsProject.instance().absolutePath()) @@ -243,7 +236,7 @@ def reset_local_changes(self, project_dir: str): msg = f"Failed to reset local changes:\n\n{str(e)}" QMessageBox.critical(None, "Project reset local changes", msg, QMessageBox.Close) - QgsProject.instance().read(current_project_filename) + self.open_project(os.path.dirname(current_project_filename)) def sync_project(self, project_dir, project_name=None): if not project_dir: From 4b6bc49c1067e44fe26cb03b078828cbed67d5a5 Mon Sep 17 00:00:00 2001 From: Jan Caha Date: Wed, 6 Dec 2023 14:16:05 +0100 Subject: [PATCH 11/11] better icon --- Mergin/images/default/tabler_icons/revert-changes.svg | 7 +++++++ Mergin/images/white/tabler_icons/revert-changes.svg | 6 ++++++ Mergin/project_status_dialog.py | 2 +- 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 Mergin/images/default/tabler_icons/revert-changes.svg create mode 100644 Mergin/images/white/tabler_icons/revert-changes.svg diff --git a/Mergin/images/default/tabler_icons/revert-changes.svg b/Mergin/images/default/tabler_icons/revert-changes.svg new file mode 100644 index 00000000..bc0abbeb --- /dev/null +++ b/Mergin/images/default/tabler_icons/revert-changes.svg @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/Mergin/images/white/tabler_icons/revert-changes.svg b/Mergin/images/white/tabler_icons/revert-changes.svg new file mode 100644 index 00000000..83585658 --- /dev/null +++ b/Mergin/images/white/tabler_icons/revert-changes.svg @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/Mergin/project_status_dialog.py b/Mergin/project_status_dialog.py index 71079501..ed143cb8 100644 --- a/Mergin/project_status_dialog.py +++ b/Mergin/project_status_dialog.py @@ -86,7 +86,7 @@ def __init__( self.validate_project() - self.btn_reset_local_changes.setIcon(QIcon(icon_path("trash.svg"))) + self.btn_reset_local_changes.setIcon(QIcon(icon_path("revert-changes.svg"))) self.btn_reset_local_changes.clicked.connect(self.reset_local_changes) if len(push_changes["added"]) > 0 or len(push_changes["removed"]) > 0 or len(push_changes["updated"]) > 0: