mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
Merge remote-tracking branch 'upstream/develop' into new-plugin-system
This commit is contained in:
@@ -337,6 +337,7 @@ class QPackageList(QListView):
|
||||
self.setItemDelegate(PackageDelegate())
|
||||
self.setIconSize(QSize(91, 24))
|
||||
self.setSelectionBehavior(QAbstractItemView.SelectItems)
|
||||
self.model().rowsInserted.connect(self.on_new_packages)
|
||||
|
||||
@property
|
||||
def selected_item(self) -> Optional[Package]:
|
||||
@@ -346,6 +347,14 @@ class QPackageList(QListView):
|
||||
return None
|
||||
return self.ato_model.package_at_index(index)
|
||||
|
||||
def on_new_packages(self, _parent: QModelIndex, first: int,
|
||||
_last: int) -> None:
|
||||
# Select the newly created pacakges. This should only ever happen due to
|
||||
# the player saving a new package, so selecting it helps them view/edit
|
||||
# it faster.
|
||||
self.selectionModel().setCurrentIndex(self.model().index(first, 0),
|
||||
QItemSelectionModel.Select)
|
||||
|
||||
|
||||
class QPackagePanel(QGroupBox):
|
||||
"""The package display portion of the ATO panel.
|
||||
@@ -357,7 +366,7 @@ class QPackagePanel(QGroupBox):
|
||||
def __init__(self, model: AtoModel) -> None:
|
||||
super().__init__("Packages")
|
||||
self.ato_model = model
|
||||
self.ato_model.layoutChanged.connect(self.on_selection_changed)
|
||||
self.ato_model.layoutChanged.connect(self.on_current_changed)
|
||||
|
||||
self.vbox = QVBoxLayout()
|
||||
self.setLayout(self.vbox)
|
||||
@@ -378,15 +387,15 @@ class QPackagePanel(QGroupBox):
|
||||
self.delete_button.clicked.connect(self.on_delete)
|
||||
self.button_row.addWidget(self.delete_button)
|
||||
|
||||
self.selection_changed.connect(self.on_selection_changed)
|
||||
self.on_selection_changed()
|
||||
self.current_changed.connect(self.on_current_changed)
|
||||
self.on_current_changed()
|
||||
|
||||
@property
|
||||
def selection_changed(self):
|
||||
def current_changed(self):
|
||||
"""Returns the signal emitted when the flight selection changes."""
|
||||
return self.package_list.selectionModel().selectionChanged
|
||||
return self.package_list.selectionModel().currentChanged
|
||||
|
||||
def on_selection_changed(self) -> None:
|
||||
def on_current_changed(self) -> None:
|
||||
"""Updates the status of the edit and delete buttons."""
|
||||
index = self.package_list.currentIndex()
|
||||
enabled = index.isValid()
|
||||
@@ -436,8 +445,7 @@ class QAirTaskingOrderPanel(QSplitter):
|
||||
self.ato_model = game_model.ato_model
|
||||
|
||||
self.package_panel = QPackagePanel(self.ato_model)
|
||||
self.package_panel.selection_changed.connect(self.on_package_change)
|
||||
self.ato_model.rowsInserted.connect(self.on_package_change)
|
||||
self.package_panel.current_changed.connect(self.on_package_change)
|
||||
self.addWidget(self.package_panel)
|
||||
|
||||
self.flight_panel = QFlightPanel(game_model)
|
||||
|
||||
@@ -39,3 +39,9 @@ class QOriginAirfieldSelector(QComboBox):
|
||||
self.addItem(f"{origin.name} ({available} available)", origin)
|
||||
self.model().sort(0)
|
||||
self.update()
|
||||
|
||||
@property
|
||||
def available(self) -> int:
|
||||
origin = self.currentData()
|
||||
inventory = self.global_inventory.for_control_point(origin)
|
||||
return inventory.available(self.aircraft)
|
||||
|
||||
@@ -4,8 +4,16 @@ import datetime
|
||||
import logging
|
||||
from typing import List, Optional, Tuple
|
||||
|
||||
from PySide2.QtCore import Qt, QPointF
|
||||
from PySide2.QtGui import QBrush, QColor, QPen, QPixmap, QWheelEvent, QPolygonF
|
||||
from PySide2.QtCore import QPointF, Qt
|
||||
from PySide2.QtGui import (
|
||||
QBrush,
|
||||
QColor,
|
||||
QFont,
|
||||
QPen,
|
||||
QPixmap,
|
||||
QPolygonF,
|
||||
QWheelEvent,
|
||||
)
|
||||
from PySide2.QtWidgets import (
|
||||
QFrame,
|
||||
QGraphicsItem,
|
||||
@@ -46,6 +54,9 @@ class QLiberationMap(QGraphicsView):
|
||||
self.game_model = game_model
|
||||
self.game: Optional[Game] = game_model.game
|
||||
|
||||
self.waypoint_info_font = QFont()
|
||||
self.waypoint_info_font.setPointSize(12)
|
||||
|
||||
self.flight_path_items: List[QGraphicsItem] = []
|
||||
# A tuple of (package index, flight index), or none.
|
||||
self.selected_flight: Optional[Tuple[int, int]] = None
|
||||
@@ -345,19 +356,19 @@ class QLiberationMap(QGraphicsView):
|
||||
pen = QPen(QColor("black"), 0.3)
|
||||
brush = QColor("white")
|
||||
|
||||
def draw_text(text: str, x: int, y: int) -> None:
|
||||
item = scene.addSimpleText(text)
|
||||
item.setBrush(brush)
|
||||
item.setPen(pen)
|
||||
item.moveBy(x, y)
|
||||
item.setZValue(2)
|
||||
self.flight_path_items.append(item)
|
||||
text = "\n".join([
|
||||
f"{number} {waypoint.name}",
|
||||
f"{altitude} ft {altitude_type}",
|
||||
tot,
|
||||
])
|
||||
|
||||
draw_text(f"{number} {waypoint.name}", position[0] + 8,
|
||||
position[1] - 15)
|
||||
draw_text(f"{altitude} ft {altitude_type}", position[0] + 8,
|
||||
position[1] - 5)
|
||||
draw_text(tot, position[0] + 8, position[1] + 5)
|
||||
item = scene.addSimpleText(text, self.waypoint_info_font)
|
||||
item.setFlag(QGraphicsItem.ItemIgnoresTransformations)
|
||||
item.setBrush(brush)
|
||||
item.setPen(pen)
|
||||
item.moveBy(position[0] + 8, position[1])
|
||||
item.setZValue(2)
|
||||
self.flight_path_items.append(item)
|
||||
|
||||
def draw_flight_path(self, scene: QGraphicsScene, pos0: Tuple[int, int],
|
||||
pos1: Tuple[int, int], player: bool,
|
||||
|
||||
@@ -102,7 +102,7 @@ class QPackageDialog(QDialog):
|
||||
self.delete_flight_button = QPushButton("Delete Selected")
|
||||
self.delete_flight_button.setProperty("style", "btn-danger")
|
||||
self.delete_flight_button.clicked.connect(self.on_delete_flight)
|
||||
self.delete_flight_button.setEnabled(False)
|
||||
self.delete_flight_button.setEnabled(model.rowCount() > 0)
|
||||
self.button_layout.addWidget(self.delete_flight_button)
|
||||
|
||||
self.button_layout.addStretch()
|
||||
@@ -205,7 +205,7 @@ class QNewPackageDialog(QPackageDialog):
|
||||
def on_cancel(self) -> None:
|
||||
super().on_cancel()
|
||||
for flight in self.package_model.package.flights:
|
||||
self.game_model.game.aircraft_inventory.return_from_flight(flight)
|
||||
self.game.aircraft_inventory.return_from_flight(flight)
|
||||
|
||||
|
||||
class QEditPackageDialog(QPackageDialog):
|
||||
|
||||
@@ -53,10 +53,23 @@ class QFlightCreator(QDialog):
|
||||
[cp for cp in game.theater.controlpoints if cp.captured],
|
||||
self.aircraft_selector.currentData()
|
||||
)
|
||||
self.aircraft_selector.currentIndexChanged.connect(self.update_max_size)
|
||||
layout.addLayout(QLabeledWidget("Airfield:", self.airfield_selector))
|
||||
|
||||
self.flight_size_spinner = QFlightSizeSpinner()
|
||||
layout.addLayout(QLabeledWidget("Count:", self.flight_size_spinner))
|
||||
self.update_max_size()
|
||||
layout.addLayout(QLabeledWidget("Size:", self.flight_size_spinner))
|
||||
|
||||
self.client_slots_spinner = QFlightSizeSpinner(
|
||||
min_size=0,
|
||||
max_size=self.flight_size_spinner.value(),
|
||||
default_size=0
|
||||
)
|
||||
self.flight_size_spinner.valueChanged.connect(
|
||||
lambda v: self.client_slots_spinner.setMaximum(v)
|
||||
)
|
||||
layout.addLayout(
|
||||
QLabeledWidget("Client Slots:", self.client_slots_spinner))
|
||||
|
||||
layout.addStretch()
|
||||
|
||||
@@ -96,6 +109,7 @@ class QFlightCreator(QDialog):
|
||||
start_type = "Warm"
|
||||
flight = Flight(aircraft, size, origin, task, start_type)
|
||||
flight.scheduled_in = self.package.delay
|
||||
flight.client_count = self.client_slots_spinner.value()
|
||||
|
||||
# noinspection PyUnresolvedReferences
|
||||
self.created.emit(flight)
|
||||
@@ -104,3 +118,8 @@ class QFlightCreator(QDialog):
|
||||
def on_aircraft_changed(self, index: int) -> None:
|
||||
new_aircraft = self.aircraft_selector.itemData(index)
|
||||
self.airfield_selector.change_aircraft(new_aircraft)
|
||||
|
||||
def update_max_size(self) -> None:
|
||||
self.flight_size_spinner.setMaximum(
|
||||
min(self.airfield_selector.available, 4)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user