"""
Fichier contenant la classe :class:`BrowseFile` dérivée de :class:`.BaseSettingType`, qui permet la gestion d'un paramètre type recherche de fichier.
"""
from dataclasses import dataclass, field
from pathlib import Path
from typing import Any
from qtpy.QtCore import Qt
from qtpy.QtWidgets import QFileDialog, QLineEdit, QPushButton
from palm_tracer.Settings.Types.BaseSettingType import BaseSettingType
##################################################
[docs]
@dataclass
class BrowseFile(BaseSettingType):
"""
Classe pour un paramètre spécifique de type recherche de fichier.
:param label: Nom du paramètre à afficher
:param tooltip: Description détaillée en overlay.
:param default: Valeur par défaut du paramètre.
"""
default: str = ""
_value: str = field(init=False, default="")
_box: QLineEdit = field(init=False, default_factory=lambda: QLineEdit())
# ==================================================
# region Initialization
# ==================================================
##################################################
[docs]
def initialize(self):
super().initialize() # . Appelle l'initialisation de la classe mère
self._box.setAlignment(Qt.AlignmentFlag.AlignLeft) # Définition de l'alignement du calque à gauche.
browse_button = QPushButton("Choisir un fichier") # .Ajout d'un bouton pour permettre de choisir le fichier
browse_button.clicked.connect(self.browse_file) # . Connexion du bouton à la méthode de sélection
# Disposer le QLineEdit et le bouton dans un calque horizontal
self._layout.addWidget(self._box) # . Ajout du champ de texte
self._layout.addWidget(browse_button) # . Ajout du bouton de sélection
self._layout.addStretch(1) # . Pousse tout à gauche, espace vide à droite
# ==================================================
# endregion Initialization
# ==================================================
# ==================================================
# region Getter/Setter
# ==================================================
##################################################
@property
def value(self) -> str:
"""Valeur actuelle du paramètre (:class:`str`)."""
self._value = self._box.text()
return self._value
##################################################
@value.setter
def value(self, value: str):
"""Valeur actuelle du paramètre (:class:`str`)."""
self._value = value
self._box.setText(value)
# ==================================================
# endregion Getter/Setter
# ==================================================
# ==================================================
# region Parsing
# ==================================================
##################################################
[docs]
def to_dict(self) -> dict[str, Any]:
return {"type": type(self).__name__, "label": self.label, "value": self._value}
##################################################
[docs]
def update_from_dict(self, data: dict[str, Any]):
self.label = data.get("label", "")
self.value = data.get("value", "")
# ==================================================
# endregion Parsing
# ==================================================
# ==================================================
# region Callbacks
# ==================================================
##################################################
[docs]
def browse_file(self):
"""Ouvre un dialogue de sélection de fichiers et mets à jour la boîte avec le chemin sélectionné."""
current = Path(self.value)
# Si le chemin par défaut n'est pas valide, on utilise le chemin principal du projet
if not current.exists() or current == Path.cwd(): current = Path.cwd()
path, _ = QFileDialog.getOpenFileName(self._box, "Sélectionner un fichier", str(current))
if not path: return
if Path(path).is_file(): self._box.setText(path) # Mets à jour le chemin dans la boîte de texte