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
« 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)
11from . import layout_paper
12from .constants import MAX_IMAGE_DIMENSION
13from .i18n import tr
16class NewDocumentDialog(QDialog):
17 def __init__(self, width, height, parent=None):
18 super().__init__(parent)
19 self.setWindowTitle(tr("新規作成"))
20 form = QFormLayout(self)
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)
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)
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)
61 self.paper.currentIndexChanged.connect(self._sync)
62 self.fit_to_paper.toggled.connect(self._sync)
63 self._sync()
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)
80 def values(self):
81 return self.w.value(), self.h.value()
83 def paper_id(self):
84 return self.paper.currentData()