From c621e822dc192b8244a173a0987f595f04a60c73 Mon Sep 17 00:00:00 2001 From: Khopa Date: Sun, 7 Jul 2019 12:11:12 +0200 Subject: [PATCH] Fix artifact on map when drawing events & improved base menu --- qt_ui/stylesheets/style.css | 5 + qt_ui/widgets/map/QLiberationMap.py | 4 +- qt_ui/widgets/map/QMapControlPoint.py | 4 - qt_ui/widgets/map/QMapEvent.py | 32 ++++--- qt_ui/windows/QBaseMenu.py | 127 ++++++++++++++++---------- qt_ui/windows/QBriefingWindow.py | 15 +-- qt_ui/windows/QLiberationWindow.py | 7 ++ 7 files changed, 121 insertions(+), 73 deletions(-) diff --git a/qt_ui/stylesheets/style.css b/qt_ui/stylesheets/style.css index 861a8912..d3015ca8 100644 --- a/qt_ui/stylesheets/style.css +++ b/qt_ui/stylesheets/style.css @@ -21,4 +21,9 @@ QPushButton[style="btn-primary"]{ QBaseMenu{ background-color:#699245; color:white; +} + +QWidgte[style="baseMenuHeader"]{ + font-size: 24px; + font-weight: bold; } \ No newline at end of file diff --git a/qt_ui/widgets/map/QLiberationMap.py b/qt_ui/widgets/map/QLiberationMap.py index 06d18066..6c4993f3 100644 --- a/qt_ui/widgets/map/QLiberationMap.py +++ b/qt_ui/widgets/map/QLiberationMap.py @@ -27,6 +27,7 @@ class QLiberationMap(QGraphicsView): "cp": True, "go": True, "lines": True, + "events": True, "ennemy_sam_ranges": True, "ally_sam_ranges": True } @@ -200,6 +201,7 @@ class QLiberationMap(QGraphicsView): nonlocal occupied_rects point = self._transform_point(location) rect = QRect(point[0] - 16, point[1] - 16, 32, 32) + print(rect) i = 0 while True: @@ -236,7 +238,7 @@ class QLiberationMap(QGraphicsView): location = self._frontline_center(event.from_cp, event.to_cp) rect = _location_to_rect(location) - scene.addItem(QMapEvent(self, rect.x(), rect.y(), rect.width(), rect.height(), event)) + scene.addItem(QMapEvent(self, rect.x(), rect.y(), 32, 32, event)) @staticmethod def set_display_rule(rule: str, value: bool): diff --git a/qt_ui/widgets/map/QMapControlPoint.py b/qt_ui/widgets/map/QMapControlPoint.py index cc68956b..a3ac9630 100644 --- a/qt_ui/widgets/map/QMapControlPoint.py +++ b/qt_ui/widgets/map/QMapControlPoint.py @@ -52,14 +52,10 @@ class QMapControlPoint(QGraphicsRectItem): self.update() def contextMenuEvent(self, event: QGraphicsSceneContextMenuEvent): - # TODO : improve this and add contextual actions (just a placholder for now) - openBaseMenu = QAction("Open base menu") openBaseMenu.triggered.connect(self.openBaseMenu) menu = QMenu("Menu", self.parent) - menu.addAction("Plan a strike on " + self.model.name + " airbase") - menu.addAction("See available intel") menu.addAction(openBaseMenu) menu.exec_(event.screenPos()) diff --git a/qt_ui/widgets/map/QMapEvent.py b/qt_ui/widgets/map/QMapEvent.py index 1f444108..11e9f83d 100644 --- a/qt_ui/widgets/map/QMapEvent.py +++ b/qt_ui/widgets/map/QMapEvent.py @@ -1,8 +1,9 @@ from PySide2.QtGui import QPen -from PySide2.QtWidgets import QGraphicsRectItem +from PySide2.QtWidgets import QGraphicsRectItem, QGraphicsSceneMouseEvent import qt_ui.uiconstants as CONST from game.event import Event +from qt_ui.windows.QBriefingWindow import QBriefingWindow from theater import TheaterGroundObject, ControlPoint @@ -14,22 +15,29 @@ class QMapEvent(QGraphicsRectItem): self.parent = parent self.setAcceptHoverEvents(True) self.setZValue(2) + print(x,y,w,h) self.setToolTip(str(self.gameEvent)) - def paint(self, painter, option, widget=None): - painter.save() + if self.parent.get_display_rule("events"): + painter.save() - if self.gameEvent.is_player_attacking: - painter.setPen(QPen(brush=CONST.COLORS["blue"])) - painter.setBrush(CONST.COLORS["blue"]) - else: - painter.setPen(QPen(brush=CONST.COLORS["red"])) - painter.setBrush(CONST.COLORS["red"]) + if self.gameEvent.is_player_attacking: + painter.setPen(QPen(brush=CONST.COLORS["blue"])) + painter.setBrush(CONST.COLORS["blue"]) + else: + painter.setPen(QPen(brush=CONST.COLORS["red"])) + painter.setBrush(CONST.COLORS["red"]) - painter.drawRect(option.rect) + painter.drawRect(option.rect) + print(option.rect) + painter.drawPixmap(option.rect, CONST.EVENT_ICONS[self.gameEvent.__class__]) + painter.restore() - painter.drawPixmap(option.rect, CONST.EVENT_ICONS[self.gameEvent.__class__]) + def mousePressEvent(self, event:QGraphicsSceneMouseEvent): + self.openBriefing() - painter.restore() + def openBriefing(self): + self.briefing = QBriefingWindow(self.window(), self.gameEvent) + self.briefing.show() \ No newline at end of file diff --git a/qt_ui/windows/QBaseMenu.py b/qt_ui/windows/QBaseMenu.py index 6501722e..5bf09343 100644 --- a/qt_ui/windows/QBaseMenu.py +++ b/qt_ui/windows/QBaseMenu.py @@ -1,8 +1,10 @@ from PySide2.QtCore import Qt -from PySide2.QtGui import QWindow +from PySide2.QtGui import QWindow, QCloseEvent from PySide2.QtWidgets import QHBoxLayout, QLabel, QWidget, QFrame, QDialog, QVBoxLayout, QGridLayout, QPushButton from dcs.unittype import UnitType +from game.event import UnitsDeliveryEvent +from qt_ui.windows.GameUpdateSignal import GameUpdateSignal from theater import ControlPoint, CAP, Embarking, AirDefence, CAS, PinpointStrike, db from game import Game @@ -13,20 +15,42 @@ class QBaseMenu(QDialog): super(QBaseMenu, self).__init__(parent) self.cp = controlPoint self.game = game - self.deliveryEvent = self.game.units_delivery_event(self.cp) + + + if self.cp.captured: + self.deliveryEvent = None + for event in self.game.events: + print(event.__class__) + print(UnitsDeliveryEvent.__class__) + if event.__class__ == UnitsDeliveryEvent and event.from_cp == self.cp: + self.deliveryEvent = event + break + if not self.deliveryEvent: + print("Rebuild event") + self.deliveryEvent = self.game.units_delivery_event(self.cp) + self.setWindowFlags(Qt.WindowStaysOnTopHint) - self.setMinimumSize(200,200) + self.setMinimumSize(200, 200) + self.setModal(True) self.initUi() def initUi(self): self.setWindowTitle(self.cp.name) + self.topLayoutWidget = QWidget() self.topLayout = QHBoxLayout() - self.topLayout.setProperty("style", "baseMenuHeader") - self.topLayout.addWidget(QLabel("" + self.cp.name + "")) - self.topLayout.addWidget( - QLabel("{} / {} / {}".format(self.cp.base.total_planes, self.cp.base.total_armor, self.cp.base.total_aa))) + + 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) + + self.topLayout.addWidget(title) + self.topLayout.addWidget(unitsPower) + self.topLayout.setAlignment(Qt.AlignTop) + self.topLayoutWidget.setProperty("style", "baseMenuHeader") + self.topLayoutWidget.setLayout(self.topLayout) units = { CAP: db.find_unittype(CAP, self.game.player_name), @@ -37,65 +61,65 @@ class QBaseMenu(QDialog): } self.mainLayout = QVBoxLayout() - self.mainLayout.addLayout(self.topLayout) + self.mainLayout.addWidget(self.topLayoutWidget) - print(units) tasks = list(units.keys()) tasks_per_column = 3 + self.unitLayout = QGridLayout() self.bought_amount_labels = {} + row = 0 + + def add_purchase_row(unit_type): + + 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.clicked.connect(lambda: self.buy(unit_type)) + + sell = QPushButton("-") + sell.clicked.connect(lambda: self.sell(unit_type)) + + self.unitLayout.addWidget(unitName, row, 0) + self.unitLayout.addWidget(amountBought, row, 1) + self.unitLayout.addWidget(price, row, 2) + self.unitLayout.addWidget(buy, row, 3) + self.unitLayout.addWidget(sell, row, 4) + + row = row + 1 + if self.cp.captured: - column = 0 - for i, tasks_column in [(i, tasks[idx:idx+tasks_per_column]) for i, idx in enumerate(range(0, len(tasks), tasks_per_column))]: - row = 2 - def purchase_row(unit_type, unit_price): - layout = QHBoxLayout() - existing_units = self.cp.base.total_units_of_type(unit_type) - scheduled_units = self.deliveryEvent.units.get(unit_type, 0) + for task_type in units.keys(): - unitName = QLabel(db.unit_type_name(unit_type)) - amountBought = QLabel("{} ({})".format(existing_units, scheduled_units)) - self.bought_amount_labels[unit_type] = amountBought + units_column = list(set(units[task_type])) + if len(units_column) == 0: continue + units_column.sort(key=lambda x: db.PRICES[x]) - price = QLabel("{}m".format(unit_price)) - - buy = QPushButton("+") - buy.clicked.connect(lambda: self.buy(unit_type)) - - sell = QPushButton("-") - sell.clicked.connect(lambda: self.sell(unit_type)) - - layout.addWidget(unitName) - layout.addWidget(amountBought) - layout.addWidget(price) - - layout.addWidget(buy) - layout.addWidget(sell) - - return layout - - for task_type in tasks_column: - QLabel("{}".format(db.task_name(task_type))) - row += 1 - - units_column = list(set(units[task_type])) - units_column.sort(key=lambda x: db.PRICES[x]) - for unit_type in units_column: - layout = purchase_row(unit_type, db.PRICES[unit_type]) - self.mainLayout.addLayout(layout) - - column += 5 + taskTypeLabel = QLabel("{}".format(db.task_name(task_type))) + self.unitLayout.addWidget(taskTypeLabel, row, 0) + row = row + 1 + for unit_type in units_column: + add_purchase_row(unit_type) + self.mainLayout.addLayout(self.unitLayout) self.setLayout(self.mainLayout) def _update_count_label(self, unit_type: UnitType): - self.bought_amount_labels[unit_type].setText("({}{})".format( + self.bought_amount_labels[unit_type].setText("{}{}".format( self.cp.base.total_units_of_type(unit_type), - unit_type in self.deliveryEvent.units and ", bought {}".format(self.deliveryEvent.units[unit_type]) or "" + unit_type in self.deliveryEvent.units and " ({})".format(self.deliveryEvent.units[unit_type]) or "" )) def buy(self, unit_type): @@ -118,4 +142,7 @@ class QBaseMenu(QDialog): self.game.budget += price self.cp.base.commit_losses({unit_type: 1}) - self._update_count_label(unit_type) \ No newline at end of file + self._update_count_label(unit_type) + + def closeEvent(self, closeEvent:QCloseEvent): + GameUpdateSignal.get_instance().updateGame(self.game) \ No newline at end of file diff --git a/qt_ui/windows/QBriefingWindow.py b/qt_ui/windows/QBriefingWindow.py index dfe3d07a..62adcd62 100644 --- a/qt_ui/windows/QBriefingWindow.py +++ b/qt_ui/windows/QBriefingWindow.py @@ -1,17 +1,20 @@ from PySide2.QtGui import QWindow -from PySide2.QtWidgets import QHBoxLayout, QLabel, QWidget +from PySide2.QtWidgets import QHBoxLayout, QLabel, QWidget, QDialog -class QBriefingWindow(QWindow): +class QBriefingWindow(QDialog): - def __init__(self, parent): + def __init__(self, parent, event): super(QBriefingWindow, self).__init__(parent) + self.gameEvent = event + self.setWindowTitle("Briefing : " + str(event)) + self.setMinimumSize(200,200) + self.setModal(True) self.initUi() def initUi(self): + layout = QHBoxLayout() layout.addWidget(QLabel("TODO : This will be the briefing window")) - central_widget = QWidget() - central_widget.setLayout(layout) - self.setCentralWidget(central_widget) \ No newline at end of file + self.setLayout(layout) \ No newline at end of file diff --git a/qt_ui/windows/QLiberationWindow.py b/qt_ui/windows/QLiberationWindow.py index 67f47cde..49bd29f5 100644 --- a/qt_ui/windows/QLiberationWindow.py +++ b/qt_ui/windows/QLiberationWindow.py @@ -110,9 +110,16 @@ class QLiberationWindow(QMainWindow): tg_line_visibility.toggled.connect( lambda: QLiberationMap.set_display_rule("lines", tg_line_visibility.isChecked())) + tg_event_visibility = QAction('Events', displayMenu) + tg_event_visibility.setCheckable(True) + tg_event_visibility.setChecked(True) + tg_event_visibility.toggled.connect( + lambda: QLiberationMap.set_display_rule("events", tg_event_visibility.isChecked())) + displayMenu.addAction(tg_go_visibility) displayMenu.addAction(tg_cp_visibility) displayMenu.addAction(tg_line_visibility) + displayMenu.addAction(tg_event_visibility) def newGame(self): wizard = NewGameWizard(self)