diff --git a/app/main_window.py b/app/main_window.py index b6fc976..e18c294 100644 --- a/app/main_window.py +++ b/app/main_window.py @@ -34,7 +34,8 @@ from app.engine.bleeds import define_bleeds class MainWindow(QMainWindow): def __init__(self): super().__init__() - self.setWindowTitle("Copydev Imposing Tool") + from app.updater import VERSION + self.setWindowTitle(f"CopyDev Imposing Tool v{VERSION} — www.copydev.fr") self.setMinimumSize(1000, 700) # Icone de la fenetre @@ -170,6 +171,9 @@ class MainWindow(QMainWindow): self._statusbar.addWidget(self._status_label, 1) self._file_label = QLabel("") self._statusbar.addPermanentWidget(self._file_label) + brand = QLabel(" CopyDev — contact@copydev.fr ") + brand.setStyleSheet("color: #64748b; font-size: 10px;") + self._statusbar.addPermanentWidget(brand) def _on_page_changed(self, page, total): pass @@ -339,14 +343,16 @@ class MainWindow(QMainWindow): QMessageBox.critical(self, "Erreur", str(e)) def _show_about(self): - from PyQt6.QtWidgets import QDialog, QVBoxLayout, QHBoxLayout, QLabel, QDialogButtonBox - from PyQt6.QtGui import QPixmap + from PyQt6.QtWidgets import QDialog, QVBoxLayout, QLabel, QDialogButtonBox + from PyQt6.QtGui import QPixmap, QFont from PyQt6.QtCore import Qt dlg = QDialog(self) - dlg.setWindowTitle("A propos") - dlg.setFixedSize(480, 380) + dlg.setWindowTitle("A propos — CopyDev Imposing Tool") + dlg.setFixedSize(520, 520) + dlg.setStyleSheet("QDialog { background-color: #0f172a; }") layout = QVBoxLayout(dlg) + layout.setContentsMargins(40, 30, 40, 25) # Logo logo_label = QLabel() @@ -354,60 +360,82 @@ class MainWindow(QMainWindow): _base = _sys._MEIPASS if getattr(_sys, 'frozen', False) else os.path.dirname(os.path.dirname(os.path.abspath(__file__))) logo_path = os.path.join(_base, "resources", "logo.png") if os.path.exists(logo_path): - pixmap = QPixmap(logo_path).scaled(120, 120, Qt.AspectRatioMode.KeepAspectRatio, + pixmap = QPixmap(logo_path).scaled(150, 150, Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation) logo_label.setPixmap(pixmap) logo_label.setAlignment(Qt.AlignmentFlag.AlignCenter) layout.addWidget(logo_label) + layout.addSpacing(10) + # Titre - title = QLabel("

Copydev Imposing Tool

") + title = QLabel("COPYDEV IMPOSING TOOL") title.setAlignment(Qt.AlignmentFlag.AlignCenter) + title.setFont(QFont("Segoe UI", 20, QFont.Weight.Bold)) + title.setStyleSheet("color: white;") layout.addWidget(title) # Version - version = QLabel("Version 1.0.0") + from app.updater import VERSION + version = QLabel(f"Version {VERSION}") version.setAlignment(Qt.AlignmentFlag.AlignCenter) - version.setStyleSheet("color: #666;") + version.setFont(QFont("Segoe UI", 10)) + version.setStyleSheet("color: #64748b;") layout.addWidget(version) - layout.addSpacing(10) + layout.addSpacing(15) # Description desc = QLabel( - "Outil professionnel d'imposition PDF.\n" - "Creation de livrets, n-up, repetition, imposition manuelle,\n" + "Outil professionnel d'imposition PDF\n" + "Livrets, n-up, repetition, imposition manuelle,\n" "numerotation, masquage et fonds perdus." ) desc.setAlignment(Qt.AlignmentFlag.AlignCenter) + desc.setFont(QFont("Segoe UI", 10)) + desc.setStyleSheet("color: #94a3b8;") desc.setWordWrap(True) layout.addWidget(desc) + layout.addSpacing(20) + + # Separateur + sep = QLabel() + sep.setFixedHeight(1) + sep.setStyleSheet("background-color: #1e293b;") + layout.addWidget(sep) + layout.addSpacing(15) # Coordonnees contact = QLabel( - '

' - 'CopyDev
' - 'Jules Dubois
' - 'contact@copydev.fr
' - 'www.copydev.fr' + '

' + 'CopyDev
' + 'Jules Dubois — Developpeur logiciel

' + 'Email : ' + 'contact@copydev.fr
' + 'Web : ' + 'www.copydev.fr
' + 'Tel : ' + '06 52 07 92 35' '

