273 lines
11 KiB
Python
273 lines
11 KiB
Python
from .sources.Ui_dialog_settings import Ui_Dialog
|
|
from PyQt6 import QtWidgets, QtCore
|
|
from src import config, log
|
|
from src.utils import Icon
|
|
from omegaconf import OmegaConf
|
|
import os
|
|
|
|
class Settings(QtWidgets.QDialog, Ui_Dialog):
|
|
def __init__(self):
|
|
super(Settings, self).__init__()
|
|
self.setupUi(self)
|
|
self.setWindowTitle("Einstellungen")
|
|
self.setWindowIcon(Icon("settings").icon)
|
|
#variables
|
|
self.originalSettings = config.to_Omegaconf()
|
|
self.changedSettings = config.to_Omegaconf()
|
|
self.shortcuts = config.shortcuts
|
|
self.shortcuts = self.sortShortcuts(self.shortcuts)
|
|
self.settingschanged = False
|
|
self.restart_required = False
|
|
|
|
|
|
# buttonbox
|
|
self.buttonBox.accepted.connect(self.saveSettings)
|
|
self.buttonBox.rejected.connect(self.close)
|
|
self.loadSettings()
|
|
|
|
|
|
self.populateShortcuts()
|
|
# buttons
|
|
self.btn_select_database_backupLocation.clicked.connect(
|
|
self.selectBackupLocation
|
|
)
|
|
self.btn_select_database_path.clicked.connect(self.selectDatabasePath)
|
|
self.btn_select_database_name.clicked.connect(self.selectDatabaseName)
|
|
self.btn_select_report_path.clicked.connect(self.selectReportPath)
|
|
self.returnMode.clicked.connect(self.returnModeSetting)
|
|
|
|
|
|
#other
|
|
#stretch columns
|
|
self.shortcutchanger.horizontalHeader().setSectionResizeMode(0, QtWidgets.QHeaderView.ResizeMode.Stretch)
|
|
def returnModeSetting(self):
|
|
currentstate = self.returnMode.isChecked()
|
|
if self.originalSettings.advanced_refresh != currentstate:
|
|
self.enableButtonBox()
|
|
|
|
def populateShortcuts(self):
|
|
for shortcut in self.shortcuts:
|
|
name = shortcut["name"]
|
|
default = shortcut["default"]
|
|
current = shortcut["current"]
|
|
self.addShortcut(name, default, current)
|
|
#assume the shortcuts will be changed
|
|
self.settingschanged = True
|
|
def addShortcut(self, name, default, current):
|
|
#remove all pages from shortcutchanger
|
|
#add new page with name, default and current
|
|
|
|
self.shortcutchanger.insertRow(0)
|
|
self.shortcutchanger.setItem(0, 0, QtWidgets.QTableWidgetItem(name))
|
|
self.shortcutchanger.setItem(0, 1, QtWidgets.QTableWidgetItem(default))
|
|
#add keysequenceedit
|
|
keysequenceedit = QtWidgets.QKeySequenceEdit()
|
|
keysequenceedit.setKeySequence(current)
|
|
self.shortcutchanger.setCellWidget(0, 2, keysequenceedit)
|
|
|
|
def selectBackupLocation(self):
|
|
backupLocation = QtWidgets.QFileDialog.getExistingDirectory(
|
|
self,
|
|
"Select Backup Location",
|
|
self.originalSettings.database.backupLocation,
|
|
)
|
|
self.database_backupLocation.setText(backupLocation)
|
|
self.buttonBox.button(
|
|
QtWidgets.QDialogButtonBox.StandardButton.Discard
|
|
).setEnabled(True)
|
|
self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Ok).setEnabled(
|
|
True
|
|
)
|
|
self.settingschanged = True
|
|
|
|
def selectReportPath(self):
|
|
reportPath = QtWidgets.QFileDialog.getExistingDirectory(
|
|
self, "Select Report Path", self.originalSettings.report.path
|
|
)
|
|
self.report_path.setText(reportPath)
|
|
self.buttonBox.button(
|
|
QtWidgets.QDialogButtonBox.StandardButton.Discard
|
|
).setEnabled(True)
|
|
self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Ok).setEnabled(
|
|
True
|
|
)
|
|
self.settingschanged = True
|
|
|
|
def selectDatabasePath(self):
|
|
databasePath = QtWidgets.QFileDialog.getExistingDirectory(
|
|
self, "Select Database Path", self.originalSettings.database.path
|
|
)
|
|
self.database_path.setText(databasePath)
|
|
self.buttonBox.button(
|
|
QtWidgets.QDialogButtonBox.StandardButton.Discard
|
|
).setEnabled(True)
|
|
self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Ok).setEnabled(
|
|
True
|
|
)
|
|
self.settingschanged = True
|
|
self.restart_required = True
|
|
|
|
def selectDatabaseName(self):
|
|
# filepicker with filter to select only .db files if a file is selected, set name to the lineedit and set database_path
|
|
databaseName = QtWidgets.QFileDialog.getOpenFileName(
|
|
self,
|
|
"Select Database",
|
|
self.originalSettings.database.path,
|
|
"Database Files (*.db)",
|
|
)
|
|
self.database_path.setText(databaseName[0].rsplit("/", 1)[0])
|
|
self.buttonBox.button(
|
|
QtWidgets.QDialogButtonBox.StandardButton.Discard
|
|
).setEnabled(True)
|
|
self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Ok).setEnabled(
|
|
True
|
|
)
|
|
self.settingschanged = True
|
|
self.restart_required = True
|
|
|
|
def getShortcuts(self):
|
|
shortcuts = []
|
|
for row in range(self.shortcutchanger.rowCount()):
|
|
name = self.shortcutchanger.item(row, 0).text()
|
|
default = self.shortcutchanger.item(row, 1).text()
|
|
current = self.shortcutchanger.cellWidget(row, 2).keySequence().toString()
|
|
shortcuts.append(
|
|
{
|
|
"name": name,
|
|
"default": default,
|
|
"current": current,
|
|
}
|
|
)
|
|
return shortcuts
|
|
|
|
def sortShortcuts(self, shortcuts):
|
|
short = []
|
|
for shortcut in shortcuts:
|
|
short.append(shortcut)
|
|
short.sort(key=lambda x: x["name"])
|
|
return short
|
|
|
|
def saveSettings(self):
|
|
# save settings to config file
|
|
institution_name = self.institution_name.text()
|
|
default_loan_duration = int(self.default_loan_duration.text())
|
|
delete_inactive_users = int(self.delete_inactive_user_duration.text())
|
|
database_backupLocation = self.database_backupLocation.text()
|
|
database_path = self.database_path.text()
|
|
database_name = self.database_name.text()
|
|
report_day = self.report_day.currentIndex()
|
|
report_generate = self.check_generate_report.isChecked()
|
|
report_path = self.report_path.text()
|
|
refresh_state = self.returnMode.isChecked()
|
|
shortcuts = self.getShortcuts()
|
|
#shortcuts to omegaconf.DictConfig
|
|
shortcuts = OmegaConf.create(shortcuts)
|
|
|
|
|
|
if database_path != self.originalSettings.database.path :
|
|
os.makedirs(database_path, exist_ok=True)
|
|
self.restart_required = True
|
|
|
|
|
|
|
|
# create new Settings
|
|
self.changedSettings.institution_name = institution_name
|
|
self.changedSettings.loan_duration = default_loan_duration
|
|
self.changedSettings.database.backupLocation = database_backupLocation
|
|
self.changedSettings.database.path = database_path
|
|
self.changedSettings.database.name = database_name
|
|
self.changedSettings.delete_inactive_user_duration = delete_inactive_users
|
|
self.changedSettings.report.report_day = report_day
|
|
self.changedSettings.report.path = report_path
|
|
self.changedSettings.report.generate_report = report_generate
|
|
self.changedSettings.advanced_refresh = refresh_state
|
|
self.changedSettings.shortcuts = shortcuts
|
|
|
|
changed = self.changedSettings
|
|
original = self.originalSettings
|
|
|
|
|
|
|
|
if changed == original:
|
|
self.settingschanged = False
|
|
self.restart_required = False
|
|
log.info("Settings not changed")
|
|
else:
|
|
self.settingschanged = True
|
|
#compare if database or shortcuts were changed
|
|
database = original.database == changed.database
|
|
shortcuts = self.shortcuts == self.sortShortcuts(changed.shortcuts)
|
|
if not database or not shortcuts:
|
|
self.restart_required = True
|
|
log.info(
|
|
f"Settings changed, restart required: {self.restart_required}",
|
|
database=database,
|
|
shortcuts=shortcuts,
|
|
)
|
|
|
|
# save the new settings
|
|
if self.settingschanged:
|
|
# save the settings
|
|
config.updateValue("institution_name", self.changedSettings.institution_name)
|
|
config.updateValue("default_loan_duration", self.changedSettings.loan_duration)
|
|
config.updateValue("database.backupLocation", self.changedSettings.database.backupLocation)
|
|
config.updateValue("database.path", self.changedSettings.database.path)
|
|
config.updateValue("database.name", self.changedSettings.database.name)
|
|
config.updateValue("inactive_user_deletion", self.changedSettings.inactive_user_deletion)
|
|
config.updateValue("report.report_day", self.changedSettings.report.report_day)
|
|
config.updateValue("report.generate_report", self.changedSettings.report.generate_report)
|
|
config.updateValue("report.path", self.changedSettings.report.path)
|
|
config.updateValue("advanced_refresh", self.changedSettings.advanced_refresh)
|
|
config.updateValue("shortcuts", self.changedSettings.shortcuts)
|
|
self.originalSettings = self.changedSettings
|
|
config.save()
|
|
|
|
if self.restart_required:
|
|
self.restart()
|
|
self.close()
|
|
|
|
def restart(self):
|
|
dialog = QtWidgets.QMessageBox()
|
|
dialog.setIcon(QtWidgets.QMessageBox.Icon.Information)
|
|
dialog.setText("Neustart erforderlich")
|
|
dialog.setInformativeText(
|
|
"Das Programm muss neu gestartet werden, um die Änderungen zu übernehmen."
|
|
)
|
|
dialog.setStandardButtons(QtWidgets.QMessageBox.StandardButton.Ok)
|
|
dialog.setDefaultButton(QtWidgets.QMessageBox.StandardButton.Ok)
|
|
dialog.setWindowTitle("Neustart erforderlich")
|
|
dialog.setWindowIcon(Icon("restart").icon)
|
|
dialog.exec()
|
|
|
|
def DiscardSettings(self):
|
|
self.loadSettings()
|
|
self.restart_required = False
|
|
self.settingschanged = False
|
|
def loadSettings(self):
|
|
self.institution_name.setText(config.institution_name)
|
|
self.default_loan_duration.setValue(
|
|
int(config.loan_duration)
|
|
)
|
|
self.delete_inactive_user_duration.setValue(
|
|
int(config.delete_inactive_user_duration)
|
|
)
|
|
self.database_backupLocation.setText(
|
|
config.database.backupLocation
|
|
)
|
|
self.database_path.setText(config.database.path)
|
|
self.database_name.setText(config.database.name)
|
|
self.report_day.setCurrentIndex(config.report.report_day)
|
|
self.check_generate_report.setChecked(config.report.generate_report)
|
|
self.report_path.setText(config.report.path)
|
|
self.returnMode.setChecked(config.advanced_refresh)
|
|
pass
|
|
|
|
|
|
def launch():
|
|
import sys
|
|
|
|
app = QtWidgets.QApplication([])
|
|
settings = Settings()
|
|
settings.show()
|
|
sys.exit(app.exec())
|