From c6939e719459df4ac20b649a4c20863081c01c1b Mon Sep 17 00:00:00 2001 From: Khopa Date: Sun, 21 Feb 2021 22:57:21 +0100 Subject: [PATCH] Added possibility to set up custom date in new game wizard. --- qt_ui/widgets/QLiberationCalendar.py | 42 +++++++++++ qt_ui/windows/newgame/QNewGameWizard.py | 94 ++++++++++++++++++------- 2 files changed, 109 insertions(+), 27 deletions(-) create mode 100644 qt_ui/widgets/QLiberationCalendar.py diff --git a/qt_ui/widgets/QLiberationCalendar.py b/qt_ui/widgets/QLiberationCalendar.py new file mode 100644 index 00000000..43e0d469 --- /dev/null +++ b/qt_ui/widgets/QLiberationCalendar.py @@ -0,0 +1,42 @@ +from PySide2 import QtCore, QtGui, QtWidgets +from PySide2.QtWidgets import QCalendarWidget + +from qt_ui.uiconstants import COLORS + + +class QLiberationCalendar(QCalendarWidget): + def __init__(self, parent=None): + super(QLiberationCalendar, self).__init__(parent) + self.setVerticalHeaderFormat(QCalendarWidget.NoVerticalHeader) + self.setGridVisible(False) + + # Overrride default QCalendar behaviour that is rendering week end days in red + for d in ( + QtCore.Qt.Monday, + QtCore.Qt.Tuesday, + QtCore.Qt.Wednesday, + QtCore.Qt.Thursday, + QtCore.Qt.Friday, + QtCore.Qt.Saturday, + QtCore.Qt.Sunday, + ): + fmt = self.weekdayTextFormat(d) + fmt.setForeground(QtCore.Qt.darkGray) + self.setWeekdayTextFormat(d, fmt) + + def paintCell(self, painter, rect, date): + if date == self.selectedDate(): + painter.save() + painter.fillRect(rect, QtGui.QColor("#D3D3D3")) + painter.setPen(QtCore.Qt.NoPen) + painter.setBrush(QtGui.QColor(COLORS["sea_blue"])) + r = QtCore.QRect( + QtCore.QPoint(), min(rect.width(), rect.height()) * QtCore.QSize(1, 1) + ) + r.moveCenter(rect.center()) + painter.drawEllipse(r) + painter.setPen(QtGui.QPen(QtGui.QColor("white"))) + painter.drawText(rect, QtCore.Qt.AlignCenter, str(date.day())) + painter.restore() + else: + super(QLiberationCalendar, self).paintCell(painter, rect, date) diff --git a/qt_ui/windows/newgame/QNewGameWizard.py b/qt_ui/windows/newgame/QNewGameWizard.py index 866db587..4b990b26 100644 --- a/qt_ui/windows/newgame/QNewGameWizard.py +++ b/qt_ui/windows/newgame/QNewGameWizard.py @@ -4,13 +4,14 @@ import logging from typing import List, Optional from PySide2 import QtGui, QtWidgets -from PySide2.QtCore import QItemSelectionModel, QPoint, Qt +from PySide2.QtCore import QItemSelectionModel, QPoint, Qt, QDate from PySide2.QtWidgets import QVBoxLayout, QTextEdit, QLabel from jinja2 import Environment, FileSystemLoader, select_autoescape from game import db from game.settings import Settings from game.theater.start_generator import GameGenerator, GeneratorSettings +from qt_ui.widgets.QLiberationCalendar import QLiberationCalendar from qt_ui.widgets.spinsliders import TenthsSpinSlider from qt_ui.windows.newgame.QCampaignList import ( Campaign, @@ -41,7 +42,10 @@ class NewGameWizard(QtWidgets.QWizard): self.faction_selection_page = FactionSelection() self.addPage(IntroPage()) - self.addPage(TheaterConfiguration(self.campaigns, self.faction_selection_page)) + self.theater_page = TheaterConfiguration( + self.campaigns, self.faction_selection_page + ) + self.addPage(self.theater_page) self.addPage(self.faction_selection_page) self.addPage(GeneratorOptions()) self.addPage(DifficultyAndAutomationOptions()) @@ -64,6 +68,13 @@ class NewGameWizard(QtWidgets.QWizard): if campaign is None: campaign = self.campaigns[0] + if self.field("usePreset"): + start_date = db.TIME_PERIODS[ + list(db.TIME_PERIODS.keys())[self.field("timePeriod")] + ] + else: + start_date = self.theater_page.calendar.selectedDate().toPython() + settings = Settings( player_income_multiplier=self.field("player_income_multiplier") / 10, enemy_income_multiplier=self.field("enemy_income_multiplier") / 10, @@ -75,9 +86,7 @@ class NewGameWizard(QtWidgets.QWizard): supercarrier=self.field("supercarrier"), ) generator_settings = GeneratorSettings( - start_date=db.TIME_PERIODS[ - list(db.TIME_PERIODS.keys())[self.field("timePeriod")] - ], + start_date=start_date, player_budget=int(self.field("starting_money")), enemy_budget=int(self.field("enemy_starting_money")), # QSlider forces integers, so we use 1 to 50 and divide by 10 to @@ -312,12 +321,56 @@ class TheaterConfiguration(QtWidgets.QWizardPage): # Faction description self.campaignMapDescription = QTextEdit("") self.campaignMapDescription.setReadOnly(True) - self.campaignMapDescription.setMaximumHeight(150) + self.campaignMapDescription.setMaximumHeight(100) self.performanceText = QTextEdit("") self.performanceText.setReadOnly(True) - self.performanceText.setMaximumHeight(150) + self.performanceText.setMaximumHeight(90) + # Campaign settings + mapSettingsGroup = QtWidgets.QGroupBox("Map Settings") + invertMap = QtWidgets.QCheckBox() + self.registerField("invertMap", invertMap) + mapSettingsLayout = QtWidgets.QGridLayout() + mapSettingsLayout.addWidget(QtWidgets.QLabel("Invert Map"), 0, 0) + mapSettingsLayout.addWidget(invertMap, 0, 1) + mapSettingsGroup.setLayout(mapSettingsLayout) + + # Time Period + timeGroup = QtWidgets.QGroupBox("Time Period") + timePeriod = QtWidgets.QLabel("Start date :") + timePeriodSelect = QtWidgets.QComboBox() + timePeriodPresetLabel = QLabel("Use preset :") + timePeriodPreset = QtWidgets.QCheckBox() + timePeriodPreset.setChecked(True) + self.calendar = QLiberationCalendar() + self.calendar.setSelectedDate(QDate()) + self.calendar.setDisabled(True) + + def onTimePeriodChanged(): + self.calendar.setSelectedDate( + list(db.TIME_PERIODS.values())[timePeriodSelect.currentIndex()] + ) + + timePeriodSelect.currentTextChanged.connect(onTimePeriodChanged) + + for r in db.TIME_PERIODS: + timePeriodSelect.addItem(r) + timePeriod.setBuddy(timePeriodSelect) + timePeriodSelect.setCurrentIndex(21) + + def onTimePeriodCheckboxChanged(): + if timePeriodPreset.isChecked(): + self.calendar.setDisabled(True) + timePeriodSelect.setDisabled(False) + onTimePeriodChanged() + else: + self.calendar.setDisabled(False) + timePeriodSelect.setDisabled(True) + + timePeriodPreset.stateChanged.connect(onTimePeriodCheckboxChanged) + + # Bind selection method for campaign selection def on_campaign_selected(): template = jinja_env.get_template("campaigntemplate_EN.j2") template_perf = jinja_env.get_template( @@ -335,27 +388,10 @@ class TheaterConfiguration(QtWidgets.QWizardPage): campaignList.selectionModel().setCurrentIndex( campaignList.indexAt(QPoint(1, 1)), QItemSelectionModel.Rows ) + campaignList.selectionModel().selectionChanged.connect(on_campaign_selected) on_campaign_selected() - # Campaign settings - mapSettingsGroup = QtWidgets.QGroupBox("Map Settings") - invertMap = QtWidgets.QCheckBox() - self.registerField("invertMap", invertMap) - mapSettingsLayout = QtWidgets.QGridLayout() - mapSettingsLayout.addWidget(QtWidgets.QLabel("Invert Map"), 0, 0) - mapSettingsLayout.addWidget(invertMap, 0, 1) - mapSettingsGroup.setLayout(mapSettingsLayout) - - # Time Period - timeGroup = QtWidgets.QGroupBox("Time Period") - timePeriod = QtWidgets.QLabel("Start date :") - timePeriodSelect = QtWidgets.QComboBox() - for r in db.TIME_PERIODS: - timePeriodSelect.addItem(r) - timePeriod.setBuddy(timePeriodSelect) - timePeriodSelect.setCurrentIndex(21) - # Docs Link docsText = QtWidgets.QLabel( 'How to create your own theater' @@ -365,10 +401,14 @@ class TheaterConfiguration(QtWidgets.QWizardPage): # Register fields self.registerField("timePeriod", timePeriodSelect) + self.registerField("usePreset", timePeriodPreset) timeGroupLayout = QtWidgets.QGridLayout() - timeGroupLayout.addWidget(timePeriod, 0, 0) - timeGroupLayout.addWidget(timePeriodSelect, 0, 1) + timeGroupLayout.addWidget(timePeriodPresetLabel, 0, 0) + timeGroupLayout.addWidget(timePeriodPreset, 0, 1) + timeGroupLayout.addWidget(timePeriod, 1, 0) + timeGroupLayout.addWidget(timePeriodSelect, 1, 1) + timeGroupLayout.addWidget(self.calendar, 0, 2, 3, 1) timeGroup.setLayout(timeGroupLayout) layout = QtWidgets.QGridLayout()