Config admin :
- Tarification activable avec paliers (ex: 1-5 = 0.50€, 6-10 = 0.40€)
- Fonction calculate_price() utilitaire
Galerie :
- Affiche "X impressions — Y.YY €" quand tarification activée
Écran impression/récap :
- Galerie des photos sélectionnées avec miniatures + quantité (xN)
- Prix total en haut
- Choix du format d'impression
- Bouton IMPRIMER
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
50 photos 1920x1080 en mémoire = segfault sur 2GB RAM.
Réduit à 400px de large pour les miniatures.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remplacé QLabel par QPushButton avec setIcon — l'icône est
automatiquement centrée horizontalement et verticalement.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Plus de crayon : clic direct sur la miniature ouvre l'éditeur
- Boutons − quantité + centrés sous la photo
- Pastille orange (sans texte) en haut à droite si ratio ≠ 3:2
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Redimensionnement verrouille le ratio (coins uniquement)
- Cadre le plus grand possible (100% d'un bord, pas de marge)
- Déplacement contraint dans les limites de la photo
- Même comportement dans l'éditeur et l'écran impression
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Galerie :
- Petit badge orange ⚠ en haut à droite des photos pas au ratio 3:2
- Discret, tooltip "Photo à recadrer"
- Tolérance 5% autour du ratio 1.5
Éditeur :
- Si la photo n'est pas au ratio 3:2, le cadre de recadrage
s'affiche automatiquement en suggestion à l'ouverture
- L'utilisateur peut le déplacer/redimensionner ou le valider
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Miniature en taille fixe (responsive selon la fenêtre mais pas extensible).
Même rendu avec 3 ou 50 photos.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Config admin :
- Chaque format (10x15, 13x18, 15x20) activable avec checkbox
- Imprimante CUPS assignable par format
Écran impression :
- Boutons de format (seuls les activés apparaissent)
- Cadre de recadrage au ratio du format (3:2, 18:13, 4:3)
- Auto-détection portrait/paysage
- Cadre déplaçable avec poignées tactiles
- Galerie → Valider → écran impression avec print_list
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Miniature s'adapte à la taille de la carte via resizeEvent
- MaxWidth/MaxHeight sur les cartes pour éviter les cadres blancs énormes
- Fonctionne avec 3 ou 50 photos
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Plus besoin de revoir le QR code une fois les photos arrivées.
Clic sur le bouton vert → galerie directe.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Réorganisé le layout : status "X photos reçues" et bouton
"Voir les photos reçues" sont maintenant entre l'instruction
et le QR code, toujours visibles sans scroller.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Thread Flask met les photos dans une queue.Queue().
QTimer(500ms) dans le thread principal Qt poll la queue
et appelle le callback. Approche fiable et simple.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
pyqtSignal.emit() depuis un thread Python standard ne fonctionne pas.
Utilise QTimer.singleShot(0, callback) qui est thread-safe et
exécute le callback dans le thread principal Qt.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Les signaux émis depuis les threads Flask/IMAP ne déclenchaient pas
le slot dans le thread principal. Forcé QueuedConnection.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
_apply_responsive_styles modifiait les widgets, déclenchant resizeEvent
en boucle. Ajout d'un flag _styling pour bloquer la récursion.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- box_size=20 pour générer en haute résolution
- FastTransformation (pas de lissage = pixels nets)
- QR prend 55% de la hauteur du bouton
- Fond bleu (#2196F3), QR blanc pour contraste
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Bouton QR Code affiche un mini QR code en icône
- Boutons QR et Email passent au vert quand photos reçues
- Bouton Continuer apparaît sur pages QR/Email quand photos dispo
- API notify_qr_photos() / notify_email_photos() pour les services
- Méthodes _import_qr / _import_email pour naviguer vers la galerie
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- La photo en cours est dupliquée dans toutes les zones du template
- Crop to fill : l'image remplit chaque zone au maximum (pas de bords)
- Fonctionne avec l'image éditée (filtres, etc.) pas juste l'originale
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
FramelessWindowHint + setGeometry(screen) pour fonctionner
sans window manager (Xvfb, RPi kiosk).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Remplacé GroupBox/FormLayout par QGridLayout compact
- Ajout QScrollArea pour les petits écrans
- Dialog prend la taille du parent
- Titres de section colorés, inputs stylés
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Nouveau module ui/style.py : scale(), scaled_font(), styles dynamiques
- Toutes les tailles (polices, boutons, marges, padding, border-radius)
calculées en % de la hauteur de la fenêtre
- S'adapte automatiquement à 800x480, 1024x768, 1920x1080, etc.
- Recalcul au resize de la fenêtre
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- 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>
- USB : message "insérez votre clé", erreur si non détectée, bouton vert + continuer
- WiFi : affiche nom AP + mot de passe
- QR Code : génère et affiche le QR code (URL upload)
- Email : affiche l'adresse email provisoire
- Navigation : boutons mode → page instructions → retour
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>