mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
Streamlining
This commit is contained in:
parent
110866cd34
commit
d4eefd0b55
@ -111,9 +111,12 @@ class Flight(SidcDescribable, RadioFrequencyContainer, TacanContainer):
|
|||||||
is_f18 = self.squadron.aircraft.dcs_unit_type.id == FA_18C_hornet.id
|
is_f18 = self.squadron.aircraft.dcs_unit_type.id == FA_18C_hornet.id
|
||||||
on_land = not self.squadron.location.is_fleet
|
on_land = not self.squadron.location.is_fleet
|
||||||
if on_land and is_f18 and self.coalition.game.settings.atflir_autoswap:
|
if on_land and is_f18 and self.coalition.game.settings.atflir_autoswap:
|
||||||
self.loadout.pylons[F18_TGP_PYLON] = Weapon.with_clsid(
|
for fm in self.roster.members:
|
||||||
|
fm.loadout.pylons[F18_TGP_PYLON] = Weapon.with_clsid(
|
||||||
str(
|
str(
|
||||||
FA_18C_hornet.Pylon4.AN_AAQ_28_LITENING___Targeting_Pod_[1]["clsid"]
|
FA_18C_hornet.Pylon4.AN_AAQ_28_LITENING___Targeting_Pod_[1][
|
||||||
|
"clsid"
|
||||||
|
]
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@ -10,7 +10,7 @@ from .loadouts import Loadout
|
|||||||
from ..data.weapons import Weapon
|
from ..data.weapons import Weapon
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from game.squadrons import Pilot
|
from game.squadrons import Pilot, Squadron
|
||||||
from .flight import Flight
|
from .flight import Flight
|
||||||
|
|
||||||
|
|
||||||
@ -20,14 +20,16 @@ class FlightMembers(IFlightRoster):
|
|||||||
self.members: list[FlightMember] = []
|
self.members: list[FlightMember] = []
|
||||||
self.resize(initial_size)
|
self.resize(initial_size)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def squadron(self) -> Squadron:
|
||||||
|
return self.flight.squadron
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def from_roster(flight: Flight, roster: FlightRoster) -> FlightMembers:
|
def from_roster(flight: Flight, roster: FlightRoster) -> FlightMembers:
|
||||||
members = FlightMembers(flight)
|
members = FlightMembers(flight)
|
||||||
loadout = Loadout.default_for(flight)
|
loadout = Loadout.default_for(flight)
|
||||||
if flight.squadron.aircraft.name == "F-15I Ra'am":
|
if flight.squadron.aircraft.name == "F-15I Ra'am":
|
||||||
loadout.pylons[16] = Weapon.with_clsid(
|
loadout.pylons[16] = Weapon.with_clsid("{IDF_MODS_PROJECT_F-15I_Raam_Dome}")
|
||||||
"{IDF_MODS_PROJECT_F-15I_Raam_Dome}"
|
|
||||||
)
|
|
||||||
members.members = [FlightMember(p, loadout) for p in roster.pilots]
|
members.members = [FlightMember(p, loadout) for p in roster.pilots]
|
||||||
return members
|
return members
|
||||||
|
|
||||||
@ -61,9 +63,7 @@ class FlightMembers(IFlightRoster):
|
|||||||
else:
|
else:
|
||||||
loadout = Loadout.default_for(self.flight)
|
loadout = Loadout.default_for(self.flight)
|
||||||
if self.flight.squadron.aircraft.name == "F-15I Ra'am":
|
if self.flight.squadron.aircraft.name == "F-15I Ra'am":
|
||||||
loadout.pylons[16] = Weapon.with_clsid(
|
loadout.pylons[16] = Weapon.with_clsid("{IDF_MODS_PROJECT_F-15I_Raam_Dome}")
|
||||||
"{IDF_MODS_PROJECT_F-15I_Raam_Dome}"
|
|
||||||
)
|
|
||||||
for _ in range(new_size - self.max_size):
|
for _ in range(new_size - self.max_size):
|
||||||
member = FlightMember(self.flight.squadron.claim_available_pilot(), loadout)
|
member = FlightMember(self.flight.squadron.claim_available_pilot(), loadout)
|
||||||
member.use_custom_loadout = loadout.is_custom
|
member.use_custom_loadout = loadout.is_custom
|
||||||
|
|||||||
@ -11,10 +11,14 @@ if TYPE_CHECKING:
|
|||||||
|
|
||||||
class FlightRoster(IFlightRoster):
|
class FlightRoster(IFlightRoster):
|
||||||
def __init__(self, squadron: Squadron, initial_size: int = 0) -> None:
|
def __init__(self, squadron: Squadron, initial_size: int = 0) -> None:
|
||||||
self.squadron = squadron
|
self._squadron = squadron
|
||||||
self.pilots: list[Optional[Pilot]] = []
|
self.pilots: list[Optional[Pilot]] = []
|
||||||
self.resize(initial_size)
|
self.resize(initial_size)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def squadron(self) -> Squadron:
|
||||||
|
return self._squadron
|
||||||
|
|
||||||
def iter_pilots(self) -> Iterator[Pilot | None]:
|
def iter_pilots(self) -> Iterator[Pilot | None]:
|
||||||
yield from self.pilots
|
yield from self.pilots
|
||||||
|
|
||||||
|
|||||||
@ -4,7 +4,7 @@ from abc import ABC, abstractmethod
|
|||||||
from typing import Optional, TYPE_CHECKING, Iterator
|
from typing import Optional, TYPE_CHECKING, Iterator
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from game.squadrons import Pilot
|
from game.squadrons import Pilot, Squadron
|
||||||
|
|
||||||
|
|
||||||
class IFlightRoster(ABC):
|
class IFlightRoster(ABC):
|
||||||
@ -16,6 +16,11 @@ class IFlightRoster(ABC):
|
|||||||
def pilot_at(self, idx: int) -> Pilot | None:
|
def pilot_at(self, idx: int) -> Pilot | None:
|
||||||
...
|
...
|
||||||
|
|
||||||
|
@property
|
||||||
|
@abstractmethod
|
||||||
|
def squadron(self) -> Squadron:
|
||||||
|
...
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def max_size(self) -> int:
|
def max_size(self) -> int:
|
||||||
|
|||||||
@ -275,7 +275,7 @@ class AircraftGenerator:
|
|||||||
or flight.client_count
|
or flight.client_count
|
||||||
and (
|
and (
|
||||||
not self.need_ecm
|
not self.need_ecm
|
||||||
or flight.loadout.has_weapon_of_type(WeaponType.JAMMER)
|
or flight.any_member_has_weapon_of_type(WeaponType.JAMMER)
|
||||||
)
|
)
|
||||||
):
|
):
|
||||||
self.ewrj_package_dict[id(flight.package)].append(group)
|
self.ewrj_package_dict[id(flight.package)].append(group)
|
||||||
|
|||||||
@ -149,7 +149,7 @@ class FlightGroupSpawner:
|
|||||||
raise RuntimeError(
|
raise RuntimeError(
|
||||||
f"Cannot spawn fixed-wing aircraft at {cp} because of insufficient ground spawn slots."
|
f"Cannot spawn fixed-wing aircraft at {cp} because of insufficient ground spawn slots."
|
||||||
)
|
)
|
||||||
pilot_count = len(self.flight.roster.pilots)
|
pilot_count = len(self.flight.roster.members)
|
||||||
if (
|
if (
|
||||||
not is_heli
|
not is_heli
|
||||||
and self.flight.roster.player_count != pilot_count
|
and self.flight.roster.player_count != pilot_count
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
from collections.abc import Iterator
|
from collections.abc import Iterator
|
||||||
from contextlib import contextmanager
|
from contextlib import contextmanager
|
||||||
|
|
||||||
from PySide6.QtWidgets import QWidget
|
from PySide2.QtWidgets import QWidget
|
||||||
|
|
||||||
|
|
||||||
@contextmanager
|
@contextmanager
|
||||||
|
|||||||
@ -16,10 +16,14 @@ class QFlightPlanner(QTabWidget):
|
|||||||
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.payload_tab = QFlightPayloadTab(flight, gm.game)
|
self.payload_tab = QFlightPayloadTab(flight, gm.game)
|
||||||
|
self.general_settings_tab = QGeneralFlightSettingsTab(
|
||||||
|
gm,
|
||||||
|
package_model,
|
||||||
|
flight,
|
||||||
|
self.waypoint_tab.flight_waypoint_list,
|
||||||
|
self.payload_tab,
|
||||||
|
)
|
||||||
self.general_settings_tab.flight_size_changed.connect(
|
self.general_settings_tab.flight_size_changed.connect(
|
||||||
self.payload_tab.resize_for_flight
|
self.payload_tab.resize_for_flight
|
||||||
)
|
)
|
||||||
|
|||||||
@ -5,11 +5,11 @@ from PySide2.QtWidgets import (
|
|||||||
QLabel,
|
QLabel,
|
||||||
QHBoxLayout,
|
QHBoxLayout,
|
||||||
QVBoxLayout,
|
QVBoxLayout,
|
||||||
QScrollArea,
|
|
||||||
QWidget,
|
QWidget,
|
||||||
QSpinBox,
|
QSpinBox,
|
||||||
QSlider,
|
QSlider,
|
||||||
QCheckBox,
|
QCheckBox,
|
||||||
|
QScrollArea,
|
||||||
)
|
)
|
||||||
|
|
||||||
from game import Game
|
from game import Game
|
||||||
@ -147,7 +147,12 @@ class QFlightPayloadTab(QFrame):
|
|||||||
scroll.setWidgetResizable(True)
|
scroll.setWidgetResizable(True)
|
||||||
scroll.setWidget(scroll_content)
|
scroll.setWidget(scroll_content)
|
||||||
scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
|
scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
|
||||||
layout.addWidget(scroll)
|
layout.addWidget(scroll, stretch=1)
|
||||||
|
|
||||||
|
self.property_editor = PropertyEditor(
|
||||||
|
self.flight, self.member_selector.selected_member
|
||||||
|
)
|
||||||
|
scrolling_layout.addLayout(self.property_editor)
|
||||||
|
|
||||||
# Docs Link
|
# Docs Link
|
||||||
docsText = QLabel(
|
docsText = QLabel(
|
||||||
@ -156,26 +161,15 @@ class QFlightPayloadTab(QFrame):
|
|||||||
docsText.setAlignment(Qt.AlignCenter)
|
docsText.setAlignment(Qt.AlignCenter)
|
||||||
docsText.setOpenExternalLinks(True)
|
docsText.setOpenExternalLinks(True)
|
||||||
|
|
||||||
self.scroll_area = QScrollArea()
|
|
||||||
self.property_editor = QWidget()
|
|
||||||
self.property_editor.setLayout(PropertyEditor(self.flight))
|
|
||||||
self.scroll_area.setWidget(self.property_editor)
|
|
||||||
layout.addWidget(self.scroll_area)
|
|
||||||
|
|
||||||
self.fuel_selector = DcsFuelSelector(flight)
|
self.fuel_selector = DcsFuelSelector(flight)
|
||||||
layout.addLayout(self.fuel_selector)
|
layout.addLayout(self.fuel_selector)
|
||||||
|
|
||||||
self.loadout_selector = DcsLoadoutSelector(flight)
|
|
||||||
self.property_editor = PropertyEditor(
|
|
||||||
self.flight, self.member_selector.selected_member
|
|
||||||
)
|
|
||||||
scrolling_layout.addLayout(self.property_editor)
|
|
||||||
self.loadout_selector = DcsLoadoutSelector(
|
self.loadout_selector = DcsLoadoutSelector(
|
||||||
flight, self.member_selector.selected_member
|
flight, self.member_selector.selected_member
|
||||||
)
|
)
|
||||||
self.loadout_selector.currentIndexChanged.connect(self.on_new_loadout)
|
self.loadout_selector.currentIndexChanged.connect(self.on_new_loadout)
|
||||||
layout.addWidget(self.loadout_selector)
|
layout.addWidget(self.loadout_selector)
|
||||||
layout.addWidget(self.payload_editor, stretch=1)
|
layout.addWidget(self.payload_editor, stretch=3)
|
||||||
layout.addWidget(docsText)
|
layout.addWidget(docsText)
|
||||||
|
|
||||||
self.setLayout(layout)
|
self.setLayout(layout)
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
from PySide6.QtWidgets import QCheckBox
|
from PySide2.QtWidgets import QCheckBox
|
||||||
from dcs.unitpropertydescription import UnitPropertyDescription
|
from dcs.unitpropertydescription import UnitPropertyDescription
|
||||||
|
|
||||||
from game.ato.flightmember import FlightMember
|
from game.ato.flightmember import FlightMember
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
from PySide6.QtWidgets import QComboBox
|
from PySide2.QtWidgets import QComboBox
|
||||||
from dcs.unitpropertydescription import UnitPropertyDescription
|
from dcs.unitpropertydescription import UnitPropertyDescription
|
||||||
|
|
||||||
from game.ato.flightmember import FlightMember
|
from game.ato.flightmember import FlightMember
|
||||||
|
|||||||
@ -1,7 +1,8 @@
|
|||||||
import logging
|
import logging
|
||||||
from typing import Callable
|
from typing import Callable, Optional
|
||||||
|
|
||||||
from PySide2.QtWidgets import QGridLayout, QLabel
|
from PySide2.QtCore import QRect
|
||||||
|
from PySide2.QtWidgets import QGridLayout, QLabel, QWidget
|
||||||
from dcs.unitpropertydescription import UnitPropertyDescription
|
from dcs.unitpropertydescription import UnitPropertyDescription
|
||||||
|
|
||||||
from game.ato import Flight
|
from game.ato import Flight
|
||||||
@ -23,6 +24,10 @@ class PropertyEditor(QGridLayout):
|
|||||||
self.flight_member = flight_member
|
self.flight_member = flight_member
|
||||||
self.flight_member_update_listeners: list[Callable[[FlightMember], None]] = []
|
self.flight_member_update_listeners: list[Callable[[FlightMember], None]] = []
|
||||||
|
|
||||||
|
self.build_props(flight)
|
||||||
|
|
||||||
|
def build_props(self, flight):
|
||||||
|
self.setGeometry(QRect())
|
||||||
for row, prop in enumerate(flight.unit_type.iter_props()):
|
for row, prop in enumerate(flight.unit_type.iter_props()):
|
||||||
if prop.label is None:
|
if prop.label is None:
|
||||||
if prop.control != "label":
|
if prop.control != "label":
|
||||||
@ -54,7 +59,7 @@ class PropertyEditor(QGridLayout):
|
|||||||
if widget is not None:
|
if widget is not None:
|
||||||
self.addWidget(widget, row, 1)
|
self.addWidget(widget, row, 1)
|
||||||
|
|
||||||
def control_for_property(self, prop: UnitPropertyDescription) -> QWidget | None:
|
def control_for_property(self, prop: UnitPropertyDescription) -> Optional[QWidget]:
|
||||||
# Valid values are:
|
# Valid values are:
|
||||||
# "checkbox", "comboList", "groupbox", "label", "slider", "spinbox"
|
# "checkbox", "comboList", "groupbox", "label", "slider", "spinbox"
|
||||||
match prop.control:
|
match prop.control:
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
from PySide6.QtWidgets import QSpinBox
|
from PySide2.QtWidgets import QSpinBox
|
||||||
from dcs.unitpropertydescription import UnitPropertyDescription
|
from dcs.unitpropertydescription import UnitPropertyDescription
|
||||||
|
|
||||||
from game.ato.flightmember import FlightMember
|
from game.ato.flightmember import FlightMember
|
||||||
|
|||||||
@ -91,8 +91,10 @@ class PilotSelector(QComboBox):
|
|||||||
|
|
||||||
|
|
||||||
class PilotControls(QHBoxLayout):
|
class PilotControls(QHBoxLayout):
|
||||||
|
player_toggled = Signal()
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self, squadron: Union[Squadron, None], roster: Optional[FlightRoster], idx: int
|
self, squadron: Optional[Squadron], roster: Optional[FlightRoster], idx: int
|
||||||
) -> None:
|
) -> None:
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.roster = roster
|
self.roster = roster
|
||||||
@ -125,6 +127,7 @@ class PilotControls(QHBoxLayout):
|
|||||||
logging.error("Cannot toggle state of a pilot when none is selected")
|
logging.error("Cannot toggle state of a pilot when none is selected")
|
||||||
return
|
return
|
||||||
pilot.player = checked
|
pilot.player = checked
|
||||||
|
self.player_toggled.emit()
|
||||||
|
|
||||||
def on_pilot_changed(self, index: int) -> None:
|
def on_pilot_changed(self, index: int) -> None:
|
||||||
pilot = self.selector.itemData(index)
|
pilot = self.selector.itemData(index)
|
||||||
@ -168,7 +171,9 @@ class PilotControls(QHBoxLayout):
|
|||||||
class FlightRosterEditor(QVBoxLayout):
|
class FlightRosterEditor(QVBoxLayout):
|
||||||
MAX_PILOTS = 4
|
MAX_PILOTS = 4
|
||||||
|
|
||||||
def __init__(self, squadron: Union[Squadron, None], roster: Union[IFlightRoster, None]) -> None:
|
def __init__(
|
||||||
|
self, squadron: Optional[Squadron], roster: Optional[IFlightRoster]
|
||||||
|
) -> None:
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.roster = roster
|
self.roster = roster
|
||||||
|
|
||||||
|
|||||||
@ -3,6 +3,7 @@ from PySide2.QtWidgets import QFrame, QGridLayout, QVBoxLayout
|
|||||||
|
|
||||||
from game.ato.flight import Flight
|
from game.ato.flight import Flight
|
||||||
from qt_ui.models import PackageModel, GameModel
|
from qt_ui.models import PackageModel, GameModel
|
||||||
|
from qt_ui.windows.mission.flight.payload.QFlightPayloadTab import QFlightPayloadTab
|
||||||
from qt_ui.windows.mission.flight.settings.FlightPlanPropertiesGroup import (
|
from qt_ui.windows.mission.flight.settings.FlightPlanPropertiesGroup import (
|
||||||
FlightPlanPropertiesGroup,
|
FlightPlanPropertiesGroup,
|
||||||
)
|
)
|
||||||
@ -27,11 +28,16 @@ class QGeneralFlightSettingsTab(QFrame):
|
|||||||
package_model: PackageModel,
|
package_model: PackageModel,
|
||||||
flight: Flight,
|
flight: Flight,
|
||||||
flight_wpt_list: QFlightWaypointList,
|
flight_wpt_list: QFlightWaypointList,
|
||||||
|
payload_tab: QFlightPayloadTab,
|
||||||
):
|
):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
||||||
self.flight_slot_editor = QFlightSlotEditor(package_model, flight, game.game)
|
self.flight_slot_editor = QFlightSlotEditor(package_model, flight, game.game)
|
||||||
self.flight_slot_editor.flight_resized.connect(self.flight_size_changed)
|
self.flight_slot_editor.flight_resized.connect(self.flight_size_changed)
|
||||||
|
for pc in self.flight_slot_editor.roster_editor.pilot_controls:
|
||||||
|
pc.player_toggled.connect(
|
||||||
|
lambda: payload_tab.property_editor.build_props(flight)
|
||||||
|
)
|
||||||
|
|
||||||
widgets = [
|
widgets = [
|
||||||
QFlightTypeTaskInfo(flight),
|
QFlightTypeTaskInfo(flight),
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user