generated from LouisMazin/PythonApplicationTemplate
144 lines
6.1 KiB
Python
144 lines
6.1 KiB
Python
from PyQt6.QtWidgets import QWidget, QVBoxLayout, QComboBox, QLabel, QHBoxLayout, QSizePolicy, QLineEdit, QPushButton, QFileDialog
|
|
from PyQt6.QtCore import Qt
|
|
from app.core.main_manager import MainManager, NotificationType
|
|
from typing import Optional
|
|
|
|
class SettingsWindow(QWidget):
|
|
def __init__(self, parent: Optional[QWidget] = None) -> None:
|
|
super().__init__(parent)
|
|
self.main_manager: MainManager = MainManager.get_instance()
|
|
self.language_manager = self.main_manager.get_language_manager()
|
|
self.settings_manager = self.main_manager.get_settings_manager()
|
|
self.theme_manager = self.main_manager.get_theme_manager()
|
|
|
|
self.observer_manager = self.main_manager.get_observer_manager()
|
|
self.observer_manager.subscribe(NotificationType.LANGUAGE, self.update_language)
|
|
|
|
# Type hints for UI elements
|
|
self.language_layout: QHBoxLayout
|
|
self.languageLabel: QLabel
|
|
self.languageCombo: QComboBox
|
|
self.theme_layout: QHBoxLayout
|
|
self.themeLabel: QLabel
|
|
self.themeCombo: QComboBox
|
|
self.model_layout: QHBoxLayout
|
|
self.modelLabel: QLabel
|
|
self.modelEdit: QLineEdit
|
|
self.modelButton: QPushButton
|
|
|
|
self.setup_ui()
|
|
|
|
def setup_ui(self) -> None:
|
|
layout: QVBoxLayout = QVBoxLayout(self)
|
|
layout.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
|
layout.setSpacing(20)
|
|
layout.setContentsMargins(20, 20, 20, 20)
|
|
|
|
layout.addStretch(1)
|
|
|
|
self.language_layout = QHBoxLayout()
|
|
# Paramètres de langue
|
|
self.languageLabel = QLabel(self.language_manager.get_text("language"),self)
|
|
self.languageLabel.setMinimumWidth(100)
|
|
self.languageLabel.setSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed)
|
|
self.language_layout.addWidget(self.languageLabel)
|
|
|
|
self.languageCombo = self.createLanguageSelector()
|
|
self.languageCombo.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed)
|
|
self.language_layout.addWidget(self.languageCombo)
|
|
|
|
layout.addLayout(self.language_layout)
|
|
|
|
layout.addStretch(1)
|
|
|
|
# Paramètres de thème
|
|
self.theme_layout = QHBoxLayout()
|
|
|
|
self.themeLabel = QLabel(self.language_manager.get_text("theme"), self)
|
|
self.themeLabel.setMinimumWidth(100)
|
|
self.themeLabel.setSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed)
|
|
self.theme_layout.addWidget(self.themeLabel)
|
|
|
|
self.themeCombo = self.createThemeSelector()
|
|
self.themeCombo.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed)
|
|
self.theme_layout.addWidget(self.themeCombo)
|
|
|
|
layout.addLayout(self.theme_layout)
|
|
|
|
layout.addStretch(1)
|
|
|
|
self.model_layout = QHBoxLayout()
|
|
|
|
self.modelLabel = QLabel(self.language_manager.get_text("chat_model_path"), self)
|
|
self.modelLabel.setMinimumWidth(100)
|
|
self.modelLabel.setSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed)
|
|
self.model_layout.addWidget(self.modelLabel)
|
|
|
|
self.modelEdit = QLineEdit(self.settings_manager.get_model_path(), self)
|
|
self.modelEdit.setPlaceholderText(self.language_manager.get_text("chat_model_placeholder"))
|
|
self.modelEdit.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed)
|
|
self.modelEdit.textChanged.connect(self.change_model_path)
|
|
self.model_layout.addWidget(self.modelEdit)
|
|
|
|
self.modelButton = QPushButton(self.language_manager.get_text("chat_model_browse"), self)
|
|
self.modelButton.clicked.connect(self.browse_model)
|
|
self.model_layout.addWidget(self.modelButton)
|
|
|
|
layout.addLayout(self.model_layout)
|
|
|
|
layout.addStretch(1)
|
|
|
|
def createLanguageSelector(self) -> QComboBox:
|
|
combo: QComboBox = QComboBox()
|
|
# Ajouter toutes les langues disponibles
|
|
for langCode, langData in self.language_manager.translations.items():
|
|
combo.addItem(langData["lang_name"], langCode)
|
|
|
|
# Sélectionner la langue actuelle
|
|
currentIndex = combo.findData(self.settings_manager.get_language())
|
|
combo.setCurrentIndex(currentIndex)
|
|
combo.currentIndexChanged.connect(self.change_language)
|
|
|
|
return combo
|
|
|
|
def createThemeSelector(self) -> QComboBox:
|
|
combo: QComboBox = QComboBox()
|
|
# Ajouter toutes les options de thème disponibles
|
|
for theme in self.theme_manager.get_themes():
|
|
combo.addItem(self.language_manager.get_text(theme.name+"_theme"), theme.name)
|
|
|
|
# Sélectionner le thème actuel
|
|
currentIndex = combo.findData(self.settings_manager.get_theme())
|
|
combo.setCurrentIndex(currentIndex)
|
|
combo.currentIndexChanged.connect(self.change_theme)
|
|
|
|
return combo
|
|
|
|
def change_language(self, index: int) -> None:
|
|
self.settings_manager.set_language(self.languageCombo.itemData(index))
|
|
|
|
def change_theme(self, index: int) -> None:
|
|
theme: str = self.themeCombo.itemData(index)
|
|
self.settings_manager.set_theme(theme)
|
|
|
|
def change_model_path(self, path: str) -> None:
|
|
self.settings_manager.set_model_path(path)
|
|
|
|
def browse_model(self) -> None:
|
|
path, _ = QFileDialog.getOpenFileName(
|
|
self, self.language_manager.get_text("chat_model_placeholder"),
|
|
"", "GGUF Models (*.gguf);;All Files (*)"
|
|
)
|
|
if path:
|
|
self.modelEdit.setText(path)
|
|
|
|
def update_language(self) -> None:
|
|
self.languageLabel.setText(self.language_manager.get_text("language"))
|
|
self.themeLabel.setText(self.language_manager.get_text("theme"))
|
|
self.modelLabel.setText(self.language_manager.get_text("chat_model_path"))
|
|
self.modelEdit.setPlaceholderText(self.language_manager.get_text("chat_model_placeholder"))
|
|
self.modelButton.setText(self.language_manager.get_text("chat_model_browse"))
|
|
|
|
# Mettre à jour les textes dans la combo de thème
|
|
for i in range(self.themeCombo.count()):
|
|
self.themeCombo.setItemText(i, self.language_manager.get_text(self.themeCombo.itemData(i)+ "_theme")) |