From 406fb61fa435f350f35f1760d699efa554e715b3 Mon Sep 17 00:00:00 2001 From: Dan Albert Date: Thu, 25 May 2023 22:19:19 -0700 Subject: [PATCH] Add UI for TOT offset adjustment. Fixes https://github.com/dcs-liberation/dcs_liberation/issues/2912. --- changelog.md | 2 + ...isplay.py => FlightPlanPropertiesGroup.py} | 51 +++++++++++++++++-- .../settings/QGeneralFlightSettingsTab.py | 8 +-- 3 files changed, 54 insertions(+), 7 deletions(-) rename qt_ui/windows/mission/flight/settings/{FlightAirfieldDisplay.py => FlightPlanPropertiesGroup.py} (59%) diff --git a/changelog.md b/changelog.md index b677698a..8538e5d2 100644 --- a/changelog.md +++ b/changelog.md @@ -10,6 +10,8 @@ Saves from 7.x are not compatible with 8.0. ## Features/Improvements +* **[Mission Planning]** Per-flight TOT offsets can now be set in the flight details UI. This allows individual flights to be scheduled ahead of or behind the rest of the package. + ## Fixes # 7.0.0 diff --git a/qt_ui/windows/mission/flight/settings/FlightAirfieldDisplay.py b/qt_ui/windows/mission/flight/settings/FlightPlanPropertiesGroup.py similarity index 59% rename from qt_ui/windows/mission/flight/settings/FlightAirfieldDisplay.py rename to qt_ui/windows/mission/flight/settings/FlightPlanPropertiesGroup.py index 322664e9..21d42f67 100644 --- a/qt_ui/windows/mission/flight/settings/FlightAirfieldDisplay.py +++ b/qt_ui/windows/mission/flight/settings/FlightPlanPropertiesGroup.py @@ -1,6 +1,16 @@ import logging +from datetime import timedelta -from PySide6.QtWidgets import QGroupBox, QLabel, QMessageBox, QVBoxLayout +from PySide6.QtCore import QTime +from PySide6.QtWidgets import ( + QGroupBox, + QLabel, + QMessageBox, + QVBoxLayout, + QTimeEdit, + QHBoxLayout, + QCheckBox, +) from game import Game from game.ato.flight import Flight @@ -10,9 +20,9 @@ from qt_ui.widgets.QLabeledWidget import QLabeledWidget from qt_ui.widgets.combos.QArrivalAirfieldSelector import QArrivalAirfieldSelector -class FlightAirfieldDisplay(QGroupBox): +class FlightPlanPropertiesGroup(QGroupBox): def __init__(self, game: Game, package_model: PackageModel, flight: Flight) -> None: - super().__init__("Departure/Arrival") + super().__init__("Flight plan properties") self.game = game self.package_model = package_model self.flight = flight @@ -28,6 +38,31 @@ class FlightAirfieldDisplay(QGroupBox): self.package_model.tot_changed.connect(self.update_departure_time) self.update_departure_time() + tot_offset_layout = QHBoxLayout() + layout.addLayout(tot_offset_layout) + + delay = int(self.flight.flight_plan.tot_offset.total_seconds()) + negative = delay < 0 + if negative: + delay = -delay + hours = delay // 3600 + minutes = delay // 60 % 60 + seconds = delay % 60 + + 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.tot_offset_spinner = QTimeEdit(QTime(hours, minutes, seconds)) + self.tot_offset_spinner.setMaximumTime(QTime(59, 0)) + self.tot_offset_spinner.setDisplayFormat("mm:ss") + self.tot_offset_spinner.timeChanged.connect(self.set_tot_offset) + self.tot_offset_spinner.setToolTip("Flight TOT offset from package TOT") + tot_offset_layout.addWidget(self.tot_offset_spinner) + layout.addWidget( QLabel( "Determined based on the package TOT. Edit the " @@ -76,3 +111,13 @@ class FlightAirfieldDisplay(QGroupBox): QMessageBox.critical( self, "Could not update flight plan", str(ex), QMessageBox.Ok ) + + def set_tot_offset(self, offset: QTime) -> None: + self.flight.flight_plan.tot_offset = timedelta( + hours=offset.hour(), minutes=offset.minute(), seconds=offset.second() + ) + self.update_departure_time() + + def toggle_negative_offset(self) -> None: + self.flight.flight_plan.tot_offset = -self.flight.flight_plan.tot_offset + self.update_departure_time() diff --git a/qt_ui/windows/mission/flight/settings/QGeneralFlightSettingsTab.py b/qt_ui/windows/mission/flight/settings/QGeneralFlightSettingsTab.py index c239de36..6fa993f1 100644 --- a/qt_ui/windows/mission/flight/settings/QGeneralFlightSettingsTab.py +++ b/qt_ui/windows/mission/flight/settings/QGeneralFlightSettingsTab.py @@ -4,15 +4,15 @@ from PySide6.QtWidgets import QFrame, QGridLayout, QVBoxLayout from game import Game from game.ato.flight import Flight from qt_ui.models import PackageModel -from qt_ui.windows.mission.flight.settings.FlightAirfieldDisplay import ( - FlightAirfieldDisplay, +from qt_ui.windows.mission.flight.settings.FlightPlanPropertiesGroup import ( + FlightPlanPropertiesGroup, ) +from qt_ui.windows.mission.flight.settings.QCustomName import QFlightCustomName from qt_ui.windows.mission.flight.settings.QFlightSlotEditor import QFlightSlotEditor from qt_ui.windows.mission.flight.settings.QFlightStartType import QFlightStartType from qt_ui.windows.mission.flight.settings.QFlightTypeTaskInfo import ( QFlightTypeTaskInfo, ) -from qt_ui.windows.mission.flight.settings.QCustomName import QFlightCustomName class QGeneralFlightSettingsTab(QFrame): @@ -23,7 +23,7 @@ class QGeneralFlightSettingsTab(QFrame): layout = QGridLayout() layout.addWidget(QFlightTypeTaskInfo(flight), 0, 0) - layout.addWidget(FlightAirfieldDisplay(game, package_model, flight), 1, 0) + layout.addWidget(FlightPlanPropertiesGroup(game, package_model, flight), 1, 0) layout.addWidget(QFlightSlotEditor(package_model, flight, game), 2, 0) layout.addWidget(QFlightStartType(package_model, flight), 3, 0) layout.addWidget(QFlightCustomName(flight), 4, 0)