' ) contact.setAlignment(Qt.AlignmentFlag.AlignCenter) contact.setOpenExternalLinks(True) layout.addWidget(contact) - layout.addSpacing(5) + layout.addStretch() # Copyright - copy_label = QLabel("© 2026 CopyDev — Tous droits reserves") + copy_label = QLabel("2026 CopyDev — Tous droits reserves\nLogiciel sous licence — Reproduction interdite") copy_label.setAlignment(Qt.AlignmentFlag.AlignCenter) - copy_label.setStyleSheet("color: #999; font-size: 11px;") + copy_label.setFont(QFont("Segoe UI", 8)) + copy_label.setStyleSheet("color: #334155;") layout.addWidget(copy_label) # Bouton Fermer buttons = QDialogButtonBox(QDialogButtonBox.StandardButton.Close) + buttons.setStyleSheet("QPushButton { background: #1e293b; color: white; border: 1px solid #334155; padding: 6px 20px; border-radius: 4px; } QPushButton:hover { background: #334155; }") buttons.rejected.connect(dlg.close) layout.addWidget(buttons) diff --git a/app/splash.py b/app/splash.py new file mode 100644 index 0000000..5368463 --- /dev/null +++ b/app/splash.py @@ -0,0 +1,88 @@ +"""Splash screen CopyDev au demarrage.""" + +import os +import sys +from PyQt6.QtWidgets import QWidget, QVBoxLayout, QLabel, QApplication +from PyQt6.QtGui import QPixmap, QFont, QColor, QPainter +from PyQt6.QtCore import Qt, QTimer + + +class SplashScreen(QWidget): + def __init__(self, parent=None): + super().__init__(parent) + self.setWindowFlags(Qt.WindowType.FramelessWindowHint | Qt.WindowType.WindowStaysOnTopHint) + self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground, False) + self.setFixedSize(500, 400) + self.setStyleSheet("background-color: #0f172a;") + + layout = QVBoxLayout(self) + layout.setContentsMargins(40, 30, 40, 30) + + # Logo + logo_label = QLabel() + base = sys._MEIPASS if getattr(sys, 'frozen', False) else os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + logo_path = os.path.join(base, "resources", "logo.png") + if os.path.exists(logo_path): + pixmap = QPixmap(logo_path).scaled(140, 140, + Qt.AspectRatioMode.KeepAspectRatio, + Qt.TransformationMode.SmoothTransformation) + logo_label.setPixmap(pixmap) + logo_label.setAlignment(Qt.AlignmentFlag.AlignCenter) + layout.addWidget(logo_label) + + layout.addSpacing(10) + + # Nom app + title = QLabel("COPYDEV IMPOSING TOOL") + title.setAlignment(Qt.AlignmentFlag.AlignCenter) + title.setFont(QFont("Segoe UI", 18, QFont.Weight.Bold)) + title.setStyleSheet("color: white;") + layout.addWidget(title) + + # Sous-titre + subtitle = QLabel("Outil professionnel d'imposition PDF") + subtitle.setAlignment(Qt.AlignmentFlag.AlignCenter) + subtitle.setFont(QFont("Segoe UI", 11)) + subtitle.setStyleSheet("color: #94a3b8;") + layout.addWidget(subtitle) + + layout.addSpacing(20) + + # Status + self._status = QLabel("Demarrage...") + self._status.setAlignment(Qt.AlignmentFlag.AlignCenter) + self._status.setFont(QFont("Segoe UI", 9)) + self._status.setStyleSheet("color: #64748b;") + layout.addWidget(self._status) + + layout.addStretch() + + # Coordonnees + contact = QLabel( + "CopyDev - Jules Dubois\n" + "contact@copydev.fr | www.copydev.fr" + ) + contact.setAlignment(Qt.AlignmentFlag.AlignCenter) + contact.setFont(QFont("Segoe UI", 8)) + contact.setStyleSheet("color: #475569;") + layout.addWidget(contact) + + # Copyright + copy_label = QLabel("2026 CopyDev - Tous droits reserves") + copy_label.setAlignment(Qt.AlignmentFlag.AlignCenter) + copy_label.setFont(QFont("Segoe UI", 7)) + copy_label.setStyleSheet("color: #334155;") + layout.addWidget(copy_label) + + # Centrer sur l'ecran + screen = QApplication.primaryScreen() + if screen: + geo = screen.geometry() + self.move( + (geo.width() - self.width()) // 2, + (geo.height() - self.height()) // 2 + ) + + def set_status(self, text): + self._status.setText(text) + QApplication.processEvents() diff --git a/main.py b/main.py index e6e4bdf..9f569f9 100644 --- a/main.py +++ b/main.py @@ -188,9 +188,17 @@ def main(): if os.path.exists(icon_path): app.setWindowIcon(QIcon(icon_path)) + # Splash screen + from app.splash import SplashScreen + splash = SplashScreen() + splash.show() + QApplication.processEvents() + + splash.set_status("Verification de la licence...") if not _check_license(): sys.exit(1) + splash.set_status("Recherche de mises a jour...") # Verification de mise a jour silencieuse from app.updater import check_for_update, VERSION update_available, remote_version = check_for_update() @@ -211,9 +219,11 @@ def main(): else: QMessageBox.warning(None, "Mise a jour", f"Echec de la mise a jour :\n{msg}") + splash.set_status("Chargement de l'interface...") from app.main_window import MainWindow window = MainWindow() window.show() + splash.close() sys.exit(app.exec())