mirror of https://github.com/borgbase/vorta
135 lines
4.6 KiB
Python
135 lines
4.6 KiB
Python
import logging
|
|
|
|
from PyQt6 import uic
|
|
from PyQt6.QtCore import Qt
|
|
from PyQt6.QtWidgets import (
|
|
QApplication,
|
|
QCheckBox,
|
|
QFormLayout,
|
|
QHBoxLayout,
|
|
QLabel,
|
|
QSizePolicy,
|
|
QSpacerItem,
|
|
)
|
|
|
|
from vorta._version import __version__
|
|
from vorta.config import LOG_DIR
|
|
from vorta.i18n import translate
|
|
from vorta.store.models import BackupProfileMixin, SettingsModel
|
|
from vorta.store.settings import get_misc_settings
|
|
from vorta.utils import get_asset, search
|
|
from vorta.views.partials.tooltip_button import ToolTipButton
|
|
from vorta.views.utils import get_colored_icon
|
|
|
|
uifile = get_asset('UI/misctab.ui')
|
|
MiscTabUI, MiscTabBase = uic.loadUiType(uifile)
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class MiscTab(MiscTabBase, MiscTabUI, BackupProfileMixin):
|
|
def __init__(self, parent=None):
|
|
"""Init."""
|
|
super().__init__(parent)
|
|
self.setupUi(parent)
|
|
self.versionLabel.setText(__version__)
|
|
self.logLink.setText(
|
|
f'<a href="file://{LOG_DIR}"><span style="text-decoration:' 'underline; color:#0984e3;">Log</span></a>'
|
|
)
|
|
|
|
self.checkboxLayout = QFormLayout(self.frameSettings)
|
|
self.checkboxLayout.setSpacing(4)
|
|
self.checkboxLayout.setHorizontalSpacing(8)
|
|
self.checkboxLayout.setContentsMargins(0, 0, 0, 12)
|
|
self.checkboxLayout.setFieldGrowthPolicy(QFormLayout.FieldGrowthPolicy.FieldsStayAtSizeHint)
|
|
self.checkboxLayout.setFormAlignment(Qt.AlignmentFlag.AlignHCenter)
|
|
self.tooltip_buttons = []
|
|
|
|
self.populate()
|
|
|
|
# Connect to palette change
|
|
QApplication.instance().paletteChanged.connect(lambda p: self.set_icons())
|
|
|
|
def populate(self):
|
|
"""
|
|
Populate the misc tab with the settings widgets.
|
|
|
|
Uses `create_group_widget` to construct the layout groups.
|
|
"""
|
|
# clear layout
|
|
while self.checkboxLayout.count():
|
|
child = self.checkboxLayout.takeAt(0)
|
|
self.checkboxLayout.removeItem(child)
|
|
if child.widget():
|
|
child.widget().deleteLater()
|
|
self.tooltip_buttons = []
|
|
|
|
# dynamically add widgets for settings
|
|
misc_settings = get_misc_settings()
|
|
|
|
i = 0
|
|
for group in (
|
|
SettingsModel.select(SettingsModel.group)
|
|
.distinct(True)
|
|
.where(SettingsModel.group != '')
|
|
.order_by(SettingsModel.group.asc())
|
|
):
|
|
# add spacer
|
|
if i > 0:
|
|
spacer = QSpacerItem(20, 4, vPolicy=QSizePolicy.Policy.Fixed)
|
|
self.checkboxLayout.setItem(i, QFormLayout.ItemRole.LabelRole, spacer)
|
|
i += 1
|
|
|
|
# add label for next group
|
|
label = QLabel()
|
|
label.setText(translate('settings', group.group) + ':')
|
|
self.checkboxLayout.setWidget(i, QFormLayout.ItemRole.LabelRole, label)
|
|
|
|
# add settings widget of the group
|
|
for setting in SettingsModel.select().where(
|
|
SettingsModel.type == 'checkbox', SettingsModel.group == group.group
|
|
):
|
|
# Skip settings that aren't specified in vorta.store.models.
|
|
if not search(setting.key, misc_settings, lambda d: d['key']):
|
|
logger.warning('Unknown setting {}'.format(setting.key))
|
|
continue
|
|
|
|
# create widget
|
|
cb = QCheckBox(translate('settings', setting.label))
|
|
cb.setToolTip(setting.tooltip)
|
|
cb.setCheckState(Qt.CheckState(setting.value))
|
|
cb.setTristate(False)
|
|
cb.stateChanged.connect(lambda v, key=setting.key: self.save_setting(key, v))
|
|
|
|
tb = ToolTipButton()
|
|
tb.setToolTip(setting.tooltip)
|
|
|
|
cbl = QHBoxLayout()
|
|
cbl.addWidget(cb)
|
|
if setting.tooltip:
|
|
cbl.addWidget(tb)
|
|
cbl.addItem(QSpacerItem(0, 0, hPolicy=QSizePolicy.Policy.Expanding))
|
|
|
|
# add widget
|
|
self.checkboxLayout.setLayout(i, QFormLayout.ItemRole.FieldRole, cbl)
|
|
self.tooltip_buttons.append(tb)
|
|
|
|
# increase i
|
|
i += 1
|
|
|
|
self.set_icons()
|
|
|
|
def set_icons(self):
|
|
"""Set or update the icons in this view."""
|
|
for button in self.tooltip_buttons:
|
|
button.setIcon(get_colored_icon('help-about'))
|
|
|
|
def save_setting(self, key, new_value):
|
|
setting = SettingsModel.get(key=key)
|
|
setting.value = bool(new_value)
|
|
setting.save()
|
|
|
|
def set_borg_details(self, version, path):
|
|
self.borgVersion.setText(version)
|
|
self.borgPath.setText(path)
|