import logging
from PySide2.QtWidgets import QGroupBox, QLabel, QMessageBox, QVBoxLayout
from game import Game
from game.ato.flight import Flight
from game.ato.flightplans.planningerror import PlanningError
from game.ato.traveltime import TotEstimator
from qt_ui.models import PackageModel
from qt_ui.widgets.QLabeledWidget import QLabeledWidget
from qt_ui.widgets.combos.QArrivalAirfieldSelector import QArrivalAirfieldSelector
class FlightAirfieldDisplay(QGroupBox):
def __init__(self, game: Game, package_model: PackageModel, flight: Flight) -> None:
super().__init__("Departure/Arrival")
self.game = game
self.package_model = package_model
self.flight = flight
layout = QVBoxLayout()
self.departure_time = QLabel()
layout.addLayout(
QLabeledWidget(
f"Departing from {flight.from_cp.name}", self.departure_time
)
)
self.package_model.tot_changed.connect(self.update_departure_time)
self.update_departure_time()
layout.addWidget(
QLabel(
"Determined based on the package TOT. Edit the "
"package to adjust the TOT."
)
)
arrival_label = QLabel(f"{flight.arrival.name}")
layout.addLayout(QLabeledWidget("Arrival:", arrival_label))
self.divert = QArrivalAirfieldSelector(
[cp for cp in game.theater.controlpoints if cp.captured],
flight.unit_type,
"None",
)
self.divert.currentIndexChanged.connect(self.set_divert)
if flight.divert is not None:
self.divert.setCurrentText(flight.divert.name)
layout.addLayout(QLabeledWidget("Divert:", self.divert))
self.setLayout(layout)
def update_departure_time(self) -> None:
if not self.flight.package.flights:
# This is theoretically impossible, but for some reason the dialog that owns
# this object QEditFlightDialog does not dispose properly on close, so this
# handler may be called for a flight whose package has been canceled, which
# is an invalid state for calling anything in TotEstimator.
return
estimator = TotEstimator(self.package_model.package)
delay = estimator.mission_start_time(self.flight)
self.departure_time.setText(f"At T+{delay}")
def set_divert(self, index: int) -> None:
old_divert = self.flight.divert
divert = self.divert.itemData(index)
if divert == old_divert:
return
self.flight.divert = divert
try:
self.flight.recreate_flight_plan()
except PlanningError as ex:
self.flight.divert = old_divert
logging.exception("Could not change divert airfield")
QMessageBox.critical(
self, "Could not update flight plan", str(ex), QMessageBox.Ok
)