diff --git a/game/ato/flightplans/custom.py b/game/ato/flightplans/custom.py index c47e93c5..82e8ff3b 100644 --- a/game/ato/flightplans/custom.py +++ b/game/ato/flightplans/custom.py @@ -44,7 +44,7 @@ class CustomFlightPlan(FlightPlan[CustomLayout]): def tot_for_waypoint(self, waypoint: FlightWaypoint) -> timedelta | None: if waypoint == self.tot_waypoint: - return self.package.time_over_target + return self.package.time_over_target + self.tot_offset return None def depart_time_for_waypoint(self, waypoint: FlightWaypoint) -> timedelta | None: diff --git a/game/ato/flightplans/flightplan.py b/game/ato/flightplans/flightplan.py index 575d1e81..c21844b4 100644 --- a/game/ato/flightplans/flightplan.py +++ b/game/ato/flightplans/flightplan.py @@ -21,7 +21,6 @@ from .planningerror import PlanningError from ..flightwaypointtype import FlightWaypointType from ..starttype import StartType from ..traveltime import GroundSpeed, TravelTime -from ...savecompat import has_save_compat_for if TYPE_CHECKING: from game.dcs.aircrafttype import FuelConsumption @@ -68,7 +67,6 @@ class FlightPlan(ABC, Generic[LayoutT]): self.layout = layout self.tot_offset = self.default_tot_offset() - @has_save_compat_for(7) def __setstate__(self, state: dict[str, Any]) -> None: if "tot_offset" not in state: state["tot_offset"] = self.default_tot_offset() diff --git a/game/ato/flightplans/formation.py b/game/ato/flightplans/formation.py index cf5bc1a8..3f380813 100644 --- a/game/ato/flightplans/formation.py +++ b/game/ato/flightplans/formation.py @@ -97,9 +97,9 @@ class FormationFlightPlan(LoiterFlightPlan, ABC): def tot_for_waypoint(self, waypoint: FlightWaypoint) -> timedelta | None: if waypoint == self.layout.join: - return self.join_time + return self.join_time + self.tot_offset elif waypoint == self.layout.split: - return self.split_time + return self.split_time + self.tot_offset return None @property diff --git a/game/ato/flightplans/loiter.py b/game/ato/flightplans/loiter.py index c3545dcd..9cd96b77 100644 --- a/game/ato/flightplans/loiter.py +++ b/game/ato/flightplans/loiter.py @@ -30,7 +30,7 @@ class LoiterFlightPlan(StandardFlightPlan[Any], ABC): def depart_time_for_waypoint(self, waypoint: FlightWaypoint) -> timedelta | None: if waypoint == self.layout.hold: - return self.push_time + return self.push_time + self.tot_offset return None def travel_time_between_waypoints( diff --git a/game/ato/flightplans/patrolling.py b/game/ato/flightplans/patrolling.py index b4815188..a1c20ff9 100644 --- a/game/ato/flightplans/patrolling.py +++ b/game/ato/flightplans/patrolling.py @@ -73,7 +73,7 @@ class PatrollingFlightPlan(StandardFlightPlan[LayoutT], UiZoneDisplay, ABC): @property def patrol_start_time(self) -> timedelta: - return self.package.time_over_target + return self.package.time_over_target + self.tot_offset @property def patrol_end_time(self) -> timedelta: diff --git a/game/ato/flightplans/sweep.py b/game/ato/flightplans/sweep.py index 60d8a5de..7ef093a7 100644 --- a/game/ato/flightplans/sweep.py +++ b/game/ato/flightplans/sweep.py @@ -66,14 +66,14 @@ class SweepFlightPlan(LoiterFlightPlan): def tot_for_waypoint(self, waypoint: FlightWaypoint) -> timedelta | None: if waypoint == self.layout.sweep_start: - return self.sweep_start_time + return self.sweep_start_time + self.tot_offset if waypoint == self.layout.sweep_end: - return self.sweep_end_time + return self.sweep_end_time + self.tot_offset return None def depart_time_for_waypoint(self, waypoint: FlightWaypoint) -> timedelta | None: if waypoint == self.layout.hold: - return self.push_time + return self.push_time + self.tot_offset return None @property diff --git a/qt_ui/windows/mission/flight/QFlightPlanner.py b/qt_ui/windows/mission/flight/QFlightPlanner.py index 69178c2d..e6d0a2d2 100644 --- a/qt_ui/windows/mission/flight/QFlightPlanner.py +++ b/qt_ui/windows/mission/flight/QFlightPlanner.py @@ -13,9 +13,12 @@ class QFlightPlanner(QTabWidget): def __init__(self, package_model: PackageModel, flight: Flight, gm: GameModel): super().__init__() - self.general_settings_tab = QGeneralFlightSettingsTab(gm, package_model, flight) self.payload_tab = QFlightPayloadTab(flight, gm.game) self.waypoint_tab = QFlightWaypointTab(gm.game, package_model.package, flight) + + self.general_settings_tab = QGeneralFlightSettingsTab( + gm, package_model, flight, self.waypoint_tab.flight_waypoint_list + ) self.waypoint_tab.loadout_changed.connect(self.payload_tab.reload_from_flight) self.addTab(self.general_settings_tab, "General Flight settings") self.addTab(self.payload_tab, "Payload") diff --git a/qt_ui/windows/mission/flight/settings/FlightPlanPropertiesGroup.py b/qt_ui/windows/mission/flight/settings/FlightPlanPropertiesGroup.py index 11eb5410..7401b429 100644 --- a/qt_ui/windows/mission/flight/settings/FlightPlanPropertiesGroup.py +++ b/qt_ui/windows/mission/flight/settings/FlightPlanPropertiesGroup.py @@ -18,14 +18,24 @@ from game.ato.flightplans.planningerror import PlanningError from qt_ui.models import PackageModel from qt_ui.widgets.QLabeledWidget import QLabeledWidget from qt_ui.widgets.combos.QArrivalAirfieldSelector import QArrivalAirfieldSelector +from qt_ui.windows.mission.flight.waypoints.QFlightWaypointList import ( + QFlightWaypointList, +) class FlightPlanPropertiesGroup(QGroupBox): - def __init__(self, game: Game, package_model: PackageModel, flight: Flight) -> None: + def __init__( + self, + game: Game, + package_model: PackageModel, + flight: Flight, + flight_wpt_list: QFlightWaypointList, + ) -> None: super().__init__("Flight plan properties") self.game = game self.package_model = package_model self.flight = flight + self.flight_wpt_list = flight_wpt_list layout = QVBoxLayout() @@ -51,10 +61,10 @@ class FlightPlanPropertiesGroup(QGroupBox): tot_offset_layout.addWidget(QLabel("TOT Offset (minutes:seconds)")) tot_offset_layout.addStretch() - negative_offset_checkbox = QCheckBox("Ahead of package") - negative_offset_checkbox.setChecked(negative) - negative_offset_checkbox.toggled.connect(self.toggle_negative_offset) - tot_offset_layout.addWidget(negative_offset_checkbox) + self.negative_offset_checkbox = QCheckBox("Ahead of package") + self.negative_offset_checkbox.setChecked(negative) + self.negative_offset_checkbox.toggled.connect(self.toggle_negative_offset) + tot_offset_layout.addWidget(self.negative_offset_checkbox) self.tot_offset_spinner = QTimeEdit(QTime(hours, minutes, seconds)) self.tot_offset_spinner.setMaximumTime(QTime(59, 0)) @@ -93,6 +103,7 @@ class FlightPlanPropertiesGroup(QGroupBox): # is an invalid state for calling anything in TotEstimator. return self.departure_time.setText(f"At T+{self.flight.flight_plan.startup_time()}") + self.flight_wpt_list.update_list() def set_divert(self, index: int) -> None: old_divert = self.flight.divert @@ -114,6 +125,8 @@ class FlightPlanPropertiesGroup(QGroupBox): self.flight.flight_plan.tot_offset = timedelta( hours=offset.hour(), minutes=offset.minute(), seconds=offset.second() ) + if self.negative_offset_checkbox.isChecked(): + return self.toggle_negative_offset() self.update_departure_time() def toggle_negative_offset(self) -> None: diff --git a/qt_ui/windows/mission/flight/settings/QGeneralFlightSettingsTab.py b/qt_ui/windows/mission/flight/settings/QGeneralFlightSettingsTab.py index 3d87af33..1fa19b09 100644 --- a/qt_ui/windows/mission/flight/settings/QGeneralFlightSettingsTab.py +++ b/qt_ui/windows/mission/flight/settings/QGeneralFlightSettingsTab.py @@ -13,18 +13,29 @@ from qt_ui.windows.mission.flight.settings.QFlightStartType import QFlightStartT from qt_ui.windows.mission.flight.settings.QFlightTypeTaskInfo import ( QFlightTypeTaskInfo, ) +from qt_ui.windows.mission.flight.waypoints.QFlightWaypointList import ( + QFlightWaypointList, +) class QGeneralFlightSettingsTab(QFrame): on_flight_settings_changed = Signal() - def __init__(self, game: GameModel, package_model: PackageModel, flight: Flight): + def __init__( + self, + game: GameModel, + package_model: PackageModel, + flight: Flight, + flight_wpt_list: QFlightWaypointList, + ): super().__init__() widgets = [ QFlightTypeTaskInfo(flight), QCommsEditor(flight, game), - FlightPlanPropertiesGroup(game.game, package_model, flight), + FlightPlanPropertiesGroup( + game.game, package_model, flight, flight_wpt_list + ), QFlightSlotEditor(package_model, flight, game.game), QFlightStartType(package_model, flight), QFlightCustomName(flight),