mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
154 lines
6.1 KiB
Python
154 lines
6.1 KiB
Python
from PySide2.QtCore import QSortFilterProxyModel, Qt, QModelIndex
|
|
from PySide2.QtGui import QStandardItem, QStandardItemModel
|
|
from PySide2.QtWidgets import QComboBox, QCompleter
|
|
from game import Game
|
|
from gen import Conflict
|
|
from gen.flights.flight import FlightWaypoint
|
|
from theater import ControlPointType
|
|
|
|
|
|
class QPredefinedWaypointSelectionComboBox(QComboBox):
|
|
|
|
def __init__(self, game: Game, parent=None):
|
|
super(QPredefinedWaypointSelectionComboBox, self).__init__(parent)
|
|
|
|
self.game = game
|
|
self.setFocusPolicy(Qt.StrongFocus)
|
|
self.setEditable(True)
|
|
self.completer = QCompleter(self)
|
|
|
|
# always show all completions
|
|
self.completer.setCompletionMode(QCompleter.UnfilteredPopupCompletion)
|
|
self.pFilterModel = QSortFilterProxyModel(self)
|
|
self.pFilterModel.setFilterCaseSensitivity(Qt.CaseInsensitive)
|
|
|
|
self.completer.setPopup(self.view())
|
|
|
|
self.setCompleter(self.completer)
|
|
|
|
self.lineEdit().textEdited.connect(self.pFilterModel.setFilterFixedString)
|
|
self.completer.activated.connect(self.setTextIfCompleterIsClicked)
|
|
|
|
self.find_possible_waypoints()
|
|
|
|
def setModel(self, model):
|
|
super(QPredefinedWaypointSelectionComboBox, self).setModel(model)
|
|
self.pFilterModel.setSourceModel(model)
|
|
self.completer.setModel(self.pFilterModel)
|
|
|
|
def setModelColumn(self, column):
|
|
self.completer.setCompletionColumn(column)
|
|
self.pFilterModel.setFilterKeyColumn(column)
|
|
super(QPredefinedWaypointSelectionComboBox, self).setModelColumn(column)
|
|
|
|
def view(self):
|
|
return self.completer.popup()
|
|
|
|
def index(self):
|
|
return self.currentIndex()
|
|
|
|
def setTextIfCompleterIsClicked(self, text):
|
|
if text:
|
|
index = self.findText(text)
|
|
self.setCurrentIndex(index)
|
|
|
|
def get_selected_waypoints(self, include_all_from_same_location=False):
|
|
n = self.currentText()
|
|
|
|
first_waypoint = None
|
|
for w in self.wpts:
|
|
if w.pretty_name == n:
|
|
first_waypoint = w
|
|
break
|
|
|
|
if first_waypoint is None:
|
|
return []
|
|
|
|
waypoints = [first_waypoint]
|
|
if include_all_from_same_location:
|
|
for w in self.wpts:
|
|
if w is not first_waypoint and w.obj_name and w.obj_name == first_waypoint.obj_name:
|
|
waypoints.append(w)
|
|
|
|
return waypoints
|
|
|
|
def find_possible_waypoints(self):
|
|
|
|
self.wpts = []
|
|
model = QStandardItemModel()
|
|
i = 0
|
|
|
|
def add_model_item(i, model, name, wpt):
|
|
print(name)
|
|
item = QStandardItem(name)
|
|
model.setItem(i, 0, item)
|
|
self.wpts.append(wpt)
|
|
return i + 1
|
|
|
|
for cp in self.game.theater.controlpoints:
|
|
print(cp)
|
|
if cp.captured:
|
|
enemy_cp = [ecp for ecp in cp.connected_points if ecp.captured != cp.captured]
|
|
for ecp in enemy_cp:
|
|
pos = Conflict.frontline_position(self.game.theater, cp, ecp)[0]
|
|
wpt = FlightWaypoint(pos.x, pos.y, 800)
|
|
wpt.name = "Frontline " + cp.name + "/" + ecp.name + " [CAS]"
|
|
wpt.alt_type = "RADIO"
|
|
wpt.pretty_name = wpt.name
|
|
wpt.description = "Frontline"
|
|
i = add_model_item(i, model, wpt.pretty_name, wpt)
|
|
|
|
for cp in self.game.theater.controlpoints:
|
|
for ground_object in cp.ground_objects:
|
|
if not ground_object.is_dead and not ground_object.dcs_identifier == "AA":
|
|
wpt = FlightWaypoint(ground_object.position.x,ground_object.position.y, 0)
|
|
wpt.alt_type = "RADIO"
|
|
wpt.name = wpt.name = "[" + str(ground_object.obj_name) + "] : " + ground_object.category + " #" + str(ground_object.object_id)
|
|
wpt.pretty_name = wpt.name
|
|
wpt.obj_name = ground_object.obj_name
|
|
wpt.targets.append(ground_object)
|
|
if cp.captured:
|
|
wpt.description = "Friendly Building"
|
|
else:
|
|
wpt.description = "Enemy Building"
|
|
i = add_model_item(i, model, wpt.pretty_name, wpt)
|
|
|
|
for cp in self.game.theater.controlpoints:
|
|
|
|
for ground_object in cp.ground_objects:
|
|
if not ground_object.is_dead and ground_object.dcs_identifier == "AA":
|
|
for g in ground_object.groups:
|
|
for j, u in enumerate(g.units):
|
|
wpt = FlightWaypoint(u.position.x, u.position.y, 0)
|
|
wpt.alt_type = "RADIO"
|
|
wpt.name = wpt.name = "[" + str(ground_object.obj_name) + "] : " + u.type + " #" + str(j)
|
|
wpt.pretty_name = wpt.name
|
|
wpt.targets.append(u)
|
|
wpt.obj_name = ground_object.obj_name
|
|
if cp.captured:
|
|
wpt.description = "Friendly unit : " + u.type
|
|
else:
|
|
wpt.description = "Enemy unit : " + u.type
|
|
i = add_model_item(i, model, wpt.pretty_name, wpt)
|
|
|
|
for cp in self.game.theater.controlpoints:
|
|
|
|
wpt = FlightWaypoint(cp.position.x, cp.position.y, 0)
|
|
wpt.alt_type = "RADIO"
|
|
wpt.name = cp.name
|
|
if cp.captured:
|
|
wpt.description = "Position of " + cp.name + " [Friendly Airbase]"
|
|
else:
|
|
wpt.description = "Position of " + cp.name + " [Enemy Airbase]"
|
|
|
|
if cp.cptype == ControlPointType.AIRCRAFT_CARRIER_GROUP:
|
|
wpt.pretty_name = cp.name + " (Aircraft Carrier Group)"
|
|
elif cp.cptype == ControlPointType.LHA_GROUP:
|
|
wpt.pretty_name = cp.name + " (LHA Group)"
|
|
else:
|
|
wpt.pretty_name = cp.name + " (Airbase)"
|
|
|
|
i = add_model_item(i, model, wpt.pretty_name, wpt)
|
|
|
|
self.setModel(model)
|