Commit Graph

37 Commits

Author SHA1 Message Date
63bcfeedf7 Thème couleur + logo + nom de la borne configurables
Config admin (section Apparence) :
- Nom de la borne (remplace "Photostation")
- Couleur du thème (hex) avec prévisualisation live
- Logo enseigne (chemin image)

Style :
- Couleur primaire lue depuis la config (plus de #2196F3 en dur)
- Fonction _darken() pour les variantes pressed/border

Home screen :
- Logo affiché à côté du titre
- Titre = nom de la borne
- Rafraîchissement après sauvegarde config

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 23:59:04 +01:00
c2c27b1892 Tarification + écran récap avec prix
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>
2026-03-21 23:54:10 +01:00
2f96447919 Fix crash galerie : réduire les pixmaps avant stockage
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>
2026-03-21 23:49:50 +01:00
2ea9c12350 Galerie : photo centrée sur le fond blanc (QPushButton + icon)
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>
2026-03-21 23:47:21 +01:00
7b1f0686ea Galerie : clic photo = éditeur, +/- centré, pastille orange simple
- 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>
2026-03-21 23:44:40 +01:00
190c914d45 Crop : ratio verrouillé, bord à bord, pas de marge
- 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>
2026-03-21 23:42:39 +01:00
980a80d43a Warning ratio sur galerie + cadre recadrage auto dans l'éditeur
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>
2026-03-21 23:36:12 +01:00
e43fc798df Fix galerie : cartes à taille fixe, plus de cadre blanc extensible
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>
2026-03-21 23:34:01 +01:00
371ae4a1f8 Formats impression configurables + recadrage au ratio
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>
2026-03-21 23:22:16 +01:00
9a643eadfc Fix galerie : miniatures remplissent les cartes, taille max limitée
- 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>
2026-03-21 23:12:17 +01:00
380adef814 Fix chemins photos : abspath pour éviter les ../.. dans les paths
QPixmap ne charge pas les fichiers avec des chemins relatifs contenant ..

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 23:09:39 +01:00
daeb760fe7 QR : si photos déjà reçues, direct à la galerie
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>
2026-03-21 23:02:50 +01:00
15958c1375 Page QR : status + Continuer au-dessus du QR code
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>
2026-03-21 23:01:00 +01:00
defb5d101e Fix cross-thread : queue + QTimer polling au lieu de signal
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>
2026-03-21 22:56:50 +01:00
29cb993b7b Fix cross-thread : QTimer.singleShot au lieu de pyqtSignal
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>
2026-03-21 22:55:31 +01:00
2c928ae84d Fix signal cross-thread : QueuedConnection pour upload/IMAP
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>
2026-03-21 22:54:06 +01:00
c4db1ac101 Debug: log notify_qr_photos
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 22:51:27 +01:00
a2a4176fb2 URL par défaut : https://photo.copydev.fr/upload
NPM proxy host créé (id=58) : photo.copydev.fr → 192.168.111.164:8080
Wildcard cert *.copydev.fr, SSL forcé.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 22:40:01 +01:00
d8d7cbde7c Config admin complète + IMAP polling
Config admin :
- Serveur upload : IP d'écoute, port, URL publique (QR code)
- Email IMAP : activer/désactiver, serveur, port, user, password,
  dossier, intervalle de polling
- Checkbox pour activer IMAP

Service IMAP :
- Thread daemon, polling configurable (défaut 30s)
- Connexion IMAP SSL, récupère mails UNSEEN
- Extrait les PJ photos (jpg/png/etc.)
- Sauvegarde dans data/photos/, notifie l'app via signal Qt
- Bouton Email passe au vert + Continuer quand photos reçues

main.py :
- Lit la config pour IP/port du serveur upload
- Démarre IMAP polling si activé dans la config

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 22:34:37 +01:00
532f8d91c0 Serveur upload Flask + page web mobile + intégration PyQt
- Serveur Flask en thread daemon (port 80 ou 8080 avec --no-root)
- Page upload responsive : drag&drop, multi-fichiers, prévisualisations
- Barre de progression, feedback succès/erreur
- Photos stockées dans data/photos/
- Signal photos_received → notify_qr_photos() sur l'écran d'accueil
- Ajout flask aux requirements

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 22:30:02 +01:00
ba2719c0fb Fix boucle de zoom infini — guard contre récursion resizeEvent
_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>
2026-03-21 22:26:40 +01:00
084b4e2b54 QR bouton : plus gros, plus net, haute résolution
- 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>
2026-03-21 22:25:08 +01:00
8f48fd2e38 Boutons QR/Email dynamiques + mini QR sur bouton
- 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>
2026-03-21 22:22:31 +01:00
cd8f2dfed3 Multi-pose : même photo dupliquée + crop to fill
- 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>
2026-03-21 22:19:07 +01:00
528e6bdfad Galerie : crayon édition + compteur quantité +/- + bouton Valider
- PhotoCard : miniature + crayon bleu (ouvre éditeur) + boutons -/+
- Quantité par photo, bordure verte quand qty > 0
- Résumé en haut : "X photos sélectionnées — Y impressions"
- Bouton Valider en haut à droite
- Responsive (tailles adaptatives)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 22:16:31 +01:00
622b55bcd1 Fix import_screen: setIcon attend QIcon pas QPixmap
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 22:09:59 +01:00
a297672248 Fix kiosk mode — force plein écran sans WM
FramelessWindowHint + setGeometry(screen) pour fonctionner
sans window manager (Xvfb, RPi kiosk).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 21:49:38 +01:00
44d38cd97d Config dialog plein écran — masque l'interface derrière
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 21:43:59 +01:00
80531cfb04 Fix config admin — layout grid + scroll, plus de chevauchement
- 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>
2026-03-21 21:42:36 +01:00
ec86e627ea Fix responsive : boutons mode s'étirent, meilleure occupation de l'espace
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 19:53:46 +01:00
d855b1fe59 Interface responsive — tailles proportionnelles à la fenêtre
- 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>
2026-03-21 19:52:01 +01:00
4f6d55bc43 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>
2026-03-21 19:46:39 +01:00
f5161d7a31 Refonte écran accueil — instructions et feedback par mode
- 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>
2026-03-21 19:38:51 +01:00
ca1e50e609 Mise à jour memoire.md avec toutes les infos projet
LXC 164, token Gitea, fonctionnalités implémentées, TODO, notes dev.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 19:34:03 +01:00
d6d431689c Import USB + éditeur complet + widgets
- Service USB watcher (polling montages, scan photos récursif)
- Écran accueil avec détection USB live (bouton vert + compteur)
- Éditeur : crop interactif avec overlay/grille des tiers
- Éditeur : filtres Pillow (N&B, sépia, vintage, contraste)
- Éditeur : stickers/goodies draggable + cadres overlay
- Éditeur : multi-pose (5 templates, remplissage auto)
- Éditeur : texte éditable draggable
- Éditeur : rotation, annulation, export scène PNG
- Widget CropOverlay avec poignées tactiles
- Widget GoodiesPanel (stickers + cadres depuis assets/)
- Widget MultiposeDialog (prévisualisation templates)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 19:28:20 +01:00
6598e4073f Init projet Photostation - borne impression photo tactile PyQt6
Structure : 4 écrans (accueil, import, éditeur, impression),
navigation QStackedWidget, base éditeur QGraphicsScene.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 18:47:56 +01:00
a5b02cb56a Initial commit 2026-03-21 18:46:07 +01:00