Follow-up on flight TOT offset

This commit is contained in:
Raffson 2023-06-04 01:43:48 +02:00
parent 529eea0c01
commit c559d6e2be
No known key found for this signature in database
GPG Key ID: B0402B2C9B764D99
9 changed files with 43 additions and 18 deletions

View File

@ -44,7 +44,7 @@ class CustomFlightPlan(FlightPlan[CustomLayout]):
def tot_for_waypoint(self, waypoint: FlightWaypoint) -> timedelta | None: def tot_for_waypoint(self, waypoint: FlightWaypoint) -> timedelta | None:
if waypoint == self.tot_waypoint: if waypoint == self.tot_waypoint:
return self.package.time_over_target return self.package.time_over_target + self.tot_offset
return None return None
def depart_time_for_waypoint(self, waypoint: FlightWaypoint) -> timedelta | None: def depart_time_for_waypoint(self, waypoint: FlightWaypoint) -> timedelta | None:

View File

@ -21,7 +21,6 @@ from .planningerror import PlanningError
from ..flightwaypointtype import FlightWaypointType from ..flightwaypointtype import FlightWaypointType
from ..starttype import StartType from ..starttype import StartType
from ..traveltime import GroundSpeed, TravelTime from ..traveltime import GroundSpeed, TravelTime
from ...savecompat import has_save_compat_for
if TYPE_CHECKING: if TYPE_CHECKING:
from game.dcs.aircrafttype import FuelConsumption from game.dcs.aircrafttype import FuelConsumption
@ -68,7 +67,6 @@ class FlightPlan(ABC, Generic[LayoutT]):
self.layout = layout self.layout = layout
self.tot_offset = self.default_tot_offset() self.tot_offset = self.default_tot_offset()
@has_save_compat_for(7)
def __setstate__(self, state: dict[str, Any]) -> None: def __setstate__(self, state: dict[str, Any]) -> None:
if "tot_offset" not in state: if "tot_offset" not in state:
state["tot_offset"] = self.default_tot_offset() state["tot_offset"] = self.default_tot_offset()

View File

@ -97,9 +97,9 @@ class FormationFlightPlan(LoiterFlightPlan, ABC):
def tot_for_waypoint(self, waypoint: FlightWaypoint) -> timedelta | None: def tot_for_waypoint(self, waypoint: FlightWaypoint) -> timedelta | None:
if waypoint == self.layout.join: if waypoint == self.layout.join:
return self.join_time return self.join_time + self.tot_offset
elif waypoint == self.layout.split: elif waypoint == self.layout.split:
return self.split_time return self.split_time + self.tot_offset
return None return None
@property @property

View File

