mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
parent
e8151678dd
commit
7bae6cd562
@ -104,6 +104,12 @@ class AircraftGenerator:
|
|||||||
ato: The ATO to spawn aircraft for.
|
ato: The ATO to spawn aircraft for.
|
||||||
dynamic_runways: Runway data for carriers and FARPs.
|
dynamic_runways: Runway data for carriers and FARPs.
|
||||||
"""
|
"""
|
||||||
|
for package in reversed(sorted(ato.packages, key=lambda x: x.time_over_target)):
|
||||||
|
if package.frequency is None:
|
||||||
|
continue
|
||||||
|
if package.frequency not in self.radio_registry.allocated_channels:
|
||||||
|
self.radio_registry.reserve(package.frequency)
|
||||||
|
|
||||||
for package in reversed(sorted(ato.packages, key=lambda x: x.time_over_target)):
|
for package in reversed(sorted(ato.packages, key=lambda x: x.time_over_target)):
|
||||||
if not package.flights:
|
if not package.flights:
|
||||||
continue
|
continue
|
||||||
|
|||||||
@ -133,18 +133,19 @@ class FlightGroupConfigurator:
|
|||||||
laser_codes.append(None)
|
laser_codes.append(None)
|
||||||
|
|
||||||
def setup_radios(self) -> RadioFrequency:
|
def setup_radios(self) -> RadioFrequency:
|
||||||
if self.flight.flight_type in {FlightType.AEWC, FlightType.REFUELING}:
|
if (freq := self.flight.package.frequency) is None:
|
||||||
channel = self.radio_registry.alloc_uhf()
|
freq = self.radio_registry.alloc_uhf()
|
||||||
self.register_air_support(channel)
|
self.flight.package.frequency = freq
|
||||||
else:
|
elif freq not in self.radio_registry.allocated_channels:
|
||||||
if (channel := self.flight.package.frequency) is None:
|
self.radio_registry.reserve(freq)
|
||||||
channel = self.radio_registry.alloc_uhf()
|
|
||||||
self.flight.package.frequency = channel
|
|
||||||
if self.flight.client_count:
|
|
||||||
channel = self.flight.unit_type.alloc_flight_radio(self.radio_registry)
|
|
||||||
|
|
||||||
self.group.set_frequency(channel.mhz)
|
if self.flight.flight_type in {FlightType.AEWC, FlightType.REFUELING}:
|
||||||
return channel
|
self.register_air_support(freq)
|
||||||
|
elif self.flight.client_count:
|
||||||
|
freq = self.flight.unit_type.alloc_flight_radio(self.radio_registry)
|
||||||
|
|
||||||
|
self.group.set_frequency(freq.mhz)
|
||||||
|
return freq
|
||||||
|
|
||||||
def register_air_support(self, channel: RadioFrequency) -> None:
|
def register_air_support(self, channel: RadioFrequency) -> None:
|
||||||
callsign = callsign_for_support_unit(self.group)
|
callsign = callsign_for_support_unit(self.group)
|
||||||
|
|||||||
@ -20,6 +20,7 @@ from game.ato.flight import Flight
|
|||||||
from game.ato.flightplans.planningerror import PlanningError
|
from game.ato.flightplans.planningerror import PlanningError
|
||||||
from game.ato.package import Package
|
from game.ato.package import Package
|
||||||
from game.game import Game
|
from game.game import Game
|
||||||
|
from game.radio.radios import RadioFrequency
|
||||||
from game.server import EventStream
|
from game.server import EventStream
|
||||||
from game.sim import GameUpdateEvents
|
from game.sim import GameUpdateEvents
|
||||||
from game.theater.missiontarget import MissionTarget
|
from game.theater.missiontarget import MissionTarget
|
||||||
@ -27,6 +28,7 @@ from qt_ui.models import AtoModel, GameModel, PackageModel
|
|||||||
from qt_ui.uiconstants import EVENT_ICONS
|
from qt_ui.uiconstants import EVENT_ICONS
|
||||||
from qt_ui.widgets.ato import QFlightList
|
from qt_ui.widgets.ato import QFlightList
|
||||||
from qt_ui.windows.mission.flight.QFlightCreator import QFlightCreator
|
from qt_ui.windows.mission.flight.QFlightCreator import QFlightCreator
|
||||||
|
from qt_ui.windows.mission.package.QPackageFrequency import QPackageFrequency
|
||||||
|
|
||||||
|
|
||||||
class QPackageDialog(QDialog):
|
class QPackageDialog(QDialog):
|
||||||
@ -56,17 +58,30 @@ class QPackageDialog(QDialog):
|
|||||||
self.summary_row = QHBoxLayout()
|
self.summary_row = QHBoxLayout()
|
||||||
self.layout.addLayout(self.summary_row)
|
self.layout.addLayout(self.summary_row)
|
||||||
|
|
||||||
self.package_type_column = QHBoxLayout()
|
self.package_type_column = QVBoxLayout()
|
||||||
self.summary_row.addLayout(self.package_type_column)
|
self.summary_row.addLayout(self.package_type_column)
|
||||||
|
|
||||||
|
package_type_row = QHBoxLayout()
|
||||||
self.package_type_label = QLabel("Package Type:")
|
self.package_type_label = QLabel("Package Type:")
|
||||||
self.package_type_text = QLabel(self.package_model.description)
|
self.package_type_text = QLabel(self.package_model.description)
|
||||||
# noinspection PyUnresolvedReferences
|
# noinspection PyUnresolvedReferences
|
||||||
self.package_changed.connect(
|
self.package_changed.connect(self.on_package_changed)
|
||||||
lambda: self.package_type_text.setText(self.package_model.description)
|
package_type_row.addWidget(self.package_type_label)
|
||||||
|
package_type_row.addWidget(self.package_type_text)
|
||||||
|
self.package_type_column.addLayout(package_type_row)
|
||||||
|
|
||||||
|
# TODO: make freq red if used by another package
|
||||||
|
package_freq_row = QHBoxLayout()
|
||||||
|
self.package_freq_label = QLabel("Package FREQ:")
|
||||||
|
freq = (
|
||||||
|
self.package_model.package.frequency.mhz
|
||||||
|
if self.package_model.package.frequency is not None
|
||||||
|
else ""
|
||||||
)
|
)
|
||||||
self.package_type_column.addWidget(self.package_type_label)
|
self.package_freq_text = QLabel(f"{freq}")
|
||||||
self.package_type_column.addWidget(self.package_type_text)
|
package_freq_row.addWidget(self.package_freq_label)
|
||||||
|
package_freq_row.addWidget(self.package_freq_text)
|
||||||
|
self.package_type_column.addLayout(package_freq_row)
|
||||||
|
|
||||||
self.summary_row.addStretch(1)
|
self.summary_row.addStretch(1)
|
||||||
|
|
||||||
@ -130,6 +145,10 @@ class QPackageDialog(QDialog):
|
|||||||
self.delete_flight_button.setEnabled(model.rowCount() > 0)
|
self.delete_flight_button.setEnabled(model.rowCount() > 0)
|
||||||
self.button_layout.addWidget(self.delete_flight_button)
|
self.button_layout.addWidget(self.delete_flight_button)
|
||||||
|
|
||||||
|
self.open_radio_button = QPushButton("Set Package FREQ")
|
||||||
|
self.open_radio_button.clicked.connect(self.on_open_radio)
|
||||||
|
self.button_layout.addWidget(self.open_radio_button)
|
||||||
|
|
||||||
self.package_model.tot_changed.connect(self.update_tot)
|
self.package_model.tot_changed.connect(self.update_tot)
|
||||||
|
|
||||||
self.button_layout.addStretch()
|
self.button_layout.addStretch()
|
||||||
@ -218,6 +237,23 @@ class QPackageDialog(QDialog):
|
|||||||
def on_change_name(self) -> None:
|
def on_change_name(self) -> None:
|
||||||
self.package_model.package.custom_name = self.package_name_text.text()
|
self.package_model.package.custom_name = self.package_name_text.text()
|
||||||
|
|
||||||
|
def on_open_radio(self) -> None:
|
||||||
|
self.package_frequency_dialog = QPackageFrequency(
|
||||||
|
self.game, self.package_model.package, parent=self.window()
|
||||||
|
)
|
||||||
|
self.package_frequency_dialog.accepted.connect(self.assign_frequency)
|
||||||
|
self.package_frequency_dialog.show()
|
||||||
|
|
||||||
|
def assign_frequency(self):
|
||||||
|
hz = round(self.package_frequency_dialog.frequency_input.value() * 10**6)
|
||||||
|
self.package_model.package.frequency = RadioFrequency(hertz=hz)
|
||||||
|
self.package_changed.emit()
|
||||||
|
|
||||||
|
def on_package_changed(self):
|
||||||
|
self.package_type_text.setText(self.package_model.description)
|
||||||
|
if (freq := self.package_model.package.frequency) is not None:
|
||||||
|
self.package_freq_text.setText(f"{freq.mhz} MHz")
|
||||||
|
|
||||||
|
|
||||||
class QNewPackageDialog(QPackageDialog):
|
class QNewPackageDialog(QPackageDialog):
|
||||||
"""Dialog window for creating a new package.
|
"""Dialog window for creating a new package.
|
||||||
|
|||||||
47
qt_ui/windows/mission/package/QPackageFrequency.py
Normal file
47
qt_ui/windows/mission/package/QPackageFrequency.py
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
from typing import Optional, Type
|
||||||
|
|
||||||
|
from PySide2.QtCore import Qt
|
||||||
|
from PySide2.QtWidgets import (
|
||||||
|
QDialog,
|
||||||
|
QPushButton,
|
||||||
|
QVBoxLayout,
|
||||||
|
QLabel,
|
||||||
|
QHBoxLayout,
|
||||||
|
QDoubleSpinBox,
|
||||||
|
)
|
||||||
|
|
||||||
|
from game import Game
|
||||||
|
from game.ato.package import Package
|
||||||
|
from game.radio.radios import RadioRegistry
|
||||||
|
from qt_ui.uiconstants import EVENT_ICONS
|
||||||
|
|
||||||
|
|
||||||
|
class QPackageFrequency(QDialog):
|
||||||
|
def __init__(self, game: Game, package: Package, parent=None) -> None:
|
||||||
|
super().__init__(parent=parent)
|
||||||
|
self.setMinimumWidth(400)
|
||||||
|
|
||||||
|
self.game = game
|
||||||
|
self.package = package
|
||||||
|
|
||||||
|
# Make dialog modal to prevent background windows to close unexpectedly.
|
||||||
|
self.setModal(True)
|
||||||
|
|
||||||
|
self.setWindowTitle("Assign frequency")
|
||||||
|
self.setWindowIcon(EVENT_ICONS["strike"])
|
||||||
|
|
||||||
|
layout = QHBoxLayout()
|
||||||
|
|
||||||
|
self.frequency_label = QLabel("FREQ (Mhz):")
|
||||||
|
self.frequency_input = QDoubleSpinBox()
|
||||||
|
self.frequency_input.setRange(225, 399.975)
|
||||||
|
self.frequency_input.setSingleStep(0.025)
|
||||||
|
self.frequency_input.setDecimals(3)
|
||||||
|
layout.addWidget(self.frequency_label)
|
||||||
|
layout.addWidget(self.frequency_input)
|
||||||
|
|
||||||
|
self.create_button = QPushButton("Save")
|
||||||
|
self.create_button.clicked.connect(self.accept)
|
||||||
|
layout.addWidget(self.create_button, alignment=Qt.AlignRight)
|
||||||
|
|
||||||
|
self.setLayout(layout)
|
||||||
@ -479,7 +479,7 @@ QComboBox QAbstractItemView {
|
|||||||
|
|
||||||
|
|
||||||
/*QSpinBox number input with up down arrows*/
|
/*QSpinBox number input with up down arrows*/
|
||||||
QSpinBox{
|
QSpinBox, QDoubleSpinBox{
|
||||||
border:1px solid #3B4656;
|
border:1px solid #3B4656;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
padding: 4px 10px;
|
padding: 4px 10px;
|
||||||
@ -487,19 +487,19 @@ QSpinBox{
|
|||||||
min-width:40px;
|
min-width:40px;
|
||||||
}
|
}
|
||||||
|
|
||||||
QSpinBox:hover{
|
QSpinBox:hover, QDoubleSpinBox:hover{
|
||||||
border-color: #3592C4;
|
border-color: #3592C4;
|
||||||
}
|
}
|
||||||
|
|
||||||
QSpinBox::up-button , QSpinBox::down-button{
|
QSpinBox::up-button , QSpinBox::down-button, QDoubleSpinBox::up-button, QDoubleSpinBox::down-button{
|
||||||
border:none;
|
border:none;
|
||||||
}
|
}
|
||||||
|
|
||||||
QSpinBox::up-button{
|
QSpinBox::up-button, QDoubleSpinBox::up-button{
|
||||||
image: url(resources/stylesheets/chevron-up.png);
|
image: url(resources/stylesheets/chevron-up.png);
|
||||||
}
|
}
|
||||||
|
|
||||||
QSpinBox::down-button{
|
QSpinBox::down-button, QDoubleSpinBox::down-button{
|
||||||
image: url(resources/stylesheets/chevron-down.png);
|
image: url(resources/stylesheets/chevron-down.png);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user