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())