Files
copydev-imposing-tool/app/dialogs/format_combo.py
Jules c9212a30ea V2.1.0 — Formats personnalises + reperes de coupe
- 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>
2026-03-21 08:00:55 +01:00

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