New mission briefing menu, work in progress.

This commit is contained in:
Khopa
2019-10-19 00:07:37 +02:00
parent 65a54acd4f
commit 7fbc75b375
163 changed files with 612 additions and 54 deletions

View File

@@ -7,9 +7,10 @@ from PySide2.QtWidgets import QHBoxLayout, QLabel, QWidget, QDialog, QVBoxLayout
from dcs.unittype import UnitType
from game.event import UnitsDeliveryEvent
from qt_ui.widgets.QBudgetBox import QBudgetBox
from qt_ui.widgets.base.QAirportInformation import QAirportInformation
from qt_ui.widgets.base.QBaseInformation import QBaseInformation
from qt_ui.widgets.base.QPlannedFlightView import QPlannedFlightView
from qt_ui.windows.mission.QPlannedFlightsView import QPlannedFlightsView
from qt_ui.windows.GameUpdateSignal import GameUpdateSignal
from theater import ControlPoint, CAP, Embarking, CAS, PinpointStrike, db
from game import Game
@@ -90,6 +91,9 @@ class QBaseMenu(QDialog):
self.recruitment = QGroupBox("Recruitment")
self.recruitmentLayout = QVBoxLayout()
self.budget = QBudgetBox()
self.budget.setBudget(self.game.budget, self.game.budget_reward_amount)
self.recruitmentLayout.addWidget(self.budget)
for task_type in units.keys():
@@ -147,7 +151,7 @@ class QBaseMenu(QDialog):
self.rightLayout = QVBoxLayout()
try:
self.rightLayout.addWidget(QPlannedFlightView(self.game.planners[self.cp.id]))
self.rightLayout.addWidget(QPlannedFlightsView(self.game.planners[self.cp.id]))
except Exception:
traceback.print_exc()
self.rightLayout.addWidget(QAirportInformation(self.cp, self.airport))
@@ -212,7 +216,7 @@ class QBaseMenu(QDialog):
if self.game.budget >= price:
self.deliveryEvent.deliver({unit_type: 1})
self.game.budget -= price
self.budget.setBudget(self.game.budget, self.game.budget_reward_amount)
self._update_count_label(unit_type)
def sell(self, unit_type):

View File

@@ -0,0 +1,34 @@
from PySide2.QtCore import Signal
from PySide2.QtWidgets import QGroupBox, QHBoxLayout, QComboBox, QLabel
from game import Game
class QChooseAirbase(QGroupBox):
selected_airbase_changed = Signal(str)
def __init__(self, game:Game, title=""):
super(QChooseAirbase, self).__init__(title)
self.game = game
self.layout = QHBoxLayout()
self.depart_from_label = QLabel("Airbase : ")
self.depart_from = QComboBox()
for i, cp in enumerate([b for b in self.game.theater.controlpoints if b.captured]):
self.depart_from.addItem(str(cp.name), cp)
self.depart_from.setCurrentIndex(0)
self.depart_from.currentTextChanged.connect(self._on_airbase_selected)
self.layout.addWidget(self.depart_from_label)
self.layout.addWidget(self.depart_from)
self.setLayout(self.layout)
def _on_airbase_selected(self):
selected = self.depart_from.currentText()
print("Airbase changed to : " + selected)
self.selected_airbase_changed.emit(selected)
print("Airbase changed to : " + selected)

View File

@@ -0,0 +1,20 @@
from PySide2.QtGui import QStandardItem, QIcon
from game import db
from gen.flights.flight import Flight
from qt_ui.uiconstants import AIRCRAFT_ICONS
class QFlightItem(QStandardItem):
def __init__(self, flight:Flight):
super(QFlightItem, self).__init__()
self.flight = flight
if db.unit_type_name(self.flight.unit_type).replace("/", " ") in AIRCRAFT_ICONS.keys():
icon = QIcon((AIRCRAFT_ICONS[db.unit_type_name(self.flight.unit_type)]))
self.setIcon(icon)
self.setEditable(False)
self.setText("["+str(self.flight.flight_type.name[:6])+"] "
+ str(self.flight.count) + " x " + db.unit_type_name(self.flight.unit_type)
+ " in " + str(self.flight.scheduled_in) + " minutes")

View File

