Avoid cases where empty flights could be created.

Fixes https://github.com/Khopa/dcs_liberation/issues/373
This commit is contained in:
Dan Albert 2020-11-18 22:03:33 -08:00
parent 98fd707aea
commit a223da8f99
2 changed files with 21 additions and 7 deletions

View File

@ -1,9 +1,10 @@
"""Combo box for selecting a departure airfield.""" """Combo box for selecting a departure airfield."""
from typing import Iterable from typing import Iterable
from PySide2.QtCore import Signal
from PySide2.QtWidgets import QComboBox from PySide2.QtWidgets import QComboBox
from dcs.planes import PlaneType from dcs.planes import PlaneType
from game.inventory import GlobalAircraftInventory from game.inventory import GlobalAircraftInventory
from game.theater.controlpoint import ControlPoint from game.theater.controlpoint import ControlPoint
@ -15,6 +16,8 @@ class QOriginAirfieldSelector(QComboBox):
that have unassigned inventory of the given aircraft type. that have unassigned inventory of the given aircraft type.
""" """
availability_changed = Signal(int)
def __init__(self, global_inventory: GlobalAircraftInventory, def __init__(self, global_inventory: GlobalAircraftInventory,
origins: Iterable[ControlPoint], origins: Iterable[ControlPoint],
aircraft: PlaneType) -> None: aircraft: PlaneType) -> None:
@ -23,6 +26,7 @@ class QOriginAirfieldSelector(QComboBox):
self.origins = list(origins) self.origins = list(origins)
self.aircraft = aircraft self.aircraft = aircraft
self.rebuild_selector() self.rebuild_selector()
self.currentIndexChanged.connect(self.index_changed)
def change_aircraft(self, aircraft: PlaneType) -> None: def change_aircraft(self, aircraft: PlaneType) -> None:
if self.aircraft == aircraft: if self.aircraft == aircraft:
@ -47,3 +51,10 @@ class QOriginAirfieldSelector(QComboBox):
return 0 return 0
inventory = self.global_inventory.for_control_point(origin) inventory = self.global_inventory.for_control_point(origin)
return inventory.available(self.aircraft) return inventory.available(self.aircraft)
def index_changed(self, index: int) -> None:
origin = self.itemData(index)
if origin is None:
return
inventory = self.global_inventory.for_control_point(origin)
self.availability_changed.emit(inventory.available(self.aircraft))

View File

@ -54,11 +54,11 @@ class QFlightCreator(QDialog):
[cp for cp in game.theater.controlpoints if cp.captured], [cp for cp in game.theater.controlpoints if cp.captured],
self.aircraft_selector.currentData() self.aircraft_selector.currentData()
) )
self.airfield_selector.currentIndexChanged.connect(self.update_max_size) self.airfield_selector.availability_changed.connect(self.update_max_size)
layout.addLayout(QLabeledWidget("Airfield:", self.airfield_selector)) layout.addLayout(QLabeledWidget("Airfield:", self.airfield_selector))
self.flight_size_spinner = QFlightSizeSpinner() self.flight_size_spinner = QFlightSizeSpinner()
self.update_max_size() self.update_max_size(self.airfield_selector.available)
layout.addLayout(QLabeledWidget("Size:", self.flight_size_spinner)) layout.addLayout(QLabeledWidget("Size:", self.flight_size_spinner))
self.client_slots_spinner = QFlightSizeSpinner( self.client_slots_spinner = QFlightSizeSpinner(
@ -91,6 +91,8 @@ class QFlightCreator(QDialog):
return f"{origin.name} has no {aircraft.id} available." return f"{origin.name} has no {aircraft.id} available."
if size > available: if size > available:
return f"{origin.name} has only {available} {aircraft.id} available." return f"{origin.name} has only {available} {aircraft.id} available."
if size <= 0:
return f"Flight must have at least one aircraft."
return None return None
def create_flight(self) -> None: def create_flight(self) -> None:
@ -120,7 +122,8 @@ class QFlightCreator(QDialog):
new_aircraft = self.aircraft_selector.itemData(index) new_aircraft = self.aircraft_selector.itemData(index)
self.airfield_selector.change_aircraft(new_aircraft) self.airfield_selector.change_aircraft(new_aircraft)
def update_max_size(self) -> None: def update_max_size(self, available: int) -> None:
self.flight_size_spinner.setMaximum( self.flight_size_spinner.setMaximum(min(available, 4))
min(self.airfield_selector.available, 4) if self.flight_size_spinner.maximum() >= 2:
) if self.flight_size_spinner.value() < 2:
self.flight_size_spinner.setValue(2)