Coverage for paintmaskanimator/new_document_dialog.py: 96%

59 statements  

« prev     ^ index     » next       coverage.py v7.17.0, created at 2026-11-02 04:50 +0000

1"""File › New… : canvas size plus an optional layout paper.""" 

2from PySide6.QtWidgets import ( 

3 QCheckBox, 

4 QComboBox, 

5 QDialog, 

6 QDialogButtonBox, 

7 QFormLayout, 

8 QSpinBox, 

9) 

10 

11from . import layout_paper 

12from .constants import MAX_IMAGE_DIMENSION 

13from .i18n import tr 

14 

15 

16class NewDocumentDialog(QDialog): 

17 def __init__(self, width, height, parent=None): 

18 super().__init__(parent) 

19 self.setWindowTitle(tr("新規作成")) 

20 form = QFormLayout(self) 

21 

22 self.paper = QComboBox() 

23 self.paper.addItem(tr("なし"), None) 

24 self._sizes = {} 

25 for entry in layout_paper.papers(): 

26 size = layout_paper.image_size(entry) 

27 if size is None: 27 ↛ 28line 27 didn't jump to line 28 because the condition on line 27 was never true

28 continue 

29 self._sizes[entry["id"]] = size 

30 self.paper.addItem(f"{entry['name']}({size[0]}×{size[1]})", entry["id"]) 

31 index = self.paper.findData(layout_paper.last_used()) 

32 self.paper.setCurrentIndex(max(0, index)) 

33 self.paper.setToolTip( 

34 tr("選んだ画像を、一番下の下書きレイヤーとして入れます。" 

35 "用紙は 環境設定 › 新規キャンバス で登録します。") 

36 ) 

37 self.fit_to_paper = QCheckBox(tr("キャンバスサイズを用紙に合わせる")) 

38 self.fit_to_paper.setChecked(True) 

39 

40 # 上限は画像読み込みと同じ MAX_IMAGE_DIMENSION。 

41 self.w = QSpinBox() 

42 self.w.setRange(64, MAX_IMAGE_DIMENSION) 

43 self.w.setValue(width) 

44 self.h = QSpinBox() 

45 self.h.setRange(64, MAX_IMAGE_DIMENSION) 

46 self.h.setValue(height) 

47 self._manual_size = (width, height) 

48 

49 form.addRow(tr("レイアウト用紙"), self.paper) 

50 form.addRow("", self.fit_to_paper) 

51 form.addRow(tr("幅"), self.w) 

52 form.addRow(tr("高さ"), self.h) 

53 buttons = QDialogButtonBox( 

54 QDialogButtonBox.StandardButton.Ok 

55 | QDialogButtonBox.StandardButton.Cancel 

56 ) 

57 buttons.accepted.connect(self.accept) 

58 buttons.rejected.connect(self.reject) 

59 form.addRow(buttons) 

60 

61 self.paper.currentIndexChanged.connect(self._sync) 

62 self.fit_to_paper.toggled.connect(self._sync) 

63 self._sync() 

64 

65 def _sync(self, *_args): 

66 paper_size = self._sizes.get(self.paper.currentData()) 

67 self.fit_to_paper.setEnabled(paper_size is not None) 

68 fitted = paper_size is not None and self.fit_to_paper.isChecked() 

69 if fitted and paper_size is not None: 

70 if self.w.isEnabled(): 70 ↛ 72line 70 didn't jump to line 72 because the condition on line 70 was always true

71 self._manual_size = (self.w.value(), self.h.value()) 

72 self.w.setValue(paper_size[0]) 

73 self.h.setValue(paper_size[1]) 

74 elif not self.w.isEnabled(): 

75 self.w.setValue(self._manual_size[0]) 

76 self.h.setValue(self._manual_size[1]) 

77 self.w.setEnabled(not fitted) 

78 self.h.setEnabled(not fitted) 

79 

80 def values(self): 

81 return self.w.value(), self.h.value() 

82 

83 def paper_id(self): 

84 return self.paper.currentData()