Add double- and right-click actions for ATO lists.

Fixes https://github.com/Khopa/dcs_liberation/issues/230
This commit is contained in:
Dan Albert 2020-10-21 17:52:03 -07:00
parent dcaa390d24
commit 8ac5dbe22a

View File

@ -10,15 +10,26 @@ from PySide2.QtCore import (
QSize, QSize,
Qt, Qt,
) )
from PySide2.QtGui import QFont, QFontMetrics, QIcon, QPainter from PySide2.QtGui import (
QContextMenuEvent,
QFont,
QFontMetrics,
QIcon,
QPainter,
)
from PySide2.QtWidgets import ( from PySide2.QtWidgets import (
QAbstractItemView, QAbstractItemView,
QAction,
QGroupBox, QGroupBox,
QHBoxLayout, QHBoxLayout,
QListView, QListView,
QMenu,
QPushButton, QPushButton,
QSplitter, QSplitter,
QStyle, QStyleOptionViewItem, QStyledItemDelegate, QVBoxLayout, QStyle,
QStyleOptionViewItem,
QStyledItemDelegate,
QVBoxLayout,
) )
from game import db from game import db
@ -130,14 +141,17 @@ class FlightDelegate(QStyledItemDelegate):
class QFlightList(QListView): class QFlightList(QListView):
"""List view for displaying the flights of a package.""" """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__() super().__init__()
self.package_model = model self.game_model = game_model
self.set_package(model) self.package_model = package_model
if model is not None: self.set_package(package_model)
self.setItemDelegate(FlightDelegate(model.package)) if package_model is not None:
self.setItemDelegate(FlightDelegate(package_model.package))
self.setIconSize(QSize(91, 24)) self.setIconSize(QSize(91, 24))
self.setSelectionBehavior(QAbstractItemView.SelectItems) self.setSelectionBehavior(QAbstractItemView.SelectItems)
self.doubleClicked.connect(self.on_double_click)
def set_package(self, model: Optional[PackageModel]) -> None: def set_package(self, model: Optional[PackageModel]) -> None:
"""Sets the package model to display.""" """Sets the package model to display."""
@ -172,6 +186,38 @@ class QFlightList(QListView):
return None return None
return self.package_model.flight_at_index(index) 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): class QFlightPanel(QGroupBox):
"""The flight display portion of the ATO panel. """The flight display portion of the ATO panel.
@ -189,7 +235,7 @@ class QFlightPanel(QGroupBox):
self.vbox = QVBoxLayout() self.vbox = QVBoxLayout()
self.setLayout(self.vbox) 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.vbox.addWidget(self.flight_list)
self.button_row = QHBoxLayout() self.button_row = QHBoxLayout()
@ -242,10 +288,7 @@ class QFlightPanel(QGroupBox):
if not index.isValid(): if not index.isValid():
logging.error(f"Cannot edit flight when no flight is selected.") logging.error(f"Cannot edit flight when no flight is selected.")
return return
from qt_ui.dialogs import Dialog self.flight_list.edit_flight(index)
Dialog.open_edit_flight_dialog(
self.package_model, self.package_model.flight_at_index(index)
)
def on_delete(self) -> None: def on_delete(self) -> None:
"""Removes the selected flight from the package.""" """Removes the selected flight from the package."""
@ -253,10 +296,7 @@ class QFlightPanel(QGroupBox):
if not index.isValid(): if not index.isValid():
logging.error(f"Cannot delete flight when no flight is selected.") logging.error(f"Cannot delete flight when no flight is selected.")
return return
self.game_model.game.aircraft_inventory.return_from_flight( self.flight_list.delete_flight(index)
self.flight_list.selected_item)
self.package_model.delete_flight_at_index(index)
GameUpdateSignal.get_instance().redraw_flight_paths()
@contextmanager @contextmanager
@ -338,6 +378,7 @@ class QPackageList(QListView):
self.setIconSize(QSize(91, 24)) self.setIconSize(QSize(91, 24))
self.setSelectionBehavior(QAbstractItemView.SelectItems) self.setSelectionBehavior(QAbstractItemView.SelectItems)
self.model().rowsInserted.connect(self.on_new_packages) self.model().rowsInserted.connect(self.on_new_packages)
self.doubleClicked.connect(self.on_double_click)
@property @property
def selected_item(self) -> Optional[Package]: def selected_item(self) -> Optional[Package]:
@ -347,6 +388,14 @@ class QPackageList(QListView):
return None return None
return self.ato_model.package_at_index(index) 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, def on_new_packages(self, _parent: QModelIndex, first: int,
_last: int) -> None: _last: int) -> None:
# Select the newly created pacakges. This should only ever happen due to # 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), self.selectionModel().setCurrentIndex(self.model().index(first, 0),
QItemSelectionModel.Select) 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): class QPackagePanel(QGroupBox):
"""The package display portion of the ATO panel. """The package display portion of the ATO panel.
@ -420,8 +489,7 @@ class QPackagePanel(QGroupBox):
if not index.isValid(): if not index.isValid():
logging.error(f"Cannot edit package when no package is selected.") logging.error(f"Cannot edit package when no package is selected.")
return return
from qt_ui.dialogs import Dialog self.package_list.edit_package(index)
Dialog.open_edit_package_dialog(self.ato_model.get_package_model(index))
def on_delete(self) -> None: def on_delete(self) -> None:
"""Removes the package from the ATO.""" """Removes the package from the ATO."""
@ -429,8 +497,7 @@ class QPackagePanel(QGroupBox):
if not index.isValid(): if not index.isValid():
logging.error(f"Cannot delete package when no package is selected.") logging.error(f"Cannot delete package when no package is selected.")
return return
self.ato_model.delete_package_at_index(index) self.package_list.delete_package(index)
GameUpdateSignal.get_instance().redraw_flight_paths()
class QAirTaskingOrderPanel(QSplitter): class QAirTaskingOrderPanel(QSplitter):
@ -440,6 +507,7 @@ class QAirTaskingOrderPanel(QSplitter):
packages of the player's ATO, and the bottom half displays the flights of packages of the player's ATO, and the bottom half displays the flights of
the selected package. the selected package.
""" """
def __init__(self, game_model: GameModel) -> None: def __init__(self, game_model: GameModel) -> None:
super().__init__(Qt.Vertical) super().__init__(Qt.Vertical)
self.ato_model = game_model.ato_model self.ato_model = game_model.ato_model