Files
LibrarySystem/src/ui/settings.py

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())