diff --git a/qt_ui/widgets/ato.py b/qt_ui/widgets/ato.py index bee61a43..ae9a5db3 100644 --- a/qt_ui/widgets/ato.py +++ b/qt_ui/widgets/ato.py @@ -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): diff --git a/qt_ui/widgets/map/QLiberationMap.py b/qt_ui/widgets/map/QLiberationMap.py index a36382b5..3f5b026a 100644 --- a/qt_ui/widgets/map/QLiberationMap.py +++ b/qt_ui/widgets/map/QLiberationMap.py @@ -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() diff --git a/qt_ui/windows/GameUpdateSignal.py b/qt_ui/windows/GameUpdateSignal.py index dd32dd58..3e855149 100644 --- a/qt_ui/windows/GameUpdateSignal.py +++ b/qt_ui/windows/GameUpdateSignal.py @@ -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 diff --git a/qt_ui/windows/mission/QEditFlightDialog.py b/qt_ui/windows/mission/QEditFlightDialog.py index 29e4eafb..24fdfae2 100644 --- a/qt_ui/windows/mission/QEditFlightDialog.py +++ b/qt_ui/windows/mission/QEditFlightDialog.py @@ -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() diff --git a/qt_ui/windows/mission/QPackageDialog.py b/qt_ui/windows/mission/QPackageDialog.py index 2b27a035..37b73d04 100644 --- a/qt_ui/windows/mission/QPackageDialog.py +++ b/qt_ui/windows/mission/QPackageDialog.py @@ -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."""