From 2cccf877f55465932d50adf518d862bc1e2bb0fa Mon Sep 17 00:00:00 2001 From: arcattack Date: Wed, 22 Jul 2026 15:59:56 -0500 Subject: [PATCH] Console: Seats spinner replaces Add/Remove pilot in relay mode Rows are capacity + per-seat defaults now -- joiners auto-populate them live and launch trims to whoever is seated, so hand-managing rows is busywork. A Seats spinner (1-8) maintains the row count in relay mode; Add pilot / Remove selected remain for mesh mode, where explicit addresses matter. Co-Authored-By: Claude Opus 4.8 (1M context) --- tools/btoperator.py | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/tools/btoperator.py b/tools/btoperator.py index d525586..98a1db3 100644 --- a/tools/btoperator.py +++ b/tools/btoperator.py @@ -283,11 +283,22 @@ class Operator(QMainWindow): self.table.verticalHeader().setVisible(True) rl.addWidget(self.table, 1) btns = QHBoxLayout() - add = QPushButton("Add pilot"); add.clicked.connect(self._add_pilot) - rem = QPushButton("Remove selected"); rem.clicked.connect(self._remove_pilot) + # RELAY mode (2026-07-22): rows are just CAPACITY + per-seat defaults + # -- joiners auto-populate them live and launch trims to whoever is + # seated, so hand add/remove is busywork. A Seats spinner maintains + # the row count; Add/Remove stay for MESH mode (explicit addresses). + self.seats_label = QLabel("Seats:") + self.seats_spin = QSpinBox() + self.seats_spin.setRange(1, 8) + self.seats_spin.valueChanged.connect(self._set_seat_count) + self.add_btn = QPushButton("Add pilot") + self.add_btn.clicked.connect(self._add_pilot) + self.rem_btn = QPushButton("Remove selected") + self.rem_btn.clicked.connect(self._remove_pilot) self.export_btn = QPushButton("Export player scripts…") self.export_btn.clicked.connect(self._export_scripts) - btns.addWidget(add); btns.addWidget(rem) + btns.addWidget(self.seats_label); btns.addWidget(self.seats_spin) + btns.addWidget(self.add_btn); btns.addWidget(self.rem_btn) btns.addStretch(1); btns.addWidget(self.export_btn) rl.addLayout(btns) upper_l.addWidget(roster_box, 1) @@ -462,8 +473,29 @@ class Operator(QMainWindow): for r, tag in enumerate(tags): self.table.item(r, 0).setText(tag) + def _set_seat_count(self, n): + if self.mode.currentIndex() != 0: + return + while self.table.rowCount() < n: + self._add_pilot() + while self.table.rowCount() > n: + self.table.removeRow(self.table.rowCount() - 1) + self._renumber_relay_tags() + + def _apply_roster_controls_mode(self): + relay = self.mode.currentIndex() == 0 + self.seats_label.setVisible(relay) + self.seats_spin.setVisible(relay) + self.add_btn.setVisible(not relay) + self.rem_btn.setVisible(not relay) + if relay: + self.seats_spin.blockSignals(True) + self.seats_spin.setValue(self.table.rowCount()) + self.seats_spin.blockSignals(False) + def _mode_changed(self, _index): relay = self.mode.currentIndex() == 0 + self._apply_roster_controls_mode() for r in range(self.table.rowCount()): item = self.table.item(r, 0) flags = item.flags() @@ -493,6 +525,7 @@ class Operator(QMainWindow): for i, p in enumerate(self.egg.pilots()): self._add_pilot_row(p, local=(relay and i == 0)) self._renumber_relay_tags() + self._apply_roster_controls_mode() # Seats spinner mirrors rows self.egg_label.setText(os.path.basename(self.egg_path)) def _collect_egg(self):