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