diff --git a/config/base_config.yaml b/config/base_config.yaml new file mode 100644 index 0000000..9c07673 --- /dev/null +++ b/config/base_config.yaml @@ -0,0 +1,57 @@ +default_apps: true +save_path: . +icon_path: icons/ +openAI: + api_key: + model: +zotero: + api_key: + library_id: + library_type: user +database: + name: semesterapparate.db + path: . + temp: ~/AppData/Local/SAM/SemesterApparatsManager/Cache +mail: + smtp_server: + port: + sender: + printer_mail: + user_name: + use_user_name: true + password: + signature: +colors: + dark: '#6b6160' + light: '#000000' + warning: '#ff0000' + success: '#00ff00' +icons: + locked: locked.svg + logo: logo.ico + show_password: visibility_off.svg + hide_password: visibility_on.svg + settings: settings.svg + today: calendar_today.svg + save: save.svg + edit_note: edit_note.svg + warning: warning.svg + error: error.svg + mail: mail.svg + semester: semester.svg + template_fail: test_fail.svg + offAction: shutdown.svg + info: info.svg + help: help.svg + close: close.svg + notification: notification.svg + valid_true: check_success.svg + valid_false: check_fail.svg + edit: edit.svg + important_warn: red_warn.svg + person: person_add.svg + database: database.svg + icons: icons.svg + api: api.svg + print: print.svg + db_search: db_search.svg diff --git a/config/config.py b/config/config.py index 4a4a550..51ba16a 100644 --- a/config/config.py +++ b/config/config.py @@ -42,9 +42,9 @@ class Database: def __post_init__(self): if isinstance(self.path, str): - self.path = Path(self.path) + self.path = Path(self.path).expanduser() if isinstance(self.temp, str): - self.temp = Path(self.temp) + self.temp = Path(self.temp).expanduser() @dataclass class Mail: @@ -137,7 +137,7 @@ class Config: """ _config: Optional[DictConfig] = None - + config_exists: bool = True def __init__(self, config_path: str): """ Loads the configuration file and stores it for future access. @@ -157,9 +157,14 @@ class Config: base_config = base_file.read() with open(config_path, "w") as config_file: config_file.write(base_config) + self.config_exists = False self._config = OmegaConf.load(config_path) self.config_path = config_path + @property + def exists(self) -> bool: + return self.config_exists + def save(self): """ Saves the current configuration to the file. @@ -169,6 +174,12 @@ class Config: """ OmegaConf.save(self._config, self.config_path) + def reload(self): + """ + Reloads the configuration from the file. + """ + self._config = OmegaConf.load(self.config_path) + @property def zotero(self): return Zotero(**self._config.zotero) diff --git a/src/__init__.py b/src/__init__.py index bb7639a..1fcb8ef 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -1,11 +1,14 @@ __version__ = "0.2.1" __author__ = "Alexander Kirchner" __all__ = ["__version__", "__author__", "Icon", "settings"] + import os -from config import Config from appdirs import AppDirs +from config import Config + + app = AppDirs("SemesterApparatsManager", "SAM") LOG_DIR = app.user_log_dir CONFIG_DIR = app.user_config_dir @@ -16,6 +19,7 @@ if not os.path.exists(CONFIG_DIR): settings = Config(f"{CONFIG_DIR}/config.yaml") +first_launch = settings.exists if not os.path.exists(settings.database.temp.expanduser()): settings.database.temp.expanduser().mkdir(parents=True, exist_ok=True) from .utils.icon import Icon diff --git a/src/ui/widgets/welcome_wizard.py b/src/ui/widgets/welcome_wizard.py new file mode 100644 index 0000000..d79fa5a --- /dev/null +++ b/src/ui/widgets/welcome_wizard.py @@ -0,0 +1,51 @@ +from .widget_sources.welcome_wizard_ui import Ui_Wizard +from PyQt6 import QtWidgets, QtCore, QtGui +from src import settings + +class WelcomeWizard(QtWidgets.QWizard, Ui_Wizard): + def __init__(self, parent=None): + super().__init__(parent) + self.setupUi(self) + self.btn_database.clicked.connect(self.open_database_settings) + self.btn_temp.clicked.connect(self.open_temp_settings) + + def open_database_settings(self): + #open filepicker dialog to select database file folder + file_dialog = QtWidgets.QFileDialog(self, "Select Database File") + file_dialog.setFileMode(QtWidgets.QFileDialog.FileMode.ExistingFile) + file_dialog.setNameFilter("Database Files (*.db *.sqlite *.sqlite3)") + file_dialog.setViewMode(QtWidgets.QFileDialog.ViewMode.List) + file_dialog.setDirectory(settings.database.path) # Set initial directory if needed + file_dialog.setOption(QtWidgets.QFileDialog.Option.DontUseNativeDialog, True) + file_dialog.setWindowFlags(file_dialog.windowFlags() | QtCore.Qt.WindowType.WindowStaysOnTopHint) + if file_dialog.exec(): + selected_files = file_dialog.selectedFiles() + if selected_files: + # Do something with the selected database file + print("Selected database file:", selected_files[0]) + + def open_temp_settings(self): + #open filepicker dialog to select temporary directory + dir_dialog = QtWidgets.QFileDialog(self, "Select Temporary Directory") + dir_dialog.setFileMode(QtWidgets.QFileDialog.FileMode.Directory) + dir_dialog.setViewMode(QtWidgets.QFileDialog.ViewMode.List) + + if dir_dialog.exec(): + selected_dirs = dir_dialog.selectedFiles() + if selected_dirs: + # Do something with the selected temporary directory + print("Selected temporary directory:", selected_dirs[0]) + + +def launch_wizard(): + """Launch the welcome wizard.""" + app = QtWidgets.QApplication.instance() + if not app: + app = QtWidgets.QApplication([]) + wizard = WelcomeWizard() + # wizard.setWindowTitle("Welcome to the Semester Apparatus Manager") + # wizard.setWindowIcon(settings.Icon("welcome").icon) + wizard.setWizardStyle(QtWidgets.QWizard.WizardStyle.ModernStyle) + wizard.setStartId(0) + wizard.show() + return wizard.exec() \ No newline at end of file diff --git a/src/ui/widgets/widget_sources/welcome_wizard.ui b/src/ui/widgets/widget_sources/welcome_wizard.ui new file mode 100644 index 0000000..b2bcba6 --- /dev/null +++ b/src/ui/widgets/widget_sources/welcome_wizard.ui @@ -0,0 +1,348 @@ + + + Wizard + + + + 0 + 0 + 564 + 425 + + + + Wizard + + + false + + + QWizard::ClassicStyle + + + Qt::PlainText + + + 0 + + + + Willkommen + + + + + + 0 + + + + + + false + + + 0 + + + QTextEdit::AutoAll + + + true + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css"> +p, li { white-space: pre-wrap; } +hr { height: 1px; border-width: 0; } +li.unchecked::marker { content: "\2610"; } +li.checked::marker { content: "\2612"; } +</style></head><body style=" font-family:'Segoe UI'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Es wurde erkannt, dass der SemesterApparatsManager (SAM) zum ersten Mal gestartet wurde. In den Folgenden Seiten werden die grundlegenden Einstellungen festgelegt, anschließend wird SAM geöffnet. Folgende Einstellungen werden über diesen Wizard festgelegt:</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Datenbank</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- eMail</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Zotero Integration</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- KI Integration</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> + + + + + + + + Datenbank + + + Hier werden die Einstellungen für die Datenbank und temporären Dateien festgelegt. Über den [...] Knopf können die Datenbank und der Speicherort für die temporären Daten festgelegt werden + + + 1 + + + + + + Datenbank + + + + + + + semesterapparate.db + + + + + + + ... + + + + + + + Temporäre Daten + + + + + + + C:\Users\[Nutzer]\AppData\Local\SAM\SemesterApparatsManager\Cache + + + + + + + ... + + + + + + + + Mail + + + Hier werden die Einstellungen für die Mailverbindung eingegeben + + + 2 + + + + + + SMTP Server + + + + + + + + + + + + + + + + + + + Nutzername + + + + + + + SMTP Port + + + + + + + Passwort + + + + + + + CheckBox + + + + + + + + + + Druckermail + + + + + + + Nutzername +für SMTP + + + + + + + + + + Signatur + + + + + + + Mail Adresse + + + + + + + + + + + Zotero + + + Hier werden die Einstellungen für Zotero verwaltet + + + 3 + + + + + + API-Key + + + + + + + + + + + + + ID + + + + + + + Anwendungstyp + + + + + + + user + + + + + + + + KI-Integration + + + Hier werden die Einstellungen für die KI Integration eingestellt. + + + 9 + + + + + + + + + API Key + + + + + + + ChatGPT Modell + + + + + + + gpt-4o-mini + + + + gpt3.5-turbo + + + + + gpt-4 + + + + + gpt-4o + + + + + gpt-4o-mini + + + + + gpt-4.1 + + + + + gpt-4.1-mini + + + + + gpt-4.1-nano + + + + + + + + + + diff --git a/src/ui/widgets/widget_sources/welcome_wizard_ui.py b/src/ui/widgets/widget_sources/welcome_wizard_ui.py new file mode 100644 index 0000000..3433e85 --- /dev/null +++ b/src/ui/widgets/widget_sources/welcome_wizard_ui.py @@ -0,0 +1,215 @@ +# Form implementation generated from reading ui file 'c:\Users\aky547\GitHub\SemesterapparatsManager\src\ui\widgets\widget_sources\welcome_wizard.ui' +# +# Created by: PyQt6 UI code generator 6.9.0 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_Wizard(object): + def setupUi(self, Wizard): + Wizard.setObjectName("Wizard") + Wizard.resize(564, 425) + Wizard.setSizeGripEnabled(False) + Wizard.setWizardStyle(QtWidgets.QWizard.WizardStyle.ClassicStyle) + Wizard.setSubTitleFormat(QtCore.Qt.TextFormat.PlainText) + Wizard.setCurrentId(0) + self.wizardPage1 = QtWidgets.QWizardPage() + self.wizardPage1.setSubTitle("") + self.wizardPage1.setObjectName("wizardPage1") + self.verticalLayout = QtWidgets.QVBoxLayout(self.wizardPage1) + self.verticalLayout.setObjectName("verticalLayout") + self.textEdit = QtWidgets.QTextEdit(parent=self.wizardPage1) + self.textEdit.setEnabled(False) + self.textEdit.setLineWidth(0) + self.textEdit.setAutoFormatting(QtWidgets.QTextEdit.AutoFormattingFlag.AutoAll) + self.textEdit.setReadOnly(True) + self.textEdit.setObjectName("textEdit") + self.verticalLayout.addWidget(self.textEdit) + Wizard.addPage(self.wizardPage1) + self.wizardPage2 = QtWidgets.QWizardPage() + self.wizardPage2.setObjectName("wizardPage2") + self.gridLayout = QtWidgets.QGridLayout(self.wizardPage2) + self.gridLayout.setObjectName("gridLayout") + self.label = QtWidgets.QLabel(parent=self.wizardPage2) + self.label.setObjectName("label") + self.gridLayout.addWidget(self.label, 0, 0, 1, 1) + self.settings_database = QtWidgets.QLineEdit(parent=self.wizardPage2) + self.settings_database.setObjectName("settings_database") + self.gridLayout.addWidget(self.settings_database, 0, 1, 1, 1) + self.btn_database = QtWidgets.QToolButton(parent=self.wizardPage2) + self.btn_database.setObjectName("btn_database") + self.gridLayout.addWidget(self.btn_database, 0, 2, 1, 1) + self.label_2 = QtWidgets.QLabel(parent=self.wizardPage2) + self.label_2.setObjectName("label_2") + self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1) + self.settings_temp = QtWidgets.QLineEdit(parent=self.wizardPage2) + self.settings_temp.setObjectName("settings_temp") + self.gridLayout.addWidget(self.settings_temp, 1, 1, 1, 1) + self.btn_temp = QtWidgets.QToolButton(parent=self.wizardPage2) + self.btn_temp.setObjectName("btn_temp") + self.gridLayout.addWidget(self.btn_temp, 1, 2, 1, 1) + Wizard.addPage(self.wizardPage2) + self.wizardPage3 = QtWidgets.QWizardPage() + self.wizardPage3.setObjectName("wizardPage3") + self.formLayout = QtWidgets.QFormLayout(self.wizardPage3) + self.formLayout.setObjectName("formLayout") + self.label_3 = QtWidgets.QLabel(parent=self.wizardPage3) + self.label_3.setObjectName("label_3") + self.formLayout.setWidget(0, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_3) + self.lineEdit = QtWidgets.QLineEdit(parent=self.wizardPage3) + self.lineEdit.setObjectName("lineEdit") + self.formLayout.setWidget(0, QtWidgets.QFormLayout.ItemRole.FieldRole, self.lineEdit) + self.lineEdit_2 = QtWidgets.QLineEdit(parent=self.wizardPage3) + self.lineEdit_2.setObjectName("lineEdit_2") + self.formLayout.setWidget(1, QtWidgets.QFormLayout.ItemRole.FieldRole, self.lineEdit_2) + self.lineEdit_3 = QtWidgets.QLineEdit(parent=self.wizardPage3) + self.lineEdit_3.setObjectName("lineEdit_3") + self.formLayout.setWidget(3, QtWidgets.QFormLayout.ItemRole.FieldRole, self.lineEdit_3) + self.lineEdit_4 = QtWidgets.QLineEdit(parent=self.wizardPage3) + self.lineEdit_4.setObjectName("lineEdit_4") + self.formLayout.setWidget(4, QtWidgets.QFormLayout.ItemRole.FieldRole, self.lineEdit_4) + self.label_4 = QtWidgets.QLabel(parent=self.wizardPage3) + self.label_4.setObjectName("label_4") + self.formLayout.setWidget(3, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_4) + self.label_5 = QtWidgets.QLabel(parent=self.wizardPage3) + self.label_5.setObjectName("label_5") + self.formLayout.setWidget(1, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_5) + self.label_6 = QtWidgets.QLabel(parent=self.wizardPage3) + self.label_6.setObjectName("label_6") + self.formLayout.setWidget(4, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_6) + self.settings_mail_use_user_name = QtWidgets.QCheckBox(parent=self.wizardPage3) + self.settings_mail_use_user_name.setObjectName("settings_mail_use_user_name") + self.formLayout.setWidget(8, QtWidgets.QFormLayout.ItemRole.FieldRole, self.settings_mail_use_user_name) + self.settings_mail_ = QtWidgets.QLineEdit(parent=self.wizardPage3) + self.settings_mail_.setObjectName("settings_mail_") + self.formLayout.setWidget(7, QtWidgets.QFormLayout.ItemRole.FieldRole, self.settings_mail_) + self.label_8 = QtWidgets.QLabel(parent=self.wizardPage3) + self.label_8.setObjectName("label_8") + self.formLayout.setWidget(7, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_8) + self.label_9 = QtWidgets.QLabel(parent=self.wizardPage3) + self.label_9.setObjectName("label_9") + self.formLayout.setWidget(8, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_9) + self.textEdit_2 = QtWidgets.QTextEdit(parent=self.wizardPage3) + self.textEdit_2.setObjectName("textEdit_2") + self.formLayout.setWidget(5, QtWidgets.QFormLayout.ItemRole.FieldRole, self.textEdit_2) + self.label_10 = QtWidgets.QLabel(parent=self.wizardPage3) + self.label_10.setObjectName("label_10") + self.formLayout.setWidget(5, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_10) + self.label_7 = QtWidgets.QLabel(parent=self.wizardPage3) + self.label_7.setObjectName("label_7") + self.formLayout.setWidget(2, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_7) + self.lineEdit_5 = QtWidgets.QLineEdit(parent=self.wizardPage3) + self.lineEdit_5.setObjectName("lineEdit_5") + self.formLayout.setWidget(2, QtWidgets.QFormLayout.ItemRole.FieldRole, self.lineEdit_5) + Wizard.addPage(self.wizardPage3) + self.wizardPage4 = QtWidgets.QWizardPage() + self.wizardPage4.setObjectName("wizardPage4") + self.formLayout_2 = QtWidgets.QFormLayout(self.wizardPage4) + self.formLayout_2.setObjectName("formLayout_2") + self.label_11 = QtWidgets.QLabel(parent=self.wizardPage4) + self.label_11.setObjectName("label_11") + self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_11) + self.settings_zotero_api_key = QtWidgets.QLineEdit(parent=self.wizardPage4) + self.settings_zotero_api_key.setObjectName("settings_zotero_api_key") + self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.ItemRole.FieldRole, self.settings_zotero_api_key) + self.settings_zotero_library_id = QtWidgets.QLineEdit(parent=self.wizardPage4) + self.settings_zotero_library_id.setObjectName("settings_zotero_library_id") + self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.ItemRole.FieldRole, self.settings_zotero_library_id) + self.label_12 = QtWidgets.QLabel(parent=self.wizardPage4) + self.label_12.setObjectName("label_12") + self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_12) + self.label_13 = QtWidgets.QLabel(parent=self.wizardPage4) + self.label_13.setObjectName("label_13") + self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_13) + self.settings_zotero_library_type = QtWidgets.QLineEdit(parent=self.wizardPage4) + self.settings_zotero_library_type.setObjectName("settings_zotero_library_type") + self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.ItemRole.FieldRole, self.settings_zotero_library_type) + Wizard.addPage(self.wizardPage4) + self.wizardPage5 = QtWidgets.QWizardPage() + self.wizardPage5.setObjectName("wizardPage5") + self.formLayout_3 = QtWidgets.QFormLayout(self.wizardPage5) + self.formLayout_3.setObjectName("formLayout_3") + self.lineEdit_6 = QtWidgets.QLineEdit(parent=self.wizardPage5) + self.lineEdit_6.setObjectName("lineEdit_6") + self.formLayout_3.setWidget(0, QtWidgets.QFormLayout.ItemRole.FieldRole, self.lineEdit_6) + self.label_14 = QtWidgets.QLabel(parent=self.wizardPage5) + self.label_14.setObjectName("label_14") + self.formLayout_3.setWidget(0, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_14) + self.label_15 = QtWidgets.QLabel(parent=self.wizardPage5) + self.label_15.setObjectName("label_15") + self.formLayout_3.setWidget(1, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_15) + self.comboBox = QtWidgets.QComboBox(parent=self.wizardPage5) + self.comboBox.setObjectName("comboBox") + self.comboBox.addItem("") + self.comboBox.addItem("") + self.comboBox.addItem("") + self.comboBox.addItem("") + self.comboBox.addItem("") + self.comboBox.addItem("") + self.comboBox.addItem("") + self.formLayout_3.setWidget(1, QtWidgets.QFormLayout.ItemRole.FieldRole, self.comboBox) + Wizard.addPage(self.wizardPage5) + + self.retranslateUi(Wizard) + QtCore.QMetaObject.connectSlotsByName(Wizard) + + def retranslateUi(self, Wizard): + _translate = QtCore.QCoreApplication.translate + Wizard.setWindowTitle(_translate("Wizard", "Wizard")) + self.wizardPage1.setTitle(_translate("Wizard", "Willkommen")) + self.textEdit.setHtml(_translate("Wizard", "\n" +"\n" +"

