Skip to content

Commit a0d5a46

Browse files
committed
[Enhancement] Added setting to run vorta in background
- Added setting to run vorta in background - Added option in the mics tab to enable/disable the background question popup.
1 parent 79420c1 commit a0d5a46

5 files changed

Lines changed: 73 additions & 26 deletions

File tree

src/vorta/application.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ def open_main_window_action(self):
128128

129129
def toggle_main_window_visibility(self):
130130
if self.main_window.isVisible():
131-
self.main_window.close()
131+
self.main_window.hide()
132132
else:
133133
self.open_main_window_action()
134134

src/vorta/store/settings.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ def get_misc_settings() -> List[Dict[str, str]]:
1717
startup = trans_late('settings', 'Startup')
1818
information = trans_late('settings', 'Information')
1919
security = trans_late('settings', 'Security')
20+
background = trans_late('settings', 'Background')
2021

2122
# Default settings for all platforms.
2223
settings = [
@@ -122,9 +123,10 @@ def get_misc_settings() -> List[Dict[str, str]]:
122123
'key': 'enable_background_question',
123124
'value': True,
124125
'type': 'checkbox',
126+
'group': background,
125127
'label': trans_late(
126128
'settings',
127-
"If the system tray isn't available, " "ask whether to continue in the background " "on exit",
129+
"When closing the window, ask whether to continue in the background",
128130
),
129131
},
130132
{

src/vorta/views/main_window.py

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from PyQt5.QtWidgets import QApplication, QCheckBox, QFileDialog, QMenu, QMessageBox, QShortcut, QToolTip
77
from vorta.profile_export import ImportFailedException, ProfileExport
88
from vorta.store.models import BackupProfileModel, SettingsModel
9-
from vorta.utils import borg_compat, get_asset, get_network_status_monitor, is_system_tray_available
9+
from vorta.utils import borg_compat, get_asset, get_network_status_monitor
1010
from vorta.views.partials.loading_button import LoadingButton
1111
from vorta.views.utils import get_colored_icon
1212
from .archive_tab import ArchiveTab
@@ -277,27 +277,26 @@ def closeEvent(self, event):
277277
SettingsModel.key == 'previous_window_height'
278278
).execute()
279279

