Fix adding and removing waypoints in the UI.

This moves more of the logic out of the UI so mypy can actually spot
these mistakes more often.

Fixes https://github.com/dcs-liberation/dcs_liberation/issues/2495.
This commit is contained in:
Dan Albert 2022-11-19 15:33:20 -08:00 committed by Raffson
parent 98e8fc88bd
commit 219b52fc12
No known key found for this signature in database
GPG Key ID: B0402B2C9B764D99
3 changed files with 18 additions and 11 deletions

View File

@ -91,6 +91,12 @@ class Flight(SidcDescribable):
def flight_plan(self) -> FlightPlan[Any]: def flight_plan(self) -> FlightPlan[Any]:
return self._flight_plan_builder.get_or_build() return self._flight_plan_builder.get_or_build()
def degrade_to_custom_flight_plan(self) -> None:
from .flightplans.custom import Builder as CustomBuilder
self._flight_plan_builder = CustomBuilder(self, self.flight_plan.waypoints[1:])
self.recreate_flight_plan()
def __getstate__(self) -> dict[str, Any]: def __getstate__(self) -> dict[str, Any]:
state = self.__dict__.copy() state = self.__dict__.copy()
# Avoid persisting the flight state since that's not (currently) used outside # Avoid persisting the flight state since that's not (currently) used outside

View File

@ -8,6 +8,7 @@ from typing import TYPE_CHECKING, Type
from .flightplan import FlightPlan, Layout from .flightplan import FlightPlan, Layout
from .ibuilder import IBuilder from .ibuilder import IBuilder
from .waypointbuilder import WaypointBuilder from .waypointbuilder import WaypointBuilder
from .. import Flight
from ..flightwaypointtype import FlightWaypointType from ..flightwaypointtype import FlightWaypointType
if TYPE_CHECKING: if TYPE_CHECKING:
@ -55,9 +56,17 @@ class CustomFlightPlan(FlightPlan[CustomLayout]):
class Builder(IBuilder[CustomFlightPlan, CustomLayout]): class Builder(IBuilder[CustomFlightPlan, CustomLayout]):
def __init__(
self, flight: Flight, waypoints: list[FlightWaypoint] | None = None
) -> None:
super().__init__(flight)
if waypoints is None:
waypoints = []
self.waypoints = waypoints
def layout(self) -> CustomLayout: def layout(self) -> CustomLayout:
builder = WaypointBuilder(self.flight, self.coalition) builder = WaypointBuilder(self.flight, self.coalition)
return CustomLayout(builder.takeoff(self.flight.departure), []) return CustomLayout(builder.takeoff(self.flight.departure), self.waypoints)
def build(self) -> CustomFlightPlan: def build(self) -> CustomFlightPlan:
return CustomFlightPlan(self.flight, self.layout()) return CustomFlightPlan(self.flight, self.layout())

View File

@ -13,7 +13,7 @@ from PySide2.QtWidgets import (
from game import Game from game import Game
from game.ato.flight import Flight from game.ato.flight import Flight
from game.ato.flightplans.custom import CustomFlightPlan, CustomLayout from game.ato.flightplans.custom import CustomFlightPlan
from game.ato.flightplans.formationattack import FormationAttackFlightPlan from game.ato.flightplans.formationattack import FormationAttackFlightPlan
from game.ato.flightplans.planningerror import PlanningError from game.ato.flightplans.planningerror import PlanningError
from game.ato.flightplans.waypointbuilder import WaypointBuilder from game.ato.flightplans.waypointbuilder import WaypointBuilder
@ -147,15 +147,7 @@ class QFlightWaypointTab(QFrame):
def degrade_to_custom_flight_plan(self) -> None: def degrade_to_custom_flight_plan(self) -> None:
if not isinstance(self.flight.flight_plan, CustomFlightPlan): if not isinstance(self.flight.flight_plan, CustomFlightPlan):
self.flight.flight_plan = CustomFlightPlan( self.flight.degrade_to_custom_flight_plan()
self.flight,
CustomLayout(
departure=WaypointBuilder(self.flight, self.coalition).takeoff(
self.flight.departure
),
custom_waypoints=self.flight.flight_plan.waypoints[1:],
),
)
def confirm_recreate(self, task: FlightType) -> None: def confirm_recreate(self, task: FlightType) -> None:
result = QMessageBox.question( result = QMessageBox.question(