- Panneau de fusion PDF avec dialog dedié : - Liste des fichiers avec drag & drop pour reordonner - Boutons Ajouter/Retirer/Monter/Descendre - Pre-rempli avec le fichier courant - Support --macro en ligne de commande - register_windows.bat : ajout dynamique des macros au menu contextuel - Vision : bouton "Configurer le client" dans le modal licence (ouvre le gros modal client avec SFTP, fonctions, tunnel, etc.) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
106 lines
3.8 KiB
Python
106 lines
3.8 KiB
Python
"""Dialogue Fusion de PDF avec reordonnement drag & drop."""
|
|
|
|
from PyQt6.QtWidgets import (QDialog, QVBoxLayout, QHBoxLayout, QLabel,
|
|
QListWidget, QListWidgetItem, QAbstractItemView,
|
|
QPushButton, QDialogButtonBox, QFileDialog)
|
|
from PyQt6.QtCore import Qt, QSize
|
|
|
|
|
|
class MergeDialog(QDialog):
|
|
def __init__(self, initial_files=None, parent=None):
|
|
super().__init__(parent)
|
|
self.setWindowTitle("Fusionner des PDF")
|
|
self.setMinimumSize(500, 400)
|
|
self._files = list(initial_files or [])
|
|
self._setup_ui()
|
|
self._refresh_list()
|
|
|
|
def _setup_ui(self):
|
|
layout = QVBoxLayout(self)
|
|
|
|
layout.addWidget(QLabel("Glissez les fichiers pour reordonner. Cliquez Ajouter pour en ajouter."))
|
|
|
|
self._list = QListWidget()
|
|
self._list.setDragDropMode(QAbstractItemView.DragDropMode.InternalMove)
|
|
self._list.setDefaultDropAction(Qt.DropAction.MoveAction)
|
|
self._list.setStyleSheet("""
|
|
QListWidget { background: #fff; border: 1px solid #d0d0d0; border-radius: 6px; padding: 4px; }
|
|
QListWidget::item { padding: 8px; border-bottom: 1px solid #eee; }
|
|
QListWidget::item:selected { background: #e0f4ff; color: #006fa6; }
|
|
""")
|
|
layout.addWidget(self._list)
|
|
|
|
btn_layout = QHBoxLayout()
|
|
btn_add = QPushButton("Ajouter des PDF...")
|
|
btn_add.clicked.connect(self._add_files)
|
|
btn_layout.addWidget(btn_add)
|
|
|
|
btn_remove = QPushButton("Retirer")
|
|
btn_remove.clicked.connect(self._remove_file)
|
|
btn_layout.addWidget(btn_remove)
|
|
|
|
btn_up = QPushButton("Monter")
|
|
btn_up.clicked.connect(self._move_up)
|
|
btn_layout.addWidget(btn_up)
|
|
|
|
btn_down = QPushButton("Descendre")
|
|
btn_down.clicked.connect(self._move_down)
|
|
btn_layout.addWidget(btn_down)
|
|
|
|
layout.addLayout(btn_layout)
|
|
|
|
self._count_label = QLabel("")
|
|
layout.addWidget(self._count_label)
|
|
|
|
buttons = QDialogButtonBox(
|
|
QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel
|
|
)
|
|
buttons.accepted.connect(self.accept)
|
|
buttons.rejected.connect(self.reject)
|
|
layout.addWidget(buttons)
|
|
|
|
def _refresh_list(self):
|
|
self._list.clear()
|
|
for i, path in enumerate(self._files):
|
|
import os
|
|
name = os.path.basename(path)
|
|
item = QListWidgetItem(f"{i+1}. {name}")
|
|
item.setData(Qt.ItemDataRole.UserRole, path)
|
|
item.setToolTip(path)
|
|
self._list.addItem(item)
|
|
self._count_label.setText(f"{len(self._files)} fichier(s)")
|
|
|
|
def _add_files(self):
|
|
paths, _ = QFileDialog.getOpenFileNames(self, "Ajouter des PDF", "", "PDF (*.pdf)")
|
|
if paths:
|
|
self._files.extend(paths)
|
|
self._refresh_list()
|
|
|
|
def _remove_file(self):
|
|
row = self._list.currentRow()
|
|
if row >= 0:
|
|
self._files.pop(row)
|
|
self._refresh_list()
|
|
|
|
def _move_up(self):
|
|
row = self._list.currentRow()
|
|
if row > 0:
|
|
self._files[row], self._files[row-1] = self._files[row-1], self._files[row]
|
|
self._refresh_list()
|
|
self._list.setCurrentRow(row - 1)
|
|
|
|
def _move_down(self):
|
|
row = self._list.currentRow()
|
|
if 0 <= row < len(self._files) - 1:
|
|
self._files[row], self._files[row+1] = self._files[row+1], self._files[row]
|
|
self._refresh_list()
|
|
self._list.setCurrentRow(row + 1)
|
|
|
|
def get_files(self):
|
|
# Relire l'ordre depuis la liste (drag & drop peut avoir change)
|
|
files = []
|
|
for i in range(self._list.count()):
|
|
item = self._list.item(i)
|
|
files.append(item.data(Qt.ItemDataRole.UserRole))
|
|
return files
|