280-
if not is_system_tray_available():
281-
if SettingsModel.get(key="enable_background_question").value:
282-
msg = QMessageBox()
283-
msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
284-
msg.setParent(self, QtCore.Qt.Sheet)
285-
msg.setText(self.tr("Should Vorta continue to run in the background?"))
286-
msg.button(QMessageBox.Yes).clicked.connect(
287-
lambda: self.miscTab.save_setting("disable_background_state", True)
288-
)
289-
msg.button(QMessageBox.No).clicked.connect(
290-
lambda: (
291-
self.miscTab.save_setting("disable_background_state", False),
292-
self.app.quit(),
293-
)
280+
if SettingsModel.get(key="enable_background_question").value:
281+
msg = QMessageBox()
282+
msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
283+
msg.setParent(self, QtCore.Qt.Sheet)
284+
msg.setText(self.tr("Should Vorta continue to run in the background?"))
285+
msg.button(QMessageBox.Yes).clicked.connect(
286+
lambda: self.miscTab.save_setting("disable_background_state", True)
287+
)
288+
msg.button(QMessageBox.No).clicked.connect(
289+
lambda: (
290+
self.miscTab.save_setting("disable_background_state", False),
291+
self.app.quit(),
294292
)
295-
msg.setWindowTitle(self.tr("Quit"))
296-
dont_show_box = QCheckBox(self.tr("Don't show this again"))
297-
dont_show_box.clicked.connect(lambda x: self.miscTab.save_setting("enable_background_question", not x))
298-
dont_show_box.setTristate(False)
299-
msg.setCheckBox(dont_show_box)
300-
msg.exec()
301-
elif not SettingsModel.get(key="disable_background_state").value:
302-
self.app.quit()
293+
)
294+
msg.setWindowTitle(self.tr("Quit"))
295+
dont_show_box = QCheckBox(self.tr("Don't show this again"))
296+
dont_show_box.clicked.connect(lambda x: self.miscTab.save_setting("enable_background_question", not x))
297+
dont_show_box.setTristate(False)
298+
msg.setCheckBox(dont_show_box)
299+
msg.exec()
300+
elif not SettingsModel.get(key="disable_background_state").value:
301+
self.app.quit()
303302
event.accept()

src/vorta/views/misc_tab.py

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import logging
2+
from typing import Dict
3+
from playhouse import signals
24
from PyQt5 import uic
35
from PyQt5.QtCore import Qt
46
from PyQt5.QtWidgets import QApplication, QCheckBox, QFormLayout, QHBoxLayout, QLabel, QSizePolicy, QSpacerItem
@@ -22,6 +24,8 @@ def __init__(self, parent=None):
2224
"""Init."""
2325
super().__init__(parent)
2426
self.setupUi(parent)
27+
self.settings_checkboxes: Dict[str, QCheckBox] = {}
28+
2529
self.versionLabel.setText(__version__)
2630
self.logLink.setText(
2731
f'<a href="file://{LOG_DIR}"><span style="text-decoration:' 'underline; color:#0984e3;">Log</span></a>'
@@ -34,6 +38,7 @@ def __init__(self, parent=None):
3438
self.checkboxLayout.setFieldGrowthPolicy(QFormLayout.FieldGrowthPolicy.FieldsStayAtSizeHint)
3539
self.checkboxLayout.setFormAlignment(Qt.AlignmentFlag.AlignHCenter)
3640
self.tooltip_buttons = []
41+
signals.post_save.connect(self.on_setting_update, sender=SettingsModel)
3742

3843
self.populate()
3944

@@ -86,8 +91,8 @@ def populate(self):
8691

8792
# create widget
8893
cb = QCheckBox(translate('settings', setting.label))
94+
cb.setChecked(setting.value)
8995
cb.setToolTip(setting.tooltip)
90-
cb.setCheckState(setting.value)
9196
cb.setTristate(False)
9297
cb.stateChanged.connect(lambda v, key=setting.key: self.save_setting(key, v))
9398

@@ -101,6 +106,7 @@ def populate(self):
101106
cbl.addItem(QSpacerItem(0, 0, hPolicy=QSizePolicy.Policy.Expanding))
102107

103108
# add widget
109+
self.settings_checkboxes[setting.key] = cb
104110
self.checkboxLayout.setLayout(i, QFormLayout.ItemRole.FieldRole, cbl)
105111
self.tooltip_buttons.append(tb)
106112

@@ -109,6 +115,39 @@ def populate(self):
109115

110116
self.set_icons()
111117

118+
def on_setting_update(self, sender, instance: SettingsModel, created=False):
119+
"""
120+
Handle a update of the settings db.
121+
Non-PyQt slot for peewee's `playhouse.signals` api.
122+
It calls `update_checkbox`.
123+
124+
Parameters
125+
----------
126+
sender : Type[SettingsModel]
127+
table sending model
128+
instance : SettingsModel
129+
The model instance (row) saved.
130+
created : bool, optional
131+
Whether it was newly created, by default False
132+
"""
133+
if not created and instance.type == 'checkbox':
134+
self.update_checkbox(instance.key, instance.value)
135+
136+
def update_checkbox(self, key, value):
137+
"""
138+
Update the checkbox for a setting with a given key.
139+
140+
Parameters
141+
----------
142+
key : str
143+
The key of the setting to update.
144+
value : bool
145+
The value to set the checkbox to.
146+
"""
147+
checkbox = self.settings_checkboxes.get(key)
148+
if checkbox:
149+
checkbox.setChecked(value)
150+
112151
def set_icons(self):
113152
"""Set or update the icons in this view."""
114153
for button in self.tooltip_buttons:

tests/conftest.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
from unittest.mock import MagicMock
55
import pytest
66
from peewee import SqliteDatabase
7+
from playhouse import signals
78
import vorta
89
import vorta.application
910
import vorta.borg.jobs_manager
11+
from vorta.store.connection import setup_autostart
1012
from vorta.store.models import (
1113
ArchiveModel,
1214
BackupProfileModel,
@@ -90,6 +92,11 @@ def init_db(qapp, qtbot, tmpdir_factory):
9092
source_dir = SourceFileModel(dir='/tmp/another', repo=new_repo, dir_size=100, dir_files_count=18, path_isdir=True)
9193
source_dir.save()
9294

95+
signals.post_save.disconnect(receiver=qapp.main_window.miscTab.on_setting_update, sender=SettingsModel)
96+
# reconnect autostart signal
97+
signals.post_save.disconnect(setup_autostart, sender=SettingsModel)
98+
signals.post_save.connect(setup_autostart, sender=SettingsModel)
99+
93100
qapp.main_window.deleteLater()
94101
del qapp.main_window
95102
qapp.main_window = MainWindow(qapp) # Re-open main window to apply mock data in UI

0 commit comments

Comments
 (0)