Es wurde erkannt, dass der SemesterApparatsManager (SAM) zum ersten Mal gestartet wurde. In den Folgenden Seiten werden die grundlegenden Einstellungen festgelegt, anschließend wird SAM geöffnet. Folgende Einstellungen werden über diesen Wizard festgelegt:

\n" +"


\n" +"

- Datenbank

\n" +"

- eMail

\n" +"

- Zotero Integration

\n" +"

- KI Integration

\n" +"


")) + self.wizardPage2.setTitle(_translate("Wizard", "Datenbank")) + self.wizardPage2.setSubTitle(_translate("Wizard", "Hier werden die Einstellungen für die Datenbank und temporären Dateien festgelegt. Über den [...] Knopf können die Datenbank und der Speicherort für die temporären Daten festgelegt werden")) + self.label.setText(_translate("Wizard", "Datenbank")) + self.settings_database.setPlaceholderText(_translate("Wizard", "semesterapparate.db")) + self.btn_database.setText(_translate("Wizard", "...")) + self.label_2.setText(_translate("Wizard", "Temporäre Daten")) + self.settings_temp.setPlaceholderText(_translate("Wizard", "C:\\Users\\[Nutzer]\\AppData\\Local\\SAM\\SemesterApparatsManager\\Cache")) + self.btn_temp.setText(_translate("Wizard", "...")) + self.wizardPage3.setTitle(_translate("Wizard", "Mail")) + self.wizardPage3.setSubTitle(_translate("Wizard", "Hier werden die Einstellungen für die Mailverbindung eingegeben")) + self.label_3.setText(_translate("Wizard", "SMTP Server")) + self.label_4.setText(_translate("Wizard", "Nutzername")) + self.label_5.setText(_translate("Wizard", "SMTP Port")) + self.label_6.setText(_translate("Wizard", "Passwort")) + self.settings_mail_use_user_name.setText(_translate("Wizard", "CheckBox")) + self.label_8.setText(_translate("Wizard", "Druckermail")) + self.label_9.setText(_translate("Wizard", "Nutzername\n" +"für SMTP")) + self.label_10.setText(_translate("Wizard", "Signatur")) + self.label_7.setText(_translate("Wizard", "Mail Adresse")) + self.wizardPage4.setTitle(_translate("Wizard", "Zotero")) + self.wizardPage4.setSubTitle(_translate("Wizard", "Hier werden die Einstellungen für Zotero verwaltet")) + self.label_11.setText(_translate("Wizard", "API-Key")) + self.label_12.setText(_translate("Wizard", "ID")) + self.label_13.setText(_translate("Wizard", "Anwendungstyp")) + self.settings_zotero_library_type.setText(_translate("Wizard", "user")) + self.wizardPage5.setTitle(_translate("Wizard", "KI-Integration")) + self.wizardPage5.setSubTitle(_translate("Wizard", "Hier werden die Einstellungen für die KI Integration eingestellt.")) + self.label_14.setText(_translate("Wizard", "API Key")) + self.label_15.setText(_translate("Wizard", "ChatGPT Modell")) + self.comboBox.setCurrentText(_translate("Wizard", "gpt-4o-mini")) + self.comboBox.setItemText(0, _translate("Wizard", "gpt3.5-turbo")) + self.comboBox.setItemText(1, _translate("Wizard", "gpt-4")) + self.comboBox.setItemText(2, _translate("Wizard", "gpt-4o")) + self.comboBox.setItemText(3, _translate("Wizard", "gpt-4o-mini")) + self.comboBox.setItemText(4, _translate("Wizard", "gpt-4.1")) + self.comboBox.setItemText(5, _translate("Wizard", "gpt-4.1-mini")) + self.comboBox.setItemText(6, _translate("Wizard", "gpt-4.1-nano"))