1 """

2 Print Settings Dialog for pyPhotoAlbum

3

4 Project-level bleed and safe-area configuration applied uniformly to all pages.

5 """

6

7 from typing import Any, Dict

8 from PyQt6.QtWidgets import (

9 QDialog,

10 QVBoxLayout,

11 QHBoxLayout,

12 QLabel,

13 QDoubleSpinBox,

14 QPushButton,

15 QGroupBox,

16 )

17 from pyPhotoAlbum.project import Project

18

19

20 class PrintSettingsDialog(QDialog):

21 """Dialog for configuring project-wide print settings (bleed and safe area)."""

22

23 def __init__(self, parent, project: Project):

24 super().__init__(parent)

25 self.project = project

26 self._setup_ui()

27

28 def _setup_ui(self):

29 self.setWindowTitle("Print Settings")

30 self.setMinimumWidth(340)

31

32 layout = QVBoxLayout()

33

34 group = QGroupBox("Bleed && Safe Area (applied to all pages)")

35 group_layout = QVBoxLayout()

36

37 # Bleed

38 bleed_layout = QHBoxLayout()

39 bleed_layout.addWidget(QLabel("Bleed Margin:"))

40 self.bleed_spinbox = QDoubleSpinBox()

41 self.bleed_spinbox.setRange(0.0, 20.0)

42 self.bleed_spinbox.setSingleStep(0.5)

43 self.bleed_spinbox.setDecimals(1)

44 self.bleed_spinbox.setSuffix(" mm")

45 self.bleed_spinbox.setValue(self.project.page_bleed_mm)

46 self.bleed_spinbox.setToolTip(

47 "Extra white space added around each page in the exported PDF.\n"

48 "The printer cuts here — 3 mm is standard."

49 )

50 bleed_layout.addWidget(self.bleed_spinbox)

51 group_layout.addLayout(bleed_layout)

52

53 # Safe area

54 safe_layout = QHBoxLayout()

55 safe_layout.addWidget(QLabel("Safe Area:"))

56 self.safe_spinbox = QDoubleSpinBox()

57 self.safe_spinbox.setRange(0.0, 50.0)

58 self.safe_spinbox.setSingleStep(0.5)

59 self.safe_spinbox.setDecimals(1)

60 self.safe_spinbox.setSuffix(" mm")

61 self.safe_spinbox.setValue(self.project.page_safe_area_mm)

62 self.safe_spinbox.setToolTip(

63 "Keep text and important content inside this distance from the cut/trim line.\n"

64 "Shown as a red guide in the editor."

65 )

66 safe_layout.addWidget(self.safe_spinbox)

67 group_layout.addLayout(safe_layout)

68

69 group.setLayout(group_layout)

70 layout.addWidget(group)

71

72 # Buttons

73 btn_layout = QHBoxLayout()

74 cancel_btn = QPushButton("Cancel")

75 cancel_btn.clicked.connect(self.reject)

76 ok_btn = QPushButton("OK")

77 ok_btn.clicked.connect(self.accept)

78 ok_btn.setDefault(True)

79 btn_layout.addStretch()

80 btn_layout.addWidget(cancel_btn)

81 btn_layout.addWidget(ok_btn)

82 layout.addLayout(btn_layout)

83

84 self.setLayout(layout)

85

86 def get_values(self) -> Dict[str, Any]:

87 return {

88 "page_bleed_mm": self.bleed_spinbox.value(),

89 "page_safe_area_mm": self.safe_spinbox.value(),

90 }