mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
Previously we were sorting by task first and price second. Much easier to find things if they're sorted by name (although longer term we should make the sort option selectable).
112 lines
3.7 KiB
Python
112 lines
3.7 KiB
Python
from typing import Optional, Set
|
|
|
|
from PySide2.QtCore import Qt
|
|
from PySide2.QtWidgets import (
|
|
QFrame,
|
|
QGridLayout,
|
|
QHBoxLayout,
|
|
QLabel,
|
|
QScrollArea,
|
|
QVBoxLayout,
|
|
QWidget,
|
|
)
|
|
from dcs.unittype import UnitType
|
|
|
|
from game.event.event import UnitsDeliveryEvent
|
|
from qt_ui.models import GameModel
|
|
from qt_ui.uiconstants import ICONS
|
|
from qt_ui.windows.basemenu.QRecruitBehaviour import QRecruitBehaviour
|
|
from theater import CAP, CAS, ControlPoint, db
|
|
|
|
|
|
class QAircraftRecruitmentMenu(QFrame, QRecruitBehaviour):
|
|
def __init__(self, cp: ControlPoint, game_model: GameModel) -> None:
|
|
QFrame.__init__(self)
|
|
self.cp = cp
|
|
self.game_model = game_model
|
|
self.deliveryEvent: Optional[UnitsDeliveryEvent] = None
|
|
|
|
self.bought_amount_labels = {}
|
|
self.existing_units_labels = {}
|
|
|
|
for event in self.game_model.game.events:
|
|
if event.__class__ == UnitsDeliveryEvent and event.from_cp == self.cp:
|
|
self.deliveryEvent = event
|
|
if not self.deliveryEvent:
|
|
self.deliveryEvent = self.game_model.game.units_delivery_event(self.cp)
|
|
|
|
# Determine maximum number of aircrafts that can be bought
|
|
self.set_maximum_units(self.cp.available_aircraft_slots)
|
|
self.set_recruitable_types([CAP, CAS])
|
|
|
|
self.bought_amount_labels = {}
|
|
self.existing_units_labels = {}
|
|
|
|
self.hangar_status = QHangarStatus(self.total_units, self.cp.available_aircraft_slots)
|
|
|
|
self.init_ui()
|
|
|
|
def init_ui(self):
|
|
main_layout = QVBoxLayout()
|
|
|
|
tasks = [CAP, CAS]
|
|
|
|
scroll_content = QWidget()
|
|
task_box_layout = QGridLayout()
|
|
row = 0
|
|
|
|
unit_types: Set[UnitType] = set()
|
|
for task in tasks:
|
|
units = db.find_unittype(task, self.game_model.game.player_name)
|
|
if not units:
|
|
continue
|
|
for unit in units:
|
|
if self.cp.is_carrier and unit not in db.CARRIER_CAPABLE:
|
|
continue
|
|
if self.cp.is_lha and unit not in db.LHA_CAPABLE:
|
|
continue
|
|
unit_types.add(unit)
|
|
|
|
sorted_units = sorted(unit_types, key=lambda u: db.unit_type_name_2(u))
|
|
for unit_type in sorted_units:
|
|
row = self.add_purchase_row(unit_type, task_box_layout, row)
|
|
stretch = QVBoxLayout()
|
|
stretch.addStretch()
|
|
task_box_layout.addLayout(stretch, row, 0)
|
|
|
|
scroll_content.setLayout(task_box_layout)
|
|
scroll = QScrollArea()
|
|
scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
|
|
scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
|
|
scroll.setWidgetResizable(True)
|
|
scroll.setWidget(scroll_content)
|
|
main_layout.addLayout(self.hangar_status)
|
|
main_layout.addWidget(scroll)
|
|
self.setLayout(main_layout)
|
|
|
|
def buy(self, unit_type):
|
|
super().buy(unit_type)
|
|
self.hangar_status.update_label(self.total_units, self.cp.available_aircraft_slots)
|
|
|
|
def sell(self, unit_type):
|
|
super().sell(unit_type)
|
|
self.hangar_status.update_label(self.total_units, self.cp.available_aircraft_slots)
|
|
|
|
|
|
class QHangarStatus(QHBoxLayout):
|
|
|
|
def __init__(self, current_amount: int, max_amount: int):
|
|
super(QHangarStatus, self).__init__()
|
|
self.icon = QLabel()
|
|
self.icon.setPixmap(ICONS["Hangar"])
|
|
self.text = QLabel("")
|
|
|
|
self.update_label(current_amount, max_amount)
|
|
self.addWidget(self.icon, Qt.AlignLeft)
|
|
self.addWidget(self.text, Qt.AlignLeft)
|
|
self.addStretch(50)
|
|
self.setAlignment(Qt.AlignLeft)
|
|
|
|
def update_label(self, current_amount: int, max_amount: int):
|
|
self.text.setText("<strong>{}/{}</strong>".format(current_amount, max_amount))
|