| 15 | |
| 16 | |
| 17 | class CreateSubcircuitDialog(QDialog): |
| 18 | def __init__(self, name: str, ports: list[str], |
| 19 | params: list | None = None, parent=None): |
| 20 | super().__init__(parent, Qt.Window) |
| 21 | self.setWindowTitle("Create Subcircuit") |
| 22 | self.setMinimumWidth(420) |
| 23 | |
| 24 | outer = QVBoxLayout(self) |
| 25 | |
| 26 | # ── name ─────────────────────────────────────────────────────────────── |
| 27 | head = QGridLayout() |
| 28 | head.addWidget(QLabel("<b>Subcircuit name:</b>"), 0, 0) |
| 29 | head.addWidget(QLabel(name or "(set a title in Document Properties)"), 0, 1) |
| 30 | outer.addLayout(head) |
| 31 | |
| 32 | # ── ports (reorderable node list) ────────────────────────────────────── |
| 33 | outer.addWidget(QLabel("Nodes (top → bottom = left → right node order):")) |
| 34 | port_row = QHBoxLayout() |
| 35 | self._ports = QListWidget() |
| 36 | for p in ports: |
| 37 | self._ports.addItem(p) |
| 38 | if self._ports.count(): |
| 39 | self._ports.setCurrentRow(0) |
| 40 | port_row.addWidget(self._ports) |
| 41 | |
| 42 | btn_col = QVBoxLayout() |
| 43 | up = QPushButton("Up") |
| 44 | dn = QPushButton("Down") |
| 45 | up.clicked.connect(lambda: self._move(-1)) |
| 46 | dn.clicked.connect(lambda: self._move(+1)) |
| 47 | btn_col.addWidget(up) |
| 48 | btn_col.addWidget(dn) |
| 49 | btn_col.addStretch(1) |
| 50 | port_row.addLayout(btn_col) |
| 51 | outer.addLayout(port_row) |
| 52 | |
| 53 | if not ports: |
| 54 | warn = QLabel("No ports found — add 'port' symbols and name them.") |
| 55 | warn.setStyleSheet("color: #b00;") |
| 56 | outer.addWidget(warn) |
| 57 | |
| 58 | # ── parameters ───────────────────────────────────────────────────────── |
| 59 | outer.addWidget(QLabel("Parameters (overridable defaults):")) |
| 60 | self._params = QTableWidget(0, 2) |
| 61 | self._params.setHorizontalHeaderLabels(["Name", "Default"]) |
| 62 | self._params.horizontalHeader().setStretchLastSection(True) |
| 63 | for pair in (params or []): |
| 64 | self._add_param_row(*(list(pair) + ["", ""])[:2]) |
| 65 | outer.addWidget(self._params) |
| 66 | |
| 67 | param_btns = QHBoxLayout() |
| 68 | add_btn = QPushButton("Add parameter") |
| 69 | del_btn = QPushButton("Remove") |
| 70 | add_btn.clicked.connect(lambda: self._add_param_row("", "")) |
| 71 | del_btn.clicked.connect(self._remove_param_row) |
| 72 | param_btns.addWidget(add_btn) |
| 73 | param_btns.addWidget(del_btn) |
| 74 | param_btns.addStretch(1) |