Files
copydev-imposing-tool/app/dialogs/merge_dialog.py
Jules e05f2e1fba V3.4.0 — Panneau fusion, macros CLI, bouton config client Vision
- 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>
2026-03-21 16:54:34 +01:00

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