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,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"
]
) )
) )

View File

@ -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

View File

@ -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

View File

@ -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:

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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
) )

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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:

View File

@ -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

View File

@ -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

View File

@ -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),