From 188f5256fb84f00f4e5e7bbddffe7ba8a07bc93e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maxime=20R=C3=A9aux?= Date: Mon, 23 Mar 2026 11:55:15 +0100 Subject: [PATCH] move war settings in a dedicated menu --- src/warchron/controller/app_controller.py | 4 +- src/warchron/controller/dtos.py | 7 + src/warchron/controller/war_controller.py | 71 ++- src/warchron/model/model.py | 16 +- src/warchron/model/pairing.py | 2 - src/warchron/model/war.py | 23 + src/warchron/view/settings_dialog.py | 66 +++ src/warchron/view/ui/ui_main_window.py | 88 ++-- src/warchron/view/ui/ui_main_window.ui | 137 ++---- src/warchron/view/ui/ui_settings.py | 8 + src/warchron/view/ui/ui_settings_dialog.py | 232 ++++++++++ src/warchron/view/ui/ui_settings_dialog.ui | 493 +++++++++++++++++++++ src/warchron/view/view.py | 28 +- 13 files changed, 924 insertions(+), 251 deletions(-) create mode 100644 src/warchron/view/settings_dialog.py create mode 100644 src/warchron/view/ui/ui_settings.py create mode 100644 src/warchron/view/ui/ui_settings_dialog.py create mode 100644 src/warchron/view/ui/ui_settings_dialog.ui diff --git a/src/warchron/controller/app_controller.py b/src/warchron/controller/app_controller.py index ac98aad..fd47b91 100644 --- a/src/warchron/controller/app_controller.py +++ b/src/warchron/controller/app_controller.py @@ -42,9 +42,7 @@ class AppController: self.view.actionAbout.triggered.connect(self.show_about) self.view.addPlayerBtn.clicked.connect(lambda: self.add_item(ItemType.PLAYER)) self.view.addWarBtn.clicked.connect(lambda: self.add_item(ItemType.WAR)) - self.view.majorValue.valueChanged.connect(self.wars.set_major_value) - self.view.minorValue.valueChanged.connect(self.wars.set_minor_value) - self.view.influenceToken.toggled.connect(self.wars.set_influence_token) + self.view.settingsBtn.clicked.connect(self.wars.open_settings) self.view.addObjectiveBtn.clicked.connect( lambda: self.add_item(ItemType.OBJECTIVE) ) diff --git a/src/warchron/controller/dtos.py b/src/warchron/controller/dtos.py index 97a08e8..cc9b211 100644 --- a/src/warchron/controller/dtos.py +++ b/src/warchron/controller/dtos.py @@ -138,3 +138,10 @@ class WarParticipantScoreDTO: @dataclass class TieDialogData: title: str + + +@dataclass +class WarSettingsDTO: + major_value: int + minor_value: int + influence_token: bool diff --git a/src/warchron/controller/war_controller.py b/src/warchron/controller/war_controller.py index c6bb127..4b7c3ef 100644 --- a/src/warchron/controller/war_controller.py +++ b/src/warchron/controller/war_controller.py @@ -19,9 +19,10 @@ if TYPE_CHECKING: from warchron.controller.dtos import ( ParticipantOption, WarParticipantScoreDTO, + WarSettingsDTO, ObjectiveDTO, ) -from warchron.model.war import War +from warchron.model.war import War, WarSettings from warchron.model.war_participant import WarParticipant from warchron.model.objective import Objective from warchron.model.tiebreaking import TieContext, TieBreaker @@ -33,6 +34,7 @@ from warchron.view.war_dialog import WarDialog from warchron.view.objective_dialog import ObjectiveDialog from warchron.view.war_participant_dialog import WarParticipantDialog from warchron.view.tie_dialog import TieDialog +from warchron.view.settings_dialog import SettingsDialog class WarController: @@ -42,11 +44,6 @@ class WarController: def _fill_war_details(self, war_id: str) -> None: war = self.app.model.get_war(war_id) self.app.view.show_war_details(name=war.name, year=war.year) - self.app.view.set_war_objective_values( - major=war.major_value, - minor=war.minor_value, - influence=war.influence_token, - ) objectives = war.get_all_objectives() objectives_for_display: List[ObjectiveDTO] = [ ObjectiveDTO(id=obj.id, name=obj.name, description=obj.description) @@ -189,50 +186,32 @@ class WarController: bids_map[ctx.key()] = dialog.get_bids() return bids_map - def set_major_value(self, value: int) -> None: + def open_settings(self) -> None: war_id = self.app.navigation.selected_war_id if not war_id: return + settings = self.app.model.get_war_settings(war_id) + settings_for_display = WarSettingsDTO( + major_value=settings.major_value, + minor_value=settings.minor_value, + influence_token=settings.influence_token, + ) + dialog = SettingsDialog(self.app.view) + dialog.load_settings(settings_for_display) + if dialog.exec() != QDialog.DialogCode.Accepted: + return + if not dialog.has_changes(): + return + new_settingsDTO = dialog.get_settings() + new_settings = WarSettings( + new_settingsDTO.major_value, + new_settingsDTO.minor_value, + new_settingsDTO.influence_token, + ) try: - self.app.model.set_major_value(war_id, value) + self.app.model.apply_war_settings(war_id, new_settings) except DomainError as e: - QMessageBox.warning( - self.app.view, - "Setting forbidden", - str(e), - ) - return - self.app.is_dirty = True - self.app.navigation.refresh(RefreshScope.CURRENT_SELECTION_DETAILS) - - def set_minor_value(self, value: int) -> None: - war_id = self.app.navigation.selected_war_id - if not war_id: - return - try: - self.app.model.set_minor_value(war_id, value) - except DomainError as e: - QMessageBox.warning( - self.app.view, - "Setting forbidden", - str(e), - ) - return - self.app.is_dirty = True - self.app.navigation.refresh(RefreshScope.CURRENT_SELECTION_DETAILS) - - def set_influence_token(self, checked: bool) -> None: - war_id = self.app.navigation.selected_war_id - if not war_id: - return - try: - self.app.model.set_influence_token(war_id, checked) - except DomainError as e: - QMessageBox.warning( - self.app.view, - "Setting forbidden", - str(e), - ) + QMessageBox.warning(self.app.view, "Setting forbidden", str(e)) return except RequiresConfirmation as e: reply = QMessageBox.question( @@ -245,7 +224,7 @@ class WarController: e.action() else: return - self.app.is_dirty = True + self.is_dirty = True self.app.navigation.refresh(RefreshScope.CURRENT_SELECTION_DETAILS) self.app.navigation.refresh_and_select( RefreshScope.WARS_TREE, item_type=ItemType.WAR, item_id=war_id diff --git a/src/warchron/model/model.py b/src/warchron/model/model.py index 312431a..d1bab74 100644 --- a/src/warchron/model/model.py +++ b/src/warchron/model/model.py @@ -6,7 +6,7 @@ from datetime import datetime from warchron.model.exception import ForbiddenOperation from warchron.model.player import Player -from warchron.model.war import War +from warchron.model.war import War, WarSettings from warchron.model.war_participant import WarParticipant from warchron.model.objective import Objective from warchron.model.campaign import Campaign @@ -165,17 +165,13 @@ class Model: war.set_name(name) war.set_year(year) - def set_major_value(self, war_id: str, value: int) -> None: - war = self.get_war(war_id) - war.set_major_value(value) + def get_war_settings(self, war_id: str) -> WarSettings: + war = self.wars[war_id] + return war.get_war_settings() - def set_minor_value(self, war_id: str, value: int) -> None: + def apply_war_settings(self, war_id: str, settings: WarSettings) -> None: war = self.get_war(war_id) - war.set_minor_value(value) - - def set_influence_token(self, war_id: str, value: bool) -> None: - war = self.get_war(war_id) - war.set_influence_token(value) + war.apply_war_settings(settings) def get_all_wars(self) -> List[War]: return list(self.wars.values()) diff --git a/src/warchron/model/pairing.py b/src/warchron/model/pairing.py index 5b9576b..50384a0 100644 --- a/src/warchron/model/pairing.py +++ b/src/warchron/model/pairing.py @@ -291,7 +291,6 @@ class Pairing: ) for battle in available ] - print(f"scored for pid {pid}: {scored}") scored.sort(key=lambda x: x[0]) best_score = scored[0][0] best_battles = [b for s, b in scored if s == best_score] @@ -314,7 +313,6 @@ class Pairing: rematch_penalty = 0 for opp in occupants: key = (pid, opp) if pid < opp else (opp, pid) - print(f"key for occupant {opp}: {key}") rematch_penalty += match_counts.get(key, 0) return rematch_penalty * rematch_weight + occupancy_penalty * occupancy_weight diff --git a/src/warchron/model/war.py b/src/warchron/model/war.py index a04a574..a78d78d 100644 --- a/src/warchron/model/war.py +++ b/src/warchron/model/war.py @@ -1,4 +1,5 @@ from __future__ import annotations +from dataclasses import dataclass from uuid import uuid4 from datetime import datetime from typing import Any, Dict, List, Set @@ -25,6 +26,13 @@ from warchron.model.choice import Choice from warchron.model.battle import Battle +@dataclass +class WarSettings: + major_value: int + minor_value: int + influence_token: bool + + class War: def __init__(self, name: str, year: int) -> None: self.id: str = str(uuid4()) @@ -48,6 +56,21 @@ class War: def set_year(self, new_year: int) -> None: self.year = new_year + def get_war_settings(self) -> WarSettings: + return WarSettings( + self.major_value, + self.minor_value, + self.influence_token, + ) + + def apply_war_settings(self, settings: WarSettings) -> None: + if settings.major_value != self.major_value: + self.set_major_value(settings.major_value) + if settings.minor_value != self.minor_value: + self.set_minor_value(settings.minor_value) + if settings.influence_token != self.influence_token: + self.set_influence_token(settings.influence_token) + def set_major_value(self, new_value: int) -> None: if self.is_over: raise ForbiddenOperation("Can't set major value of a closed war.") diff --git a/src/warchron/view/settings_dialog.py b/src/warchron/view/settings_dialog.py new file mode 100644 index 0000000..a651c4a --- /dev/null +++ b/src/warchron/view/settings_dialog.py @@ -0,0 +1,66 @@ +from PyQt6.QtWidgets import QWidget, QDialog, QDialogButtonBox + +from warchron.constants import Icons, IconName +from warchron.controller.dtos import WarSettingsDTO +from warchron.view.ui.ui_settings_dialog import Ui_settingsDialog + + +class SettingsDialog(QDialog): + def __init__( + self, + parent: QWidget | None = None, + ) -> None: + super().__init__(parent) + self.ui: Ui_settingsDialog = Ui_settingsDialog() + self.ui.setupUi(self) # type: ignore + self._original: WarSettingsDTO | None = None + self.ui.majorValue.setMinimum(0) + self.ui.minorValue.setMinimum(0) + self.ui.majorValue.valueChanged.connect(self._on_major_changed) + self.ui.minorValue.valueChanged.connect(self._on_minor_changed) + self.ui.buttonBox.accepted.connect(self.accept) + self.ui.buttonBox.rejected.connect(self.reject) + self._validate() + self.setWindowIcon(Icons.get(IconName.WARCHRONICO)) + + def load_settings(self, settings: WarSettingsDTO) -> None: + self._original = settings + self.ui.majorValue.blockSignals(True) + self.ui.minorValue.blockSignals(True) + self.ui.influenceToken.blockSignals(True) + self.ui.majorValue.setValue(settings.major_value) + self.ui.minorValue.setValue(settings.minor_value) + self.ui.influenceToken.setChecked(settings.influence_token) + self.ui.minorValue.setMaximum(settings.major_value) + self.ui.majorValue.setMinimum(settings.minor_value) + self.ui.majorValue.blockSignals(False) + self.ui.minorValue.blockSignals(False) + self.ui.influenceToken.blockSignals(False) + + self._validate() + + def get_settings(self) -> WarSettingsDTO: + return WarSettingsDTO( + major_value=self.ui.majorValue.value(), + minor_value=self.ui.minorValue.value(), + influence_token=self.ui.influenceToken.isChecked(), + ) + + def has_changes(self) -> bool: + if self._original is None: + return True + return self.get_settings() != self._original + + def _validate(self) -> None: + valid = self.ui.majorValue.value() >= self.ui.minorValue.value() + ok_btn = self.ui.buttonBox.button(QDialogButtonBox.StandardButton.Ok) + if ok_btn is not None: + ok_btn.setEnabled(valid) + + def _on_major_changed(self, value: int) -> None: + self.ui.minorValue.setMaximum(value) + self._validate() + + def _on_minor_changed(self, value: int) -> None: + self.ui.majorValue.setMinimum(value) + self._validate() diff --git a/src/warchron/view/ui/ui_main_window.py b/src/warchron/view/ui/ui_main_window.py index 038e890..1eaee4b 100644 --- a/src/warchron/view/ui/ui_main_window.py +++ b/src/warchron/view/ui/ui_main_window.py @@ -124,6 +124,17 @@ class Ui_MainWindow(object): self.warYear.setObjectName("warYear") self.horizontalLayout_8.addWidget(self.warYear) self.verticalLayout_10.addLayout(self.horizontalLayout_8) + self.horizontalLayout_7 = QtWidgets.QHBoxLayout() + self.horizontalLayout_7.setObjectName("horizontalLayout_7") + spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_7.addItem(spacerItem3) + self.label_19 = QtWidgets.QLabel(parent=self.pageWar) + self.label_19.setObjectName("label_19") + self.horizontalLayout_7.addWidget(self.label_19) + self.settingsBtn = QtWidgets.QToolButton(parent=self.pageWar) + self.settingsBtn.setObjectName("settingsBtn") + self.horizontalLayout_7.addWidget(self.settingsBtn) + self.verticalLayout_10.addLayout(self.horizontalLayout_7) self.groupBox = QtWidgets.QGroupBox(parent=self.pageWar) font = QtGui.QFont() font.setPointSize(10) @@ -137,43 +148,8 @@ class Ui_MainWindow(object): self.addObjectiveBtn.setEnabled(True) self.addObjectiveBtn.setObjectName("addObjectiveBtn") self.horizontalLayout_3.addWidget(self.addObjectiveBtn) - spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) - self.horizontalLayout_3.addItem(spacerItem3) - self.label = QtWidgets.QLabel(parent=self.groupBox) - self.label.setObjectName("label") - self.horizontalLayout_3.addWidget(self.label) - self.majorValue = QtWidgets.QSpinBox(parent=self.groupBox) - self.majorValue.setMinimum(1) - self.majorValue.setObjectName("majorValue") - self.horizontalLayout_3.addWidget(self.majorValue) - self.label_5 = QtWidgets.QLabel(parent=self.groupBox) - self.label_5.setObjectName("label_5") - self.horizontalLayout_3.addWidget(self.label_5) spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) self.horizontalLayout_3.addItem(spacerItem4) - self.label_2 = QtWidgets.QLabel(parent=self.groupBox) - self.label_2.setObjectName("label_2") - self.horizontalLayout_3.addWidget(self.label_2) - self.minorValue = QtWidgets.QSpinBox(parent=self.groupBox) - self.minorValue.setMinimum(1) - self.minorValue.setObjectName("minorValue") - self.horizontalLayout_3.addWidget(self.minorValue) - self.label_4 = QtWidgets.QLabel(parent=self.groupBox) - self.label_4.setObjectName("label_4") - self.horizontalLayout_3.addWidget(self.label_4) - spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) - self.horizontalLayout_3.addItem(spacerItem5) - self.label_3 = QtWidgets.QLabel(parent=self.groupBox) - self.label_3.setObjectName("label_3") - self.horizontalLayout_3.addWidget(self.label_3) - self.influenceToken = QtWidgets.QCheckBox(parent=self.groupBox) - self.influenceToken.setEnabled(True) - self.influenceToken.setCheckable(True) - self.influenceToken.setChecked(True) - self.influenceToken.setObjectName("influenceToken") - self.horizontalLayout_3.addWidget(self.influenceToken) - spacerItem6 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) - self.horizontalLayout_3.addItem(spacerItem6) self.verticalLayout.addLayout(self.horizontalLayout_3) self.objectivesTable = QtWidgets.QTableWidget(parent=self.groupBox) self.objectivesTable.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) @@ -201,8 +177,8 @@ class Ui_MainWindow(object): self.addWarParticipantBtn = QtWidgets.QPushButton(parent=self.groupBox_2) self.addWarParticipantBtn.setObjectName("addWarParticipantBtn") self.horizontalLayout_5.addWidget(self.addWarParticipantBtn) - spacerItem7 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) - self.horizontalLayout_5.addItem(spacerItem7) + spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_5.addItem(spacerItem5) self.verticalLayout_2.addLayout(self.horizontalLayout_5) self.warParticipantsTable = QtWidgets.QTableWidget(parent=self.groupBox_2) self.warParticipantsTable.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) @@ -226,8 +202,8 @@ class Ui_MainWindow(object): self.verticalLayout_10.addWidget(self.groupBox_2) self.horizontalLayout_6 = QtWidgets.QHBoxLayout() self.horizontalLayout_6.setObjectName("horizontalLayout_6") - spacerItem8 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) - self.horizontalLayout_6.addItem(spacerItem8) + spacerItem6 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_6.addItem(spacerItem6) self.endWarBtn = QtWidgets.QPushButton(parent=self.pageWar) self.endWarBtn.setEnabled(True) self.endWarBtn.setObjectName("endWarBtn") @@ -246,8 +222,8 @@ class Ui_MainWindow(object): self.campaignName.setFont(font) self.campaignName.setObjectName("campaignName") self.horizontalLayout_11.addWidget(self.campaignName) - spacerItem9 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) - self.horizontalLayout_11.addItem(spacerItem9) + spacerItem7 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_11.addItem(spacerItem7) self.campaignMonth = QtWidgets.QLabel(parent=self.pageCampaign) font = QtGui.QFont() font.setPointSize(12) @@ -268,8 +244,8 @@ class Ui_MainWindow(object): self.addSectorBtn.setEnabled(True) self.addSectorBtn.setObjectName("addSectorBtn") self.horizontalLayout_17.addWidget(self.addSectorBtn) - spacerItem10 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) - self.horizontalLayout_17.addItem(spacerItem10) + spacerItem8 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_17.addItem(spacerItem8) self.verticalLayout_5.addLayout(self.horizontalLayout_17) self.sectorsTable = QtWidgets.QTableWidget(parent=self.groupBox_3) self.sectorsTable.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) @@ -306,8 +282,8 @@ class Ui_MainWindow(object): self.addCampaignParticipantBtn = QtWidgets.QPushButton(parent=self.groupBox_4) self.addCampaignParticipantBtn.setObjectName("addCampaignParticipantBtn") self.horizontalLayout_18.addWidget(self.addCampaignParticipantBtn) - spacerItem11 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) - self.horizontalLayout_18.addItem(spacerItem11) + spacerItem9 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_18.addItem(spacerItem9) self.verticalLayout_6.addLayout(self.horizontalLayout_18) self.campaignParticipantsTable = QtWidgets.QTableWidget(parent=self.groupBox_4) self.campaignParticipantsTable.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) @@ -330,8 +306,8 @@ class Ui_MainWindow(object): self.verticalLayout_7.addWidget(self.groupBox_4) self.horizontalLayout_10 = QtWidgets.QHBoxLayout() self.horizontalLayout_10.setObjectName("horizontalLayout_10") - spacerItem12 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) - self.horizontalLayout_10.addItem(spacerItem12) + spacerItem10 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_10.addItem(spacerItem10) self.endCampaignBtn = QtWidgets.QPushButton(parent=self.pageCampaign) self.endCampaignBtn.setEnabled(True) self.endCampaignBtn.setObjectName("endCampaignBtn") @@ -376,8 +352,8 @@ class Ui_MainWindow(object): self.verticalLayout_8.addWidget(self.groupBox_5) self.horizontalLayout_13 = QtWidgets.QHBoxLayout() self.horizontalLayout_13.setObjectName("horizontalLayout_13") - spacerItem13 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) - self.horizontalLayout_13.addItem(spacerItem13) + spacerItem11 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_13.addItem(spacerItem11) self.resolvePairingBtn = QtWidgets.QPushButton(parent=self.pageRound) self.resolvePairingBtn.setEnabled(True) self.resolvePairingBtn.setObjectName("resolvePairingBtn") @@ -413,8 +389,8 @@ class Ui_MainWindow(object): self.verticalLayout_8.addWidget(self.groupBox_6) self.horizontalLayout_9 = QtWidgets.QHBoxLayout() self.horizontalLayout_9.setObjectName("horizontalLayout_9") - spacerItem14 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) - self.horizontalLayout_9.addItem(spacerItem14) + spacerItem12 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_9.addItem(spacerItem12) self.endRoundBtn = QtWidgets.QPushButton(parent=self.pageRound) self.endRoundBtn.setEnabled(True) self.endRoundBtn.setObjectName("endRoundBtn") @@ -476,7 +452,7 @@ class Ui_MainWindow(object): self.retranslateUi(MainWindow) self.tabWidget.setCurrentIndex(1) - self.selectedDetailsStack.setCurrentIndex(3) + self.selectedDetailsStack.setCurrentIndex(1) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): @@ -500,14 +476,10 @@ class Ui_MainWindow(object): self.backgroundImage.setText(_translate("MainWindow", "IMAGE")) self.warName.setText(_translate("MainWindow", "warName")) self.warYear.setText(_translate("MainWindow", "warYear")) + self.label_19.setText(_translate("MainWindow", "Settings")) + self.settingsBtn.setText(_translate("MainWindow", "...")) self.groupBox.setTitle(_translate("MainWindow", "Objectives")) self.addObjectiveBtn.setText(_translate("MainWindow", "Add objective")) - self.label.setText(_translate("MainWindow", "Major objective")) - self.label_5.setText(_translate("MainWindow", "points")) - self.label_2.setText(_translate("MainWindow", "Minor opportunity")) - self.label_4.setText(_translate("MainWindow", "points")) - self.label_3.setText(_translate("MainWindow", "Influence")) - self.influenceToken.setText(_translate("MainWindow", "Token")) self.objectivesTable.setSortingEnabled(True) item = self.objectivesTable.horizontalHeaderItem(0) item.setText(_translate("MainWindow", "Name")) diff --git a/src/warchron/view/ui/ui_main_window.ui b/src/warchron/view/ui/ui_main_window.ui index dd8c0d6..f278829 100644 --- a/src/warchron/view/ui/ui_main_window.ui +++ b/src/warchron/view/ui/ui_main_window.ui @@ -157,7 +157,7 @@ - 3 + 1 @@ -242,6 +242,37 @@ + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Settings + + + + + + + ... + + + + + @@ -265,110 +296,6 @@ - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Major objective - - - - - - - 1 - - - - - - - points - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Minor opportunity - - - - - - - 1 - - - - - - - points - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Influence - - - - - - - true - - - Token - - - true - - - true - - - diff --git a/src/warchron/view/ui/ui_settings.py b/src/warchron/view/ui/ui_settings.py new file mode 100644 index 0000000..1aa598e --- /dev/null +++ b/src/warchron/view/ui/ui_settings.py @@ -0,0 +1,8 @@ +# Form implementation generated from reading ui file '.\src\warchron\view\ui\ui_settings.ui' +# +# Created by: PyQt6 UI code generator 6.7.1 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + diff --git a/src/warchron/view/ui/ui_settings_dialog.py b/src/warchron/view/ui/ui_settings_dialog.py new file mode 100644 index 0000000..bf0f161 --- /dev/null +++ b/src/warchron/view/ui/ui_settings_dialog.py @@ -0,0 +1,232 @@ +# Form implementation generated from reading ui file '.\src\warchron\view\ui\ui_settings_dialog.ui' +# +# Created by: PyQt6 UI code generator 6.7.1 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_settingsDialog(object): + def setupUi(self, settingsDialog): + settingsDialog.setObjectName("settingsDialog") + settingsDialog.setWindowModality(QtCore.Qt.WindowModality.ApplicationModal) + settingsDialog.resize(661, 377) + icon = QtGui.QIcon() + icon.addPixmap(QtGui.QPixmap(".\\src\\warchron\\view\\ui\\../resources/warchron_logo.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + settingsDialog.setWindowIcon(icon) + self.verticalLayout_4 = QtWidgets.QVBoxLayout(settingsDialog) + self.verticalLayout_4.setObjectName("verticalLayout_4") + self.groupBox_2 = QtWidgets.QGroupBox(parent=settingsDialog) + font = QtGui.QFont() + font.setPointSize(10) + self.groupBox_2.setFont(font) + self.groupBox_2.setObjectName("groupBox_2") + self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.groupBox_2) + self.verticalLayout_2.setObjectName("verticalLayout_2") + self.horizontalLayout = QtWidgets.QHBoxLayout() + self.horizontalLayout.setObjectName("horizontalLayout") + self.label_5 = QtWidgets.QLabel(parent=self.groupBox_2) + self.label_5.setObjectName("label_5") + self.horizontalLayout.addWidget(self.label_5) + self.winValue = QtWidgets.QSpinBox(parent=self.groupBox_2) + self.winValue.setEnabled(False) + self.winValue.setMinimum(1) + self.winValue.setObjectName("winValue") + self.horizontalLayout.addWidget(self.winValue) + self.label_14 = QtWidgets.QLabel(parent=self.groupBox_2) + self.label_14.setObjectName("label_14") + self.horizontalLayout.addWidget(self.label_14) + spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout.addItem(spacerItem) + self.label_6 = QtWidgets.QLabel(parent=self.groupBox_2) + self.label_6.setObjectName("label_6") + self.horizontalLayout.addWidget(self.label_6) + self.drawValue = QtWidgets.QSpinBox(parent=self.groupBox_2) + self.drawValue.setEnabled(False) + self.drawValue.setSuffix("") + self.drawValue.setMinimum(0) + self.drawValue.setProperty("value", 0) + self.drawValue.setObjectName("drawValue") + self.horizontalLayout.addWidget(self.drawValue) + self.label_15 = QtWidgets.QLabel(parent=self.groupBox_2) + self.label_15.setObjectName("label_15") + self.horizontalLayout.addWidget(self.label_15) + spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout.addItem(spacerItem1) + self.verticalLayout_2.addLayout(self.horizontalLayout) + self.horizontalLayout_5 = QtWidgets.QHBoxLayout() + self.horizontalLayout_5.setObjectName("horizontalLayout_5") + self.label_12 = QtWidgets.QLabel(parent=self.groupBox_2) + self.label_12.setObjectName("label_12") + self.horizontalLayout_5.addWidget(self.label_12) + self.rankingComboBox = QtWidgets.QComboBox(parent=self.groupBox_2) + self.rankingComboBox.setEnabled(False) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.rankingComboBox.sizePolicy().hasHeightForWidth()) + self.rankingComboBox.setSizePolicy(sizePolicy) + self.rankingComboBox.setObjectName("rankingComboBox") + self.rankingComboBox.addItem("") + self.horizontalLayout_5.addWidget(self.rankingComboBox) + spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_5.addItem(spacerItem2) + self.verticalLayout_2.addLayout(self.horizontalLayout_5) + self.verticalLayout_4.addWidget(self.groupBox_2) + self.groupBox = QtWidgets.QGroupBox(parent=settingsDialog) + font = QtGui.QFont() + font.setPointSize(10) + self.groupBox.setFont(font) + self.groupBox.setObjectName("groupBox") + self.verticalLayout = QtWidgets.QVBoxLayout(self.groupBox) + self.verticalLayout.setObjectName("verticalLayout") + self.horizontalLayout_3 = QtWidgets.QHBoxLayout() + self.horizontalLayout_3.setObjectName("horizontalLayout_3") + self.label_4 = QtWidgets.QLabel(parent=self.groupBox) + self.label_4.setObjectName("label_4") + self.horizontalLayout_3.addWidget(self.label_4) + self.majorValue = QtWidgets.QSpinBox(parent=self.groupBox) + self.majorValue.setMinimum(1) + self.majorValue.setObjectName("majorValue") + self.horizontalLayout_3.addWidget(self.majorValue) + self.label_8 = QtWidgets.QLabel(parent=self.groupBox) + self.label_8.setObjectName("label_8") + self.horizontalLayout_3.addWidget(self.label_8) + spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_3.addItem(spacerItem3) + self.label_9 = QtWidgets.QLabel(parent=self.groupBox) + self.label_9.setObjectName("label_9") + self.horizontalLayout_3.addWidget(self.label_9) + self.minorValue = QtWidgets.QSpinBox(parent=self.groupBox) + self.minorValue.setMinimum(1) + self.minorValue.setObjectName("minorValue") + self.horizontalLayout_3.addWidget(self.minorValue) + self.label_10 = QtWidgets.QLabel(parent=self.groupBox) + self.label_10.setObjectName("label_10") + self.horizontalLayout_3.addWidget(self.label_10) + spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_3.addItem(spacerItem4) + self.verticalLayout.addLayout(self.horizontalLayout_3) + self.horizontalLayout_4 = QtWidgets.QHBoxLayout() + self.horizontalLayout_4.setObjectName("horizontalLayout_4") + self.label_11 = QtWidgets.QLabel(parent=self.groupBox) + self.label_11.setObjectName("label_11") + self.horizontalLayout_4.addWidget(self.label_11) + self.influenceToken = QtWidgets.QCheckBox(parent=self.groupBox) + self.influenceToken.setEnabled(True) + self.influenceToken.setCheckable(True) + self.influenceToken.setChecked(True) + self.influenceToken.setObjectName("influenceToken") + self.horizontalLayout_4.addWidget(self.influenceToken) + spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_4.addItem(spacerItem5) + self.verticalLayout.addLayout(self.horizontalLayout_4) + self.verticalLayout_4.addWidget(self.groupBox) + self.groupBox_3 = QtWidgets.QGroupBox(parent=settingsDialog) + font = QtGui.QFont() + font.setPointSize(10) + self.groupBox_3.setFont(font) + self.groupBox_3.setObjectName("groupBox_3") + self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.groupBox_3) + self.verticalLayout_3.setObjectName("verticalLayout_3") + self.horizontalLayout_7 = QtWidgets.QHBoxLayout() + self.horizontalLayout_7.setObjectName("horizontalLayout_7") + self.label_17 = QtWidgets.QLabel(parent=self.groupBox_3) + self.label_17.setObjectName("label_17") + self.horizontalLayout_7.addWidget(self.label_17) + self.fallbackComboBox = QtWidgets.QComboBox(parent=self.groupBox_3) + self.fallbackComboBox.setEnabled(False) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.fallbackComboBox.sizePolicy().hasHeightForWidth()) + self.fallbackComboBox.setSizePolicy(sizePolicy) + self.fallbackComboBox.setObjectName("fallbackComboBox") + self.fallbackComboBox.addItem("") + self.horizontalLayout_7.addWidget(self.fallbackComboBox) + spacerItem6 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_7.addItem(spacerItem6) + self.label_18 = QtWidgets.QLabel(parent=self.groupBox_3) + self.label_18.setObjectName("label_18") + self.horizontalLayout_7.addWidget(self.label_18) + self.influenceToken_2 = QtWidgets.QCheckBox(parent=self.groupBox_3) + self.influenceToken_2.setEnabled(False) + self.influenceToken_2.setText("") + self.influenceToken_2.setCheckable(True) + self.influenceToken_2.setChecked(True) + self.influenceToken_2.setObjectName("influenceToken_2") + self.horizontalLayout_7.addWidget(self.influenceToken_2) + spacerItem7 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_7.addItem(spacerItem7) + self.verticalLayout_3.addLayout(self.horizontalLayout_7) + self.horizontalLayout_6 = QtWidgets.QHBoxLayout() + self.horizontalLayout_6.setObjectName("horizontalLayout_6") + self.label_13 = QtWidgets.QLabel(parent=self.groupBox_3) + self.label_13.setObjectName("label_13") + self.horizontalLayout_6.addWidget(self.label_13) + self.rematchValue = QtWidgets.QSpinBox(parent=self.groupBox_3) + self.rematchValue.setEnabled(False) + self.rematchValue.setMinimum(1) + self.rematchValue.setObjectName("rematchValue") + self.horizontalLayout_6.addWidget(self.rematchValue) + spacerItem8 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_6.addItem(spacerItem8) + self.label_16 = QtWidgets.QLabel(parent=self.groupBox_3) + self.label_16.setObjectName("label_16") + self.horizontalLayout_6.addWidget(self.label_16) + self.occupancyValue = QtWidgets.QSpinBox(parent=self.groupBox_3) + self.occupancyValue.setEnabled(False) + self.occupancyValue.setMinimum(1) + self.occupancyValue.setObjectName("occupancyValue") + self.horizontalLayout_6.addWidget(self.occupancyValue) + spacerItem9 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_6.addItem(spacerItem9) + self.verticalLayout_3.addLayout(self.horizontalLayout_6) + self.verticalLayout_4.addWidget(self.groupBox_3) + self.buttonBox = QtWidgets.QDialogButtonBox(parent=settingsDialog) + self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal) + self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok) + self.buttonBox.setObjectName("buttonBox") + self.verticalLayout_4.addWidget(self.buttonBox) + + self.retranslateUi(settingsDialog) + self.buttonBox.accepted.connect(settingsDialog.accept) # type: ignore + self.buttonBox.rejected.connect(settingsDialog.reject) # type: ignore + QtCore.QMetaObject.connectSlotsByName(settingsDialog) + + def retranslateUi(self, settingsDialog): + _translate = QtCore.QCoreApplication.translate + settingsDialog.setWindowTitle(_translate("settingsDialog", "Settings")) + self.groupBox_2.setTitle(_translate("settingsDialog", "Scores")) + self.label_5.setText(_translate("settingsDialog", "Win")) + self.label_14.setText(_translate("settingsDialog", "victory points")) + self.label_6.setText(_translate("settingsDialog", "Draw")) + self.label_15.setText(_translate("settingsDialog", "victory points")) + self.label_12.setText(_translate("settingsDialog", "Ranking mode")) + self.rankingComboBox.setItemText(0, _translate("settingsDialog", "Sum points & tie-breaks")) + self.groupBox.setTitle(_translate("settingsDialog", "Objectives")) + self.label_4.setText(_translate("settingsDialog", "Major objective")) + self.label_8.setText(_translate("settingsDialog", "narrative points")) + self.label_9.setText(_translate("settingsDialog", "Minor opportunity")) + self.label_10.setText(_translate("settingsDialog", "narrative points")) + self.label_11.setText(_translate("settingsDialog", "Underlying influence")) + self.influenceToken.setText(_translate("settingsDialog", "Token")) + self.groupBox_3.setTitle(_translate("settingsDialog", "Pairing")) + self.label_17.setText(_translate("settingsDialog", "Fallback mode")) + self.fallbackComboBox.setItemText(0, _translate("settingsDialog", "Best ranking first & avoid rematch")) + self.label_18.setText(_translate("settingsDialog", "Shuffle")) + self.label_13.setText(_translate("settingsDialog", "Rematch weight")) + self.label_16.setText(_translate("settingsDialog", "Occupancy weight")) + + +if __name__ == "__main__": + import sys + app = QtWidgets.QApplication(sys.argv) + settingsDialog = QtWidgets.QDialog() + ui = Ui_settingsDialog() + ui.setupUi(settingsDialog) + settingsDialog.show() + sys.exit(app.exec()) diff --git a/src/warchron/view/ui/ui_settings_dialog.ui b/src/warchron/view/ui/ui_settings_dialog.ui new file mode 100644 index 0000000..2b371bc --- /dev/null +++ b/src/warchron/view/ui/ui_settings_dialog.ui @@ -0,0 +1,493 @@ + + + settingsDialog + + + Qt::ApplicationModal + + + + 0 + 0 + 661 + 377 + + + + Settings + + + + ../resources/warchron_logo.png../resources/warchron_logo.png + + + + + + + 10 + + + + Scores + + + + + + + + Win + + + + + + + false + + + 1 + + + + + + + victory points + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Draw + + + + + + + false + + + + + + 0 + + + 0 + + + + + + + victory points + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Ranking mode + + + + + + + false + + + + 0 + 0 + + + + + Sum points & tie-breaks + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + 10 + + + + Objectives + + + + + + + + Major objective + + + + + + + 1 + + + + + + + narrative points + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Minor opportunity + + + + + + + 1 + + + + + + + narrative points + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Underlying influence + + + + + + + true + + + Token + + + true + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + 10 + + + + Pairing + + + + + + + + Fallback mode + + + + + + + false + + + + 0 + 0 + + + + + Best ranking first & avoid rematch + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Shuffle + + + + + + + false + + + + + + true + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Rematch weight + + + + + + + false + + + 1 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Occupancy weight + + + + + + + false + + + 1 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + settingsDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + settingsDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/warchron/view/view.py b/src/warchron/view/view.py index 74f766f..fc25fca 100644 --- a/src/warchron/view/view.py +++ b/src/warchron/view/view.py @@ -36,15 +36,10 @@ class View(QtWidgets.QMainWindow, Ui_MainWindow): self.on_tree_selection_changed: ( Callable[[TreeSelection | None], None] | None ) = None - self.on_major_value_changed: Callable[[int], None] | None = None - self.on_minot_value_changed: Callable[[int], None] | None = None - self.majorValue.setMinimum(0) - self.minorValue.setMinimum(0) - self.on_influence_token_changed: Callable[[int], None] | None = None self.on_add_item: Callable[[str], None] | None = None self.on_edit_item: Callable[[str, str], None] | None = None self.on_delete_item: Callable[[str, str], None] | None = None - self.splitter.setSizes([200, 800]) + self.splitter.setSizes([300, 900]) self.show_details(None) self.playersTable.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu) self.playersTable.customContextMenuRequested.connect( @@ -88,8 +83,6 @@ class View(QtWidgets.QMainWindow, Ui_MainWindow): self.battlesTable.customContextMenuRequested.connect( self._on_battles_table_context_menu ) - self.majorValue.valueChanged.connect(self._on_major_changed) - self.minorValue.valueChanged.connect(self._on_minor_changed) self.warsTree.currentItemChanged.connect(self._emit_selection_changed) self._apply_icons() @@ -422,25 +415,6 @@ class View(QtWidgets.QMainWindow, Ui_MainWindow): table.sortItems(2, Qt.SortOrder.DescendingOrder) table.resizeColumnsToContents() - def _on_major_changed(self, value: int) -> None: - self.minorValue.setMaximum(value) - - def _on_minor_changed(self, value: int) -> None: - self.majorValue.setMinimum(value) - - def set_war_objective_values(self, major: int, minor: int, influence: bool) -> None: - self.majorValue.blockSignals(True) - self.minorValue.blockSignals(True) - self.influenceToken.blockSignals(True) - self.majorValue.setValue(major) - self.minorValue.setValue(minor) - self.influenceToken.setChecked(influence) - self.minorValue.setMaximum(major) - self.majorValue.setMinimum(minor) - self.majorValue.blockSignals(False) - self.minorValue.blockSignals(False) - self.influenceToken.blockSignals(False) - # Campaign page def _on_sectors_table_context_menu(self, pos: QPoint) -> None: