class LitecoinTab(QWidget): change_network = Signal(Network) def __init__(self, litecoin: Litecoin): super().__init__() self.litecoin = litecoin self.litecoin_layout = QVBoxLayout() self.data_directory_group_box = DataDirectoryBox(litecoin=self.litecoin) self.data_directory_group_box.file_dialog.new_data_directory.connect( self.change_datadir ) self.litecoin_layout.addWidget(self.data_directory_group_box) self.litecoin_layout.setAlignment(self.data_directory_group_box, Qt.AlignHCenter) self.enable_wallet_label = QLabel('Enable wallet') self.enable_wallet_widget = QCheckBox('Enable Wallet') self.enable_wallet_widget.setChecked(not self.litecoin.file['disablewallet']) self.enable_wallet_widget.stateChanged.connect( lambda x: self.update_config('disablewallet', not bool(x)) ) self.litecoin_layout.addWidget(self.enable_wallet_widget) self.enable_testnet_label = QLabel('Enable testnet') self.enable_testnet_widget = QCheckBox('Enable Testnet') self.set_checked( self.enable_testnet_widget, self.litecoin.file['testnet'] ) self.enable_testnet_widget.stateChanged.connect( lambda x: self.update_config('testnet', bool(x)) ) self.litecoin_layout.addWidget(self.enable_testnet_widget) self.setLayout(self.litecoin_layout) self.litecoin.file.file_watcher.fileChanged.connect(self.litecoin_config_changed) def change_datadir(self, new_datadir: str): self.litecoin.file['datadir'] = new_datadir self.litecoin.set_prune() self.data_directory_group_box.set_datadir( self.litecoin.file['datadir'], self.litecoin.file['prune'] ) @staticmethod def set_checked(widget: QCheckBox, state: bool): if state is None: widget.setChecked(False) return widget.setChecked(state) def update_config(self, name: str, state: bool): self.litecoin.file[name] = state if name == 'testnet' and state: self.change_network.emit(TESTNET) elif name == 'testnet' and not state: self.change_network.emit(MAINNET) def litecoin_config_changed(self): if self.litecoin.file['testnet']: self.enable_testnet_widget.blockSignals(True) self.set_checked(self.enable_testnet_widget, True) self.enable_testnet_widget.blockSignals(False) else: self.enable_testnet_widget.blockSignals(True) self.set_checked(self.enable_testnet_widget, False) self.enable_testnet_widget.blockSignals(False)
class PilotControls(QHBoxLayout): def __init__(self, roster: Optional[FlightRoster], idx: int) -> None: super().__init__() self.roster = roster self.pilot_index = idx self.selector = PilotSelector(roster, idx) self.selector.currentIndexChanged.connect(self.on_pilot_changed) self.addWidget(self.selector) self.player_checkbox = QCheckBox(text="Player") self.player_checkbox.setToolTip("Checked if this pilot is a player.") self.on_pilot_changed(self.selector.currentIndex()) self.addWidget(self.player_checkbox) self.player_checkbox.toggled.connect(self.on_player_toggled) @property def pilot(self) -> Optional[Pilot]: if self.roster is None or self.pilot_index >= self.roster.max_size: return None return self.roster.pilots[self.pilot_index] def on_player_toggled(self, checked: bool) -> None: pilot = self.pilot if pilot is None: logging.error( "Cannot toggle state of a pilot when none is selected") return pilot.player = checked def on_pilot_changed(self, index: int) -> None: pilot = self.selector.itemData(index) self.player_checkbox.blockSignals(True) try: self.player_checkbox.setChecked(pilot is not None and pilot.player) finally: self.player_checkbox.blockSignals(False) def update_available_pilots(self) -> None: self.selector.rebuild() def enable_and_reset(self) -> None: self.selector.rebuild() self.player_checkbox.setEnabled(True) self.on_pilot_changed(self.selector.currentIndex()) def disable_and_clear(self) -> None: self.selector.rebuild() self.player_checkbox.blockSignals(True) try: self.player_checkbox.setEnabled(False) self.player_checkbox.setChecked(False) finally: self.player_checkbox.blockSignals(False) def replace(self, new_roster: Optional[FlightRoster]) -> None: self.roster = new_roster if self.roster is None or self.pilot_index >= self.roster.max_size: self.disable_and_clear() else: self.enable_and_reset() self.selector.replace(new_roster)