Babysteps towards fully editable faction

This commit is contained in:
Raffson 2024-05-25 02:18:43 +02:00
parent 692ceefadb
commit 13509bbda5
No known key found for this signature in database
GPG Key ID: B0402B2C9B764D99
3 changed files with 144 additions and 11 deletions

View File

@ -28,6 +28,7 @@ from qt_ui.models import AirWingModel, AtoModel, GameModel, SquadronModel
from qt_ui.simcontroller import SimController
from qt_ui.windows.AirWingConfigurationDialog import AirWingConfigurationDialog
from qt_ui.windows.SquadronDialog import SquadronDialog
from qt_ui.windows.newgame.WizardPages.QFactionSelection import QFactionUnits
class SquadronDelegate(TwoColumnRowDelegate):
@ -238,6 +239,8 @@ class AirWingTabs(QTabWidget):
def __init__(self, game_model: GameModel) -> None:
super().__init__()
self.game_model = game_model
self.addTab(
SquadronList(
game_model.ato_model,
@ -260,18 +263,33 @@ class AirWingTabs(QTabWidget):
if game_model.game.settings.enable_air_wing_adjustments:
pb = QPushButton("Open Air Wing Config Dialog")
pb.clicked.connect(lambda _: self.open_awcd(game_model))
pb.clicked.connect(self.open_awcd)
pb.setMaximumWidth(300)
layout = QHBoxLayout()
layout.addWidget(pb)
w = QWidget(layout=layout)
self.addTab(w, "Cheats")
def open_awcd(self, gm: GameModel):
AirWingConfigurationDialog(gm.game, True, self).exec_()
self.addTab(
QFactionUnits(
game_model.game.coalition_for(True).faction,
self,
),
"Faction OWNFOR",
)
self.addTab(
QFactionUnits(
game_model.game.coalition_for(False).faction,
self,
),
"Faction OPFOR",
)
def open_awcd(self):
AirWingConfigurationDialog(self.game_model.game, True, self).exec_()
events = GameUpdateEvents().begin_new_turn()
EventStream.put_nowait(events)
gm.ato_model.on_sim_update(events)
self.game_model.ato_model.on_sim_update(events)
class AirWingDialog(QDialog):

View File

@ -1,7 +1,7 @@
from __future__ import unicode_literals
from copy import deepcopy
from typing import Union
from typing import Union, Callable, Set, Optional
from PySide6 import QtWidgets, QtGui
from PySide6.QtCore import Qt
@ -12,9 +12,16 @@ from PySide6.QtWidgets import (
QCheckBox,
QLabel,
QTextBrowser,
QPushButton,
QComboBox,
QHBoxLayout,
)
from game.ato import FlightType
from game.campaignloader import Campaign
from game.dcs.aircrafttype import AircraftType
from game.dcs.groundunittype import GroundUnitType
from game.dcs.unittype import UnitType
from game.factions import Faction, FACTIONS
from qt_ui.windows.newgame.jinja_env import jinja_env
@ -29,7 +36,13 @@ class QFactionUnits(QScrollArea):
self.faction = faction
self._create_checkboxes()
def _add_checkboxes(self, units: set, counter: int, grid: QGridLayout) -> int:
def _add_checkboxes(
self,
units: set,
counter: int,
grid: QGridLayout,
combo_layout: Optional[QHBoxLayout] = None,
) -> int:
counter += 1
for i, v in enumerate(sorted(units, key=lambda x: str(x)), counter):
cb = QCheckBox(str(v))
@ -37,6 +50,9 @@ class QFactionUnits(QScrollArea):
self.checkboxes[str(v)] = cb
grid.addWidget(cb, i, 1)
counter += 1
if combo_layout:
counter += 1
grid.addLayout(combo_layout, counter, 1)
counter += 1
return counter
@ -44,18 +60,47 @@ class QFactionUnits(QScrollArea):
counter = 0
self.checkboxes: dict[str, QCheckBox] = {}
grid = QGridLayout()
grid.setColumnStretch(1, 1)
if len(self.faction.aircraft) > 0:
self.add_ac_combo = QComboBox()
hbox = self._create_aircraft_combobox(
self.add_ac_combo,
lambda: self._on_add_ac(self.faction.aircraft, self.add_ac_combo),
self._aircraft_predicate,
)
grid.addWidget(QLabel("<strong>Aircraft:</strong>"), counter, 0)
counter = self._add_checkboxes(self.faction.aircraft, counter, grid)
counter = self._add_checkboxes(self.faction.aircraft, counter, grid, hbox)
if len(self.faction.awacs) > 0:
self.add_awacs_combo = QComboBox()
hbox = self._create_aircraft_combobox(
self.add_awacs_combo,
lambda: self._on_add_ac(self.faction.awacs, self.add_awacs_combo),
self._awacs_predicate,
)
grid.addWidget(QLabel("<strong>AWACS:</strong>"), counter, 0)
counter = self._add_checkboxes(self.faction.awacs, counter, grid)
counter = self._add_checkboxes(self.faction.awacs, counter, grid, hbox)
if len(self.faction.tankers) > 0:
self.add_tanker_combo = QComboBox()
hbox = self._create_aircraft_combobox(
self.add_tanker_combo,
lambda: self._on_add_ac(self.faction.tankers, self.add_tanker_combo),
self._tanker_predicate,
)
grid.addWidget(QLabel("<strong>Tankers:</strong>"), counter, 0)
counter = self._add_checkboxes(self.faction.tankers, counter, grid)
counter = self._add_checkboxes(self.faction.tankers, counter, grid, hbox)
if len(self.faction.frontline_units) > 0:
self.add_frontline_combo = QComboBox()
hbox = self._create_unit_combobox(
self.add_frontline_combo,
lambda: self._on_add_unit(
self.faction.frontline_units, self.add_frontline_combo
),
self.faction.frontline_units,
)
grid.addWidget(QLabel("<strong>Frontlines vehicles:</strong>"), counter, 0)
counter = self._add_checkboxes(self.faction.frontline_units, counter, grid)
counter = self._add_checkboxes(
self.faction.frontline_units, counter, grid, hbox
)
if len(self.faction.artillery_units) > 0:
grid.addWidget(QLabel("<strong>Artillery units:</strong>"), counter, 0)
counter = self._add_checkboxes(self.faction.artillery_units, counter, grid)
@ -82,6 +127,76 @@ class QFactionUnits(QScrollArea):
self.content.setLayout(grid)
def _aircraft_predicate(self, ac: AircraftType):
if (
FlightType.AEWC not in ac.task_priorities
and FlightType.REFUELING not in ac.task_priorities
):
self.add_ac_combo.addItem(ac.variant_id, ac)
def _awacs_predicate(self, ac: AircraftType):
if FlightType.AEWC in ac.task_priorities:
self.add_awacs_combo.addItem(ac.variant_id, ac)
def _tanker_predicate(self, ac: AircraftType):
if FlightType.REFUELING in ac.task_priorities:
self.add_tanker_combo.addItem(ac.variant_id, ac)
def _create_aircraft_combobox(
self, cb: QComboBox, callback: Callable, predicate: Callable
):
for ac_dcs in sorted(AircraftType.each_dcs_type(), key=lambda x: x.id):
if (
ac_dcs not in self.faction.country.planes
and ac_dcs not in self.faction.country.helicopters
):
continue
for ac in AircraftType.for_dcs_type(ac_dcs):
if ac in self.faction.aircraft:
continue
predicate(ac)
add_ac = QPushButton("+")
add_ac.setStyleSheet("QPushButton{ font-weight: bold; }")
add_ac.setFixedWidth(50)
add_ac.clicked.connect(callback)
hbox = QHBoxLayout()
hbox.addWidget(cb)
hbox.addWidget(add_ac)
return hbox
def _create_unit_combobox(
self, cb: QComboBox, callback: Callable, units: Set[GroundUnitType]
):
for dcs_unit in sorted(GroundUnitType.each_dcs_type(), key=lambda x: x.id):
if dcs_unit not in self.faction.country.vehicles:
continue
for unit in GroundUnitType.for_dcs_type(dcs_unit):
if unit in units:
continue
cb.addItem(unit.variant_id, unit)
add_unit = QPushButton("+")
add_unit.setStyleSheet("QPushButton{ font-weight: bold; }")
add_unit.setFixedWidth(50)
add_unit.clicked.connect(callback)
hbox = QHBoxLayout()
hbox.addWidget(cb)
hbox.addWidget(add_unit)
return hbox
def _on_add_unit(self, units: Set[UnitType], cb: QComboBox):
units.add(cb.currentData())
if self.faction.__dict__.get("accessible_units"):
# invalidate the cached property
del self.faction.__dict__["accessible_units"]
self.updateFaction(self.faction)
def _on_add_ac(self, aircraft: Set[AircraftType], cb: QComboBox):
aircraft.add(cb.currentData())
if self.faction.__dict__.get("all_aircrafts"):
# invalidate the cached property
del self.faction.__dict__["all_aircrafts"]
self.updateFaction(self.faction)
def updateFaction(self, faction: Faction):
self.faction = faction
self.content = QWidget()

View File

@ -32,7 +32,7 @@ pluggy==1.5.0
pre-commit==3.7.0
pydantic==2.7.1
pydantic-settings==2.2.1
pydcs @ git+https://github.com/dcs-retribution/pydcs@a8f3a0b26b78c37c88e58e7f32a30305a1568de5
pydcs @ git+https://github.com/dcs-retribution/pydcs@805088f20263025eda61398d10383e4d73945dc7
pyinstaller==5.13.2
pyinstaller-hooks-contrib==2024.0
pyparsing==3.1.2