Merge branch 'dcs-retribution:dev' into vietnamwarvessels

This commit is contained in:
Astro-739
2024-12-15 03:30:46 +01:00
committed by GitHub
6 changed files with 273 additions and 81 deletions

View File

@@ -1,6 +1,6 @@
from typing import Optional, Type
from PySide6.QtCore import Qt, Signal
from PySide6.QtCore import Qt, Signal, QEvent
from PySide6.QtWidgets import (
QComboBox,
QDialog,
@@ -10,12 +10,15 @@ from PySide6.QtWidgets import (
QVBoxLayout,
QLineEdit,
QHBoxLayout,
QStyledItemDelegate,
QToolTip,
)
from dcs.unittype import FlyingType
from game import Game
from game.ato.flight import Flight
from game.ato.flightroster import FlightRoster
from game.ato.loadouts import Loadout
from game.ato.package import Package
from game.ato.starttype import StartType
from game.squadrons.squadron import Squadron
@@ -85,6 +88,15 @@ class QFlightCreator(QDialog):
self.update_max_size(self.squadron_selector.aircraft_available)
layout.addLayout(QLabeledWidget("Size:", self.flight_size_spinner))
hbox = QHBoxLayout()
self.loadout_selector = QComboBox()
self.loadout_selector.setMaximumWidth(250)
self.loadout_selector.setItemDelegate(LoadoutDelegate(self.loadout_selector))
self._init_loadout_selector()
hbox.addWidget(QLabel("Loadout:"))
hbox.addWidget(self.loadout_selector)
layout.addLayout(hbox)
required_start_type = None
squadron = self.squadron_selector.currentData()
if squadron is None:
@@ -206,6 +218,7 @@ class QFlightCreator(QDialog):
member.assign_tgp_laser_code(
self.game.laser_code_registry.alloc_laser_code()
)
member.loadout = self.current_loadout()
# noinspection PyUnresolvedReferences
self.created.emit(flight)
@@ -217,8 +230,9 @@ class QFlightCreator(QDialog):
self.task_selector.currentData(), new_aircraft
)
self.divert.change_aircraft(new_aircraft)
self.roster_editor.pilots_changed.emit()
if self.aircraft_selector.currentData() is not None:
self._init_loadout_selector()
def on_departure_changed(self, departure: ControlPoint) -> None:
if isinstance(departure, OffMapSpawn):
@@ -290,3 +304,38 @@ class QFlightCreator(QDialog):
start_type = self.game.settings.default_start_type
self.start_type.setCurrentText(start_type.value)
def current_loadout(self) -> Loadout:
loadout = self.loadout_selector.currentData()
if loadout is None:
return Loadout.empty_loadout()
return loadout
def _init_loadout_selector(self):
self.loadout_selector.clear()
ac_type = self.aircraft_selector.currentData()
if ac_type is None:
return
for loadout in Loadout.iter_for_aircraft(ac_type):
self.loadout_selector.addItem(loadout.name, loadout)
for loadout in Loadout.default_loadout_names_for(
self.task_selector.currentData()
):
index = self.loadout_selector.findText(loadout)
if index != -1:
self.loadout_selector.setCurrentIndex(index)
break
class LoadoutDelegate(QStyledItemDelegate):
def helpEvent(self, event, view, option, index):
if event.type() == QEvent.ToolTip:
loadout = index.data(Qt.UserRole)
if loadout:
max_pylon = max(loadout.pylons.keys(), default=0)
pylons_info = "\n".join(
f"Pylon {pylon}: {loadout.pylons.get(pylon, 'Clean')}"
for pylon in range(1, max_pylon + 1)
)
QToolTip.showText(event.globalPos(), pylons_info, view)
return True

View File

@@ -105,8 +105,7 @@ class QLoadoutEditor(QGroupBox):
ac_id = ac_type.id
payloads_folder = payloads_dir()
payload_file = payloads_folder / f"{ac_id}.lua"
if not payloads_folder.exists():
payloads_folder.mkdir()
payloads_folder.mkdir(parents=True, exist_ok=True)
ac_type.payloads[payload_name] = DcsPayload.from_flight_member(
self.flight_member, payload_name
).to_dict()

View File

@@ -1,3 +1,5 @@
from typing import Optional
from PySide6.QtCore import QItemSelectionModel, QPoint, QModelIndex
from PySide6.QtGui import QStandardItem, QStandardItemModel
from PySide6.QtWidgets import (
@@ -32,6 +34,7 @@ class AltitudeEditorDelegate(QStyledItemDelegate):
class QFlightWaypointList(QTableView):
def __init__(self, package: Package, flight: Flight):
super().__init__()
self._last_waypoint: Optional[FlightWaypoint] = None
self.package = package
self.flight = flight
@@ -83,7 +86,10 @@ class QFlightWaypointList(QTableView):
self.update(self.currentIndex())
def _add_waypoint_row(
self, row: int, flight: Flight, waypoint: FlightWaypoint
self,
row: int,
flight: Flight,
waypoint: FlightWaypoint,
) -> None:
self.model.insertRow(self.model.rowCount())
@@ -112,18 +118,36 @@ class QFlightWaypointList(QTableView):
name = self.model.item(i, 0).text()
self.flight.flight_plan.waypoints[i].pretty_name = name
def tot_text(self, flight: Flight, waypoint: FlightWaypoint) -> str:
def tot_text(
self,
flight: Flight,
waypoint: FlightWaypoint,
) -> str:
if waypoint.waypoint_type == FlightWaypointType.TAKEOFF:
self.update_last_tot(flight.flight_plan.takeoff_time())
self._last_waypoint = waypoint
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:
if time is None and self._last_waypoint is not None:
prefix = ""
timedelta = flight.flight_plan.travel_time_between_waypoints(
self._last_waypoint, waypoint
)
time = self._last_tot + timedelta
else:
return ""
self.update_last_tot(time)
self._last_waypoint = waypoint
return f"{prefix}{time:%H:%M:%S}"
@staticmethod
def takeoff_text(flight: Flight) -> str:
return f"{flight.flight_plan.takeoff_time():%H:%M:%S}"
def update_last_tot(self, time) -> None:
if time is not None:
self._last_tot = time

View File

@@ -35,6 +35,7 @@ class QFactionUnits(QScrollArea):
self.parent = parent
self.faction = faction
self._create_checkboxes(show_jtac)
self.show_jtac = show_jtac
def _add_checkboxes(
self,
@@ -214,7 +215,7 @@ class QFactionUnits(QScrollArea):
self.faction = faction
self.content = QWidget()
self.setWidget(self.content)
self._create_checkboxes()
self._create_checkboxes(self.show_jtac)
self.update()
if self.parent:
self.parent.update()