@@ -0,0 +1,63 @@
from PySide2.QtCore import Qt, Slot, QItemSelectionModel, QPoint
from PySide2.QtWidgets import QDialog, QGridLayout, QScrollArea, QVBoxLayout
from game import Game
from qt_ui.windows.mission.QPlannedFlightsView import QPlannedFlightsView
from qt_ui.windows.mission.QChooseAirbase import QChooseAirbase
from qt_ui.windows.mission.flight.QFlightPlanner import QFlightPlanner
class QMissionPlanning(QDialog):
def __init__(self, game: Game):
super(QMissionPlanning, self).__init__()
self.game = game
self.setWindowFlags(Qt.WindowStaysOnTopHint)
self.setMinimumSize(750, 350)
self.setModal(True)
self.setWindowTitle("Mission Preparation")
self.init_ui()
print("DONE")
def init_ui(self):
self.captured_cp = [cp for cp in self.game.theater.controlpoints if cp.captured]
self.layout = QGridLayout()
self.left_bar_layout = QVBoxLayout()
self.select_airbase = QChooseAirbase(self.game)
self.select_airbase.selected_airbase_changed.connect(self.on_departure_cp_changed)
self.planned_flight_view = QPlannedFlightsView(None)
if self.captured_cp[0].id in self.game.planners.keys():
self.planner = self.game.planners[self.captured_cp[0].id]
self.planned_flight_view.set_flight_planner(self.planner)
self.planned_flight_view.selectionModel().setCurrentIndex(self.planned_flight_view.indexAt(QPoint(1, 1)), QItemSelectionModel.Select)
self.planned_flight_view.selectionModel().selectionChanged.connect(self.on_flight_selection_change)
self.flight_planner = QFlightPlanner(self.planned_flight_view.flight_planner.flights[0], self.game)
self.left_bar_layout.addWidget(self.select_airbase)
self.left_bar_layout.addWidget(self.planned_flight_view)
self.layout.addLayout(self.left_bar_layout, 0, 0)
self.layout.addWidget(self.flight_planner, 0, 1)
self.setLayout(self.layout)
@Slot(str)
def on_departure_cp_changed(self, cp_name):
cps = [cp for cp in self.game.theater.controlpoints if cp.name == cp_name]
if len(cps) == 1:
self.planner = self.game.planners[cps[0].id]
self.planned_flight_view.set_flight_planner(self.planner)
else:
self.planned_flight_view.set_flight_planner(None)
def on_flight_selection_change(self):
index = self.planned_flight_view.selectionModel().currentIndex().row()
flight = self.planner.flights[index]
self.flight_planner = QFlightPlanner(flight, self.game)
self.layout.addWidget(self.flight_planner,0 ,1)

View File

@@ -0,0 +1,30 @@
from PySide2.QtCore import QSize
from PySide2.QtGui import QStandardItemModel
from PySide2.QtWidgets import QListView
from gen.flights.ai_flight_planner import FlightPlanner
from qt_ui.windows.mission.QFlightItem import QFlightItem
class QPlannedFlightsView(QListView):
def __init__(self, flight_planner: FlightPlanner):
super(QPlannedFlightsView, self).__init__()
self.model = QStandardItemModel(self)
self.setModel(self.model)
self.setIconSize(QSize(91, 24))
if flight_planner:
self.set_flight_planner(flight_planner)
def update_content(self):
for i, f in enumerate(self.flight_planner.flights):
self.model.appendRow(QFlightItem(f))
def clear_layout(self):
self.model.removeRows(0, self.model.rowCount())
def set_flight_planner(self, flight_planner: FlightPlanner):
self.clear_layout()
self.flight_planner = flight_planner
if self.flight_planner:
self.update_content()

View File

@@ -0,0 +1,19 @@
from PySide2.QtWidgets import QTabWidget
from gen.flights.flight import Flight
from game import Game
from qt_ui.windows.mission.flight.payload.QFlightPayloadTab import QFlightPayloadTab
from qt_ui.windows.mission.flight.settings.QGeneralFlightSettingsTab import QGeneralFlightSettingsTab
from qt_ui.windows.mission.flight.waypoints.QFlightWaypointTab import QFlightWaypointTab
class QFlightPlanner(QTabWidget):
def __init__(self, flight: Flight, game: Game):
super(QFlightPlanner, self).__init__()
self.general_settings_tab = QGeneralFlightSettingsTab(flight, game)
self.payload_tab = QFlightPayloadTab(flight)
self.waypoint_tab = QFlightWaypointTab(flight)
self.addTab(self.general_settings_tab, "General Flight settings")
self.addTab(self.payload_tab, "Payload")
self.addTab(self.waypoint_tab, "Waypoints")

View File

@@ -0,0 +1,16 @@
from PySide2.QtWidgets import QFrame, QGridLayout, QLabel
from gen.flights.flight import Flight
class QFlightPayloadTab(QFrame):
def __init__(self, flight: Flight):
super(QFlightPayloadTab, self).__init__()
self.flight = flight
self.init_ui()
def init_ui(self):
layout = QGridLayout()
layout.addWidget(QLabel("Coming in two weeks"))
self.setLayout(layout)

View File

@@ -0,0 +1,28 @@
from PySide2.QtWidgets import QLabel, QHBoxLayout, QGroupBox, QSpinBox
class QFlightDepartureEditor(QGroupBox):
def __init__(self, flight):
super(QFlightDepartureEditor, self).__init__("Departure")
self.flight = flight
layout = QHBoxLayout()
self.depart_from = QLabel("Departing from <b>" + self.flight.from_cp.name + "</b>")
self.depart_at_t = QLabel("At T +")
self.minutes = QLabel(" minutes")
self.departure_delta = QSpinBox(self)
self.departure_delta.setMinimum(0)
self.departure_delta.setMaximum(120)
self.departure_delta.setValue(self.flight.scheduled_in)
self.departure_delta.valueChanged.connect(self.change_scheduled)
layout.addWidget(self.depart_from)
layout.addWidget(self.depart_at_t)
layout.addWidget(self.departure_delta)
layout.addWidget(self.minutes)
self.setLayout(layout)
def change_scheduled(self):
self.flight.scheduled_in = int(self.departure_delta.value())

