From 771deab9da1f4a86c7198ad05a76f44b7acbeedf Mon Sep 17 00:00:00 2001 From: Manu Date: Wed, 4 Dec 2024 14:12:08 +0000 Subject: [PATCH 1/8] Use events instead of calling child widgets --- src/vorta/application.py | 1 + src/vorta/views/archive_tab.py | 2 ++ src/vorta/views/log_page.py | 2 ++ src/vorta/views/main_window.py | 24 +++++++++++------------- src/vorta/views/misc_tab.py | 1 + src/vorta/views/networks_page.py | 4 +++- src/vorta/views/repo_tab.py | 6 +++--- src/vorta/views/schedule_page.py | 3 +++ src/vorta/views/source_tab.py | 7 ++++--- 9 files changed, 30 insertions(+), 20 deletions(-) diff --git a/src/vorta/application.py b/src/vorta/application.py index 17ec6752a..d87830d91 100644 --- a/src/vorta/application.py +++ b/src/vorta/application.py @@ -42,6 +42,7 @@ class VortaApp(QtSingleApplication): backup_log_event = QtCore.pyqtSignal(str, dict) backup_progress_event = QtCore.pyqtSignal(str) check_failed_event = QtCore.pyqtSignal(dict) + profile_changed_event = QtCore.pyqtSignal() def __init__(self, args_raw, single_app=False): super().__init__(str(APP_ID), args_raw) diff --git a/src/vorta/views/archive_tab.py b/src/vorta/views/archive_tab.py index cab452856..d865cf188 100644 --- a/src/vorta/views/archive_tab.py +++ b/src/vorta/views/archive_tab.py @@ -152,6 +152,8 @@ def __init__(self, parent=None, app=None): # Connect to palette change self.app.paletteChanged.connect(lambda p: self.set_icons()) + self.app.profile_changed_event.connect(self.populate_from_profile) + self.app.profile_changed_event.connect(self.toggle_compact_button_visibility) def set_icons(self): """Used when changing between light- and dark mode""" diff --git a/src/vorta/views/log_page.py b/src/vorta/views/log_page.py index 0ae3f12c7..9b00c21ee 100644 --- a/src/vorta/views/log_page.py +++ b/src/vorta/views/log_page.py @@ -1,6 +1,7 @@ from PyQt6 import uic from PyQt6.QtWidgets import ( QAbstractItemView, + QApplication, QHeaderView, QTableWidgetItem, ) @@ -26,6 +27,7 @@ def __init__(self, parent=None): super().__init__(parent) self.setupUi(self) self.init_ui() + QApplication.instance().profile_changed_event.connect(self.populate_logs) def init_ui(self): self.logPage.setAlternatingRowColors(True) diff --git a/src/vorta/views/main_window.py b/src/vorta/views/main_window.py index 7b3e21d12..b71e70ad8 100644 --- a/src/vorta/views/main_window.py +++ b/src/vorta/views/main_window.py @@ -185,18 +185,15 @@ def profile_selection_changed_action(self, index): if not backup_profile_id: return self.current_profile = BackupProfileModel.get(id=backup_profile_id) - self.archiveTab.populate_from_profile() - self.repoTab.populate_from_profile() - self.sourceTab.populate_from_profile() - self.scheduleTab.schedulePage.populate_from_profile() - self.scheduleTab.networksPage.populate_wifi() - self.scheduleTab.networksPage.setup_connections() - self.scheduleTab.shellCommandsPage.populate_from_profile() - + self.app.profile_changed_event.emit() + # self.archiveTab.populate_from_profile() + # self.repoTab.populate_from_profile() + # self.sourceTab.populate_from_profile() + # self.scheduleTab.schedulePage.populate_from_profile() SettingsModel.update({SettingsModel.str_value: self.current_profile.id}).where( SettingsModel.key == 'previous_profile_id' ).execute() - self.archiveTab.toggle_compact_button_visibility() + # self.archiveTab.toggle_compact_button_visibility() def profile_clicked_action(self): if self.miscWidget.isVisible(): @@ -266,11 +263,12 @@ def profile_imported_event(profile): self.tr('Profile import successful!'), self.tr('Profile {} imported.').format(profile.name), ) - self.repoTab.populate_from_profile() - self.scheduleTab.logPage.populate_logs() - self.scheduleTab.networksPage.populate_wifi() - self.miscTab.populate() + # self.repoTab.populate_from_profile() + # self.scheduleTab.logPage.populate_logs() + # self.scheduleTab.networksPage.populate_wifi() + # self.miscTab.populate() self.populate_profile_selector() + self.app.profile_changed_event.emit() filename = QFileDialog.getOpenFileName( self, diff --git a/src/vorta/views/misc_tab.py b/src/vorta/views/misc_tab.py index 8cde53210..982ba76ee 100644 --- a/src/vorta/views/misc_tab.py +++ b/src/vorta/views/misc_tab.py @@ -46,6 +46,7 @@ def __init__(self, parent=None): # Connect to palette change QApplication.instance().paletteChanged.connect(lambda p: self.set_icons()) + QApplication.instance().profile_changed_event.connect(self.populate) def populate(self): """ diff --git a/src/vorta/views/networks_page.py b/src/vorta/views/networks_page.py index a9ee4a1e1..0dc0769ca 100644 --- a/src/vorta/views/networks_page.py +++ b/src/vorta/views/networks_page.py @@ -1,6 +1,6 @@ from PyQt6 import uic from PyQt6.QtCore import Qt -from PyQt6.QtWidgets import QCheckBox, QLabel, QListWidget, QListWidgetItem +from PyQt6.QtWidgets import QApplication, QCheckBox, QLabel, QListWidget, QListWidgetItem from vorta.store.models import BackupProfileMixin, WifiSettingModel from vorta.utils import get_asset, get_sorted_wifis @@ -20,6 +20,8 @@ def __init__(self, parent=None): self.populate_wifi() self.setup_connections() + QApplication.instance().profile_changed_event.connect(self.populate_wifi) + QApplication.instance().profile_changed_event.connect(self.setup_connections) def setup_connections(self): self.meteredNetworksCheckBox.stateChanged.connect(self.on_metered_networks_state_changed) diff --git a/src/vorta/views/repo_tab.py b/src/vorta/views/repo_tab.py index 8c6015e90..e17d61c42 100644 --- a/src/vorta/views/repo_tab.py +++ b/src/vorta/views/repo_tab.py @@ -63,11 +63,11 @@ def __init__(self, parent=None): self.bAddSSHKey.clicked.connect(self.create_ssh_key) self.set_icons() + self.populate_from_profile() # needs init of ssh and compression items - # Connect to palette change + # Connect to events QApplication.instance().paletteChanged.connect(lambda p: self.set_icons()) - - self.populate_from_profile() # needs init of ssh and compression items + QApplication.instance().profile_changed_event.connect(self.populate_from_profile) def set_icons(self): self.bAddSSHKey.setIcon(get_colored_icon("plus")) diff --git a/src/vorta/views/schedule_page.py b/src/vorta/views/schedule_page.py index fee539d1c..d020a012d 100644 --- a/src/vorta/views/schedule_page.py +++ b/src/vorta/views/schedule_page.py @@ -64,6 +64,9 @@ def __init__(self, parent=None): self.app.scheduler.schedule_changed.connect(lambda pid: self.draw_next_scheduled_backup()) self.populate_from_profile() + # Listen for events + self.app.profile_changed_event.connect(self.populate_from_profile) + def on_scheduler_change(self, _): profile = self.profile() for label, obj in self.schedulerRadioMapping.items(): diff --git a/src/vorta/views/source_tab.py b/src/vorta/views/source_tab.py index 20f0a2646..66dc7b3fd 100644 --- a/src/vorta/views/source_tab.py +++ b/src/vorta/views/source_tab.py @@ -106,13 +106,14 @@ def __init__(self, parent=None): self.bExclude.clicked.connect(self.show_exclude_dialog) header.sortIndicatorChanged.connect(self.update_sort_order) - # Connect to palette change - QApplication.instance().paletteChanged.connect(lambda p: self.set_icons()) - # Populate self.populate_from_profile() self.set_icons() + # Listen for events + QApplication.instance().paletteChanged.connect(lambda p: self.set_icons()) + QApplication.instance().profile_changed_event.connect(self.populate_from_profile) + def set_icons(self): "Used when changing between light- and dark mode" self.addButton.setIcon(get_colored_icon('plus')) From ce34f721da9ab1c97386acb6e3210194f86ad6c6 Mon Sep 17 00:00:00 2001 From: Manu Date: Wed, 4 Dec 2024 14:51:31 +0000 Subject: [PATCH 2/8] Remove comments --- src/vorta/views/main_window.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/vorta/views/main_window.py b/src/vorta/views/main_window.py index b71e70ad8..7d2352776 100644 --- a/src/vorta/views/main_window.py +++ b/src/vorta/views/main_window.py @@ -184,16 +184,13 @@ def profile_selection_changed_action(self, index): backup_profile_id = profile.data(Qt.ItemDataRole.UserRole) if profile else None if not backup_profile_id: return + self.current_profile = BackupProfileModel.get(id=backup_profile_id) - self.app.profile_changed_event.emit() - # self.archiveTab.populate_from_profile() - # self.repoTab.populate_from_profile() - # self.sourceTab.populate_from_profile() - # self.scheduleTab.schedulePage.populate_from_profile() SettingsModel.update({SettingsModel.str_value: self.current_profile.id}).where( SettingsModel.key == 'previous_profile_id' ).execute() - # self.archiveTab.toggle_compact_button_visibility() + + self.app.profile_changed_event.emit() def profile_clicked_action(self): if self.miscWidget.isVisible(): From 89f8ce8249150d0794edc8d7dccaa1431ebac7c9 Mon Sep 17 00:00:00 2001 From: Manu Date: Wed, 4 Dec 2024 17:04:05 +0000 Subject: [PATCH 3/8] Fix shell command and logs updating --- src/vorta/views/log_page.py | 12 +++++++++--- src/vorta/views/shell_commands_page.py | 4 +++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/vorta/views/log_page.py b/src/vorta/views/log_page.py index 9b00c21ee..2dff13ab1 100644 --- a/src/vorta/views/log_page.py +++ b/src/vorta/views/log_page.py @@ -7,7 +7,7 @@ ) from vorta import config -from vorta.store.models import EventLogModel +from vorta.store.models import BackupProfileMixin, EventLogModel from vorta.utils import get_asset uifile = get_asset('UI/log_page.ui') @@ -22,7 +22,7 @@ class LogTableColumn: ReturnCode = 4 -class LogPage(LogTableBase, LogTableUI): +class LogPage(LogTableBase, LogTableUI, BackupProfileMixin): def __init__(self, parent=None): super().__init__(parent) self.setupUi(self) @@ -46,7 +46,13 @@ def init_ui(self): self.populate_logs() def populate_logs(self): - event_logs = [s for s in EventLogModel.select().order_by(EventLogModel.start_time.desc())] + profile = self.profile() + event_logs = [ + s + for s in EventLogModel.select() + .where(EventLogModel.profile == profile.id) + .order_by(EventLogModel.start_time.desc()) + ] sorting = self.logPage.isSortingEnabled() self.logPage.setSortingEnabled(False) diff --git a/src/vorta/views/shell_commands_page.py b/src/vorta/views/shell_commands_page.py index 54dfddaff..68b80c039 100644 --- a/src/vorta/views/shell_commands_page.py +++ b/src/vorta/views/shell_commands_page.py @@ -1,5 +1,5 @@ from PyQt6 import uic -from PyQt6.QtWidgets import QLineEdit, QWidget +from PyQt6.QtWidgets import QApplication, QLineEdit, QWidget from vorta.store.models import BackupProfileMixin from vorta.utils import get_asset @@ -17,6 +17,8 @@ def __init__(self, parent=None): self.populate_from_profile() self.setup_connections() + QApplication.instance().profile_changed_event.connect(self.populate_from_profile) + def populate_from_profile(self): profile = self.profile() if profile.repo: From 3e12a152f2544134ba6640d1e130c329312e3c21 Mon Sep 17 00:00:00 2001 From: Manu Date: Wed, 4 Dec 2024 17:05:20 +0000 Subject: [PATCH 4/8] Remove comments --- src/vorta/views/main_window.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/vorta/views/main_window.py b/src/vorta/views/main_window.py index 7d2352776..82d0b0b99 100644 --- a/src/vorta/views/main_window.py +++ b/src/vorta/views/main_window.py @@ -260,10 +260,6 @@ def profile_imported_event(profile): self.tr('Profile import successful!'), self.tr('Profile {} imported.').format(profile.name), ) - # self.repoTab.populate_from_profile() - # self.scheduleTab.logPage.populate_logs() - # self.scheduleTab.networksPage.populate_wifi() - # self.miscTab.populate() self.populate_profile_selector() self.app.profile_changed_event.emit() From 481ff70d5968b4fefeac37cdd9d12e6a03461017 Mon Sep 17 00:00:00 2001 From: Manu Date: Wed, 4 Dec 2024 17:09:47 +0000 Subject: [PATCH 5/8] Move connecting signals to init() --- src/vorta/views/networks_page.py | 10 ++++------ src/vorta/views/shell_commands_page.py | 21 +++++++++------------ 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/src/vorta/views/networks_page.py b/src/vorta/views/networks_page.py index 0dc0769ca..6b262f19a 100644 --- a/src/vorta/views/networks_page.py +++ b/src/vorta/views/networks_page.py @@ -18,14 +18,12 @@ def __init__(self, parent=None): self.meteredNetworksCheckBox: QCheckBox = self.findChild(QCheckBox, 'meteredNetworksCheckBox') self.wifiListWidget: QListWidget = self.findChild(QListWidget, 'wifiListWidget') - self.populate_wifi() - self.setup_connections() - QApplication.instance().profile_changed_event.connect(self.populate_wifi) - QApplication.instance().profile_changed_event.connect(self.setup_connections) - - def setup_connections(self): + # Connect signals self.meteredNetworksCheckBox.stateChanged.connect(self.on_metered_networks_state_changed) self.wifiListWidget.itemChanged.connect(self.save_wifi_item) + QApplication.instance().profile_changed_event.connect(self.populate_wifi) + + self.populate_wifi() def on_metered_networks_state_changed(self, state): profile = self.profile() diff --git a/src/vorta/views/shell_commands_page.py b/src/vorta/views/shell_commands_page.py index 68b80c039..707f0f7e6 100644 --- a/src/vorta/views/shell_commands_page.py +++ b/src/vorta/views/shell_commands_page.py @@ -15,8 +15,16 @@ def __init__(self, parent=None): self.postBackupCmdLineEdit: QLineEdit = self.findChild(QLineEdit, 'postBackupCmdLineEdit') self.createCmdLineEdit: QLineEdit = self.findChild(QLineEdit, 'createCmdLineEdit') self.populate_from_profile() - self.setup_connections() + self.preBackupCmdLineEdit.textEdited.connect( + lambda new_val, attr='pre_backup_cmd': self.save_profile_attr(attr, new_val) + ) + self.postBackupCmdLineEdit.textEdited.connect( + lambda new_val, attr='post_backup_cmd': self.save_profile_attr(attr, new_val) + ) + self.createCmdLineEdit.textEdited.connect( + lambda new_val, attr='create_backup_cmd': self.save_repo_attr(attr, new_val) + ) QApplication.instance().profile_changed_event.connect(self.populate_from_profile) def populate_from_profile(self): @@ -35,17 +43,6 @@ def populate_from_profile(self): self.preBackupCmdLineEdit.setEnabled(False) self.postBackupCmdLineEdit.setEnabled(False) - def setup_connections(self): - self.preBackupCmdLineEdit.textEdited.connect( - lambda new_val, attr='pre_backup_cmd': self.save_profile_attr(attr, new_val) - ) - self.postBackupCmdLineEdit.textEdited.connect( - lambda new_val, attr='post_backup_cmd': self.save_profile_attr(attr, new_val) - ) - self.createCmdLineEdit.textEdited.connect( - lambda new_val, attr='create_backup_cmd': self.save_repo_attr(attr, new_val) - ) - def save_profile_attr(self, attr, new_value): profile = self.profile() setattr(profile, attr, new_value) From f750528c30b5eb5d185417bf6686eb3a2ca904ba Mon Sep 17 00:00:00 2001 From: Manu Date: Thu, 5 Dec 2024 07:06:48 +0000 Subject: [PATCH 6/8] Also use events for cancelled and finished runs --- src/vorta/views/archive_tab.py | 2 ++ src/vorta/views/log_page.py | 1 + src/vorta/views/main_window.py | 5 ----- src/vorta/views/repo_tab.py | 1 + 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/vorta/views/archive_tab.py b/src/vorta/views/archive_tab.py index d865cf188..096cd4b22 100644 --- a/src/vorta/views/archive_tab.py +++ b/src/vorta/views/archive_tab.py @@ -152,8 +152,10 @@ def __init__(self, parent=None, app=None): # Connect to palette change self.app.paletteChanged.connect(lambda p: self.set_icons()) + self.app.backup_finished_event.connect(self.populate_from_profile) self.app.profile_changed_event.connect(self.populate_from_profile) self.app.profile_changed_event.connect(self.toggle_compact_button_visibility) + self.app.backup_cancelled_event.connect(self.cancel_action) def set_icons(self): """Used when changing between light- and dark mode""" diff --git a/src/vorta/views/log_page.py b/src/vorta/views/log_page.py index 2dff13ab1..86c35a30c 100644 --- a/src/vorta/views/log_page.py +++ b/src/vorta/views/log_page.py @@ -27,6 +27,7 @@ def __init__(self, parent=None): super().__init__(parent) self.setupUi(self) self.init_ui() + QApplication.instance().backup_finished_event.connect(self.populate_logs) QApplication.instance().profile_changed_event.connect(self.populate_logs) def init_ui(self): diff --git a/src/vorta/views/main_window.py b/src/vorta/views/main_window.py index 82d0b0b99..0a017a27f 100644 --- a/src/vorta/views/main_window.py +++ b/src/vorta/views/main_window.py @@ -319,10 +319,6 @@ def backup_started_event(self): self.set_log('') def backup_finished_event(self): - self.archiveTab.populate_from_profile() - self.repoTab.init_repo_stats() - self.scheduleTab.logPage.populate_logs() - if not self.app.jobs_manager.is_worker_running() and ( self.archiveTab.remaining_refresh_archives == 0 or self.archiveTab.remaining_refresh_archives == 1 ): # Either the refresh is done or this is the last archive to refresh. @@ -332,7 +328,6 @@ def backup_finished_event(self): def backup_cancelled_event(self): self._toggle_buttons(create_enabled=True) self.set_log(self.tr('Task cancelled')) - self.archiveTab.cancel_action() def closeEvent(self, event): # Save window state in SettingsModel diff --git a/src/vorta/views/repo_tab.py b/src/vorta/views/repo_tab.py index e17d61c42..79cc9aa8c 100644 --- a/src/vorta/views/repo_tab.py +++ b/src/vorta/views/repo_tab.py @@ -68,6 +68,7 @@ def __init__(self, parent=None): # Connect to events QApplication.instance().paletteChanged.connect(lambda p: self.set_icons()) QApplication.instance().profile_changed_event.connect(self.populate_from_profile) + QApplication.instance().backup_finished_event.connect(self.init_repo_stats) def set_icons(self): self.bAddSSHKey.setIcon(get_colored_icon("plus")) From aa55499057008a4255c9b2c802fe5d29df3107d2 Mon Sep 17 00:00:00 2001 From: Manu Date: Thu, 5 Dec 2024 12:24:30 +0000 Subject: [PATCH 7/8] Update comments --- src/vorta/views/archive_tab.py | 2 +- src/vorta/views/misc_tab.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vorta/views/archive_tab.py b/src/vorta/views/archive_tab.py index 096cd4b22..ad21d4663 100644 --- a/src/vorta/views/archive_tab.py +++ b/src/vorta/views/archive_tab.py @@ -150,7 +150,7 @@ def __init__(self, parent=None, app=None): self.selected_archives = None # TODO: remove unused variable self.set_icons() - # Connect to palette change + # Connect to events self.app.paletteChanged.connect(lambda p: self.set_icons()) self.app.backup_finished_event.connect(self.populate_from_profile) self.app.profile_changed_event.connect(self.populate_from_profile) diff --git a/src/vorta/views/misc_tab.py b/src/vorta/views/misc_tab.py index 982ba76ee..bc8bfe209 100644 --- a/src/vorta/views/misc_tab.py +++ b/src/vorta/views/misc_tab.py @@ -44,7 +44,7 @@ def __init__(self, parent=None): self.populate() - # Connect to palette change + # Connect to events QApplication.instance().paletteChanged.connect(lambda p: self.set_icons()) QApplication.instance().profile_changed_event.connect(self.populate) From 3fa8c0727f12384190bcceaba666e4b2ca69ec03 Mon Sep 17 00:00:00 2001 From: Manu Date: Thu, 5 Dec 2024 12:28:12 +0000 Subject: [PATCH 8/8] Fix button color in archive table --- src/vorta/views/archive_tab.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vorta/views/archive_tab.py b/src/vorta/views/archive_tab.py index ad21d4663..4e59b0e69 100644 --- a/src/vorta/views/archive_tab.py +++ b/src/vorta/views/archive_tab.py @@ -151,7 +151,8 @@ def __init__(self, parent=None, app=None): self.set_icons() # Connect to events - self.app.paletteChanged.connect(lambda p: self.set_icons()) + self.app.paletteChanged.connect(self.set_icons) + self.app.paletteChanged.connect(self.populate_from_profile) self.app.backup_finished_event.connect(self.populate_from_profile) self.app.profile_changed_event.connect(self.populate_from_profile) self.app.profile_changed_event.connect(self.toggle_compact_button_visibility)