diff --git a/qt_ui/widgets/base/QAirportInformation.py b/qt_ui/widgets/base/QAirportInformation.py
new file mode 100644
index 00000000..4fc1474c
--- /dev/null
+++ b/qt_ui/widgets/base/QAirportInformation.py
@@ -0,0 +1,52 @@
+from PySide2.QtWidgets import QGridLayout, QLabel, QGroupBox, QVBoxLayout, QLCDNumber
+
+from theater import ControlPoint, Airport
+
+
+class QAirportInformation(QGroupBox):
+
+ def __init__(self, cp:ControlPoint, airport:Airport):
+ super(QAirportInformation, self).__init__(airport.name)
+ self.cp = cp
+ self.airport = airport
+ self.init_ui()
+
+ def init_ui(self):
+ self.layout = QGridLayout()
+
+ # Runway information
+ self.runways = QGroupBox("Runways")
+ self.runwayLayout = QGridLayout()
+ for i, runway in enumerate(self.airport.runways):
+
+ # Seems like info is missing in pydcs, even if the attribute is there
+ lr = ""
+ if runway.leftright == 1:
+ lr = "L"
+ elif runway.leftright == 2:
+ lr = "R"
+
+ self.runwayLayout.addWidget(QLabel("Runway " + str(runway.heading) + lr), i, 0)
+
+ # Seems like info is missing in pydcs, even if the attribute is there
+ if runway.ils:
+ self.runwayLayout.addWidget(QLabel("ILS "), i, 1)
+ self.runwayLayout.addWidget(QLCDNumber(6, runway.ils), i, 1)
+ else:
+ self.runwayLayout.addWidget(QLabel("NO ILS"), i, 1)
+
+
+ self.runways.setLayout(self.runwayLayout)
+ self.layout.addWidget(self.runways, 0, 0)
+
+ self.layout.addWidget(QLabel("Parking Slots :"), 1, 0)
+ self.layout.addWidget(QLabel(str(len(self.airport.parking_slots))), 1, 1)
+
+
+ stretch = QVBoxLayout()
+ stretch.addStretch()
+
+ self.layout.addLayout(stretch, 2, 0)
+ self.setLayout(self.layout)
+
+
diff --git a/qt_ui/widgets/QBaseInformation.py b/qt_ui/widgets/base/QBaseInformation.py
similarity index 82%
rename from qt_ui/widgets/QBaseInformation.py
rename to qt_ui/widgets/base/QBaseInformation.py
index 7dd396ab..0bea5bdb 100644
--- a/qt_ui/widgets/QBaseInformation.py
+++ b/qt_ui/widgets/base/QBaseInformation.py
@@ -1,6 +1,5 @@
-from PySide2.QtWidgets import QGridLayout, QLabel, QGroupBox
+from PySide2.QtWidgets import QGridLayout, QLabel, QGroupBox, QVBoxLayout
-from game import db
from theater import ControlPoint, Airport
@@ -30,4 +29,7 @@ class QBaseInformation(QGroupBox):
self.layout.addWidget(QLabel(str(v) + " x " + k), i, 0)
i = i + 1
+ stretch = QVBoxLayout()
+ stretch.addStretch()
+ self.layout.addLayout(stretch, len(unit_dict) + 1, 0)
self.setLayout(self.layout)
diff --git a/qt_ui/widgets/QPlannedFlightView.py b/qt_ui/widgets/base/QPlannedFlightView.py
similarity index 70%
rename from qt_ui/widgets/QPlannedFlightView.py
rename to qt_ui/widgets/base/QPlannedFlightView.py
index 9dbfacf4..6032579f 100644
--- a/qt_ui/widgets/QPlannedFlightView.py
+++ b/qt_ui/widgets/base/QPlannedFlightView.py
@@ -1,4 +1,4 @@
-from PySide2.QtWidgets import QGridLayout, QLabel, QGroupBox
+from PySide2.QtWidgets import QGridLayout, QLabel, QGroupBox, QVBoxLayout, QHBoxLayout
from game import db
from gen.flights.ai_flight_planner import FlightPlanner
@@ -16,12 +16,14 @@ class QPlannedFlightView(QGroupBox):
for i,f in enumerate(self.flight_planner.flights):
ftype = QLabel("" + f.flight_type.name + "")
- count = QLabel(str(f.count) + "x" + db.unit_type_name(f.unit_type))
+ count = QLabel(str(f.count) + " x " + db.unit_type_name(f.unit_type))
sched = QLabel(" in " + str(f.scheduled_in) + " minutes")
self.layout.addWidget(ftype, i, 0)
self.layout.addWidget(count, i, 1)
self.layout.addWidget(sched, i, 2)
-
+ stretch = QVBoxLayout()
+ stretch.addStretch()
+ self.layout.addLayout(stretch, len(self.flight_planner.flights)+1, 0)
self.setLayout(self.layout)
diff --git a/qt_ui/windows/QBaseMenu.py b/qt_ui/windows/QBaseMenu.py
index 7d9b5968..481d43cf 100644
--- a/qt_ui/windows/QBaseMenu.py
+++ b/qt_ui/windows/QBaseMenu.py
@@ -1,14 +1,17 @@
+import traceback
+
from PySide2.QtCore import Qt
-from PySide2.QtGui import QWindow, QCloseEvent
-from PySide2.QtWidgets import QHBoxLayout, QLabel, QWidget, QFrame, QDialog, QVBoxLayout, QGridLayout, QPushButton, \
- QGroupBox
+from PySide2.QtGui import QCloseEvent
+from PySide2.QtWidgets import QHBoxLayout, QLabel, QWidget, QDialog, QVBoxLayout, QGridLayout, QPushButton, \
+ QGroupBox, QSizePolicy, QSpacerItem
from dcs.unittype import UnitType
from game.event import UnitsDeliveryEvent
-from qt_ui.widgets.QBaseInformation import QBaseInformation
-from qt_ui.widgets.QPlannedFlightView import QPlannedFlightView
+from qt_ui.widgets.base.QAirportInformation import QAirportInformation
+from qt_ui.widgets.base.QBaseInformation import QBaseInformation
+from qt_ui.widgets.base.QPlannedFlightView import QPlannedFlightView
from qt_ui.windows.GameUpdateSignal import GameUpdateSignal
-from theater import ControlPoint, CAP, Embarking, AirDefence, CAS, PinpointStrike, db
+from theater import ControlPoint, CAP, Embarking, CAS, PinpointStrike, db
from game import Game
@@ -25,7 +28,6 @@ class QBaseMenu(QDialog):
except:
self.airport = None
-
if self.cp.captured:
self.deliveryEvent = None
for event in self.game.events:
@@ -52,8 +54,8 @@ class QBaseMenu(QDialog):
title = QLabel("" + self.cp.name + "")
title.setAlignment(Qt.AlignLeft | Qt.AlignTop)
- unitsPower = QLabel("{} / {} / {}".format(self.cp.base.total_planes, self.cp.base.total_armor, self.cp.base.total_aa))
- unitsPower.setAlignment(Qt.AlignLeft |Qt.AlignTop)
+ title.setProperty("style", "base-title")
+ unitsPower = QLabel("{} / {}".format(self.cp.base.total_planes, self.cp.base.total_armor))
self.topLayout.addWidget(title)
self.topLayout.addWidget(unitsPower)
@@ -77,68 +79,46 @@ class QBaseMenu(QDialog):
}
self.mainLayout = QGridLayout()
-
self.leftLayout = QVBoxLayout()
- self.leftLayout.addWidget(self.topLayoutWidget)
-
- tasks = list(units.keys())
- tasks_per_column = 3
-
self.unitLayout = QVBoxLayout()
self.bought_amount_labels = {}
+ self.existing_units_labels = {}
row = 0
- def add_purchase_row(unit_type, layout):
-
- nonlocal row
- existing_units = self.cp.base.total_units_of_type(unit_type)
- scheduled_units = self.deliveryEvent.units.get(unit_type, 0)
-
- unitName = QLabel("" + db.unit_type_name(unit_type) + "")
- amountBought = QLabel("{} ({})".format(existing_units, scheduled_units))
- self.bought_amount_labels[unit_type] = amountBought
-
- price = QLabel("{}m".format(db.PRICES[unit_type]))
-
- buy = QPushButton("+")
- buy.setProperty("style", "btn-success")
- buy.clicked.connect(lambda: self.buy(unit_type))
-
- sell = QPushButton("-")
- sell.setProperty("style", "btn-danger")
- sell.clicked.connect(lambda: self.sell(unit_type))
-
- layout.addWidget(unitName, row, 0)
- layout.addWidget(amountBought, row, 1)
- layout.addWidget(price, row, 2)
- layout.addWidget(buy, row, 3)
- layout.addWidget(sell, row, 4)
-
- row = row + 1
-
if self.cp.captured:
+ self.recruitment = QGroupBox("Recruitment")
+ self.recruitmentLayout = QVBoxLayout()
+
for task_type in units.keys():
units_column = list(set(units[task_type]))
if len(units_column) == 0: continue
units_column.sort(key=lambda x: db.PRICES[x])
- taskBox = QGroupBox("{}".format(db.task_name(task_type)))
- taskBoxLayout = QGridLayout()
- taskBox.setLayout(taskBoxLayout)
+ task_box = QGroupBox("{}".format(db.task_name(task_type)))
+ task_box_layout = QGridLayout()
+ task_box.setLayout(task_box_layout)
row = 0
for unit_type in units_column:
- add_purchase_row(unit_type, taskBoxLayout)
+ row = self.add_purchase_row(unit_type, task_box_layout, row)
- self.unitLayout.addWidget(taskBox)
- self.leftLayout.addLayout(self.unitLayout)
+ stretch = QVBoxLayout()
+ stretch.addStretch()
+ task_box_layout.addLayout(stretch, row, 0)
+
+ self.recruitmentLayout.addWidget(task_box)
+ self.recruitmentLayout.addStretch()
+
+
+ self.recruitment.setLayout(self.recruitmentLayout)
+ self.leftLayout.addWidget(self.recruitment)
+ self.leftLayout.addStretch()
else:
intel = QGroupBox("Intel")
intelLayout = QVBoxLayout()
- row = 0
for task_type in units.keys():
units_column = list(set(units[task_type]))
@@ -158,23 +138,74 @@ class QBaseMenu(QDialog):
row += 1
intelLayout.addWidget(group)
- self.leftLayout.addLayout(intelLayout)
+ intelLayout.addStretch()
+ intel.setLayout(intelLayout)
+ self.leftLayout.addWidget(intel)
- self.mainLayout.addLayout(self.leftLayout, 0, 0)
+ self.mainLayout.addWidget(self.topLayoutWidget, 0, 0)
+ self.mainLayout.addLayout(self.leftLayout, 1, 0)
+ self.mainLayout.addWidget(QBaseInformation(self.cp, self.airport), 1, 1)
+ self.rightLayout = QVBoxLayout()
try:
- self.mainLayout.addWidget(QPlannedFlightView(self.game.planners[self.cp.id]), 0, 1)
- except Exception as e:
- print(e)
- self.mainLayout.addWidget(QBaseInformation(self.cp, self.airport), 0, 3)
+ self.rightLayout.addWidget(QPlannedFlightView(self.game.planners[self.cp.id]))
+ except Exception:
+ traceback.print_exc()
+ self.rightLayout.addWidget(QAirportInformation(self.cp, self.airport))
+ self.mainLayout.addLayout(self.rightLayout, 1, 2)
self.setLayout(self.mainLayout)
+ def add_purchase_row(self, unit_type, layout, row):
+
+ existing_units = self.cp.base.total_units_of_type(unit_type)
+ scheduled_units = self.deliveryEvent.units.get(unit_type, 0)
+
+ unitName = QLabel("" + db.unit_type_name(unit_type) + "")
+ unitName.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding))
+
+ existing_units = QLabel(str(existing_units))
+ existing_units.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed))
+
+ amount_bought = QLabel("[{}]".format(str(scheduled_units)))
+ amount_bought.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed))
+
+ self.existing_units_labels[unit_type] = existing_units
+ self.bought_amount_labels[unit_type] = amount_bought
+
+ price = QLabel("{}m".format(db.PRICES[unit_type]))
+ price.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed))
+
+ buy = QPushButton("+")
+ buy.setProperty("style", "btn-success")
+ buy.setMinimumSize(24, 24)
+ buy.clicked.connect(lambda: self.buy(unit_type))
+ buy.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed))
+
+ sell = QPushButton("-")
+ sell.setProperty("style", "btn-danger")
+ sell.setMinimumSize(24, 24)
+ sell.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed))
+ sell.clicked.connect(lambda: self.sell(unit_type))
+
+ layout.addWidget(unitName, row, 0)
+ layout.addItem(QSpacerItem(20, 0, QSizePolicy.Minimum, QSizePolicy.Minimum), row, 1)
+ layout.addWidget(existing_units, row, 2)
+ layout.addWidget(amount_bought, row, 3)
+ layout.addWidget(price, row, 4)
+ layout.addItem(QSpacerItem(20, 0, QSizePolicy.Minimum, QSizePolicy.Minimum), row, 5)
+ layout.addWidget(buy, row, 6)
+ layout.addWidget(sell, row, 7)
+
+ return row + 1
def _update_count_label(self, unit_type: UnitType):
- self.bought_amount_labels[unit_type].setText("{}{}".format(
- self.cp.base.total_units_of_type(unit_type),
- unit_type in self.deliveryEvent.units and " ({})".format(self.deliveryEvent.units[unit_type]) or ""
+ self.bought_amount_labels[unit_type].setText("[{}]".format(
+ unit_type in self.deliveryEvent.units and "{}".format(self.deliveryEvent.units[unit_type]) or "0"
+ ))
+
+ self.existing_units_labels[unit_type].setText("{}".format(
+ self.cp.base.total_units_of_type(unit_type)
))
def buy(self, unit_type):
diff --git a/resources/stylesheets/style.css b/resources/stylesheets/style.css
index c60a21fb..e018df5a 100644
--- a/resources/stylesheets/style.css
+++ b/resources/stylesheets/style.css
@@ -53,6 +53,12 @@ QPushButton[style="btn-danger"]:hover{
cursor: pointer;
}
+QLabel[style="base-title"]{
+ font-size: 24px;
+ font-color: #ccc;
+ border: 1px solid #ccc;
+}
+
/*QBaseMenu{
background-color:#699245;
color:white;