import sys
from src.shared.logging import log, get_bloat_logger, preview
from PySide6 import QtCore, QtGui, QtWidgets
from src import settings
from src.ui.widgets.iconLine import IconWidget
from src.utils.icon import Icon
from .dialog_sources.settings_ui import Ui_Dialog as _settings
# use centralized logging from src.shared.logging
base = """'
'"""
class Settings(QtWidgets.QDialog, _settings):
def __init__(self, user=None):
super().__init__()
self.setupUi(self)
self.password.setEchoMode(QtWidgets.QLineEdit.EchoMode.Normal)
self.zotero_api_key.setEchoMode(QtWidgets.QLineEdit.EchoMode.Normal)
self.editSignature.setAcceptRichText(True)
self.editSignature.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus)
self.bold.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.italic.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.underscore.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.font_size.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
self.fontComboBox.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
# self.setWindowIcon(Icon("settings").icon)
Icon("settings", self)
self.setWindowTitle("Einstellungen")
self.font_size.setCurrentText("9")
# add button to toggle password visibility
if user == "admin":
self.debug.show()
else:
self.debug.hide()
self.showPassword = True
self.togglePassword.clicked.connect(self.toggle_password)
self.toggle_api_visibility.clicked.connect(self.toggle_api)
self.tb_select_db.clicked.connect(self.select_db)
self.tb_set_save_path.clicked.connect(self.set_save_path)
self.bold.clicked.connect(self.setFontBold)
self.italic.clicked.connect(self.setTextFontItalic)
self.underscore.clicked.connect(self.setTextFontUnderline)
self.font_size.currentTextChanged.connect(self.setFontSize)
self.fontComboBox.currentFontChanged.connect(self.setCurrentFont)
self.debug.clicked.connect(self.debug_mode)
self.toggle_password()
self.toggle_api()
self.load_config()
self.buttonBox.accepted.connect(self.save)
# set text in gridlayout_4 to be not bold
self.toolBox.setItemIcon(0, Icon("database").icon)
self.toolBox.setItemIcon(1, Icon("api").icon)
self.toolBox.setItemIcon(2, Icon("mail").icon)
self.toolBox.setItemIcon(3, Icon("icons").icon)
log.info("Settings dialog opened, data loaded")
def load_config(self):
self.db_name.setText(settings.database.name)
self.db_path.setText(str(settings.database.path.expanduser()))
self.save_path.setText(str(settings.database.temp.expanduser()))
self.smtp_address.setText(settings.mail.smtp_server)
self.smtp_port.setText(str(settings.mail.port))
self.sender_email.setText(settings.mail.sender)
self.mail_username.setText(settings.mail.user_name)
self.password.setText(settings.mail.password)
self.printermail.setText(settings.mail.printer_mail)
self.printermail.setPlaceholderText("E-Mail-Adresse des Druckers")
self.use_username_smtp_login.setChecked(
settings.mail.use_user_name if settings.mail.use_user_name else False,
)
self.editSignature.setHtml(settings.mail.signature)
self.zotero_api_key.setText(settings.zotero.api_key)
self.zotero_library_id.setText(str(settings.zotero.library_id))
self.zotero_library_type.setText(settings.zotero.library_type)
for row, color in enumerate(settings.icons.colors):
# add a label with the color name, a lineedit with the color value and a button to change the color
label = QtWidgets.QLabel(color)
lineedit = QtWidgets.QLineEdit(settings.icons.colors[color])
button = QtWidgets.QPushButton("Farbe ändern")
button.clicked.connect(lambda: self.change_color(lineedit))
self.gridLayout_4.addWidget(label, row, 0)
self.gridLayout_4.addWidget(lineedit, row, 1)
self.gridLayout_4.addWidget(button, row, 2)
for i in range(self.gridLayout_4.count()):
self.gridLayout_4.itemAt(i).widget().setFont(QtGui.QFont("Segoe UI", 9))
for row, icon in enumerate(settings.icons.icons):
icon_widget = IconWidget(icon, settings.icons.icons[icon])
self.vertical_icons.addWidget(icon_widget)
def change_color(self, lineedit):
log.debug("Changing color for {}", lineedit.text())
colorDialog = QtWidgets.QColorDialog()
colorDialog.setSizePolicy()
color = colorDialog.getColor()
if color.isValid():
lineedit.setText(color.name())
def setCurrentFont(self):
font = self.fontComboBox.currentFont()
font.setPointSize(int(self.font_size.currentText()))
self.editSignature.setFont(font)
def setFontSize(self):
size = self.font_size.currentText()
self.editSignature.setFontPointSize(int(size))
def toggle_password(self):
# self.togglePassword.setIconSize(QtCore.QSize(16, 16))
if self.password.echoMode() == QtWidgets.QLineEdit.EchoMode.Password:
self.password.setEchoMode(QtWidgets.QLineEdit.EchoMode.Normal)
Icon("show_password", self.togglePassword)
else:
self.password.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password)
Icon("hide_password", self.togglePassword)
def toggle_api(self):
if self.zotero_api_key.echoMode() == QtWidgets.QLineEdit.EchoMode.Normal:
self.zotero_api_key.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password)
Icon("hide_password", self.toggle_api_visibility)
else:
self.zotero_api_key.setEchoMode(QtWidgets.QLineEdit.EchoMode.Normal)
Icon("show_password", widget=self.toggle_api_visibility)
def setFontBold(self):
if self.bold.isChecked():
self.editSignature.setFontWeight(QtGui.QFont.Weight.Bold)
else:
self.editSignature.setFontWeight(QtGui.QFont.Weight.Normal)
def setTextFontItalic(self):
if self.italic.isChecked():
self.editSignature.setFontItalic(True)
else:
self.editSignature.setFontItalic(False)
def setTextFontUnderline(self):
if self.underscore.isChecked():
self.editSignature.setFontUnderline(True)
else:
self.editSignature.setFontUnderline(False)
def select_db(self):
# open file dialog, limit to .db files
file_dialog = QtWidgets.QFileDialog()
file_dialog.setFileMode(QtWidgets.QFileDialog.FileMode.AnyFile)
file_dialog.setNameFilter("Datenbank (*.db)")
file_dialog.setViewMode(QtWidgets.QFileDialog.ViewMode.Detail)
if file_dialog.exec():
self.db_name.setText(file_dialog.selectedFiles()[0].split("/")[-1])
self.db_path.setText(
file_dialog.selectedFiles()[0].split(self.db_name.text())[0],
)
def set_save_path(self):
# open file dialog, limit to .db files
file_dialog = QtWidgets.QFileDialog(filter="Ordner auswählen")
file_dialog.setFileMode(QtWidgets.QFileDialog.FileMode.Directory)
file_dialog.setViewMode(QtWidgets.QFileDialog.ViewMode.Detail)
if file_dialog.exec():
self.save_path.setText(file_dialog.selectedFiles()[0])
def debug_mode(self):
bloat = get_bloat_logger()
bloat.debug(
"Signature HTML (preview): {}", preview(self.editSignature.toHtml(), 2000)
)
def return_data(self):
port = self.smtp_port.text()
if port != "None":
port = int(port)
else:
port = 0
signature = self.editSignature.toHtml()
if signature != base:
signature = signature
else:
signature = ""
settings.set_database_attr("name", self.db_name.text())
settings.set_database_attr("path", self.db_path.text())
settings.save_path = self.save_path.text()
settings.set_mail_attr("smtp_server", self.smtp_address.text())
settings.set_mail_attr("port", port)
settings.set_mail_attr("sender", self.sender_email.text())
settings.set_mail_attr("user_name", self.mail_username.text())
settings.set_mail_attr("password", self.password.text())
settings.set_mail_attr(
"use_user_name",
self.use_username_smtp_login.isChecked(),
)
settings.set_mail_attr("printer_mail", self.printermail.text())
settings.set_mail_attr("signature", signature)
settings.set_zotero_attr("api_key", self.zotero_api_key.text())
settings.set_zotero_attr("library_id", self.zotero_library_id.text())
settings.set_zotero_attr("library_type", self.zotero_library_type.text())
for color in self.get_colors():
settings.icons.colors[color] = self.get_colors()[color]
# #print(color)
for icon in self.get_icons():
settings.icons.icons[icon] = self.get_icons()[icon]
return settings
def get_colors(self) -> dict:
colors = {}
for i in range(self.gridLayout_4.count()):
widget = self.gridLayout_4.itemAt(i).widget()
if isinstance(widget, QtWidgets.QLineEdit):
colors[self.gridLayout_4.itemAt(i - 1).widget().text()] = widget.text()
return colors
def get_icons(self):
icons = {}
for row in range(self.vertical_icons.count()):
widget = self.vertical_icons.itemAt(row).widget()
if isinstance(widget, IconWidget):
data = widget.return_data()
icons[data[0]] = data[1]
return icons
def save(self):
config = self.return_data()
# ##print(config)
config.save()
self.accept()
def launch_settings():
app = QtWidgets.QApplication(sys.argv)
window = Settings()
window.show()
sys.exit(app.exec())