mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
Merge branch 'develop' into faction_refactor
This commit is contained in:
@@ -252,6 +252,8 @@ class AtoModel(QAbstractListModel):
|
||||
else:
|
||||
self.ato = AirTaskingOrder()
|
||||
self.endResetModel()
|
||||
# noinspection PyUnresolvedReferences
|
||||
self.client_slots_changed.emit()
|
||||
|
||||
def get_package_model(self, index: QModelIndex) -> PackageModel:
|
||||
"""Returns a model for the package at the given index."""
|
||||
|
||||
@@ -10,15 +10,26 @@ from PySide2.QtCore import (
|
||||
QSize,
|
||||
Qt,
|
||||
)
|
||||
from PySide2.QtGui import QFont, QFontMetrics, QIcon, QPainter
|
||||
from PySide2.QtGui import (
|
||||
QContextMenuEvent,
|
||||
QFont,
|
||||
QFontMetrics,
|
||||
QIcon,
|
||||
QPainter,
|
||||
)
|
||||
from PySide2.QtWidgets import (
|
||||
QAbstractItemView,
|
||||
QAction,
|
||||
QGroupBox,
|
||||
QHBoxLayout,
|
||||
QListView,
|
||||
QMenu,
|
||||
QPushButton,
|
||||
QSplitter,
|
||||
QStyle, QStyleOptionViewItem, QStyledItemDelegate, QVBoxLayout,
|
||||
QStyle,
|
||||
QStyleOptionViewItem,
|
||||
QStyledItemDelegate,
|
||||
QVBoxLayout,
|
||||
)
|
||||
|
||||
from game import db
|
||||
@@ -130,14 +141,17 @@ class FlightDelegate(QStyledItemDelegate):
|
||||
class QFlightList(QListView):
|
||||
"""List view for displaying the flights of a package."""
|
||||
|
||||
def __init__(self, model: Optional[PackageModel]) -> None:
|
||||
def __init__(self, game_model: GameModel,
|
||||
package_model: Optional[PackageModel]) -> None:
|
||||
super().__init__()
|
||||
self.package_model = model
|
||||
self.set_package(model)
|
||||
if model is not None:
|
||||
self.setItemDelegate(FlightDelegate(model.package))
|
||||
self.game_model = game_model
|
||||
self.package_model = package_model
|
||||
self.set_package(package_model)
|
||||
if package_model is not None:
|
||||
self.setItemDelegate(FlightDelegate(package_model.package))
|
||||
self.setIconSize(QSize(91, 24))
|
||||
self.setSelectionBehavior(QAbstractItemView.SelectItems)
|
||||
self.doubleClicked.connect(self.on_double_click)
|
||||
|
||||
def set_package(self, model: Optional[PackageModel]) -> None:
|
||||
"""Sets the package model to display."""
|
||||
@@ -172,6 +186,38 @@ class QFlightList(QListView):
|
||||
return None
|
||||
return self.package_model.flight_at_index(index)
|
||||
|
||||
def on_double_click(self, index: QModelIndex) -> None:
|
||||
if not index.isValid():
|
||||
return
|
||||
self.edit_flight(index)
|
||||
|
||||
def edit_flight(self, index: QModelIndex) -> None:
|
||||
from qt_ui.dialogs import Dialog
|
||||
Dialog.open_edit_flight_dialog(
|
||||
self.package_model, self.package_model.flight_at_index(index)
|
||||
)
|
||||
|
||||
def delete_flight(self, index: QModelIndex) -> None:
|
||||
self.game_model.game.aircraft_inventory.return_from_flight(
|
||||
self.selected_item)
|
||||
self.package_model.delete_flight_at_index(index)
|
||||
GameUpdateSignal.get_instance().redraw_flight_paths()
|
||||
|
||||
def contextMenuEvent(self, event: QContextMenuEvent) -> None:
|
||||
index = self.indexAt(event.pos())
|
||||
|
||||
menu = QMenu("Menu")
|
||||
|
||||
edit_action = QAction("Edit")
|
||||
edit_action.triggered.connect(lambda: self.edit_flight(index))
|
||||
menu.addAction(edit_action)
|
||||
|
||||
delete_action = QAction(f"Delete")
|
||||
delete_action.triggered.connect(lambda: self.delete_flight(index))
|
||||
menu.addAction(delete_action)
|
||||
|
||||
menu.exec_(event.globalPos())
|
||||
|
||||
|
||||
class QFlightPanel(QGroupBox):
|
||||
"""The flight display portion of the ATO panel.
|
||||
@@ -189,7 +235,7 @@ class QFlightPanel(QGroupBox):
|
||||
self.vbox = QVBoxLayout()
|
||||
self.setLayout(self.vbox)
|
||||
|
||||
self.flight_list = QFlightList(package_model)
|
||||
self.flight_list = QFlightList(game_model, package_model)
|
||||
self.vbox.addWidget(self.flight_list)
|
||||
|
||||
self.button_row = QHBoxLayout()
|
||||
@@ -242,10 +288,7 @@ class QFlightPanel(QGroupBox):
|
||||
if not index.isValid():
|
||||
logging.error(f"Cannot edit flight when no flight is selected.")
|
||||
return
|
||||
from qt_ui.dialogs import Dialog
|
||||
Dialog.open_edit_flight_dialog(
|
||||
self.package_model, self.package_model.flight_at_index(index)
|
||||
)
|
||||
self.flight_list.edit_flight(index)
|
||||
|
||||
def on_delete(self) -> None:
|
||||
"""Removes the selected flight from the package."""
|
||||
@@ -253,10 +296,7 @@ class QFlightPanel(QGroupBox):
|
||||
if not index.isValid():
|
||||
logging.error(f"Cannot delete flight when no flight is selected.")
|
||||
return
|
||||
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()
|
||||
self.flight_list.delete_flight(index)
|
||||
|
||||
|
||||
@contextmanager
|
||||
@@ -338,6 +378,7 @@ class QPackageList(QListView):
|
||||
self.setIconSize(QSize(91, 24))
|
||||
self.setSelectionBehavior(QAbstractItemView.SelectItems)
|
||||
self.model().rowsInserted.connect(self.on_new_packages)
|
||||
self.doubleClicked.connect(self.on_double_click)
|
||||
|
||||
@property
|
||||
def selected_item(self) -> Optional[Package]:
|
||||
@@ -347,6 +388,14 @@ class QPackageList(QListView):
|
||||
return None
|
||||
return self.ato_model.package_at_index(index)
|
||||
|
||||
def edit_package(self, index: QModelIndex) -> None:
|
||||
from qt_ui.dialogs import Dialog
|
||||
Dialog.open_edit_package_dialog(self.ato_model.get_package_model(index))
|
||||
|
||||
def delete_package(self, index: QModelIndex) -> None:
|
||||
self.ato_model.delete_package_at_index(index)
|
||||
GameUpdateSignal.get_instance().redraw_flight_paths()
|
||||
|
||||
def on_new_packages(self, _parent: QModelIndex, first: int,
|
||||
_last: int) -> None:
|
||||
# Select the newly created pacakges. This should only ever happen due to
|
||||
@@ -355,6 +404,26 @@ class QPackageList(QListView):
|
||||
self.selectionModel().setCurrentIndex(self.model().index(first, 0),
|
||||
QItemSelectionModel.Select)
|
||||
|
||||
def on_double_click(self, index: QModelIndex) -> None:
|
||||
if not index.isValid():
|
||||
return
|
||||
self.edit_package(index)
|
||||
|
||||
def contextMenuEvent(self, event: QContextMenuEvent) -> None:
|
||||
index = self.indexAt(event.pos())
|
||||
|
||||
menu = QMenu("Menu")
|
||||
|
||||
edit_action = QAction("Edit")
|
||||
edit_action.triggered.connect(lambda: self.edit_package(index))
|
||||
menu.addAction(edit_action)
|
||||
|
||||
delete_action = QAction(f"Delete")
|
||||
delete_action.triggered.connect(lambda: self.delete_package(index))
|
||||
menu.addAction(delete_action)
|
||||
|
||||
menu.exec_(event.globalPos())
|
||||
|
||||
|
||||
class QPackagePanel(QGroupBox):
|
||||
"""The package display portion of the ATO panel.
|
||||
@@ -420,8 +489,7 @@ class QPackagePanel(QGroupBox):
|
||||
if not index.isValid():
|
||||
logging.error(f"Cannot edit package when no package is selected.")
|
||||
return
|
||||
from qt_ui.dialogs import Dialog
|
||||
Dialog.open_edit_package_dialog(self.ato_model.get_package_model(index))
|
||||
self.package_list.edit_package(index)
|
||||
|
||||
def on_delete(self) -> None:
|
||||
"""Removes the package from the ATO."""
|
||||
@@ -429,8 +497,7 @@ class QPackagePanel(QGroupBox):
|
||||
if not index.isValid():
|
||||
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()
|
||||
self.package_list.delete_package(index)
|
||||
|
||||
|
||||
class QAirTaskingOrderPanel(QSplitter):
|
||||
@@ -440,6 +507,7 @@ class QAirTaskingOrderPanel(QSplitter):
|
||||
packages of the player's ATO, and the bottom half displays the flights of
|
||||
the selected package.
|
||||
"""
|
||||
|
||||
def __init__(self, game_model: GameModel) -> None:
|
||||
super().__init__(Qt.Vertical)
|
||||
self.ato_model = game_model.ato_model
|
||||
|
||||
@@ -4,7 +4,7 @@ import webbrowser
|
||||
from typing import Optional, Union
|
||||
|
||||
from PySide2.QtCore import Qt
|
||||
from PySide2.QtGui import QIcon
|
||||
from PySide2.QtGui import QCloseEvent, QIcon
|
||||
from PySide2.QtWidgets import (
|
||||
QAction,
|
||||
QActionGroup, QDesktopWidget,
|
||||
@@ -136,7 +136,7 @@ class QLiberationWindow(QMainWindow):
|
||||
file_menu.addSeparator()
|
||||
file_menu.addAction(self.showLiberationPrefDialogAction)
|
||||
file_menu.addSeparator()
|
||||
file_menu.addAction("E&xit" , lambda: self.exit())
|
||||
file_menu.addAction("E&xit", self.close)
|
||||
|
||||
displayMenu = self.menu.addMenu("&Display")
|
||||
|
||||
@@ -214,13 +214,6 @@ class QLiberationWindow(QMainWindow):
|
||||
self.game = game
|
||||
GameUpdateSignal.get_instance().updateGame(self.game)
|
||||
|
||||
def closeGame(self):
|
||||
self.game = None
|
||||
GameUpdateSignal.get_instance().updateGame(self.game)
|
||||
|
||||
def exit(self):
|
||||
sys.exit(0)
|
||||
|
||||
def setGame(self, game: Optional[Game]):
|
||||
if game is not None:
|
||||
game.on_load()
|
||||
@@ -257,3 +250,14 @@ class QLiberationWindow(QMainWindow):
|
||||
logging.info("On Debriefing")
|
||||
self.debriefing = QDebriefingWindow(debrief.debriefing, debrief.gameEvent, debrief.game)
|
||||
self.debriefing.show()
|
||||
|
||||
def closeEvent(self, event: QCloseEvent) -> None:
|
||||
result = QMessageBox.question(
|
||||
self, "Quit Liberation?",
|
||||
"Are you sure you want to quit? All unsaved progress will be lost.",
|
||||
QMessageBox.Yes | QMessageBox.No
|
||||
)
|
||||
if result == QMessageBox.Yes:
|
||||
super().closeEvent(event)
|
||||
else:
|
||||
event.ignore()
|
||||
|
||||
@@ -17,7 +17,7 @@ from gen.ato import Package
|
||||
from gen.flights.flight import Flight
|
||||
from gen.flights.flightplan import FlightPlanBuilder
|
||||
from gen.flights.traveltime import TotEstimator
|
||||
from qt_ui.models import AtoModel, PackageModel
|
||||
from qt_ui.models import AtoModel, GameModel, PackageModel
|
||||
from qt_ui.uiconstants import EVENT_ICONS
|
||||
from qt_ui.widgets.ato import QFlightList
|
||||
from qt_ui.windows.GameUpdateSignal import GameUpdateSignal
|
||||
@@ -35,9 +35,9 @@ class QPackageDialog(QDialog):
|
||||
#: Emitted when a change is made to the package.
|
||||
package_changed = Signal()
|
||||
|
||||
def __init__(self, game: Game, model: PackageModel) -> None:
|
||||
def __init__(self, game_model: GameModel, model: PackageModel) -> None:
|
||||
super().__init__()
|
||||
self.game = game
|
||||
self.game_model = game_model
|
||||
self.package_model = model
|
||||
self.add_flight_dialog: Optional[QFlightCreator] = None
|
||||
|
||||
@@ -86,7 +86,7 @@ class QPackageDialog(QDialog):
|
||||
self.reset_tot_button.clicked.connect(self.reset_tot)
|
||||
self.tot_column.addWidget(self.reset_tot_button)
|
||||
|
||||
self.package_view = QFlightList(self.package_model)
|
||||
self.package_view = QFlightList(self.game_model, self.package_model)
|
||||
self.package_view.selectionModel().selectionChanged.connect(
|
||||
self.on_selection_changed
|
||||
)
|
||||
@@ -113,6 +113,10 @@ class QPackageDialog(QDialog):
|
||||
self.finished.connect(self.on_close)
|
||||
self.rejected.connect(self.on_cancel)
|
||||
|
||||
@property
|
||||
def game(self) -> Game:
|
||||
return self.game_model.game
|
||||
|
||||
def tot_qtime(self) -> QTime:
|
||||
delay = self.package_model.package.time_over_target
|
||||
hours = delay // 3600
|
||||
|
||||
@@ -111,19 +111,22 @@ class QFlightWaypointTab(QFrame):
|
||||
self.subwindow.show()
|
||||
|
||||
def on_ascend_waypoint(self):
|
||||
ascend = self.planner.generate_ascend_point(self.flight.from_cp)
|
||||
ascend = self.planner.generate_ascend_point(self.flight,
|
||||
self.flight.from_cp)
|
||||
self.flight.points.append(ascend)
|
||||
self.flight_waypoint_list.update_list()
|
||||
self.on_change()
|
||||
|
||||
def on_rtb_waypoint(self):
|
||||
rtb = self.planner.generate_rtb_waypoint(self.flight.from_cp)
|
||||
rtb = self.planner.generate_rtb_waypoint(self.flight,
|
||||
self.flight.from_cp)
|
||||
self.flight.points.append(rtb)
|
||||
self.flight_waypoint_list.update_list()
|
||||
self.on_change()
|
||||
|
||||
def on_descend_waypoint(self):
|
||||
descend = self.planner.generate_descend_point(self.flight.from_cp)
|
||||
descend = self.planner.generate_descend_point(self.flight,
|
||||
self.flight.from_cp)
|
||||
self.flight.points.append(descend)
|
||||
self.flight_waypoint_list.update_list()
|
||||
self.on_change()
|
||||
|
||||
Reference in New Issue
Block a user