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>
This commit is contained in:
2026-03-21 19:28:20 +01:00
parent 6598e4073f
commit d6d431689c
11 changed files with 811 additions and 54 deletions

View File

@@ -6,12 +6,15 @@ from PyQt6.QtWidgets import (
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QFont
from services.usb_watcher import UsbWatcher
class HomeScreen(QWidget):
def __init__(self, main_window):
super().__init__()
self.main_window = main_window
self._setup_ui()
self._setup_usb_watcher()
def _setup_ui(self):
layout = QVBoxLayout(self)
@@ -29,6 +32,13 @@ class HomeScreen(QWidget):
subtitle.setAlignment(Qt.AlignmentFlag.AlignCenter)
layout.addWidget(subtitle)
# Status USB
self.usb_status = QLabel("")
self.usb_status.setFont(QFont("", 14))
self.usb_status.setAlignment(Qt.AlignmentFlag.AlignCenter)
self.usb_status.setStyleSheet("color: #4CAF50;")
layout.addWidget(self.usb_status)
# Boutons d'import
buttons_layout = QHBoxLayout()
buttons_layout.setSpacing(20)
@@ -40,10 +50,12 @@ class HomeScreen(QWidget):
("Email", "Recevoir par mail", self._import_email),
]
self.buttons = {}
for label, desc, callback in modes:
btn = self._create_mode_button(label, desc)
btn.clicked.connect(callback)
buttons_layout.addWidget(btn)
self.buttons[label] = btn
layout.addLayout(buttons_layout)
@@ -61,11 +73,54 @@ class HomeScreen(QWidget):
QPushButton:pressed {
background-color: #1976D2;
}
QPushButton:disabled {
background-color: #9E9E9E;
}
""")
return btn
def _setup_usb_watcher(self):
self.usb_watcher = UsbWatcher(self)
self.usb_watcher.usb_inserted.connect(self._on_usb_inserted)
self.usb_watcher.usb_removed.connect(self._on_usb_removed)
self.usb_watcher.start()
self._usb_photos = []
self._usb_mount = None
def _on_usb_inserted(self, mount_path, photos):
self._usb_mount = mount_path
self._usb_photos = photos
count = len(photos)
self.usb_status.setText(f"Clé USB détectée — {count} photo{'s' if count != 1 else ''}")
self.buttons["USB"].setStyleSheet("""
QPushButton {
background-color: #4CAF50;
color: white;
border-radius: 15px;
padding: 20px;
}
QPushButton:pressed { background-color: #388E3C; }
""")
def _on_usb_removed(self, mount_path):
if mount_path == self._usb_mount:
self._usb_mount = None
self._usb_photos = []
self.usb_status.setText("")
self.buttons["USB"].setStyleSheet("""
QPushButton {
background-color: #2196F3;
color: white;
border-radius: 15px;
padding: 20px;
}
QPushButton:pressed { background-color: #1976D2; }
""")
def _import_usb(self):
self.main_window.show_import()
if self._usb_photos:
self.main_window.import_screen.set_photos(self._usb_photos)
self.main_window.show_import()
def _import_wifi(self):
self.main_window.show_import()