Set up split/join points.

This commit is contained in:
Dan Albert
2020-09-29 18:22:20 -07:00
parent 56a5864600
commit 6ce82be46b
23 changed files with 282 additions and 121 deletions

View File

@@ -54,7 +54,12 @@ class Dialog:
cls.edit_package_dialog.show()
@classmethod
def open_edit_flight_dialog(cls, flight: Flight):
def open_edit_flight_dialog(cls, package_model: PackageModel,
flight: Flight) -> None:
"""Opens the dialog to edit the given flight."""
cls.edit_flight_dialog = QEditFlightDialog(cls.game_model.game, flight)
cls.edit_flight_dialog = QEditFlightDialog(
cls.game_model.game,
package_model.package,
flight
)
cls.edit_flight_dialog.show()

View File

@@ -1,3 +1,5 @@
from typing import Optional
from PySide2.QtWidgets import QFrame, QGroupBox, QHBoxLayout, QPushButton
import qt_ui.uiconstants as CONST
@@ -74,7 +76,7 @@ class QTopPanel(QFrame):
self.layout.setContentsMargins(0,0,0,0)
self.setLayout(self.layout)
def setGame(self, game:Game):
def setGame(self, game: Optional[Game]):
self.game = game
if game is not None:
self.turnCounter.setCurrentTurn(self.game.turn, self.game.current_day)

View File

@@ -123,7 +123,7 @@ class QFlightPanel(QGroupBox):
return
from qt_ui.dialogs import Dialog
Dialog.open_edit_flight_dialog(
self.package_model.flight_at_index(index)
self.package_model, self.package_model.flight_at_index(index)
)
def on_delete(self) -> None:

View File

@@ -1,4 +1,4 @@
from typing import Dict, List, Tuple
from typing import Dict, List, Optional, Tuple
from PySide2.QtCore import Qt
from PySide2.QtGui import QBrush, QColor, QPen, QPixmap, QWheelEvent
@@ -43,6 +43,7 @@ class QLiberationMap(QGraphicsView):
super(QLiberationMap, self).__init__()
QLiberationMap.instance = self
self.game_model = game_model
self.game: Optional[Game] = game_model.game
self.flight_path_items: List[QGraphicsItem] = []
@@ -71,7 +72,7 @@ class QLiberationMap(QGraphicsView):
def connectSignals(self):
GameUpdateSignal.get_instance().gameupdated.connect(self.setGame)
def setGame(self, game: Game):
def setGame(self, game: Optional[Game]):
self.game = game
print("Reloading Map Canvas")
if self.game is not None:

View File

@@ -1,5 +1,7 @@
from __future__ import annotations
from typing import Optional
from PySide2.QtCore import QObject, Signal
from game import Game
@@ -31,7 +33,7 @@ class GameUpdateSignal(QObject):
# noinspection PyUnresolvedReferences
self.flight_paths_changed.emit()
def updateGame(self, game: Game):
def updateGame(self, game: Optional[Game]):
# noinspection PyUnresolvedReferences
self.gameupdated.emit(game)

View File

@@ -232,6 +232,8 @@ class QLiberationWindow(QMainWindow):
sys.exit(0)
def setGame(self, game: Optional[Game]):
if game is not None:
game.on_load()
self.game = game
if self.info_panel:
self.info_panel.setGame(game)

View File

@@ -5,6 +5,7 @@ from PySide2.QtWidgets import (
)
from game import Game
from gen.ato import Package
from gen.flights.flight import Flight
from qt_ui.uiconstants import EVENT_ICONS
from qt_ui.windows.GameUpdateSignal import GameUpdateSignal
@@ -14,7 +15,7 @@ from qt_ui.windows.mission.flight.QFlightPlanner import QFlightPlanner
class QEditFlightDialog(QDialog):
"""Dialog window for editing flight plans and loadouts."""
def __init__(self, game: Game, flight: Flight) -> None:
def __init__(self, game: Game, package: Package, flight: Flight) -> None:
super().__init__()
self.game = game
@@ -24,7 +25,7 @@ class QEditFlightDialog(QDialog):
layout = QVBoxLayout()
self.flight_planner = QFlightPlanner(flight, game)
self.flight_planner = QFlightPlanner(package, flight, game)
layout.addWidget(self.flight_planner)
self.setLayout(layout)

