diff --git a/game/ato/flightmember.py b/game/ato/flightmember.py index 680dc7ae..a948dd41 100644 --- a/game/ato/flightmember.py +++ b/game/ato/flightmember.py @@ -18,13 +18,12 @@ class FlightMember: self.weapon_laser_code: LaserCode | None = None self.properties: dict[str, bool | float | int] = {} self.livery: Optional[str] = None + self.use_livery_set: bool = True def __setstate__(self, state: dict[str, Any]) -> None: - if "tgp_laser_code" not in state: - state["tgp_laser_code"] = None - if "weapon_laser_code" not in state: - state["weapon_laser_code"] = None - self.__dict__.update(state) + new_state = FlightMember(state["pilot"], state["loadout"]) + new_state.__dict__.update(state) + self.__dict__.update(new_state.__dict__) def assign_tgp_laser_code(self, code: LaserCode) -> None: if self.tgp_laser_code is not None: diff --git a/game/missiongenerator/aircraft/aircraftpainter.py b/game/missiongenerator/aircraft/aircraftpainter.py index 0adf06f0..e93dc766 100644 --- a/game/missiongenerator/aircraft/aircraftpainter.py +++ b/game/missiongenerator/aircraft/aircraftpainter.py @@ -28,12 +28,17 @@ class AircraftPainter: return self.flight.squadron.livery def livery_from_squadron_set(self) -> Optional[str]: - if not self.flight.squadron.livery_set: + if not ( + self.flight.squadron.livery_set and self.flight.squadron.use_livery_set + ): return None return random.choice(self.flight.squadron.livery_set) - def determine_livery(self) -> Optional[str]: - if (livery := self.livery_from_squadron_set()) is not None: + def determine_livery(self, member_uses_livery_set: bool) -> Optional[str]: + if ( + member_uses_livery_set + and (livery := self.livery_from_squadron_set()) is not None + ): return livery if (livery := self.livery_from_squadron()) is not None: return livery @@ -45,7 +50,7 @@ class AircraftPainter: def apply_livery(self) -> None: for unit, member in zip(self.group.units, self.flight.iter_members()): - livery = self.determine_livery() + livery = self.determine_livery(member.use_livery_set) if not (livery or member.livery): continue unit.livery_id = member.livery if member.livery else livery diff --git a/game/squadrons/squadron.py b/game/squadrons/squadron.py index c62d511f..ab109f6b 100644 --- a/game/squadrons/squadron.py +++ b/game/squadrons/squadron.py @@ -70,9 +70,13 @@ class Squadron: untasked_aircraft: int = field(init=False, hash=False, compare=False, default=0) pending_deliveries: int = field(init=False, hash=False, compare=False, default=0) + use_livery_set: bool = False # if livery-set should be used when present + def __setstate__(self, state: dict[str, Any]) -> None: if "id" not in state: state["id"] = uuid4() + if "use_livery_set" not in state: + state["use_livery_set"] = len(state["livery_set"]) > 0 self.__dict__.update(state) def __str__(self) -> str: diff --git a/qt_ui/widgets/combos/QSquadronLiverySelector.py b/qt_ui/widgets/combos/QSquadronLiverySelector.py index d354f70c..d278bf7e 100644 --- a/qt_ui/widgets/combos/QSquadronLiverySelector.py +++ b/qt_ui/widgets/combos/QSquadronLiverySelector.py @@ -4,6 +4,8 @@ from PySide6.QtWidgets import QComboBox from game.squadrons import Squadron +LIVERY_SET_TEXT = "Use livery-set from squadron's yaml" + class SquadronLiverySelector(QComboBox): """ @@ -11,15 +13,17 @@ class SquadronLiverySelector(QComboBox): The combo box will automatically be populated with all available liveries. """ - def __init__( - self, squadron: Squadron, full_list_view_override: bool = False - ) -> None: + def __init__(self, squadron: Squadron, update_squadron: bool = True) -> None: super().__init__() self.setSizeAdjustPolicy(QComboBox.SizeAdjustPolicy.AdjustToContents) + self.squadron = squadron self.aircraft_type = squadron.aircraft selected_livery = squadron.livery + if update_squadron: + self.currentTextChanged.connect(self.on_change) + liveries = set() cc = squadron.coalition.faction.country.shortname aircraft_liveries = set(self.aircraft_type.dcs_unit_type.iter_liveries()) @@ -35,23 +39,32 @@ class SquadronLiverySelector(QComboBox): for x in faction.liveries_overrides.get(self.aircraft_type, []) if x in [y.id.lower() for y in liveries] ] - if ( - selected_livery is None - and squadron.livery_set - and not full_list_view_override - ): - self.addItem("Using livery-set from squadron's yaml", userData=None) - self.setEnabled(False) - return - if selected_livery is None and squadron.aircraft.default_livery: - selected_livery = squadron.aircraft.default_livery + if squadron.livery_set: + self.addItem(LIVERY_SET_TEXT, userData=None) if len(overrides) > 0: self.addItem("Use livery overrides", userData=None) + if ( + selected_livery is None + and not squadron.livery_set + and squadron.aircraft.default_livery + ): + selected_livery = squadron.aircraft.default_livery for livery in sorted(liveries): self.addItem(livery.name, userData=livery.id) - if selected_livery is not None: + if selected_livery is not None and not squadron.livery_set: if selected_livery.lower() == livery.id: self.setCurrentText(livery.name) if len(liveries) == 0: self.addItem("No available liveries (using DCS default)") self.setEnabled(False) + + @property + def using_livery_set(self) -> bool: + return self.currentText() == LIVERY_SET_TEXT + + def on_change(self, text: str) -> None: + self.squadron.livery = self.currentData() + if text == LIVERY_SET_TEXT: + self.squadron.use_livery_set = True + else: + self.squadron.use_livery_set = False diff --git a/qt_ui/windows/AirWingConfigurationDialog.py b/qt_ui/windows/AirWingConfigurationDialog.py index 9f2b9dc1..d4b2ac9b 100644 --- a/qt_ui/windows/AirWingConfigurationDialog.py +++ b/qt_ui/windows/AirWingConfigurationDialog.py @@ -439,7 +439,6 @@ class SquadronConfigurationBox(QGroupBox): if base is None: raise RuntimeError("Base cannot be none") self.squadron.assign_to_base(base) - self.squadron.livery = self.livery_selector.currentData() self.return_players_to_squadron() # Also update the auto assignable mission types diff --git a/qt_ui/windows/SquadronDialog.py b/qt_ui/windows/SquadronDialog.py index 98ac5b40..ab2b72eb 100644 --- a/qt_ui/windows/SquadronDialog.py +++ b/qt_ui/windows/SquadronDialog.py @@ -268,7 +268,6 @@ class SquadronDialog(QDialog): left_column.addWidget(QLabel("Livery")) self.livery_selector = SquadronLiverySelector(self.squadron_model.squadron) - self.livery_selector.currentIndexChanged.connect(self.on_livery_changed) left_column.addWidget(self.livery_selector) auto_assigned_tasks = AutoAssignedTaskControls(squadron_model) @@ -422,6 +421,3 @@ class SquadronDialog(QDialog): if task is None: raise RuntimeError("Selected task cannot be None") self.squadron.primary_task = task - - def on_livery_changed(self) -> None: - self.squadron.livery = self.livery_selector.currentData() diff --git a/qt_ui/windows/mission/flight/payload/QFlightPayloadTab.py b/qt_ui/windows/mission/flight/payload/QFlightPayloadTab.py index 44b3e040..c568cdc6 100644 --- a/qt_ui/windows/mission/flight/payload/QFlightPayloadTab.py +++ b/qt_ui/windows/mission/flight/payload/QFlightPayloadTab.py @@ -152,11 +152,7 @@ class QFlightPayloadTab(QFrame): self.same_livery_for_all_checkbox.toggled.connect(self.on_same_livery_toggled) hbox.addWidget(self.same_livery_for_all_checkbox) self.livery_selector = SquadronLiverySelector( - self.flight.squadron, full_list_view_override=True - ) - self.livery_selector.insertItem(0, "Default", None) - self.livery_selector.setCurrentIndex( - self.livery_selector.findData(self.member_selector.selected_member.livery) + self.flight.squadron, update_squadron=False ) self.livery_selector.currentIndexChanged.connect(self.on_livery_change) hbox.addWidget(self.livery_selector) @@ -313,8 +309,11 @@ class QFlightPayloadTab(QFrame): def on_livery_change(self) -> None: livery = self.livery_selector.currentData() + use_livery_set = self.livery_selector.using_livery_set if self.flight.use_same_livery_for_all_members: for m in self.flight.roster.members: m.livery = livery + m.use_livery_set = use_livery_set else: self.member_selector.selected_member.livery = livery + self.member_selector.selected_member.use_livery_set = use_livery_set