From fee959940ab1309024a072faa89a5f9c0b5ee2bc Mon Sep 17 00:00:00 2001 From: Khopa Date: Wed, 16 Oct 2019 22:22:16 +0200 Subject: [PATCH] Base menu layout improved. --- qt_ui/widgets/base/QAirportInformation.py | 52 ++++++ qt_ui/widgets/{ => base}/QBaseInformation.py | 6 +- .../widgets/{ => base}/QPlannedFlightView.py | 8 +- qt_ui/windows/QBaseMenu.py | 149 +++++++++++------- resources/stylesheets/style.css | 6 + 5 files changed, 157 insertions(+), 64 deletions(-) create mode 100644 qt_ui/widgets/base/QAirportInformation.py rename qt_ui/widgets/{ => base}/QBaseInformation.py (82%) rename qt_ui/widgets/{ => base}/QPlannedFlightView.py (70%) 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;