Bouton Retour visible + menu config admin

- Bouton "< Retour" gros en haut à gauche sur chaque page d'instructions
- Appui long (5 sec) sur le titre "Photostation" = ouvre config admin
- Config : nom WiFi, mot de passe, URL QR, adresse email, imprimante CUPS
- Config sauvegardée dans config/settings.json
- Labels WiFi/QR/Email mis à jour dynamiquement depuis la config

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-21 19:46:39 +01:00
parent f5161d7a31
commit 4f6d55bc43
2 changed files with 282 additions and 105 deletions

View File

@@ -0,0 +1,148 @@
"""Dialogue de configuration admin — accessible par appui long sur le titre."""
import json
import os
from PyQt6.QtWidgets import (
QDialog, QVBoxLayout, QHBoxLayout, QFormLayout,
QLineEdit, QPushButton, QLabel, QComboBox, QGroupBox
)
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QFont
CONFIG_PATH = os.path.join(
os.path.dirname(__file__), "..", "..", "..", "config", "settings.json"
)
DEFAULT_CONFIG = {
"wifi_ap_name": "Photostation",
"wifi_ap_password": "photo1234",
"email_address": "photo@photostation.local",
"upload_url": "http://192.168.4.1/upload",
"printer_name": "",
"print_format": "10x15 cm",
"kiosk_mode": False,
}
def load_config():
try:
with open(CONFIG_PATH, "r") as f:
saved = json.load(f)
config = dict(DEFAULT_CONFIG)
config.update(saved)
return config
except (FileNotFoundError, json.JSONDecodeError):
return dict(DEFAULT_CONFIG)
def save_config(config):
os.makedirs(os.path.dirname(CONFIG_PATH), exist_ok=True)
with open(CONFIG_PATH, "w") as f:
json.dump(config, f, indent=2, ensure_ascii=False)
class ConfigDialog(QDialog):
"""Panneau de configuration admin."""
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle("Configuration — Admin")
self.setMinimumSize(500, 450)
self.config = load_config()
self._setup_ui()
def _setup_ui(self):
layout = QVBoxLayout(self)
layout.setSpacing(15)
# Titre
title = QLabel("Configuration Photostation")
title.setFont(QFont("", 20, 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)
# 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)
# 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)
# 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)
self.format_combo = QComboBox()
self.format_combo.setFont(QFont("", 14))
self.format_combo.setMinimumHeight(40)
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)
# Boutons
buttons = QHBoxLayout()
cancel_btn = QPushButton("Annuler")
cancel_btn.setFont(QFont("", 14))
cancel_btn.setMinimumHeight(50)
cancel_btn.setStyleSheet("""
QPushButton { background-color: #757575; color: white; border-radius: 10px; padding: 10px 30px; }
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.setStyleSheet("""
QPushButton { background-color: #4CAF50; color: white; border-radius: 10px; padding: 10px 30px; }
QPushButton:pressed { background-color: #388E3C; }
""")
save_btn.clicked.connect(self._save)
buttons.addWidget(save_btn)
layout.addLayout(buttons)
def _save(self):
self.config["wifi_ap_name"] = self.wifi_name_input.text()
self.config["wifi_ap_password"] = self.wifi_pass_input.text()
self.config["upload_url"] = self.upload_url_input.text()
self.config["email_address"] = self.email_input.text()
self.config["printer_name"] = self.printer_input.text()
self.config["print_format"] = self.format_combo.currentText()
save_config(self.config)
self.accept()
@staticmethod
def open_config(parent=None):
dialog = ConfigDialog(parent)
return dialog.exec() == QDialog.DialogCode.Accepted