Add WIP airlift UI.

Doesn't do anything yet.

https://github.com/Khopa/dcs_liberation/issues/825
This commit is contained in:
Dan Albert 2021-04-21 01:02:02 -07:00
parent c2ebf61fd3
commit 29cd55e795

View File

@ -2,10 +2,12 @@ from __future__ import annotations
import logging import logging
from collections import defaultdict from collections import defaultdict
from dataclasses import dataclass
from typing import Callable, Dict, Type from typing import Callable, Dict, Type
from PySide2.QtCore import Qt from PySide2.QtCore import Qt
from PySide2.QtWidgets import ( from PySide2.QtWidgets import (
QCheckBox,
QComboBox, QComboBox,
QDialog, QDialog,
QFrame, QFrame,
@ -23,7 +25,7 @@ from PySide2.QtWidgets import (
from dcs.task import PinpointStrike from dcs.task import PinpointStrike
from dcs.unittype import UnitType from dcs.unittype import UnitType
from game import db from game import Game, db
from game.theater import ControlPoint, SupplyRoute from game.theater import ControlPoint, SupplyRoute
from game.transfers import RoadTransferOrder from game.transfers import RoadTransferOrder
from qt_ui.models import GameModel from qt_ui.models import GameModel
@ -80,12 +82,43 @@ class UnitTransferList(QFrame):
main_layout.addWidget(scroll) main_layout.addWidget(scroll)
class TransferDestinationPanel(QVBoxLayout): @dataclass(frozen=True)
def __init__(self, label: str, origin: ControlPoint) -> None: class AirliftCapacity:
helicopter: int
cargo_plane: int
@property
def total(self) -> int:
return self.helicopter + self.cargo_plane
@classmethod
def to_control_point(cls, game: Game) -> AirliftCapacity:
helo_capacity = 0
plane_capacity = 0
for cp in game.theater.player_points():
inventory = game.aircraft_inventory.for_control_point(cp)
for unit_type, count in inventory.all_aircraft:
if unit_type.helicopter:
helo_capacity += count
return AirliftCapacity(helicopter=helo_capacity, cargo_plane=plane_capacity)
class TransferOptionsPanel(QVBoxLayout):
def __init__(self, origin: ControlPoint, airlift_capacity: AirliftCapacity) -> None:
super().__init__() super().__init__()
self.source_combo_box = TransferDestinationComboBox(origin) self.source_combo_box = TransferDestinationComboBox(origin)
self.addLayout(QLabeledWidget(label, self.source_combo_box)) self.addLayout(QLabeledWidget("Destination:", self.source_combo_box))
self.airlift = QCheckBox()
self.airlift.toggled.connect(self.set_airlift)
self.addLayout(QLabeledWidget("Airlift (non-functional):", self.airlift))
self.addWidget(
QLabel(
f"{airlift_capacity.total} airlift capacity "
f"({airlift_capacity.cargo_plane} from cargo planes, "
f"{airlift_capacity.helicopter} from helicopters)"
)
)
@property @property
def changed(self): def changed(self):
@ -95,6 +128,9 @@ class TransferDestinationPanel(QVBoxLayout):
def current(self) -> ControlPoint: def current(self) -> ControlPoint:
return self.source_combo_box.currentData() return self.source_combo_box.currentData()
def set_airlift(self, value: bool) -> None:
pass
class TransferControls(QGroupBox): class TransferControls(QGroupBox):
def __init__( def __init__(
@ -147,9 +183,17 @@ class TransferControls(QGroupBox):
class ScrollingUnitTransferGrid(QFrame): class ScrollingUnitTransferGrid(QFrame):
def __init__(self, cp: ControlPoint, game_model: GameModel) -> None: def __init__(
self,
cp: ControlPoint,
airlift: bool,
airlift_capacity: AirliftCapacity,
game_model: GameModel,
) -> None:
super().__init__() super().__init__()
self.cp = cp self.cp = cp
self.airlift = airlift
self.remaining_capacity = airlift_capacity.total
self.game_model = game_model self.game_model = game_model
self.transfers: Dict[Type[UnitType, int]] = defaultdict(int) self.transfers: Dict[Type[UnitType, int]] = defaultdict(int)
@ -219,6 +263,11 @@ class ScrollingUnitTransferGrid(QFrame):
if not origin_inventory: if not origin_inventory:
return return
if self.airlift:
if not self.remaining_capacity:
return
self.remaining_capacity -= 1
self.transfers[unit_type] += 1 self.transfers[unit_type] += 1
origin_inventory -= 1 origin_inventory -= 1
controls.set_quantity(self.transfers[unit_type]) controls.set_quantity(self.transfers[unit_type])
@ -230,6 +279,9 @@ class ScrollingUnitTransferGrid(QFrame):
if not controls.quantity: if not controls.quantity:
return return
if self.airlift:
self.remaining_capacity += 1
self.transfers[unit_type] -= 1 self.transfers[unit_type] -= 1
origin_inventory += 1 origin_inventory += 1
controls.set_quantity(self.transfers[unit_type]) controls.set_quantity(self.transfers[unit_type])
@ -266,11 +318,18 @@ class NewUnitTransferDialog(QDialog):
layout = QVBoxLayout() layout = QVBoxLayout()
self.setLayout(layout) self.setLayout(layout)
self.dest_panel = TransferDestinationPanel("Destination:", origin) self.airlift_capacity = AirliftCapacity.to_control_point(game_model.game)
self.dest_panel.changed.connect(self.on_destination_changed) self.dest_panel = TransferOptionsPanel(origin, self.airlift_capacity)
self.dest_panel.changed.connect(self.rebuild_transfers)
layout.addLayout(self.dest_panel) layout.addLayout(self.dest_panel)
self.transfer_panel = ScrollingUnitTransferGrid(origin, game_model) self.transfer_panel = ScrollingUnitTransferGrid(
origin,
airlift=False,
airlift_capacity=self.airlift_capacity,
game_model=game_model,
)
self.dest_panel.airlift.toggled.connect(self.rebuild_transfers)
layout.addWidget(self.transfer_panel) layout.addWidget(self.transfer_panel)
self.submit_button = QPushButton("Create Transfer Order", parent=self) self.submit_button = QPushButton("Create Transfer Order", parent=self)
@ -278,12 +337,17 @@ class NewUnitTransferDialog(QDialog):
self.submit_button.setProperty("style", "start-button") self.submit_button.setProperty("style", "start-button")
layout.addWidget(self.submit_button) layout.addWidget(self.submit_button)
def on_destination_changed(self, index: int) -> None: def rebuild_transfers(self) -> None:
# Rebuild the transfer panel to reset everything. It's easier to recreate the # Rebuild the transfer panel to reset everything. It's easier to recreate the
# panel itself than to clear the grid layout in the panel. # panel itself than to clear the grid layout in the panel.
self.layout().removeWidget(self.transfer_panel) self.layout().removeWidget(self.transfer_panel)
self.layout().removeWidget(self.submit_button) self.layout().removeWidget(self.submit_button)
self.transfer_panel = ScrollingUnitTransferGrid(self.origin, self.game_model) self.transfer_panel = ScrollingUnitTransferGrid(
self.origin,
airlift=self.dest_panel.airlift.isChecked(),
airlift_capacity=self.airlift_capacity,
game_model=self.game_model,
)
self.layout().addWidget(self.transfer_panel) self.layout().addWidget(self.transfer_panel)
self.layout().addWidget(self.submit_button) self.layout().addWidget(self.submit_button)