Redraw flight plans when they change.

This commit is contained in:
Dan Albert 2020-09-27 18:35:16 -07:00
parent 1e041b6249
commit aa309af015
5 changed files with 56 additions and 10 deletions

View File

@ -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):

View File

@ -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()

View File

@ -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

View File

@ -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()

View File

@ -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."""