Streamlining

This commit is contained in:
Raffson 2023-10-01 20:14:22 +02:00
parent 110866cd34
commit d4eefd0b55
No known key found for this signature in database
GPG Key ID: B0402B2C9B764D99
15 changed files with 68 additions and 42 deletions

View File

@ -111,11 +111,14 @@ class Flight(SidcDescribable, RadioFrequencyContainer, TacanContainer):
is_f18 = self.squadron.aircraft.dcs_unit_type.id == FA_18C_hornet.id
on_land = not self.squadron.location.is_fleet
if on_land and is_f18 and self.coalition.game.settings.atflir_autoswap:
self.loadout.pylons[F18_TGP_PYLON] = Weapon.with_clsid(
str(
FA_18C_hornet.Pylon4.AN_AAQ_28_LITENING___Targeting_Pod_[1]["clsid"]
for fm in self.roster.members:
fm.loadout.pylons[F18_TGP_PYLON] = Weapon.with_clsid(
str(
FA_18C_hornet.Pylon4.AN_AAQ_28_LITENING___Targeting_Pod_[1][
"clsid"
]
)
)
)
@property
def flight_plan(self) -> FlightPlan[Any]:

View File

@ -10,7 +10,7 @@ from .loadouts import Loadout
from ..data.weapons import Weapon
if TYPE_CHECKING:
from game.squadrons import Pilot
from game.squadrons import Pilot, Squadron
from .flight import Flight
@ -20,14 +20,16 @@ class FlightMembers(IFlightRoster):
self.members: list[FlightMember] = []
self.resize(initial_size)
@property
def squadron(self) -> Squadron:
return self.flight.squadron
@staticmethod
def from_roster(flight: Flight, roster: FlightRoster) -> FlightMembers:
members = FlightMembers(flight)
loadout = Loadout.default_for(flight)
if flight.squadron.aircraft.name == "F-15I Ra'am":
loadout.pylons[16] = Weapon.with_clsid(
"{IDF_MODS_PROJECT_F-15I_Raam_Dome}"
)
loadout.pylons[16] = Weapon.with_clsid("{IDF_MODS_PROJECT_F-15I_Raam_Dome}")
members.members = [FlightMember(p, loadout) for p in roster.pilots]
return members
@ -61,9 +63,7 @@ class FlightMembers(IFlightRoster):
else:
loadout = Loadout.default_for(self.flight)
if self.flight.squadron.aircraft.name == "F-15I Ra'am":
loadout.pylons[16] = Weapon.with_clsid(
"{IDF_MODS_PROJECT_F-15I_Raam_Dome}"
)
loadout.pylons[16] = Weapon.with_clsid("{IDF_MODS_PROJECT_F-15I_Raam_Dome}")
for _ in range(new_size - self.max_size):
member = FlightMember(self.flight.squadron.claim_available_pilot(), loadout)
member.use_custom_loadout = loadout.is_custom

View File

@ -11,10 +11,14 @@ if TYPE_CHECKING:
class FlightRoster(IFlightRoster):
def __init__(self, squadron: Squadron, initial_size: int = 0) -> None:
self.squadron = squadron
self._squadron = squadron
self.pilots: list[Optional[Pilot]] = []
self.resize(initial_size)
@property
def squadron(self) -> Squadron:
return self._squadron
def iter_pilots(self) -> Iterator[Pilot | None]:
yield from self.pilots

View File

@ -4,7 +4,7 @@ from abc import ABC, abstractmethod
from typing import Optional, TYPE_CHECKING, Iterator
if TYPE_CHECKING:
from game.squadrons import Pilot
from game.squadrons import Pilot, Squadron
class IFlightRoster(ABC):
@ -16,6 +16,11 @@ class IFlightRoster(ABC):
def pilot_at(self, idx: int) -> Pilot | None:
...
@property
@abstractmethod
def squadron(self) -> Squadron:
...
@property
@abstractmethod
def max_size(self) -> int:

View File

@ -275,7 +275,7 @@ class AircraftGenerator:
or flight.client_count
and (
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)

View File

@ -149,7 +149,7 @@ class FlightGroupSpawner:
raise RuntimeError(
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 (
not is_heli
and self.flight.roster.player_count != pilot_count

View File

@ -1,7 +1,7 @@
from collections.abc import Iterator
from contextlib import contextmanager
from PySide6.QtWidgets import QWidget
from PySide2.QtWidgets import QWidget
@contextmanager

View File

@ -16,10 +16,14 @@ class QFlightPlanner(QTabWidget):
self.payload_tab = QFlightPayloadTab(flight, gm.game)
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.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.payload_tab.resize_for_flight
)

View File

@ -5,11 +5,11 @@ from PySide2.QtWidgets import (
QLabel,
QHBoxLayout,
QVBoxLayout,
QScrollArea,
QWidget,
QSpinBox,
QSlider,
QCheckBox,
QScrollArea,
)
from game import Game
@ -147,7 +147,12 @@ class QFlightPayloadTab(QFrame):
scroll.setWidgetResizable(True)
scroll.setWidget(scroll_content)
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
docsText = QLabel(
@ -156,26 +161,15 @@ class QFlightPayloadTab(QFrame):
docsText.setAlignment(Qt.AlignCenter)
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)
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(
flight, self.member_selector.selected_member
)
self.loadout_selector.currentIndexChanged.connect(self.on_new_loadout)
layout.addWidget(self.loadout_selector)
layout.addWidget(self.payload_editor, stretch=1)
layout.addWidget(self.payload_editor, stretch=3)
layout.addWidget(docsText)
self.setLayout(layout)
@ -232,7 +226,7 @@ class QFlightPayloadTab(QFrame):
loadout = self.flight.loadout
self.loadout_selector.addItem(payload_name, loadout)
self.loadout_selector.setCurrentIndex(self.loadout_selector.count() - 1)
def on_same_loadout_toggled(self, checked: bool) -> None:
self.flight.use_same_loadout_for_all_members = checked
if self.member_selector.value():

View File

@ -1,4 +1,4 @@
from PySide6.QtWidgets import QCheckBox
from PySide2.QtWidgets import QCheckBox
from dcs.unitpropertydescription import UnitPropertyDescription
from game.ato.flightmember import FlightMember

View File

@ -1,4 +1,4 @@
from PySide6.QtWidgets import QComboBox
from PySide2.QtWidgets import QComboBox
from dcs.unitpropertydescription import UnitPropertyDescription
from game.ato.flightmember import FlightMember

View File

@ -1,7 +1,8 @@
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 game.ato import Flight
@ -23,6 +24,10 @@ class PropertyEditor(QGridLayout):
self.flight_member = flight_member
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()):
if prop.label is None:
if prop.control != "label":
@ -54,7 +59,7 @@ class PropertyEditor(QGridLayout):
if widget is not None:
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:
# "checkbox", "comboList", "groupbox", "label", "slider", "spinbox"
match prop.control:

View File

@ -1,4 +1,4 @@
from PySide6.QtWidgets import QSpinBox
from PySide2.QtWidgets import QSpinBox
from dcs.unitpropertydescription import UnitPropertyDescription
from game.ato.flightmember import FlightMember

View File

@ -91,8 +91,10 @@ class PilotSelector(QComboBox):
class PilotControls(QHBoxLayout):
player_toggled = Signal()
def __init__(
self, squadron: Union[Squadron, None], roster: Optional[FlightRoster], idx: int
self, squadron: Optional[Squadron], roster: Optional[FlightRoster], idx: int
) -> None:
super().__init__()
self.roster = roster
@ -125,6 +127,7 @@ class PilotControls(QHBoxLayout):
logging.error("Cannot toggle state of a pilot when none is selected")
return
pilot.player = checked
self.player_toggled.emit()
def on_pilot_changed(self, index: int) -> None:
pilot = self.selector.itemData(index)
@ -168,7 +171,9 @@ class PilotControls(QHBoxLayout):
class FlightRosterEditor(QVBoxLayout):
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__()
self.roster = roster

View File

@ -3,6 +3,7 @@ from PySide2.QtWidgets import QFrame, QGridLayout, QVBoxLayout
from game.ato.flight import Flight
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 (
FlightPlanPropertiesGroup,
)
@ -27,11 +28,16 @@ class QGeneralFlightSettingsTab(QFrame):
package_model: PackageModel,
flight: Flight,
flight_wpt_list: QFlightWaypointList,
payload_tab: QFlightPayloadTab,
):
super().__init__()
self.flight_slot_editor = QFlightSlotEditor(package_model, flight, game.game)
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 = [
QFlightTypeTaskInfo(flight),