mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
Follow-up on flight TOT offset
This commit is contained in:
parent
529eea0c01
commit
c559d6e2be
@ -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:
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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(
|
||||||
|
|||||||
@ -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:
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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")
|
||||||
|
|||||||
@ -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:
|
||||||
|
|||||||
@ -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),
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user