From 944a8e9cd6f1ec33e4b06c6e1c83a9b2b055d829 Mon Sep 17 00:00:00 2001 From: Dan Albert Date: Sat, 30 Jan 2021 16:15:12 -0800 Subject: [PATCH] Allow selecting start type when creating flights. --- changelog.md | 1 + .../windows/mission/flight/QFlightCreator.py | 44 ++++++++++++++++--- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/changelog.md b/changelog.md index 68d32542..a26e0b18 100644 --- a/changelog.md +++ b/changelog.md @@ -32,6 +32,7 @@ Saves from 2.3 are not compatible with 2.4. * **[UI]** Docs for time-on-target and creating new theaters/factions/loadouts are now linked in the UI at the appropriate places. * **[UI]** ASAP is now a checkbox rather than a button. Enabling this will disable the TOT selector but changes to the package structure will automatically re-ASAP the package. * **[UI]** Arrival airfield is now shown in the flight list if it differs from the departure airfield. +* **[UI]** Start type can now be selected when creating a flight. * **[Factions]** Added option for date-based loadout restriction. Active radar homing missiles are handled, patches welcome for the other thousand weapons. * **[Factions]** Added Poland 2010 faction. * **[Factions]** Added Greece 2005 faction. diff --git a/qt_ui/windows/mission/flight/QFlightCreator.py b/qt_ui/windows/mission/flight/QFlightCreator.py index 533ff71b..eafd3c90 100644 --- a/qt_ui/windows/mission/flight/QFlightCreator.py +++ b/qt_ui/windows/mission/flight/QFlightCreator.py @@ -1,9 +1,10 @@ -from re import L from typing import Optional from PySide2.QtCore import Qt, Signal from PySide2.QtWidgets import ( + QComboBox, QDialog, + QLabel, QMessageBox, QPushButton, QVBoxLayout, @@ -63,6 +64,7 @@ class QFlightCreator(QDialog): self.aircraft_selector.currentData() ) self.departure.availability_changed.connect(self.update_max_size) + self.departure.currentIndexChanged.connect(self.on_departure_changed) layout.addLayout(QLabeledWidget("Departure:", self.departure)) self.arrival = QArrivalAirfieldSelector( @@ -94,6 +96,22 @@ class QFlightCreator(QDialog): layout.addLayout( QLabeledWidget("Client Slots:", self.client_slots_spinner)) + # When an off-map spawn overrides the start type to in-flight, we save + # the selected type into this value. If a non-off-map spawn is selected + # we restore the previous choice. + self.restore_start_type: Optional[str] = None + self.start_type = QComboBox() + self.start_type.addItems(["Cold", "Warm", "Runway", "In Flight"]) + self.start_type.setCurrentText(self.game.settings.default_start_type) + layout.addLayout(QLabeledWidget( + "Start type:", self.start_type, + tooltip="Selects the start type for this flight.")) + layout.addWidget(QLabel( + "Any option other than Cold will make this flight " + + "non-targetable
by OCA/Aircraft missions. This will affect " + + "game balance." + )) + self.custom_name = QLineEdit() self.custom_name.textChanged.connect(self.set_custom_name_text) layout.addLayout( @@ -108,6 +126,8 @@ class QFlightCreator(QDialog): self.setLayout(layout) + self.on_departure_changed(self.departure.currentIndex()) + def set_custom_name_text(self, text: str): self.custom_name_text = text @@ -117,7 +137,7 @@ class QFlightCreator(QDialog): arrival: ControlPoint = self.arrival.currentData() divert: ControlPoint = self.divert.currentData() size: int = self.flight_size_spinner.value() - if aircraft == None: + if aircraft is None: return "You must select an aircraft type." if not origin.captured: return f"{origin.name} is not owned by your coalition." @@ -153,12 +173,8 @@ class QFlightCreator(QDialog): if arrival is None: arrival = origin - if isinstance(origin, OffMapSpawn): - start_type = "In Flight" - else: - start_type = self.game.settings.default_start_type flight = Flight(self.package, self.country, aircraft, size, task, - start_type, origin, arrival, divert, + self.start_type.currentText(), origin, arrival, divert, custom_name=self.custom_name_text) flight.client_count = self.client_slots_spinner.value() @@ -172,6 +188,20 @@ class QFlightCreator(QDialog): self.arrival.change_aircraft(new_aircraft) self.divert.change_aircraft(new_aircraft) + def on_departure_changed(self, index: int) -> None: + departure = self.departure.itemData(index) + if isinstance(departure, OffMapSpawn): + previous_type = self.start_type.currentText() + if previous_type != "In Flight": + self.restore_start_type = previous_type + self.start_type.setCurrentText("In Flight") + self.start_type.setEnabled(False) + else: + self.start_type.setEnabled(True) + if self.restore_start_type is not None: + self.start_type.setCurrentText(self.restore_start_type) + self.restore_start_type = None + def on_task_changed(self) -> None: self.aircraft_selector.updateItems(self.task_selector.currentData(), self.game.aircraft_inventory.available_types_for_player)