Fix crash when window is closed while thread running. By @samuel-w (#685)

This commit is contained in:
Samuel 2020-10-30 00:17:24 -05:00 committed by GitHub
parent 47df3eccc9
commit cc47c1bc78
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 19 additions and 24 deletions

View File

@ -1,6 +1,5 @@
import os
import sys
import sip
from PyQt5 import QtCore
from PyQt5.QtWidgets import QMessageBox
@ -47,8 +46,9 @@ class VortaApp(QtSingleApplication):
self.scheduler = VortaScheduler(self)
self.setApplicationName("Vorta")
# Prepare system tray icon
# Prepare tray and main window
self.tray = TrayMenu(self)
self.main_window = MainWindow(self)
args = parse_args()
if getattr(args, 'daemonize', False):
@ -88,16 +88,12 @@ class VortaApp(QtSingleApplication):
self.backup_progress_event.emit(translate('messages', msg['message']))
def open_main_window_action(self):
if not self._main_window_exists():
self.main_window = MainWindow(self)
self.main_window.show()
self.main_window.raise_()
def _main_window_exists(self):
return hasattr(self, 'main_window') and not sip.isdeleted(self.main_window)
self.main_window.activateWindow()
def toggle_main_window_visibility(self):
if self._main_window_exists():
if self.main_window.isVisible():
self.main_window.close()
else:
self.open_main_window_action()
@ -126,14 +122,13 @@ class VortaApp(QtSingleApplication):
def set_borg_details_result(self, result):
"""
Receive result from BorgVersionThread. If MainWindow is open, set the version in misc tab.
Receive result from BorgVersionThread.
If no valid version was found, display an error.
"""
if 'version' in result['data']:
borg_compat.set_version(result['data']['version'], result['data']['path'])
if self._main_window_exists():
self.main_window.miscTab.set_borg_details(borg_compat.version, borg_compat.path)
self.main_window.repoTab.toggle_available_compression()
self.main_window.miscTab.set_borg_details(borg_compat.version, borg_compat.path)
self.main_window.repoTab.toggle_available_compression()
else:
self._alert_missing_borg()

View File

@ -32,11 +32,12 @@ ArchiveTabUI, ArchiveTabBase = uic.loadUiType(uifile)
class ArchiveTab(ArchiveTabBase, ArchiveTabUI, BackupProfileMixin):
prune_intervals = ['hour', 'day', 'week', 'month', 'year']
def __init__(self, parent=None):
def __init__(self, parent=None, app=None):
super().__init__(parent)
self.setupUi(parent)
self.mount_points = {}
self.menu = None
self.app = app
self.toolBox.setCurrentIndex(0)
header = self.archiveTable.horizontalHeader()
@ -178,7 +179,7 @@ class ArchiveTab(ArchiveTabBase, ArchiveTabUI, BackupProfileMixin):
archive_name = archive_cell.text()
params['cmd'][-1] += f'::{archive_name}'
thread = BorgCheckThread(params['cmd'], params, parent=self)
thread = BorgCheckThread(params['cmd'], params, parent=self.app)
thread.updated.connect(self._set_status)
thread.result.connect(self.check_result)
self._toggle_all_buttons(False)
@ -191,7 +192,7 @@ class ArchiveTab(ArchiveTabBase, ArchiveTabUI, BackupProfileMixin):
def prune_action(self):
params = BorgPruneThread.prepare(self.profile())
if params['ok']:
thread = BorgPruneThread(params['cmd'], params, parent=self)
thread = BorgPruneThread(params['cmd'], params, parent=self.app)
thread.updated.connect(self._set_status)
thread.result.connect(self.prune_result)
self._toggle_all_buttons(False)
@ -207,7 +208,7 @@ class ArchiveTab(ArchiveTabBase, ArchiveTabUI, BackupProfileMixin):
def list_action(self):
params = BorgListRepoThread.prepare(self.profile())
if params['ok']:
thread = BorgListRepoThread(params['cmd'], params, parent=self)
thread = BorgListRepoThread(params['cmd'], params, parent=self.app)
thread.updated.connect(self._set_status)
thread.result.connect(self.list_result)
self._toggle_all_buttons(False)
@ -254,7 +255,7 @@ class ArchiveTab(ArchiveTabBase, ArchiveTabUI, BackupProfileMixin):
self.mount_points[params['current_archive']] = mount_point[0]
if params['ok']:
self._toggle_all_buttons(False)
thread = BorgMountThread(params['cmd'], params, parent=self)
thread = BorgMountThread(params['cmd'], params, parent=self.app)
thread.updated.connect(self.mountErrors.setText)
thread.result.connect(self.mount_result)
thread.start()
@ -289,7 +290,7 @@ class ArchiveTab(ArchiveTabBase, ArchiveTabUI, BackupProfileMixin):
if os.path.normpath(mount_point) in params['active_mount_points']:
params['cmd'].append(mount_point)
thread = BorgUmountThread(params['cmd'], params, parent=self)
thread = BorgUmountThread(params['cmd'], params, parent=self.app)
thread.updated.connect(self.mountErrors.setText)
thread.result.connect(self.umount_result)
thread.start()
@ -333,7 +334,7 @@ class ArchiveTab(ArchiveTabBase, ArchiveTabUI, BackupProfileMixin):
self._set_status('')
self._toggle_all_buttons(False)
thread = BorgListArchiveThread(params['cmd'], params, parent=self)
thread = BorgListArchiveThread(params['cmd'], params, parent=self.app)
thread.updated.connect(self.mountErrors.setText)
thread.result.connect(self.list_archive_result)
thread.start()
@ -358,7 +359,7 @@ class ArchiveTab(ArchiveTabBase, ArchiveTabUI, BackupProfileMixin):
self.profile(), archive.name, window.selected, extraction_folder[0])
if params['ok']:
self._toggle_all_buttons(False)
thread = BorgExtractThread(params['cmd'], params, parent=self)
thread = BorgExtractThread(params['cmd'], params, parent=self.app)
thread.updated.connect(self.mountErrors.setText)
thread.result.connect(self.extract_archive_result)
thread.start()
@ -418,7 +419,7 @@ class ArchiveTab(ArchiveTabBase, ArchiveTabUI, BackupProfileMixin):
return
params['cmd'][-1] += f'::{archive_name}'
thread = BorgDeleteThread(params['cmd'], params, parent=self)
thread = BorgDeleteThread(params['cmd'], params, parent=self.app)
thread.updated.connect(self._set_status)
thread.result.connect(self.delete_result)
self._toggle_all_buttons(False)
@ -457,7 +458,7 @@ class ArchiveTab(ArchiveTabBase, ArchiveTabUI, BackupProfileMixin):
if params['ok']:
self._toggle_all_buttons(False)
thread = BorgDiffThread(params['cmd'], params, parent=self)
thread = BorgDiffThread(params['cmd'], params, parent=self.app)
thread.updated.connect(self.mountErrors.setText)
thread.result.connect(self.list_diff_result)
thread.start()

View File

@ -25,7 +25,6 @@ class MainWindow(MainWindowBase, MainWindowUI):
super().__init__()
self.setupUi(self)
self.setWindowTitle('Vorta for Borg Backup')
self.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
self.app = parent
self.setWindowIcon(get_colored_icon("icon"))
self.setWindowFlags(QtCore.Qt.WindowCloseButtonHint | QtCore.Qt.WindowMinimizeButtonHint)
@ -47,7 +46,7 @@ class MainWindow(MainWindowBase, MainWindowUI):
# Load tab models
self.repoTab = RepoTab(self.repoTabSlot)
self.sourceTab = SourceTab(self.sourceTabSlot)
self.archiveTab = ArchiveTab(self.archiveTabSlot)
self.archiveTab = ArchiveTab(self.archiveTabSlot, app=self.app)
self.scheduleTab = ScheduleTab(self.scheduleTabSlot)
self.miscTab = MiscTab(self.miscTabSlot)
self.miscTab.set_borg_details(borg_compat.version, borg_compat.path)