diff --git a/qt_ui/windows/basemenu/QRecruitBehaviour.py b/qt_ui/windows/basemenu/QRecruitBehaviour.py index da2f3045..5eb7534a 100644 --- a/qt_ui/windows/basemenu/QRecruitBehaviour.py +++ b/qt_ui/windows/basemenu/QRecruitBehaviour.py @@ -1,7 +1,7 @@ from __future__ import annotations import logging - +from PySide2.QtCore import Qt from PySide2.QtWidgets import ( QGroupBox, QHBoxLayout, @@ -10,6 +10,7 @@ from PySide2.QtWidgets import ( QSizePolicy, QSpacerItem, QGridLayout, + QApplication, ) from game.dcs.unittype import UnitType @@ -18,6 +19,12 @@ from game.unitdelivery import PendingUnitDeliveries from qt_ui.models import GameModel from qt_ui.windows.GameUpdateSignal import GameUpdateSignal from qt_ui.windows.QUnitInfoWindow import QUnitInfoWindow +from enum import Enum + + +class RecruitType(Enum): + BUY = 0 + SELL = 1 class PurchaseGroup(QGroupBox): @@ -41,7 +48,9 @@ class PurchaseGroup(QGroupBox): QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) ) - self.sell_button.clicked.connect(lambda: self.recruiter.sell(self.unit_type)) + self.sell_button.clicked.connect( + lambda: self.recruiter.recruit_handler(RecruitType.SELL, self.unit_type) + ) self.amount_bought = QLabel() self.amount_bought.setSizePolicy( @@ -54,7 +63,9 @@ class PurchaseGroup(QGroupBox): self.buy_button.setMinimumSize(16, 16) self.buy_button.setMaximumSize(16, 16) - self.buy_button.clicked.connect(lambda: self.recruiter.buy(self.unit_type)) + self.buy_button.clicked.connect( + lambda: self.recruiter.recruit_handler(RecruitType.BUY, self.unit_type) + ) self.buy_button.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) layout.addWidget(self.sell_button) @@ -162,17 +173,39 @@ class QRecruitBehaviour: def update_available_budget(self) -> None: GameUpdateSignal.get_instance().updateBudget(self.game_model.game) - def buy(self, unit_type: UnitType) -> None: + def recruit_handler(self, recruit_type: RecruitType, unit_type: UnitType) -> None: + # Lookup if Keyboard Modifiers were pressed + # Shift = 10 times + # CTRL = 5 Times + modifiers = QApplication.keyboardModifiers() + if modifiers == Qt.ShiftModifier: + amount = 10 + elif modifiers == Qt.ControlModifier: + amount = 5 + else: + amount = 1 + + for i in range(amount): + if recruit_type == RecruitType.SELL: + if not self.sell(unit_type): + return + elif recruit_type == RecruitType.BUY: + if not self.buy(unit_type): + return + + def buy(self, unit_type: UnitType) -> bool: + if not self.enable_purchase(unit_type): logging.error(f"Purchase of {unit_type} not allowed at {self.cp.name}") - return + return False self.pending_deliveries.order({unit_type: 1}) self.budget -= unit_type.price self.update_purchase_controls() self.update_available_budget() + return True - def sell(self, unit_type: UnitType) -> None: + def sell(self, unit_type: UnitType) -> bool: if self.pending_deliveries.available_next_turn(unit_type) > 0: self.budget += unit_type.price self.pending_deliveries.sell({unit_type: 1}) @@ -180,6 +213,7 @@ class QRecruitBehaviour: del self.pending_deliveries.units[unit_type] self.update_purchase_controls() self.update_available_budget() + return True def update_purchase_controls(self) -> None: for group in self.purchase_groups.values(): diff --git a/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py b/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py index 96fbf74e..c5edcdbc 100644 --- a/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py +++ b/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py @@ -89,7 +89,7 @@ class QAircraftRecruitmentMenu(QFrame, QRecruitBehaviour): return False return True - def buy(self, unit_type: AircraftType) -> None: + def buy(self, unit_type: AircraftType) -> bool: if self.maximum_units > 0: if self.cp.unclaimed_parking(self.game_model.game) <= 0: logging.debug(f"No space for additional aircraft at {self.cp}.") @@ -100,7 +100,7 @@ class QAircraftRecruitmentMenu(QFrame, QRecruitBehaviour): "another plane.", QMessageBox.Ok, ) - return + return False # If we change our mind about selling, we want the aircraft to be put # back in the inventory immediately. elif self.pending_deliveries.units.get(unit_type, 0) < 0: @@ -110,8 +110,9 @@ class QAircraftRecruitmentMenu(QFrame, QRecruitBehaviour): super().buy(unit_type) self.hangar_status.update_label() + return True - def sell(self, unit_type: AircraftType) -> None: + def sell(self, unit_type: AircraftType) -> bool: # Don't need to remove aircraft from the inventory if we're canceling # orders. if self.pending_deliveries.units.get(unit_type, 0) <= 0: @@ -128,10 +129,12 @@ class QAircraftRecruitmentMenu(QFrame, QRecruitBehaviour): "assigned to a mission?", QMessageBox.Ok, ) - return + return False super().sell(unit_type) self.hangar_status.update_label() + return True + class QHangarStatus(QHBoxLayout): def __init__(self, game_model: GameModel, control_point: ControlPoint) -> None: