- Formats personnalises dans tous les menus deroulants de format : - "Personnalise..." : saisie libre largeur x hauteur en mm - "Ajouter un format..." : sauvegarder un format custom (persistant) - Formats custom affiches dans le dropdown avec separateur - Reperes de coupe (Annotations > Reperes de coupe) : - Longueur, distance du bord, epaisseur configurables - Couleur : noir, gris, CMYK - Reperes de centrage optionnels - Appliquer a : toutes, paires, impaires, page courante - Enlever les reperes de coupe (menu) - Step & Repeat : ajout des marges (haut, bas, gauche, droite) - Tous les dialogues de format migres vers format_combo Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
94 lines
2.8 KiB
Python
94 lines
2.8 KiB
Python
"""ComboBox de formats de page avec support personnalise."""
|
|
|
|
from PyQt6.QtWidgets import QComboBox
|
|
from app.engine.pdf_utils import PAGE_SIZES, mm_to_pt
|
|
from app.dialogs.custom_size_dialog import (CustomSizeDialog, load_custom_sizes,
|
|
save_custom_sizes)
|
|
|
|
|
|
SEP = "---"
|
|
CUSTOM_LABEL = "Personnalise..."
|
|
ADD_LABEL = "Ajouter un format..."
|
|
|
|
|
|
def populate_format_combo(combo, default="A4 Paysage"):
|
|
"""Remplir un combo avec les formats standard + custom + options."""
|
|
combo.blockSignals(True)
|
|
combo.clear()
|
|
|
|
# Formats standard
|
|
for name in PAGE_SIZES:
|
|
combo.addItem(name, PAGE_SIZES[name])
|
|
|
|
# Formats custom sauvegardes
|
|
custom = load_custom_sizes()
|
|
if custom:
|
|
combo.insertSeparator(combo.count())
|
|
for name, size in custom.items():
|
|
combo.addItem(name, (size[0], size[1]))
|
|
|
|
# Options speciales
|
|
combo.insertSeparator(combo.count())
|
|
combo.addItem(CUSTOM_LABEL, None)
|
|
combo.addItem(ADD_LABEL, None)
|
|
|
|
# Selectionner le defaut
|
|
idx = combo.findText(default)
|
|
if idx >= 0:
|
|
combo.setCurrentIndex(idx)
|
|
|
|
combo.blockSignals(False)
|
|
|
|
|
|
def handle_format_selection(combo, parent=None):
|
|
"""Gerer la selection dans le combo. Retourne (w, h) en points ou None si annule."""
|
|
text = combo.currentText()
|
|
|
|
if text == CUSTOM_LABEL:
|
|
dlg = CustomSizeDialog(save_mode=False, parent=parent)
|
|
if dlg.exec():
|
|
size = dlg.get_size()
|
|
name = dlg.get_name()
|
|
# Ajouter temporairement dans le combo
|
|
combo.blockSignals(True)
|
|
combo.insertItem(combo.count() - 3, name, size)
|
|
combo.setCurrentText(name)
|
|
combo.blockSignals(False)
|
|
return size
|
|
# Annule — revenir au precedent
|
|
combo.blockSignals(True)
|
|
combo.setCurrentIndex(0)
|
|
combo.blockSignals(False)
|
|
return None
|
|
|
|
elif text == ADD_LABEL:
|
|
dlg = CustomSizeDialog(save_mode=True, parent=parent)
|
|
if dlg.exec():
|
|
name = dlg.get_name()
|
|
if not name:
|
|
name = dlg.get_name()
|
|
size = dlg.get_size()
|
|
# Sauvegarder
|
|
custom = load_custom_sizes()
|
|
w_mm, h_mm = dlg.get_size_mm()
|
|
custom[name] = [mm_to_pt(w_mm), mm_to_pt(h_mm)]
|
|
save_custom_sizes(custom)
|
|
# Recharger le combo
|
|
populate_format_combo(combo, name)
|
|
return size
|
|
combo.blockSignals(True)
|
|
combo.setCurrentIndex(0)
|
|
combo.blockSignals(False)
|
|
return None
|
|
|
|
else:
|
|
return combo.currentData()
|
|
|
|
|
|
def get_selected_size(combo):
|
|
"""Obtenir la taille selectionnee. Retourne (w, h) en points."""
|
|
data = combo.currentData()
|
|
if data:
|
|
return data
|
|
return PAGE_SIZES.get(combo.currentText(), (595.28, 841.89))
|