mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
Moves all TOT planning into the FlightPlan to clean up specialized behavior and improve planning characteristics. The important part of this change is that flights are now planning to the mission time for their flight rather than the package as a whole. For example, a TARCAP is planned based on the time from startup to the patrol point, a sweep is planned based on the time from startup to the sween end point, and a strike flight is planned based on the time from startup to the target location. TOT offsets can be handled within the flight plan. As another benefit of theis cleanup, flights without hold points no longer account for the hold time in their planning, so those flights are planned to reach their targets sooner. As a follow up TotEstimator can be removed, but I want to keep this low impact for 2.3.2. Fixes https://github.com/Khopa/dcs_liberation/issues/593
84 lines
3.2 KiB
Python
84 lines
3.2 KiB
Python
from datetime import timedelta
|
|
|
|
from PySide2.QtCore import QItemSelectionModel, QPoint
|
|
from PySide2.QtGui import QStandardItem, QStandardItemModel
|
|
from PySide2.QtWidgets import QHeaderView, QTableView
|
|
|
|
from game.utils import meter_to_feet
|
|
from gen.ato import Package
|
|
from gen.flights.flight import Flight, FlightWaypoint, FlightWaypointType
|
|
from qt_ui.windows.mission.flight.waypoints.QFlightWaypointItem import \
|
|
QWaypointItem
|
|
|
|
|
|
class QFlightWaypointList(QTableView):
|
|
|
|
def __init__(self, package: Package, flight: Flight):
|
|
super().__init__()
|
|
self.package = package
|
|
self.flight = flight
|
|
|
|
self.model = QStandardItemModel(self)
|
|
self.setModel(self.model)
|
|
self.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
|
|
self.model.setHorizontalHeaderLabels(["Name", "Alt", "TOT/DEPART"])
|
|
|
|
header = self.horizontalHeader()
|
|
header.setSectionResizeMode(0, QHeaderView.ResizeToContents)
|
|
|
|
if len(self.flight.points) > 0:
|
|
self.selectedPoint = self.flight.points[0]
|
|
self.update_list()
|
|
|
|
self.selectionModel().setCurrentIndex(self.indexAt(QPoint(1, 1)), QItemSelectionModel.Select)
|
|
|
|
def update_list(self):
|
|
self.model.clear()
|
|
|
|
self.model.setHorizontalHeaderLabels(["Name", "Alt", "TOT/DEPART"])
|
|
|
|
waypoints = self.flight.flight_plan.waypoints
|
|
for row, waypoint in enumerate(waypoints):
|
|
self.add_waypoint_row(row, self.flight, waypoint)
|
|
self.selectionModel().setCurrentIndex(self.indexAt(QPoint(1, 1)),
|
|
QItemSelectionModel.Select)
|
|
|
|
def add_waypoint_row(self, row: int, flight: Flight,
|
|
waypoint: FlightWaypoint) -> None:
|
|
self.model.insertRow(self.model.rowCount())
|
|
|
|
self.model.setItem(row, 0, QWaypointItem(waypoint, row))
|
|
|
|
altitude = meter_to_feet(waypoint.alt)
|
|
altitude_type = "AGL" if waypoint.alt_type == "RADIO" else "MSL"
|
|
altitude_item = QStandardItem(f"{altitude} ft {altitude_type}")
|
|
altitude_item.setEditable(False)
|
|
self.model.setItem(row, 1, altitude_item)
|
|
|
|
tot = self.tot_text(flight, waypoint)
|
|
tot_item = QStandardItem(tot)
|
|
tot_item.setEditable(False)
|
|
self.model.setItem(row, 2, tot_item)
|
|
|
|
def tot_text(self, flight: Flight, waypoint: FlightWaypoint) -> str:
|
|
if waypoint.waypoint_type == FlightWaypointType.TAKEOFF:
|
|
return self.takeoff_text(flight)
|
|
prefix = ""
|
|
time = flight.flight_plan.tot_for_waypoint(waypoint)
|
|
if time is None:
|
|
prefix = "Depart "
|
|
time = flight.flight_plan.depart_time_for_waypoint(waypoint)
|
|
if time is None:
|
|
return ""
|
|
time = timedelta(seconds=int(time.total_seconds()))
|
|
return f"{prefix}T+{time}"
|
|
|
|
@staticmethod
|
|
def takeoff_text(flight: Flight) -> str:
|
|
takeoff_time = flight.flight_plan.takeoff_time()
|
|
# Handle custom flight plans where we can't estimate the takeoff time.
|
|
if takeoff_time is None:
|
|
takeoff_time = timedelta()
|
|
start_time = timedelta(seconds=int(takeoff_time.total_seconds()))
|
|
return f"T+{start_time}"
|