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:
148
src/ui/widgets/config_dialog.py
Normal file
148
src/ui/widgets/config_dialog.py
Normal 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
|
||||
Reference in New Issue
Block a user