mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
Redraw flight plans when they change.
This commit is contained in:
parent
1e041b6249
commit
aa309af015
@ -16,6 +16,7 @@ from PySide2.QtWidgets import (
|
||||
from gen.ato import Package
|
||||
from gen.flights.flight import Flight
|
||||
from ..models import AtoModel, GameModel, NullListModel, PackageModel
|
||||
from qt_ui.windows.GameUpdateSignal import GameUpdateSignal
|
||||
|
||||
|
||||
class QFlightList(QListView):
|
||||
@ -134,6 +135,7 @@ class QFlightPanel(QGroupBox):
|
||||
self.game_model.game.aircraft_inventory.return_from_flight(
|
||||
self.flight_list.selected_item)
|
||||
self.package_model.delete_flight_at_index(index)
|
||||
GameUpdateSignal.get_instance().redraw_flight_paths()
|
||||
|
||||
|
||||
class QPackageList(QListView):
|
||||
@ -217,6 +219,7 @@ class QPackagePanel(QGroupBox):
|
||||
logging.error(f"Cannot delete package when no package is selected.")
|
||||
return
|
||||
self.ato_model.delete_package_at_index(index)
|
||||
GameUpdateSignal.get_instance().redraw_flight_paths()
|
||||
|
||||
|
||||
class QAirTaskingOrderPanel(QSplitter):
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
import typing
|
||||
from typing import Dict, Tuple
|
||||
from typing import Dict, List, Tuple
|
||||
|
||||
from PySide2.QtCore import Qt
|
||||
from PySide2.QtGui import QBrush, QColor, QPen, QPixmap, QWheelEvent
|
||||
from PySide2.QtWidgets import (
|
||||
QFrame,
|
||||
QGraphicsItem,
|
||||
QGraphicsOpacityEffect,
|
||||
QGraphicsScene,
|
||||
QGraphicsView,
|
||||
@ -44,6 +44,8 @@ class QLiberationMap(QGraphicsView):
|
||||
QLiberationMap.instance = self
|
||||
self.game_model = game_model
|
||||
|
||||
self.flight_path_items: List[QGraphicsItem] = []
|
||||
|
||||
self.setMinimumSize(800,600)
|
||||
self.setMaximumHeight(2160)
|
||||
self._zoom = 0
|
||||
@ -53,6 +55,10 @@ class QLiberationMap(QGraphicsView):
|
||||
self.connectSignals()
|
||||
self.setGame(game_model.game)
|
||||
|
||||
GameUpdateSignal.get_instance().flight_paths_changed.connect(
|
||||
lambda: self.draw_flight_plans(self.scene())
|
||||
)
|
||||
|
||||
def init_scene(self):
|
||||
scene = QLiberationScene(self)
|
||||
self.setScene(scene)
|
||||
@ -176,8 +182,7 @@ class QLiberationMap(QGraphicsView):
|
||||
if self.get_display_rule("lines"):
|
||||
self.scene_create_lines_for_cp(cp, playerColor, enemyColor)
|
||||
|
||||
if self.get_display_rule("flight_paths"):
|
||||
self.draw_flight_plans(scene)
|
||||
self.draw_flight_plans(scene)
|
||||
|
||||
for cp in self.game.theater.controlpoints:
|
||||
pos = self._transform_point(cp.position)
|
||||
@ -188,6 +193,15 @@ class QLiberationMap(QGraphicsView):
|
||||
text.setPos(pos[0] + CONST.CP_SIZE + 1, pos[1] - CONST.CP_SIZE / 2 + 1)
|
||||
|
||||
def draw_flight_plans(self, scene) -> None:
|
||||
for item in self.flight_path_items:
|
||||
try:
|
||||
scene.removeItem(item)
|
||||
except RuntimeError:
|
||||
# Something may have caused those items to already be removed.
|
||||
pass
|
||||
self.flight_path_items.clear()
|
||||
if not self.get_display_rule("flight_paths"):
|
||||
return
|
||||
for package in self.game_model.ato_model.packages:
|
||||
for flight in package.flights:
|
||||
self.draw_flight_plan(scene, flight)
|
||||
@ -209,17 +223,21 @@ class QLiberationMap(QGraphicsView):
|
||||
player: bool) -> None:
|
||||
waypoint_pen = self.waypoint_pen(player)
|
||||
waypoint_brush = self.waypoint_brush(player)
|
||||
scene.addEllipse(position[0], position[1], self.WAYPOINT_SIZE,
|
||||
self.WAYPOINT_SIZE, waypoint_pen, waypoint_brush)
|
||||
self.flight_path_items.append(scene.addEllipse(
|
||||
position[0], position[1], self.WAYPOINT_SIZE,
|
||||
self.WAYPOINT_SIZE, waypoint_pen, waypoint_brush
|
||||
))
|
||||
|
||||
def draw_flight_path(self, scene: QGraphicsScene, pos0: Tuple[int, int],
|
||||
pos1: Tuple[int, int], player: bool):
|
||||
flight_path_pen = self.flight_path_pen(player)
|
||||
# Draw the line to the *middle* of the waypoint.
|
||||
offset = self.WAYPOINT_SIZE // 2
|
||||
scene.addLine(pos0[0] + offset, pos0[1] + offset,
|
||||
pos1[0] + offset, pos1[1] + offset,
|
||||
flight_path_pen)
|
||||
self.flight_path_items.append(scene.addLine(
|
||||
pos0[0] + offset, pos0[1] + offset,
|
||||
pos1[0] + offset, pos1[1] + offset,
|
||||
flight_path_pen
|
||||
))
|
||||
|
||||
def scene_create_lines_for_cp(self, cp: ControlPoint, playerColor, enemyColor):
|
||||
scene = self.scene()
|
||||
|
||||
@ -1,3 +1,5 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from PySide2.QtCore import QObject, Signal
|
||||
|
||||
from game import Game
|
||||
@ -19,21 +21,31 @@ class GameUpdateSignal(QObject):
|
||||
budgetupdated = Signal(Game)
|
||||
debriefingReceived = Signal(DebriefingSignal)
|
||||
|
||||
flight_paths_changed = Signal()
|
||||
|
||||
def __init__(self):
|
||||
super(GameUpdateSignal, self).__init__()
|
||||
GameUpdateSignal.instance = self
|
||||
|
||||
def redraw_flight_paths(self) -> None:
|
||||
# noinspection PyUnresolvedReferences
|
||||
self.flight_paths_changed.emit()
|
||||
|
||||
def updateGame(self, game: Game):
|
||||
# noinspection PyUnresolvedReferences
|
||||
self.gameupdated.emit(game)
|
||||
|
||||
def updateBudget(self, game: Game):
|
||||
# noinspection PyUnresolvedReferences
|
||||
self.budgetupdated.emit(game)
|
||||
|
||||
def sendDebriefing(self, game: Game, gameEvent: Event, debriefing: Debriefing):
|
||||
sig = DebriefingSignal(game, gameEvent, debriefing)
|
||||
# noinspection PyUnresolvedReferences
|
||||
self.gameupdated.emit(game)
|
||||
# noinspection PyUnresolvedReferences
|
||||
self.debriefingReceived.emit(sig)
|
||||
|
||||
@staticmethod
|
||||
def get_instance():
|
||||
def get_instance() -> GameUpdateSignal:
|
||||
return GameUpdateSignal.instance
|
||||
|
||||
@ -7,6 +7,7 @@ from PySide2.QtWidgets import (
|
||||
from game import Game
|
||||
from gen.flights.flight import Flight
|
||||
from qt_ui.uiconstants import EVENT_ICONS
|
||||
from qt_ui.windows.GameUpdateSignal import GameUpdateSignal
|
||||
from qt_ui.windows.mission.flight.QFlightPlanner import QFlightPlanner
|
||||
|
||||
|
||||
@ -27,3 +28,8 @@ class QEditFlightDialog(QDialog):
|
||||
layout.addWidget(self.flight_planner)
|
||||
|
||||
self.setLayout(layout)
|
||||
self.finished.connect(self.on_close)
|
||||
|
||||
@staticmethod
|
||||
def on_close(_result) -> None:
|
||||
GameUpdateSignal.get_instance().redraw_flight_paths()
|
||||
|
||||
@ -17,6 +17,7 @@ from gen.flights.flight import Flight
|
||||
from qt_ui.models import AtoModel, PackageModel
|
||||
from qt_ui.uiconstants import EVENT_ICONS
|
||||
from qt_ui.widgets.ato import QFlightList
|
||||
from qt_ui.windows.GameUpdateSignal import GameUpdateSignal
|
||||
from qt_ui.windows.mission.flight.QFlightCreator import QFlightCreator
|
||||
from theater.missiontarget import MissionTarget
|
||||
|
||||
@ -86,6 +87,12 @@ class QPackageDialog(QDialog):
|
||||
|
||||
self.setLayout(self.layout)
|
||||
|
||||
self.finished.connect(self.on_close)
|
||||
|
||||
@staticmethod
|
||||
def on_close(_result) -> None:
|
||||
GameUpdateSignal.get_instance().redraw_flight_paths()
|
||||
|
||||
def on_selection_changed(self, selected: QItemSelection,
|
||||
_deselected: QItemSelection) -> None:
|
||||
"""Updates the state of the delete button."""
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user