diff --git a/qt_ui/windows/newgame/QCampaignList.py b/qt_ui/windows/newgame/QCampaignList.py index 85d3f0d1..d67ca32e 100644 --- a/qt_ui/windows/newgame/QCampaignList.py +++ b/qt_ui/windows/newgame/QCampaignList.py @@ -8,7 +8,7 @@ from typing import Any, Dict, List, Union, Tuple import packaging.version from PySide2 import QtGui -from PySide2.QtCore import QItemSelectionModel +from PySide2.QtCore import QItemSelectionModel, QModelIndex, Qt from PySide2.QtGui import QStandardItem, QStandardItemModel from PySide2.QtWidgets import QAbstractItemView, QListView @@ -116,6 +116,7 @@ def load_campaigns() -> List[Campaign]: class QCampaignItem(QStandardItem): def __init__(self, campaign: Campaign) -> None: super(QCampaignItem, self).__init__() + self.setData(campaign, QCampaignList.CampaignRole) self.setIcon(QtGui.QIcon(CONST.ICONS[campaign.icon_name])) self.setEditable(False) if campaign.is_compatible: @@ -126,31 +127,29 @@ class QCampaignItem(QStandardItem): class QCampaignList(QListView): - def __init__(self, campaigns: List[Campaign]) -> None: + CampaignRole = Qt.UserRole + + def __init__(self, campaigns: list[Campaign], show_incompatible: bool) -> None: super(QCampaignList, self).__init__() - self.model = QStandardItemModel(self) - self.setModel(self.model) + self.campaign_model = QStandardItemModel(self) + self.setModel(self.campaign_model) self.setMinimumWidth(250) self.setMinimumHeight(350) - self.campaigns = [] + self.campaigns = campaigns self.setSelectionBehavior(QAbstractItemView.SelectItems) - self.setup_content(campaigns) + self.setup_content(show_incompatible) - def setup_content(self, campaigns: List[Campaign]) -> None: - for campaign in campaigns: - self.campaigns.append(campaign) - item = QCampaignItem(campaign) - self.model.appendRow(item) - self.setSelectedCampaign(0) - self.repaint() + @property + def selected_campaign(self) -> Campaign: + return self.currentIndex().data(QCampaignList.CampaignRole) - def setSelectedCampaign(self, row): - self.selectionModel().clearSelection() - index = self.model.index(row, 0) - if not index.isValid(): - index = self.model.index(0, 0) - self.selectionModel().setCurrentIndex(index, QItemSelectionModel.Select) - self.repaint() + def setup_content(self, show_incompatible: bool) -> None: + self.campaign_model.clear() + for campaign in self.campaigns: + if show_incompatible or campaign.is_compatible: + item = QCampaignItem(campaign) + self.campaign_model.appendRow(item) - def clear_layout(self): - self.model.removeRows(0, self.model.rowCount()) + self.selectionModel().setCurrentIndex( + self.campaign_model.index(0, 0, QModelIndex()), QItemSelectionModel.Select + ) diff --git a/qt_ui/windows/newgame/QNewGameWizard.py b/qt_ui/windows/newgame/QNewGameWizard.py index cd08a4a0..f2e2e0c4 100644 --- a/qt_ui/windows/newgame/QNewGameWizard.py +++ b/qt_ui/windows/newgame/QNewGameWizard.py @@ -6,7 +6,7 @@ from typing import List from PySide2 import QtGui, QtWidgets from PySide2.QtCore import QItemSelectionModel, QPoint, Qt, QDate -from PySide2.QtWidgets import QVBoxLayout, QTextEdit, QLabel +from PySide2.QtWidgets import QVBoxLayout, QTextEdit, QLabel, QCheckBox from jinja2 import Environment, FileSystemLoader, select_autoescape from game import db @@ -319,7 +319,16 @@ class TheaterConfiguration(QtWidgets.QWizardPage): ) # List of campaigns - campaignList = QCampaignList(campaigns) + show_incompatible_campaigns_checkbox = QCheckBox( + text="Show incompatible campaigns" + ) + show_incompatible_campaigns_checkbox.setChecked(False) + campaignList = QCampaignList( + campaigns, show_incompatible_campaigns_checkbox.isChecked() + ) + show_incompatible_campaigns_checkbox.toggled.connect( + lambda checked: campaignList.setup_content(show_incompatible=checked) + ) self.registerField("selectedCampaign", campaignList) # Faction description @@ -380,8 +389,7 @@ class TheaterConfiguration(QtWidgets.QWizardPage): template_perf = jinja_env.get_template( "campaign_performance_template_EN.j2" ) - index = campaignList.selectionModel().currentIndex().row() - campaign = campaignList.campaigns[index] + campaign = campaignList.selected_campaign self.setField("selectedCampaign", campaign) self.campaignMapDescription.setText(template.render({"campaign": campaign})) self.faction_selection.setDefaultFactions(campaign) @@ -396,9 +404,12 @@ class TheaterConfiguration(QtWidgets.QWizardPage): campaignList.selectionModel().selectionChanged.connect(on_campaign_selected) on_campaign_selected() - # Docs Link docsText = QtWidgets.QLabel( - 'How to create your own theater' + "
Want more campaigns? You can " + 'offer to help, ' + 'play a community campaign, ' + 'or create your own.' + "
" ) docsText.setAlignment(Qt.AlignCenter) docsText.setOpenExternalLinks(True) @@ -418,7 +429,8 @@ class TheaterConfiguration(QtWidgets.QWizardPage): layout = QtWidgets.QGridLayout() layout.setColumnMinimumWidth(0, 20) layout.addWidget(campaignList, 0, 0, 5, 1) - layout.addWidget(docsText, 5, 0, 1, 1) + layout.addWidget(show_incompatible_campaigns_checkbox, 5, 0, 1, 1) + layout.addWidget(docsText, 6, 0, 1, 1) layout.addWidget(self.campaignMapDescription, 0, 1, 1, 1) layout.addWidget(self.performanceText, 1, 1, 1, 1) layout.addWidget(mapSettingsGroup, 2, 1, 1, 1)