@ -30,7 +30,7 @@ class LoiterFlightPlan(StandardFlightPlan[Any], ABC):
def depart_time_for_waypoint(self, waypoint: FlightWaypoint) -> timedelta | None: def depart_time_for_waypoint(self, waypoint: FlightWaypoint) -> timedelta | None:
if waypoint == self.layout.hold: if waypoint == self.layout.hold:
return self.push_time return self.push_time + self.tot_offset
return None return None
def travel_time_between_waypoints( def travel_time_between_waypoints(

View File

@ -73,7 +73,7 @@ class PatrollingFlightPlan(StandardFlightPlan[LayoutT], UiZoneDisplay, ABC):
@property @property
def patrol_start_time(self) -> timedelta: def patrol_start_time(self) -> timedelta:
return self.package.time_over_target return self.package.time_over_target + self.tot_offset
@property @property
def patrol_end_time(self) -> timedelta: def patrol_end_time(self) -> timedelta:

View File

@ -66,14 +66,14 @@ class SweepFlightPlan(LoiterFlightPlan):
def tot_for_waypoint(self, waypoint: FlightWaypoint) -> timedelta | None: def tot_for_waypoint(self, waypoint: FlightWaypoint) -> timedelta | None:
if waypoint == self.layout.sweep_start: 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: if waypoint == self.layout.sweep_end:
return self.sweep_end_time return self.sweep_end_time + self.tot_offset
return None return None
def depart_time_for_waypoint(self, waypoint: FlightWaypoint) -> timedelta | None: def depart_time_for_waypoint(self, waypoint: FlightWaypoint) -> timedelta | None:
if waypoint == self.layout.hold: if waypoint == self.layout.hold:
return self.push_time return self.push_time + self.tot_offset
return None return None
@property @property

View File

@ -13,9 +13,12 @@ class QFlightPlanner(QTabWidget):
def __init__(self, package_model: PackageModel, flight: Flight, gm: GameModel): def __init__(self, package_model: PackageModel, flight: Flight, gm: GameModel):
super().__init__() super().__init__()
self.general_settings_tab = QGeneralFlightSettingsTab(gm, package_model, flight)
self.payload_tab = QFlightPayloadTab(flight, gm.game) self.payload_tab = QFlightPayloadTab(flight, gm.game)
self.waypoint_tab = QFlightWaypointTab(gm.game, package_model.package, flight) 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.waypoint_tab.loadout_changed.connect(self.payload_tab.reload_from_flight)
self.addTab(self.general_settings_tab, "General Flight settings") self.addTab(self.general_settings_tab, "General Flight settings")
self.addTab(self.payload_tab, "Payload") self.addTab(self.payload_tab, "Payload")

View File

@ -18,14 +18,24 @@ from game.ato.flightplans.planningerror import PlanningError
from qt_ui.models import PackageModel from qt_ui.models import PackageModel
from qt_ui.widgets.QLabeledWidget import QLabeledWidget from qt_ui.widgets.QLabeledWidget import QLabeledWidget
from qt_ui.widgets.combos.QArrivalAirfieldSelector import QArrivalAirfieldSelector from qt_ui.widgets.combos.QArrivalAirfieldSelector import QArrivalAirfieldSelector
from qt_ui.windows.mission.flight.waypoints.QFlightWaypointList import (
QFlightWaypointList,
)
class FlightPlanPropertiesGroup(QGroupBox): 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") super().__init__("Flight plan properties")
self.game = game self.game = game
self.package_model = package_model self.package_model = package_model
self.flight = flight self.flight = flight
self.flight_wpt_list = flight_wpt_list
layout = QVBoxLayout() layout = QVBoxLayout()
@ -51,10 +61,10 @@ class FlightPlanPropertiesGroup(QGroupBox):
tot_offset_layout.addWidget(QLabel("TOT Offset (minutes:seconds)")) tot_offset_layout.addWidget(QLabel("TOT Offset (minutes:seconds)"))
tot_offset_layout.addStretch() tot_offset_layout.addStretch()
negative_offset_checkbox = QCheckBox("Ahead of package") self.negative_offset_checkbox = QCheckBox("Ahead of package")
negative_offset_checkbox.setChecked(negative) self.negative_offset_checkbox.setChecked(negative)
negative_offset_checkbox.toggled.connect(self.toggle_negative_offset) self.negative_offset_checkbox.toggled.connect(self.toggle_negative_offset)
tot_offset_layout.addWidget(negative_offset_checkbox) tot_offset_layout.addWidget(self.negative_offset_checkbox)
self.tot_offset_spinner = QTimeEdit(QTime(hours, minutes, seconds)) self.tot_offset_spinner = QTimeEdit(QTime(hours, minutes, seconds))
self.tot_offset_spinner.setMaximumTime(QTime(59, 0)) self.tot_offset_spinner.setMaximumTime(QTime(59, 0))
@ -93,6 +103,7 @@ class FlightPlanPropertiesGroup(QGroupBox):
# is an invalid state for calling anything in TotEstimator. # is an invalid state for calling anything in TotEstimator.
return return
self.departure_time.setText(f"At T+{self.flight.flight_plan.startup_time()}") 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: def set_divert(self, index: int) -> None:
old_divert = self.flight.divert old_divert = self.flight.divert
@ -114,6 +125,8 @@ class FlightPlanPropertiesGroup(QGroupBox):
self.flight.flight_plan.tot_offset = timedelta( self.flight.flight_plan.tot_offset = timedelta(
hours=offset.hour(), minutes=offset.minute(), seconds=offset.second() hours=offset.hour(), minutes=offset.minute(), seconds=offset.second()
) )
if self.negative_offset_checkbox.isChecked():
return self.toggle_negative_offset()
self.update_departure_time() self.update_departure_time()
def toggle_negative_offset(self) -> None: def toggle_negative_offset(self) -> None:

View File

@ -13,18 +13,29 @@ from qt_ui.windows.mission.flight.settings.QFlightStartType import QFlightStartT
from qt_ui.windows.mission.flight.settings.QFlightTypeTaskInfo import ( from qt_ui.windows.mission.flight.settings.QFlightTypeTaskInfo import (
QFlightTypeTaskInfo, QFlightTypeTaskInfo,
) )
from qt_ui.windows.mission.flight.waypoints.QFlightWaypointList import (
QFlightWaypointList,
)
class QGeneralFlightSettingsTab(QFrame): class QGeneralFlightSettingsTab(QFrame):
on_flight_settings_changed = Signal() 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__() super().__init__()
widgets = [ widgets = [
QFlightTypeTaskInfo(flight), QFlightTypeTaskInfo(flight),
QCommsEditor(flight, game), QCommsEditor(flight, game),
FlightPlanPropertiesGroup(game.game, package_model, flight), FlightPlanPropertiesGroup(
game.game, package_model, flight, flight_wpt_list
),
QFlightSlotEditor(package_model, flight, game.game), QFlightSlotEditor(package_model, flight, game.game),
QFlightStartType(package_model, flight), QFlightStartType(package_model, flight),
QFlightCustomName(flight), QFlightCustomName(flight),