From ddf523e44790b88fc284bd8558218ca5551cc553 Mon Sep 17 00:00:00 2001 From: raj bunsha Date: Thu, 15 Feb 2024 01:17:10 +0530 Subject: [PATCH 1/5] Allowed multiple directories to be selected for backup by making few changes while calling QFileDialog corresponding to selecting folders. --- src/vorta/utils.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/vorta/utils.py b/src/vorta/utils.py index 033b486a5..0f02f9ea4 100644 --- a/src/vorta/utils.py +++ b/src/vorta/utils.py @@ -15,7 +15,7 @@ import psutil from PyQt6 import QtCore from PyQt6.QtCore import QFileInfo, QThread, pyqtSignal -from PyQt6.QtWidgets import QApplication, QFileDialog, QSystemTrayIcon +from PyQt6.QtWidgets import QApplication, QFileDialog, QSystemTrayIcon, QListView, QTreeView from vorta.borg._compatibility import BorgCompatibility from vorta.log import logger @@ -172,6 +172,16 @@ def choose_file_dialog(parent, title, want_folder=True): dialog.setParent(parent, QtCore.Qt.WindowType.Sheet) if want_folder: dialog.setOption(QFileDialog.Option.ShowDirsOnly) + dialog.setFileMode(QFileDialog.FileMode.Directory) + dialog.setOption(QFileDialog.Option.DontUseNativeDialog, True) + list_view = dialog.findChild(QListView, "listView") + if list_view: + list_view.setSelectionMode(QListView.SelectionMode.MultiSelection) + + tree_view = dialog.findChild(QTreeView) + if tree_view: + tree_view.setSelectionMode(QTreeView.SelectionMode.MultiSelection) + return dialog From 3cbed4702ce72e88e3792d25455b53917d4d9614 Mon Sep 17 00:00:00 2001 From: raj bunsha Date: Thu, 15 Feb 2024 01:19:28 +0530 Subject: [PATCH 2/5] Made few changes to allow adding multiple directories without having to change anything else. --- src/vorta/views/archive_tab.py | 6 ++++-- src/vorta/views/repo_add_dialog.py | 3 ++- src/vorta/views/source_tab.py | 3 ++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/vorta/views/archive_tab.py b/src/vorta/views/archive_tab.py index d2af5757b..2daa67762 100644 --- a/src/vorta/views/archive_tab.py +++ b/src/vorta/views/archive_tab.py @@ -642,7 +642,8 @@ def receive(): self.app.jobs_manager.add_job(job) dialog = choose_file_dialog(self, self.tr("Choose Mount Point"), want_folder=True) - dialog.open(receive) + if dialog.exec(): + receive() def mount_result(self, result): if result['returncode'] == 0: @@ -788,7 +789,8 @@ def receive(): self._set_status(params['message']) dialog = choose_file_dialog(self, self.tr("Choose Extraction Point"), want_folder=True) - dialog.open(receive) + if dialog.exec(): + receive() window = ExtractDialog(archive, model) self._toggle_all_buttons(True) diff --git a/src/vorta/views/repo_add_dialog.py b/src/vorta/views/repo_add_dialog.py index cd265a333..62295bf4e 100644 --- a/src/vorta/views/repo_add_dialog.py +++ b/src/vorta/views/repo_add_dialog.py @@ -72,7 +72,8 @@ def receive(): self.is_remote_repo = False dialog = choose_file_dialog(self, self.tr("Choose Location of Borg Repository")) - dialog.open(receive) + if dialog.exec(): + receive() def use_remote_repo_action(self): self.repoURL.setText('') diff --git a/src/vorta/views/source_tab.py b/src/vorta/views/source_tab.py index ed63be2a7..c702b909c 100644 --- a/src/vorta/views/source_tab.py +++ b/src/vorta/views/source_tab.py @@ -302,7 +302,8 @@ def receive(): msg = self.tr("Choose directory to back up") if want_folder else self.tr("Choose file(s) to back up") dialog = choose_file_dialog(self, msg, want_folder=want_folder) - dialog.open(receive) + if dialog.exec(): + receive(dialog) def source_copy(self, index=None): """ From b684ff024f671fbc472748afa68f5c1e022d47fa Mon Sep 17 00:00:00 2001 From: raj bunsha Date: Thu, 15 Feb 2024 11:59:01 +0530 Subject: [PATCH 3/5] Made change to the way file is opened and made a formatting change --- src/vorta/utils.py | 8 +++++++- src/vorta/views/archive_tab.py | 8 ++++---- src/vorta/views/repo_add_dialog.py | 4 ++-- src/vorta/views/source_tab.py | 4 ++-- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/vorta/utils.py b/src/vorta/utils.py index 0f02f9ea4..61d693edf 100644 --- a/src/vorta/utils.py +++ b/src/vorta/utils.py @@ -15,7 +15,13 @@ import psutil from PyQt6 import QtCore from PyQt6.QtCore import QFileInfo, QThread, pyqtSignal -from PyQt6.QtWidgets import QApplication, QFileDialog, QSystemTrayIcon, QListView, QTreeView +from PyQt6.QtWidgets import ( + QApplication, + QFileDialog, + QListView, + QSystemTrayIcon, + QTreeView, +) from vorta.borg._compatibility import BorgCompatibility from vorta.log import logger diff --git a/src/vorta/views/archive_tab.py b/src/vorta/views/archive_tab.py index 2daa67762..8fe7b44da 100644 --- a/src/vorta/views/archive_tab.py +++ b/src/vorta/views/archive_tab.py @@ -642,8 +642,8 @@ def receive(): self.app.jobs_manager.add_job(job) dialog = choose_file_dialog(self, self.tr("Choose Mount Point"), want_folder=True) - if dialog.exec(): - receive() + dialog.filesSelected.connect(receive) + dialog.open() def mount_result(self, result): if result['returncode'] == 0: @@ -789,8 +789,8 @@ def receive(): self._set_status(params['message']) dialog = choose_file_dialog(self, self.tr("Choose Extraction Point"), want_folder=True) - if dialog.exec(): - receive() + dialog.filesSelected.connect(receive) + dialog.open() window = ExtractDialog(archive, model) self._toggle_all_buttons(True) diff --git a/src/vorta/views/repo_add_dialog.py b/src/vorta/views/repo_add_dialog.py index 62295bf4e..a60dba824 100644 --- a/src/vorta/views/repo_add_dialog.py +++ b/src/vorta/views/repo_add_dialog.py @@ -72,8 +72,8 @@ def receive(): self.is_remote_repo = False dialog = choose_file_dialog(self, self.tr("Choose Location of Borg Repository")) - if dialog.exec(): - receive() + dialog.filesSelected.connect(receive) + dialog.open() def use_remote_repo_action(self): self.repoURL.setText('') diff --git a/src/vorta/views/source_tab.py b/src/vorta/views/source_tab.py index c702b909c..77031d6f6 100644 --- a/src/vorta/views/source_tab.py +++ b/src/vorta/views/source_tab.py @@ -302,8 +302,8 @@ def receive(): msg = self.tr("Choose directory to back up") if want_folder else self.tr("Choose file(s) to back up") dialog = choose_file_dialog(self, msg, want_folder=want_folder) - if dialog.exec(): - receive(dialog) + dialog.filesSelected.connect(receive) + dialog.open() def source_copy(self, index=None): """ From 455a15d92dc172b555c3cd0e4d8777bbff79dd69 Mon Sep 17 00:00:00 2001 From: raj bunsha Date: Thu, 15 Feb 2024 12:22:54 +0530 Subject: [PATCH 4/5] Added a function to MockFileDialog along with the change in original files to make sure multiple directories are added when directories are chosen --- src/vorta/views/archive_tab.py | 8 ++++---- src/vorta/views/repo_add_dialog.py | 4 ++-- src/vorta/views/source_tab.py | 4 ++-- tests/integration/conftest.py | 3 +++ tests/unit/conftest.py | 3 +++ tests/unit/test_archives.py | 3 +++ 6 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/vorta/views/archive_tab.py b/src/vorta/views/archive_tab.py index 8fe7b44da..2daa67762 100644 --- a/src/vorta/views/archive_tab.py +++ b/src/vorta/views/archive_tab.py @@ -642,8 +642,8 @@ def receive(): self.app.jobs_manager.add_job(job) dialog = choose_file_dialog(self, self.tr("Choose Mount Point"), want_folder=True) - dialog.filesSelected.connect(receive) - dialog.open() + if dialog.exec(): + receive() def mount_result(self, result): if result['returncode'] == 0: @@ -789,8 +789,8 @@ def receive(): self._set_status(params['message']) dialog = choose_file_dialog(self, self.tr("Choose Extraction Point"), want_folder=True) - dialog.filesSelected.connect(receive) - dialog.open() + if dialog.exec(): + receive() window = ExtractDialog(archive, model) self._toggle_all_buttons(True) diff --git a/src/vorta/views/repo_add_dialog.py b/src/vorta/views/repo_add_dialog.py index a60dba824..62295bf4e 100644 --- a/src/vorta/views/repo_add_dialog.py +++ b/src/vorta/views/repo_add_dialog.py @@ -72,8 +72,8 @@ def receive(): self.is_remote_repo = False dialog = choose_file_dialog(self, self.tr("Choose Location of Borg Repository")) - dialog.filesSelected.connect(receive) - dialog.open() + if dialog.exec(): + receive() def use_remote_repo_action(self): self.repoURL.setText('') diff --git a/src/vorta/views/source_tab.py b/src/vorta/views/source_tab.py index 77031d6f6..78f665a59 100644 --- a/src/vorta/views/source_tab.py +++ b/src/vorta/views/source_tab.py @@ -302,8 +302,8 @@ def receive(): msg = self.tr("Choose directory to back up") if want_folder else self.tr("Choose file(s) to back up") dialog = choose_file_dialog(self, msg, want_folder=want_folder) - dialog.filesSelected.connect(receive) - dialog.open() + if dialog.exec(): + receive() def source_copy(self, index=None): """ diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index 683271f54..4e581bd13 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -189,6 +189,9 @@ def __init__(self, *args, **kwargs): def open(self, func): func() + + def exec(self): + return 1 def selectedFiles(self): if self.subdirectory: diff --git a/tests/unit/conftest.py b/tests/unit/conftest.py index e622a2118..fecaed649 100644 --- a/tests/unit/conftest.py +++ b/tests/unit/conftest.py @@ -85,6 +85,9 @@ def __init__(self, *args, **kwargs): def open(self, func): func() + + def exec(self): + return 1 def selectedFiles(self): return ['/tmp'] diff --git a/tests/unit/test_archives.py b/tests/unit/test_archives.py index e0a7fb1aa..3a04f1470 100644 --- a/tests/unit/test_archives.py +++ b/tests/unit/test_archives.py @@ -14,6 +14,9 @@ class MockFileDialog: def open(self, func): func() + def exec(self): + return 1 + def selectedFiles(self): return ['/tmp'] From a1d407267b083780505e9151727c99221771d5cc Mon Sep 17 00:00:00 2001 From: raj bunsha Date: Fri, 16 Feb 2024 18:33:04 +0530 Subject: [PATCH 5/5] Trimmed trailing whitespace --- tests/integration/conftest.py | 2 +- tests/unit/conftest.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index 4e581bd13..8dffd8d7a 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -189,7 +189,7 @@ def __init__(self, *args, **kwargs): def open(self, func): func() - + def exec(self): return 1 diff --git a/tests/unit/conftest.py b/tests/unit/conftest.py index fecaed649..2d689d40e 100644 --- a/tests/unit/conftest.py +++ b/tests/unit/conftest.py @@ -85,7 +85,7 @@ def __init__(self, *args, **kwargs): def open(self, func): func() - + def exec(self): return 1