mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
Further improvements to livery-selector
Unlocking the full potential, i.e. allowing users to switch back & forth between livery-sets, livery-overrides and normal liveries, including support for overriding flight/flight-member specific liveries.
This commit is contained in:
parent
5aca992140
commit
f79e96a474
@ -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:
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user