View File

@@ -0,0 +1,50 @@
from PySide2.QtWidgets import QLabel, QHBoxLayout, QGroupBox, QSpinBox, QGridLayout
class QFlightSlotEditor(QGroupBox):
def __init__(self, flight, game):
super(QFlightSlotEditor, self).__init__("Slots")
self.flight = flight
self.game = game
layout = QGridLayout()
self.aircraft_count = QLabel("Aircraft count :")
self.aircraft_count_spinner = QSpinBox()
self.aircraft_count_spinner.setMinimum(1)
self.aircraft_count_spinner.setMaximum(4)
self.aircraft_count_spinner.setValue(flight.count)
self.aircraft_count_spinner.valueChanged.connect(self._changed_aircraft_count)
self.client_count = QLabel("Client slots count :")
self.client_count_spinner = QSpinBox()
self.client_count_spinner.setMinimum(0)
self.client_count_spinner.setMaximum(4)
self.client_count_spinner.setValue(flight.client_count)
self.client_count_spinner.valueChanged.connect(self._changed_client_count)
if not self.flight.unit_type.flyable:
self.client_count_spinner.setValue(0)
self.client_count_spinner.setEnabled(False)
layout.addWidget(self.aircraft_count, 0, 0)
layout.addWidget(self.aircraft_count_spinner, 0, 1)
layout.addWidget(self.client_count, 1, 0)
layout.addWidget(self.client_count_spinner, 1, 1)
self.setLayout(layout)
def _changed_aircraft_count(self):
self.flight.count = int(self.aircraft_count_spinner.value())
# TODO check if enough aircraft are available
def _changed_client_count(self):
self.flight.client_count = int(self.client_count_spinner.value())
self._cap_client_count()
def _cap_client_count(self):
if self.flight.client_count > self.flight.count:
self.flight.client_count = self.flight.count
self.client_count_spinner.setValue(self.flight.client_count)

View File

@@ -0,0 +1,28 @@
from PySide2.QtWidgets import QLabel, QHBoxLayout, QGroupBox, QSpinBox, QGridLayout
from game import db
from qt_ui.uiconstants import AIRCRAFT_ICONS
class QFlightTypeTaskInfo(QGroupBox):
def __init__(self, flight):
super(QFlightTypeTaskInfo, self).__init__("Flight")
self.flight = flight
layout = QGridLayout()
self.aircraft_icon = QLabel()
if db.unit_type_name(self.flight.unit_type) in AIRCRAFT_ICONS:
self.aircraft_icon.setPixmap(AIRCRAFT_ICONS[db.unit_type_name(self.flight.unit_type)])
self.task = QLabel("Task :")
self.task_type = QLabel(flight.flight_type.name)
self.task_type.setProperty("style", flight.flight_type.name)
layout.addWidget(self.aircraft_icon, 0, 0)
layout.addWidget(self.task, 1, 0)
layout.addWidget(self.task_type, 1, 1)
self.setLayout(layout)

View File

@@ -0,0 +1,29 @@
from PySide2.QtWidgets import QFrame, QGridLayout, QVBoxLayout
from gen.flights.flight import Flight
from game import Game
from qt_ui.windows.mission.flight.settings.QFlightDepartureEditor import QFlightDepartureEditor
from qt_ui.windows.mission.flight.settings.QFlightSlotEditor import QFlightSlotEditor
from qt_ui.windows.mission.flight.settings.QFlightTypeTaskInfo import QFlightTypeTaskInfo
class QGeneralFlightSettingsTab(QFrame):
def __init__(self, flight: Flight, game: Game):
super(QGeneralFlightSettingsTab, self).__init__()
self.flight = flight
self.game = game
self.init_ui()
def init_ui(self):
layout = QGridLayout()
self.flight_info = QFlightTypeTaskInfo(self.flight)
self.flight_departure = QFlightDepartureEditor(self.flight)
self.flight_slots = QFlightSlotEditor(self.flight, self.game)
layout.addWidget(self.flight_info, 0, 0)
layout.addWidget(self.flight_departure, 1, 0)
layout.addWidget(self.flight_slots, 2, 0)
vstretch = QVBoxLayout()
vstretch.addStretch()
layout.addLayout(vstretch, 3, 0)
self.setLayout(layout)

View File

@@ -0,0 +1,16 @@
from PySide2.QtWidgets import QFrame, QGridLayout, QLabel
from gen.flights.flight import Flight
class QFlightWaypointTab(QFrame):
def __init__(self, flight: Flight):
super(QFlightWaypointTab, self).__init__()
self.flight = flight
self.init_ui()
def init_ui(self):
layout = QGridLayout()
layout.addWidget(QLabel("Coming in two weeks"))
self.setLayout(layout)