mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
New mission briefing menu, work in progress.
This commit is contained in:
@@ -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):
|
||||
|
||||
34
qt_ui/windows/mission/QChooseAirbase.py
Normal file
34
qt_ui/windows/mission/QChooseAirbase.py
Normal 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)
|
||||
|
||||
|
||||
|
||||
20
qt_ui/windows/mission/QFlightItem.py
Normal file
20
qt_ui/windows/mission/QFlightItem.py
Normal 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")
|
||||
63
qt_ui/windows/mission/QMissionPlanning.py
Normal file
63
qt_ui/windows/mission/QMissionPlanning.py
Normal 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)
|
||||
30
qt_ui/windows/mission/QPlannedFlightsView.py
Normal file
30
qt_ui/windows/mission/QPlannedFlightsView.py
Normal 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()
|
||||
19
qt_ui/windows/mission/flight/QFlightPlanner.py
Normal file
19
qt_ui/windows/mission/flight/QFlightPlanner.py
Normal 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")
|
||||
16
qt_ui/windows/mission/flight/payload/QFlightPayloadTab.py
Normal file
16
qt_ui/windows/mission/flight/payload/QFlightPayloadTab.py
Normal 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)
|
||||
@@ -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())
|
||||
50
qt_ui/windows/mission/flight/settings/QFlightSlotEditor.py
Normal file
50
qt_ui/windows/mission/flight/settings/QFlightSlotEditor.py
Normal 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)
|
||||
28
qt_ui/windows/mission/flight/settings/QFlightTypeTaskInfo.py
Normal file
28
qt_ui/windows/mission/flight/settings/QFlightTypeTaskInfo.py
Normal 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)
|
||||
@@ -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)
|
||||
16
qt_ui/windows/mission/flight/waypoints/QFlightWaypointTab.py
Normal file
16
qt_ui/windows/mission/flight/waypoints/QFlightWaypointTab.py
Normal 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)
|
||||
Reference in New Issue
Block a user