View File

@@ -14,6 +14,7 @@ from PySide2.QtWidgets import (
from game.game import Game
from gen.ato import Package
from gen.flights.flight import Flight
from gen.flights.flightplan import FlightPlanBuilder
from qt_ui.models import AtoModel, PackageModel
from qt_ui.uiconstants import EVENT_ICONS
from qt_ui.widgets.ato import QFlightList
@@ -100,15 +101,17 @@ class QPackageDialog(QDialog):
def on_add_flight(self) -> None:
"""Opens the new flight dialog."""
self.add_flight_dialog = QFlightCreator(
self.game, self.package_model.package
)
self.add_flight_dialog = QFlightCreator(self.game,
self.package_model.package)
self.add_flight_dialog.created.connect(self.add_flight)
self.add_flight_dialog.show()
def add_flight(self, flight: Flight) -> None:
"""Adds the new flight to the package."""
self.package_model.add_flight(flight)
planner = FlightPlanBuilder(self.game, self.package_model.package,
is_player=True)
planner.populate_flight_plan(flight)
# noinspection PyUnresolvedReferences
self.package_changed.emit()
# noinspection PyUnresolvedReferences

View File

@@ -1,4 +1,3 @@
import logging
from typing import Optional
from PySide2.QtCore import Qt, Signal
@@ -11,15 +10,14 @@ from dcs.planes import PlaneType
from game import Game
from gen.ato import Package
from gen.flights.flightplan import FlightPlanBuilder
from gen.flights.flight import Flight, FlightType
from gen.flights.flight import Flight
from qt_ui.uiconstants import EVENT_ICONS
from qt_ui.widgets.QFlightSizeSpinner import QFlightSizeSpinner
from qt_ui.widgets.QLabeledWidget import QLabeledWidget
from qt_ui.widgets.combos.QAircraftTypeSelector import QAircraftTypeSelector
from qt_ui.widgets.combos.QFlightTypeComboBox import QFlightTypeComboBox
from qt_ui.widgets.combos.QOriginAirfieldSelector import QOriginAirfieldSelector
from theater import ControlPoint, FrontLine, TheaterGroundObject
from theater import ControlPoint
class QFlightCreator(QDialog):
@@ -29,9 +27,6 @@ class QFlightCreator(QDialog):
super().__init__()
self.game = game
self.package = package
self.planner = FlightPlanBuilder(self.game, is_player=True)
self.setWindowTitle("Create flight")
self.setWindowIcon(EVENT_ICONS["strike"])
@@ -39,7 +34,7 @@ class QFlightCreator(QDialog):
layout = QVBoxLayout()
self.task_selector = QFlightTypeComboBox(
self.game.theater, self.package.target
self.game.theater, package.target
)
self.task_selector.setCurrentIndex(0)
layout.addLayout(QLabeledWidget("Task:", self.task_selector))
@@ -95,7 +90,6 @@ class QFlightCreator(QDialog):
size = self.flight_size_spinner.value()
flight = Flight(aircraft, size, origin, task)
self.planner.populate_flight_plan(flight, self.package.target)
# noinspection PyUnresolvedReferences
self.created.emit(flight)

View File

@@ -2,6 +2,7 @@ from PySide2.QtCore import Signal
from PySide2.QtWidgets import QTabWidget
from game import Game
from gen.ato import Package
from gen.flights.flight import Flight
from qt_ui.windows.mission.flight.payload.QFlightPayloadTab import \
QFlightPayloadTab
@@ -15,14 +16,14 @@ class QFlightPlanner(QTabWidget):
on_planned_flight_changed = Signal()
def __init__(self, flight: Flight, game: Game):
def __init__(self, package: Package, flight: Flight, game: Game):
super().__init__()
self.general_settings_tab = QGeneralFlightSettingsTab(game, flight)
self.general_settings_tab.on_flight_settings_changed.connect(
lambda: self.on_planned_flight_changed.emit())
self.payload_tab = QFlightPayloadTab(flight, game)
self.waypoint_tab = QFlightWaypointTab(game, flight)
self.waypoint_tab = QFlightWaypointTab(game, package, flight)
self.waypoint_tab.on_flight_changed.connect(
lambda: self.on_planned_flight_changed.emit())
self.addTab(self.general_settings_tab, "General Flight settings")

View File

@@ -2,6 +2,7 @@ from PySide2.QtCore import Qt
from PySide2.QtWidgets import QDialog, QPushButton
from game import Game
from gen.ato import Package
from gen.flights.flight import Flight
from gen.flights.flightplan import FlightPlanBuilder
from qt_ui.uiconstants import EVENT_ICONS
@@ -10,9 +11,11 @@ from qt_ui.windows.mission.flight.waypoints.QFlightWaypointInfoBox import QFligh
class QAbstractMissionGenerator(QDialog):
def __init__(self, game: Game, flight: Flight, flight_waypoint_list, title):
def __init__(self, game: Game, package: Package, flight: Flight,
flight_waypoint_list, title) -> None:
super(QAbstractMissionGenerator, self).__init__()
self.game = game
self.package = package
self.flight = flight
self.setWindowFlags(Qt.WindowStaysOnTopHint)
self.setMinimumSize(400, 250)
@@ -20,7 +23,7 @@ class QAbstractMissionGenerator(QDialog):
self.setWindowTitle(title)
self.setWindowIcon(EVENT_ICONS["strike"])
self.flight_waypoint_list = flight_waypoint_list
self.planner = FlightPlanBuilder(self.game, is_player=True)
self.planner = FlightPlanBuilder(self.game, package, is_player=True)
self.selected_waypoints = []
self.wpt_info = QFlightWaypointInfoBox()

View File

@@ -1,15 +1,26 @@
import logging
from PySide2.QtWidgets import QLabel, QHBoxLayout, QVBoxLayout
from game import Game
from gen.flights.flight import Flight, PredefinedWaypointCategory
from gen.ato import Package
from gen.flights.flight import Flight, FlightType
from qt_ui.widgets.combos.QPredefinedWaypointSelectionComboBox import QPredefinedWaypointSelectionComboBox
from qt_ui.windows.mission.flight.generator.QAbstractMissionGenerator import QAbstractMissionGenerator
from theater import ControlPoint, FrontLine
class QCAPMissionGenerator(QAbstractMissionGenerator):
def __init__(self, game: Game, flight: Flight, flight_waypoint_list):
super(QCAPMissionGenerator, self).__init__(game, flight, flight_waypoint_list, "CAP Generator")
def __init__(self, game: Game, package: Package, flight: Flight,
flight_waypoint_list) -> None:
super(QCAPMissionGenerator, self).__init__(
game,
package,
flight,
flight_waypoint_list,
"CAP Generator"
)
self.wpt_selection_box = QPredefinedWaypointSelectionComboBox(self.game, self, False, True, True, False, False, True)
self.wpt_selection_box.setMinimumWidth(200)
@@ -34,16 +45,22 @@ class QCAPMissionGenerator(QAbstractMissionGenerator):
self.setLayout(layout)
def apply(self):
self.flight.points = []
wpt = self.selected_waypoints[0]
if wpt.category == PredefinedWaypointCategory.FRONTLINE:
self.planner.generate_frontline_cap(self.flight, wpt.data[0], wpt.data[1])
elif wpt.category == PredefinedWaypointCategory.ALLY_CP:
self.planner.generate_barcap(self.flight, wpt.data)
location = self.package.target
if isinstance(location, FrontLine):
self.flight.flight_type = FlightType.TARCAP
self.planner.populate_flight_plan(self.flight)
elif isinstance(location, ControlPoint):
if location.is_fleet:
self.flight.flight_type = FlightType.BARCAP
else:
self.flight.flight_type = FlightType.CAP
else:
name = location.__class__.__name__
logging.error(f"Unexpected objective type for CAP: {name}")
return
self.planner.generate_barcap(self.flight)
self.flight_waypoint_list.update_list()
self.close()

View File

@@ -4,15 +4,23 @@ from dcs import Point
from game import Game
from game.utils import meter_to_nm
from gen.flights.flight import Flight
from gen.ato import Package
from gen.flights.flight import Flight, FlightType
from qt_ui.widgets.combos.QPredefinedWaypointSelectionComboBox import QPredefinedWaypointSelectionComboBox
from qt_ui.windows.mission.flight.generator.QAbstractMissionGenerator import QAbstractMissionGenerator
class QCASMissionGenerator(QAbstractMissionGenerator):
def __init__(self, game: Game, flight: Flight, flight_waypoint_list):
super(QCASMissionGenerator, self).__init__(game, flight, flight_waypoint_list, "CAS Generator")
def __init__(self, game: Game, package: Package, flight: Flight,
flight_waypoint_list) -> None:
super(QCASMissionGenerator, self).__init__(
game,
package,
flight,
flight_waypoint_list,
"CAS Generator"
)
self.wpt_selection_box = QPredefinedWaypointSelectionComboBox(self.game, self, False, False, True, False, False)
self.wpt_selection_box.setMinimumWidth(200)
@@ -55,8 +63,8 @@ class QCASMissionGenerator(QAbstractMissionGenerator):
self.setLayout(layout)
def apply(self):
self.flight.points = []
self.planner.generate_cas(self.flight, self.selected_waypoints[0].data[0], self.selected_waypoints[0].data[1])
self.flight.flight_type = FlightType.CAS
self.planner.populate_flight_plan(self.flight)
self.flight_waypoint_list.update_list()
self.close()

View File

@@ -3,7 +3,8 @@ from PySide2.QtWidgets import QLabel, QHBoxLayout, QVBoxLayout, QGroupBox
from game import Game
from game.utils import meter_to_nm
from gen.flights.flight import Flight
from gen.ato import Package
from gen.flights.flight import Flight, FlightType
from qt_ui.widgets.combos.QSEADTargetSelectionComboBox import QSEADTargetSelectionComboBox
from qt_ui.widgets.views.QSeadTargetInfoView import QSeadTargetInfoView
from qt_ui.windows.mission.flight.generator.QAbstractMissionGenerator import QAbstractMissionGenerator
@@ -11,8 +12,15 @@ from qt_ui.windows.mission.flight.generator.QAbstractMissionGenerator import QAb
class QSEADMissionGenerator(QAbstractMissionGenerator):
def __init__(self, game: Game, flight: Flight, flight_waypoint_list):
super(QSEADMissionGenerator, self).__init__(game, flight, flight_waypoint_list, "SEAD/DEAD Generator")
def __init__(self, game: Game, package: Package, flight: Flight,
flight_waypoint_list) -> None:
super(QSEADMissionGenerator, self).__init__(
game,
package,
flight,
flight_waypoint_list,
"SEAD/DEAD Generator"
)
self.tgt_selection_box = QSEADTargetSelectionComboBox(self.game)
self.tgt_selection_box.setMinimumWidth(200)
@@ -73,9 +81,9 @@ class QSEADMissionGenerator(QAbstractMissionGenerator):
self.setLayout(layout)
def apply(self):
self.flight.points = []
target = self.tgt_selection_box.get_selected_target()
self.planner.generate_sead(self.flight, target.location, target.radars)
self.flight.flight_type = FlightType.SEAD
self.planner.populate_flight_plan(self.flight, target.radars)
self.flight_waypoint_list.update_list()
self.close()

View File

@@ -3,7 +3,8 @@ from PySide2.QtWidgets import QLabel, QHBoxLayout, QVBoxLayout, QGroupBox
from game import Game
from game.utils import meter_to_nm
from gen.flights.flight import Flight
from gen.ato import Package
from gen.flights.flight import Flight, FlightType
from qt_ui.widgets.combos.QStrikeTargetSelectionComboBox import QStrikeTargetSelectionComboBox
from qt_ui.widgets.views.QStrikeTargetInfoView import QStrikeTargetInfoView
from qt_ui.windows.mission.flight.generator.QAbstractMissionGenerator import QAbstractMissionGenerator
@@ -11,8 +12,15 @@ from qt_ui.windows.mission.flight.generator.QAbstractMissionGenerator import QAb
class QSTRIKEMissionGenerator(QAbstractMissionGenerator):
def __init__(self, game: Game, flight: Flight, flight_waypoint_list):
super(QSTRIKEMissionGenerator, self).__init__(game, flight, flight_waypoint_list, "Strike Generator")
def __init__(self, game: Game, package: Package, flight: Flight,
flight_waypoint_list) -> None:
super(QSTRIKEMissionGenerator, self).__init__(
game,
package,
flight,
flight_waypoint_list,
"Strike Generator"
)
self.tgt_selection_box = QStrikeTargetSelectionComboBox(self.game)
self.tgt_selection_box.setMinimumWidth(200)
@@ -53,9 +61,9 @@ class QSTRIKEMissionGenerator(QAbstractMissionGenerator):
self.setLayout(layout)
def apply(self):
self.flight.points = []
target = self.tgt_selection_box.get_selected_target()
self.planner.generate_strike(self.flight, target.location)
self.flight.flight_type = FlightType.STRIKE
self.planner.populate_flight_plan(self.flight, target.location)
self.flight_waypoint_list.update_list()
self.close()

View File

@@ -2,6 +2,7 @@ from PySide2.QtCore import Signal
from PySide2.QtWidgets import QFrame, QGridLayout, QLabel, QPushButton, QVBoxLayout
from game import Game
from gen.ato import Package
from gen.flights.flight import Flight
from gen.flights.flightplan import FlightPlanBuilder
from qt_ui.windows.mission.flight.generator.QCAPMissionGenerator import QCAPMissionGenerator
@@ -16,11 +17,12 @@ class QFlightWaypointTab(QFrame):
on_flight_changed = Signal()
def __init__(self, game: Game, flight: Flight):
def __init__(self, game: Game, package: Package, flight: Flight):
super(QFlightWaypointTab, self).__init__()
self.flight = flight
self.game = game
self.planner = FlightPlanBuilder(self.game, is_player=True)
self.package = package
self.flight = flight
self.planner = FlightPlanBuilder(self.game, package, is_player=True)
self.init_ui()
def init_ui(self):
@@ -104,22 +106,42 @@ class QFlightWaypointTab(QFrame):
self.on_change()
def on_cas_generator(self):
self.subwindow = QCASMissionGenerator(self.game, self.flight, self.flight_waypoint_list)
self.subwindow = QCASMissionGenerator(
self.game,
self.package,
self.flight,
self.flight_waypoint_list
)
self.subwindow.finished.connect(self.on_change)
self.subwindow.show()
def on_cap_generator(self):
self.subwindow = QCAPMissionGenerator(self.game, self.flight, self.flight_waypoint_list)
self.subwindow = QCAPMissionGenerator(
self.game,
self.package,
self.flight,
self.flight_waypoint_list
)
self.subwindow.finished.connect(self.on_change)
self.subwindow.show()
def on_sead_generator(self):
self.subwindow = QSEADMissionGenerator(self.game, self.flight, self.flight_waypoint_list)
self.subwindow = QSEADMissionGenerator(
self.game,
self.package,
self.flight,
self.flight_waypoint_list
)
self.subwindow.finished.connect(self.on_change)
self.subwindow.show()
def on_strike_generator(self):
self.subwindow = QSTRIKEMissionGenerator(self.game, self.flight, self.flight_waypoint_list)
self.subwindow = QSTRIKEMissionGenerator(
self.game,
self.package,
self.flight,
self.flight_waypoint_list
)
self.subwindow.finished.connect(self.on_change)
self.subwindow.show()