diff --git a/src/ui/widgets/config_dialog.py b/src/ui/widgets/config_dialog.py index d9320a7..cc2d1a5 100644 --- a/src/ui/widgets/config_dialog.py +++ b/src/ui/widgets/config_dialog.py @@ -3,8 +3,8 @@ import json import os from PyQt6.QtWidgets import ( - QDialog, QVBoxLayout, QHBoxLayout, QFormLayout, - QLineEdit, QPushButton, QLabel, QComboBox, QGroupBox + QDialog, QVBoxLayout, QHBoxLayout, QGridLayout, + QLineEdit, QPushButton, QLabel, QComboBox, QScrollArea, QWidget ) from PyQt6.QtCore import Qt from PyQt6.QtGui import QFont @@ -42,89 +42,133 @@ def save_config(config): class ConfigDialog(QDialog): - """Panneau de configuration admin.""" + """Panneau de configuration admin — plein écran, responsive.""" def __init__(self, parent=None): super().__init__(parent) self.setWindowTitle("Configuration — Admin") - self.setMinimumSize(500, 450) self.config = load_config() self._setup_ui() + def showEvent(self, event): + super().showEvent(event) + # Prendre toute la taille du parent + if self.parent(): + self.resize(self.parent().size()) + + def _fs(self, pct): + """Font size en % de la hauteur du dialogue.""" + return max(8, int(self.height() * pct / 100)) if self.height() > 0 else 14 + def _setup_ui(self): layout = QVBoxLayout(self) - layout.setSpacing(15) + layout.setContentsMargins(20, 10, 20, 10) + layout.setSpacing(8) # Titre title = QLabel("Configuration Photostation") - title.setFont(QFont("", 20, QFont.Weight.Bold)) + title.setFont(QFont("", 18, QFont.Weight.Bold)) title.setAlignment(Qt.AlignmentFlag.AlignCenter) layout.addWidget(title) - # WiFi - wifi_group = QGroupBox("WiFi (Hotspot)") - wifi_form = QFormLayout(wifi_group) - self.wifi_name_input = QLineEdit(self.config["wifi_ap_name"]) - self.wifi_name_input.setFont(QFont("", 14)) - self.wifi_name_input.setMinimumHeight(40) - wifi_form.addRow("Nom du réseau :", self.wifi_name_input) - self.wifi_pass_input = QLineEdit(self.config["wifi_ap_password"]) - self.wifi_pass_input.setFont(QFont("", 14)) - self.wifi_pass_input.setMinimumHeight(40) - wifi_form.addRow("Mot de passe :", self.wifi_pass_input) - layout.addWidget(wifi_group) + # Scroll area pour le contenu + scroll = QScrollArea() + scroll.setWidgetResizable(True) + scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff) + scroll.setStyleSheet("QScrollArea { border: none; }") - # QR Code - qr_group = QGroupBox("QR Code") - qr_form = QFormLayout(qr_group) - self.upload_url_input = QLineEdit(self.config["upload_url"]) - self.upload_url_input.setFont(QFont("", 14)) - self.upload_url_input.setMinimumHeight(40) - qr_form.addRow("URL d'upload :", self.upload_url_input) - layout.addWidget(qr_group) + content = QWidget() + grid = QGridLayout(content) + grid.setSpacing(8) + grid.setColumnStretch(0, 1) + grid.setColumnStretch(1, 2) - # Email - email_group = QGroupBox("Email") - email_form = QFormLayout(email_group) - self.email_input = QLineEdit(self.config["email_address"]) - self.email_input.setFont(QFont("", 14)) - self.email_input.setMinimumHeight(40) - email_form.addRow("Adresse email :", self.email_input) - layout.addWidget(email_group) + row = 0 - # Imprimante - printer_group = QGroupBox("Impression") - printer_form = QFormLayout(printer_group) - self.printer_input = QLineEdit(self.config["printer_name"]) - self.printer_input.setFont(QFont("", 14)) - self.printer_input.setMinimumHeight(40) - self.printer_input.setPlaceholderText("Nom CUPS (vide = par défaut)") - printer_form.addRow("Imprimante :", self.printer_input) + # ── WiFi ── + wifi_title = QLabel("WiFi (Hotspot)") + wifi_title.setFont(QFont("", 13, QFont.Weight.Bold)) + wifi_title.setStyleSheet("color: #2196F3; padding-top: 5px;") + grid.addWidget(wifi_title, row, 0, 1, 2) + row += 1 + + grid.addWidget(self._label("Nom du réseau :"), row, 0) + self.wifi_name_input = self._input(self.config["wifi_ap_name"]) + grid.addWidget(self.wifi_name_input, row, 1) + row += 1 + + grid.addWidget(self._label("Mot de passe :"), row, 0) + self.wifi_pass_input = self._input(self.config["wifi_ap_password"]) + grid.addWidget(self.wifi_pass_input, row, 1) + row += 1 + + # ── QR Code ── + qr_title = QLabel("QR Code") + qr_title.setFont(QFont("", 13, QFont.Weight.Bold)) + qr_title.setStyleSheet("color: #2196F3; padding-top: 5px;") + grid.addWidget(qr_title, row, 0, 1, 2) + row += 1 + + grid.addWidget(self._label("URL d'upload :"), row, 0) + self.upload_url_input = self._input(self.config["upload_url"]) + grid.addWidget(self.upload_url_input, row, 1) + row += 1 + + # ── Email ── + email_title = QLabel("Email") + email_title.setFont(QFont("", 13, QFont.Weight.Bold)) + email_title.setStyleSheet("color: #2196F3; padding-top: 5px;") + grid.addWidget(email_title, row, 0, 1, 2) + row += 1 + + grid.addWidget(self._label("Adresse email :"), row, 0) + self.email_input = self._input(self.config["email_address"]) + grid.addWidget(self.email_input, row, 1) + row += 1 + + # ── Impression ── + print_title = QLabel("Impression") + print_title.setFont(QFont("", 13, QFont.Weight.Bold)) + print_title.setStyleSheet("color: #2196F3; padding-top: 5px;") + grid.addWidget(print_title, row, 0, 1, 2) + row += 1 + + grid.addWidget(self._label("Imprimante :"), row, 0) + self.printer_input = self._input(self.config["printer_name"], "Nom CUPS (vide = par défaut)") + grid.addWidget(self.printer_input, row, 1) + row += 1 + + grid.addWidget(self._label("Format par défaut :"), row, 0) self.format_combo = QComboBox() - self.format_combo.setFont(QFont("", 14)) - self.format_combo.setMinimumHeight(40) + self.format_combo.setFont(QFont("", 12)) + self.format_combo.setMinimumHeight(35) self.format_combo.addItems(["10x15 cm", "13x18 cm", "15x20 cm"]) self.format_combo.setCurrentText(self.config["print_format"]) - printer_form.addRow("Format par défaut :", self.format_combo) - layout.addWidget(printer_group) + grid.addWidget(self.format_combo, row, 1) + row += 1 - # Boutons + scroll.setWidget(content) + layout.addWidget(scroll, 1) + + # Boutons en bas buttons = QHBoxLayout() + buttons.setSpacing(15) + cancel_btn = QPushButton("Annuler") - cancel_btn.setFont(QFont("", 14)) - cancel_btn.setMinimumHeight(50) + cancel_btn.setFont(QFont("", 13)) + cancel_btn.setMinimumHeight(45) cancel_btn.setStyleSheet(""" - QPushButton { background-color: #757575; color: white; border-radius: 10px; padding: 10px 30px; } + QPushButton { background-color: #757575; color: white; border-radius: 8px; padding: 8px 25px; } QPushButton:pressed { background-color: #616161; } """) cancel_btn.clicked.connect(self.reject) buttons.addWidget(cancel_btn) save_btn = QPushButton("Enregistrer") - save_btn.setFont(QFont("", 14, QFont.Weight.Bold)) - save_btn.setMinimumHeight(50) + save_btn.setFont(QFont("", 13, QFont.Weight.Bold)) + save_btn.setMinimumHeight(45) save_btn.setStyleSheet(""" - QPushButton { background-color: #4CAF50; color: white; border-radius: 10px; padding: 10px 30px; } + QPushButton { background-color: #4CAF50; color: white; border-radius: 8px; padding: 8px 25px; } QPushButton:pressed { background-color: #388E3C; } """) save_btn.clicked.connect(self._save) @@ -132,6 +176,31 @@ class ConfigDialog(QDialog): layout.addLayout(buttons) + def _label(self, text): + lbl = QLabel(text) + lbl.setFont(QFont("", 12)) + lbl.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter) + return lbl + + def _input(self, value, placeholder=""): + inp = QLineEdit(value) + inp.setFont(QFont("", 12)) + inp.setMinimumHeight(35) + inp.setStyleSheet(""" + QLineEdit { + border: 2px solid #ccc; + border-radius: 6px; + padding: 5px 10px; + background: white; + } + QLineEdit:focus { + border-color: #2196F3; + } + """) + if placeholder: + inp.setPlaceholderText(placeholder) + return inp + def _save(self): self.config["wifi_ap_name"] = self.wifi_name_input.text() self.config["wifi_ap_password"] = self.wifi_pass_input.text()