mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
refactor to enum typing and many other fixes fix tests attempt to fix some typescript more typescript fixes more typescript test fixes revert all API changes update to pydcs mypy fixes Use properties to check if player is blue/red/neutral update requirements.txt black -_- bump pydcs and fix mypy add opponent property bump pydcs
115 lines
3.7 KiB
Python
115 lines
3.7 KiB
Python
import logging
|
|
from typing import Callable, Dict, TypeVar
|
|
|
|
from PySide6.QtGui import QIcon, QPixmap, QCloseEvent
|
|
from PySide6.QtWidgets import (
|
|
QDialog,
|
|
QGridLayout,
|
|
QGroupBox,
|
|
QLabel,
|
|
QPushButton,
|
|
QScrollArea,
|
|
QVBoxLayout,
|
|
QWidget,
|
|
)
|
|
|
|
from game.debriefing import Debriefing
|
|
from game.theater import Player
|
|
from qt_ui.windows.GameUpdateSignal import GameUpdateSignal
|
|
|
|
T = TypeVar("T")
|
|
|
|
|
|
class LossGrid(QGridLayout):
|
|
def __init__(self, debriefing: Debriefing, player: Player) -> None:
|
|
super().__init__()
|
|
|
|
self.add_loss_rows(
|
|
debriefing.air_losses.by_type(player), lambda u: u.display_name
|
|
)
|
|
self.add_loss_rows(
|
|
debriefing.front_line_losses_by_type(player), lambda u: str(u)
|
|
)
|
|
self.add_loss_rows(
|
|
debriefing.convoy_losses_by_type(player), lambda u: f"{u} from convoy"
|
|
)
|
|
self.add_loss_rows(
|
|
debriefing.cargo_ship_losses_by_type(player),
|
|
lambda u: f"{u} from cargo ship",
|
|
)
|
|
self.add_loss_rows(
|
|
debriefing.airlift_losses_by_type(player), lambda u: f"{u} from airlift"
|
|
)
|
|
self.add_loss_rows(debriefing.ground_object_losses_by_type(player), lambda u: u)
|
|
self.add_loss_rows(debriefing.scenery_losses_by_type(player), lambda u: u)
|
|
|
|
# TODO: Display dead ground object units and runways.
|
|
|
|
def add_loss_rows(self, losses: Dict[T, int], make_name: Callable[[T], str]):
|
|
for unit_type, count in losses.items():
|
|
row = self.rowCount()
|
|
try:
|
|
name = make_name(unit_type)
|
|
except AttributeError:
|
|
logging.exception(f"Could not make unit name for {unit_type}")
|
|
name = unit_type.id
|
|
self.addWidget(QLabel(name), row, 0)
|
|
self.addWidget(QLabel(str(count)), row, 1)
|
|
|
|
|
|
class ScrollingCasualtyReportContainer(QGroupBox):
|
|
def __init__(self, debriefing: Debriefing, player: Player) -> None:
|
|
country = (
|
|
debriefing.player_country if player.is_blue else debriefing.enemy_country
|
|
)
|
|
super().__init__(f"{country}'s lost units:")
|
|
scroll_content = QWidget()
|
|
scroll_content.setLayout(LossGrid(debriefing, player))
|
|
scroll_area = QScrollArea()
|
|
scroll_area.setWidget(scroll_content)
|
|
layout = QVBoxLayout()
|
|
layout.addWidget(scroll_area)
|
|
self.setLayout(layout)
|
|
|
|
|
|
class QDebriefingWindow(QDialog):
|
|
def __init__(self, debriefing: Debriefing):
|
|
super(QDebriefingWindow, self).__init__()
|
|
self.debriefing = debriefing
|
|
|
|
self.setModal(True)
|
|
self.setWindowTitle("Debriefing")
|
|
self.setMinimumSize(300, 200)
|
|
self.setWindowIcon(QIcon("./resources/icon.png"))
|
|
|
|
layout = QVBoxLayout()
|
|
self.setLayout(layout)
|
|
|
|
header = QLabel(self)
|
|
header.setGeometry(0, 0, 655, 106)
|
|
pixmap = QPixmap("./resources/ui/debriefing.png")
|
|
header.setPixmap(pixmap)
|
|
layout.addWidget(header)
|
|
|
|
title = QLabel("<b>Casualty report</b>")
|
|
layout.addWidget(title)
|
|
|
|
player_lost_units = ScrollingCasualtyReportContainer(
|
|
debriefing, player=Player.BLUE
|
|
)
|
|
layout.addWidget(player_lost_units)
|
|
|
|
enemy_lost_units = ScrollingCasualtyReportContainer(
|
|
debriefing, player=Player.RED
|
|
)
|
|
layout.addWidget(enemy_lost_units, 1)
|
|
|
|
okay = QPushButton("Okay")
|
|
okay.clicked.connect(self.close)
|
|
layout.addWidget(okay)
|
|
|
|
def closeEvent(self, event: QCloseEvent) -> None:
|
|
super().closeEvent(event)
|
|
state = self.debriefing.game.check_win_loss()
|
|
GameUpdateSignal.get_instance().gameStateChanged(state)
|