mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
100 lines
3.4 KiB
Python
100 lines
3.4 KiB
Python
from typing import Optional
|
|
|
|
from PySide2.QtGui import QColor, QPainter
|
|
from PySide2.QtWidgets import QAction, QMenu
|
|
|
|
import qt_ui.uiconstants as const
|
|
from qt_ui.models import GameModel
|
|
from qt_ui.windows.basemenu.QBaseMenu2 import QBaseMenu2
|
|
from theater import ControlPoint
|
|
from .QMapObject import QMapObject
|
|
from ...displayoptions import DisplayOptions
|
|
from ...windows.GameUpdateSignal import GameUpdateSignal
|
|
|
|
|
|
class QMapControlPoint(QMapObject):
|
|
def __init__(self, parent, x: float, y: float, w: float, h: float,
|
|
control_point: ControlPoint, game_model: GameModel) -> None:
|
|
super().__init__(x, y, w, h, mission_target=control_point)
|
|
self.game_model = game_model
|
|
self.control_point = control_point
|
|
self.parent = parent
|
|
self.setZValue(1)
|
|
self.setToolTip(self.control_point.name)
|
|
self.base_details_dialog: Optional[QBaseMenu2] = None
|
|
self.capture_action = QAction(
|
|
f"CHEAT: Capture {self.control_point.name}")
|
|
self.capture_action.triggered.connect(self.cheat_capture)
|
|
|
|
def paint(self, painter, option, widget=None) -> None:
|
|
if DisplayOptions.control_points:
|
|
painter.save()
|
|
painter.setRenderHint(QPainter.Antialiasing)
|
|
painter.setBrush(self.brush_color)
|
|
painter.setPen(self.pen_color)
|
|
|
|
if self.control_point.has_runway():
|
|
if self.isUnderMouse():
|
|
painter.setBrush(const.COLORS["white"])
|
|
painter.setPen(self.pen_color)
|
|
|
|
r = option.rect
|
|
painter.drawEllipse(r.x(), r.y(), r.width(), r.height())
|
|
# TODO: Draw sunk carriers differently.
|
|
# Either don't draw them at all, or perhaps use a sunk ship icon.
|
|
painter.restore()
|
|
|
|
@property
|
|
def brush_color(self) -> QColor:
|
|
if self.control_point.captured:
|
|
return const.COLORS["blue"]
|
|
else:
|
|
return const.COLORS["super_red"]
|
|
|
|
@property
|
|
def pen_color(self) -> QColor:
|
|
return const.COLORS["white"]
|
|
|
|
@property
|
|
def object_dialog_text(self) -> str:
|
|
if self.control_point.captured:
|
|
return "Open base menu"
|
|
else:
|
|
return "Open intel menu"
|
|
|
|
def on_click(self) -> None:
|
|
self.base_details_dialog = QBaseMenu2(
|
|
self.window(),
|
|
self.control_point,
|
|
self.game_model
|
|
)
|
|
self.base_details_dialog.show()
|
|
|
|
def add_context_menu_actions(self, menu: QMenu) -> None:
|
|
if self.control_point.is_fleet:
|
|
return
|
|
|
|
if self.control_point.captured:
|
|
return
|
|
|
|
for connected in self.control_point.connected_points:
|
|
if connected.captured:
|
|
break
|
|
else:
|
|
return
|
|
|
|
menu.addAction(self.capture_action)
|
|
|
|
def cheat_capture(self) -> None:
|
|
self.control_point.capture(self.game_model.game, for_player=True)
|
|
# Reinitialized ground planners and the like.
|
|
self.game_model.game.initialize_turn()
|
|
GameUpdateSignal.get_instance().updateGame(self.game_model.game)
|
|
|
|
def open_new_package_dialog(self) -> None:
|
|
"""Extends the default packagedialog to redirect to base menu for red air base."""
|
|
if not self.control_point.captured:
|
|
self.on_click()
|
|
else:
|
|
super(QMapControlPoint, self).open_new_package_dialog()
|