From 93aae78f0d387e3cd84e7c2ed0c0204baaa67f17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maxime=20R=C3=A9aux?= Date: Thu, 12 Feb 2026 09:10:03 +0100 Subject: [PATCH] fix sector missing fields --- .../controller/campaign_controller.py | 12 ++++++++++ src/warchron/controller/dtos.py | 2 ++ src/warchron/model/campaign.py | 10 ++++++++- src/warchron/model/model.py | 10 ++++++++- src/warchron/model/sector.py | 14 ++++++++++-- src/warchron/model/war.py | 10 ++++++++- src/warchron/view/sector_dialog.py | 11 +++++++++- src/warchron/view/ui/ui_main_window.py | 22 ++++++++++++++----- src/warchron/view/ui/ui_main_window.ui | 15 +++++++++++++ src/warchron/view/view.py | 10 ++++++--- 10 files changed, 102 insertions(+), 14 deletions(-) diff --git a/src/warchron/controller/campaign_controller.py b/src/warchron/controller/campaign_controller.py index 96c3a9a..e0d37c1 100644 --- a/src/warchron/controller/campaign_controller.py +++ b/src/warchron/controller/campaign_controller.py @@ -36,6 +36,8 @@ class CampaignController: major=war.get_objective_name(sect.major_objective_id), minor=war.get_objective_name(sect.minor_objective_id), influence=war.get_objective_name(sect.influence_objective_id), + mission=sect.mission, + description=sect.description, ) for sect in sectors ] @@ -214,6 +216,8 @@ class CampaignController: major_id = dialog.get_major_id() minor_id = dialog.get_minor_id() influence_id = dialog.get_influence_id() + mission = dialog.get_mission() + description = dialog.get_description() if not self._validate_sector_inputs( name, round_id, major_id, minor_id, influence_id ): @@ -225,6 +229,8 @@ class CampaignController: major_id, minor_id, influence_id, + mission, + description, ) self.app.is_dirty = True self.app.navigation.refresh(RefreshScope.CURRENT_SELECTION_DETAILS) @@ -251,6 +257,8 @@ class CampaignController: default_major_id=sect.major_objective_id, default_minor_id=sect.minor_objective_id, default_influence_id=sect.influence_objective_id, + default_mission=sect.mission, + default_description=sect.description, ) if sect_dialog.exec() == QDialog.DialogCode.Accepted: name = sect_dialog.get_sector_name() @@ -258,6 +266,8 @@ class CampaignController: major_id = sect_dialog.get_major_id() minor_id = sect_dialog.get_minor_id() influence_id = sect_dialog.get_influence_id() + mission = sect_dialog.get_mission() + description = sect_dialog.get_description() self.app.model.update_sector( sector_id, name=name, @@ -265,4 +275,6 @@ class CampaignController: major_id=major_id, minor_id=minor_id, influence_id=influence_id, + mission=mission, + description=description, ) diff --git a/src/warchron/controller/dtos.py b/src/warchron/controller/dtos.py index d96df92..f428cd6 100644 --- a/src/warchron/controller/dtos.py +++ b/src/warchron/controller/dtos.py @@ -66,6 +66,8 @@ class SectorDTO: major: str | None minor: str | None influence: str | None + mission: str | None + description: str | None @dataclass diff --git a/src/warchron/model/campaign.py b/src/warchron/model/campaign.py index 4a847c0..fb16c97 100644 --- a/src/warchron/model/campaign.py +++ b/src/warchron/model/campaign.py @@ -152,8 +152,12 @@ class Campaign: major_id: str | None, minor_id: str | None, influence_id: str | None, + mission: str | None, + description: str | None, ) -> Sector: - sect = Sector(name, round_id, major_id, minor_id, influence_id) + sect = Sector( + name, round_id, major_id, minor_id, influence_id, mission, description + ) self.sectors[sect.id] = sect return sect @@ -177,6 +181,8 @@ class Campaign: major_id: str | None, minor_id: str | None, influence_id: str | None, + mission: str | None, + description: str | None, ) -> None: sect = self.get_sector(sector_id) old_round_id = sect.round_id @@ -187,6 +193,8 @@ class Campaign: sect.set_major(major_id) sect.set_minor(minor_id) sect.set_influence(influence_id) + sect.set_mission(mission) + sect.set_description(description) if old_round_id == round_id: apply_update() diff --git a/src/warchron/model/model.py b/src/warchron/model/model.py index 36ab496..ca7cd10 100644 --- a/src/warchron/model/model.py +++ b/src/warchron/model/model.py @@ -301,9 +301,13 @@ class Model: major_id: str | None, minor_id: str | None, influence_id: str | None, + mission: str | None, + description: str | None, ) -> Sector: camp = self.get_campaign(campaign_id) - return camp.add_sector(name, round_id, major_id, minor_id, influence_id) + return camp.add_sector( + name, round_id, major_id, minor_id, influence_id, mission, description + ) # TODO replace multiloops by internal has_* method def get_sector(self, sector_id: str) -> Sector: @@ -323,6 +327,8 @@ class Model: major_id: str | None, minor_id: str | None, influence_id: str | None, + mission: str | None, + description: str | None, ) -> None: war = self.get_war_by_sector(sector_id) war.update_sector( @@ -332,6 +338,8 @@ class Model: major_id=major_id, minor_id=minor_id, influence_id=influence_id, + mission=mission, + description=description, ) def remove_sector(self, sector_id: str) -> None: diff --git a/src/warchron/model/sector.py b/src/warchron/model/sector.py index 3b76068..479dcf6 100644 --- a/src/warchron/model/sector.py +++ b/src/warchron/model/sector.py @@ -11,6 +11,8 @@ class Sector: major_id: str | None, minor_id: str | None, influence_id: str | None, + mission: str | None, + description: str | None, ): self.id: str = str(uuid4()) self.name: str = name @@ -18,8 +20,8 @@ class Sector: self.major_objective_id: str | None = major_id # ref to War.objectives self.minor_objective_id: str | None = minor_id # ref to War.objectives self.influence_objective_id: str | None = influence_id # ref to War.objectives - self.mission: str | None = None - self.description: str | None = None + self.mission: str | None = mission + self.description: str | None = description def set_id(self, new_id: str) -> None: self.id = new_id @@ -39,6 +41,12 @@ class Sector: def set_influence(self, new_influence_id: str | None) -> None: self.influence_objective_id = new_influence_id + def set_mission(self, new_mission_id: str | None) -> None: + self.mission = new_mission_id + + def set_description(self, new_description: str | None) -> None: + self.description = new_description + def toDict(self) -> Dict[str, Any]: return { "id": self.id, @@ -59,6 +67,8 @@ class Sector: data.get("major_objective_id") or None, data.get("minor_objective_id") or None, data.get("influence_objective_id") or None, + data.get("mission") or None, + data.get("description") or None, ) sec.set_id(data["id"]) sec.mission = data.get("mission") or None diff --git a/src/warchron/model/war.py b/src/warchron/model/war.py index 71cbe5c..a2fa125 100644 --- a/src/warchron/model/war.py +++ b/src/warchron/model/war.py @@ -233,9 +233,13 @@ class War: major_id: str, minor_id: str, influence_id: str, + mission: str, + description: str, ) -> Sector: camp = self.get_campaign(campaign_id) - return camp.add_sector(name, round_id, major_id, minor_id, influence_id) + return camp.add_sector( + name, round_id, major_id, minor_id, influence_id, mission, description + ) # TODO replace multiloops by internal has_* method def get_sector(self, sector_id: str) -> Sector: @@ -254,6 +258,8 @@ class War: major_id: str | None, minor_id: str | None, influence_id: str | None, + mission: str | None, + description: str | None, ) -> None: camp = self.get_campaign_by_sector(sector_id) camp.update_sector( @@ -263,6 +269,8 @@ class War: major_id=major_id, minor_id=minor_id, influence_id=influence_id, + mission=mission, + description=description, ) def remove_sector(self, sector_id: str) -> None: diff --git a/src/warchron/view/sector_dialog.py b/src/warchron/view/sector_dialog.py index 65e2802..783fb12 100644 --- a/src/warchron/view/sector_dialog.py +++ b/src/warchron/view/sector_dialog.py @@ -19,6 +19,8 @@ class SectorDialog(QDialog): default_major_id: str | None = None, default_minor_id: str | None = None, default_influence_id: str | None = None, + default_mission: str | None = None, + default_description: str | None = None, ) -> None: super().__init__(parent) self.ui: Ui_sectorDialog = Ui_sectorDialog() @@ -38,6 +40,8 @@ class SectorDialog(QDialog): select_if_exists(self.ui.majorComboBox, default_major_id) select_if_exists(self.ui.minorComboBox, default_minor_id) select_if_exists(self.ui.influenceComboBox, default_influence_id) + self.ui.sectorMission.setText(default_mission) + self.ui.sectorDescription.setPlainText(default_description) def get_sector_name(self) -> str: return self.ui.sectorName.text().strip() @@ -58,5 +62,10 @@ class SectorDialog(QDialog): text = cast(str, self.ui.influenceComboBox.currentData()) return text if text else None + def get_mission(self) -> str | None: + text = self.ui.sectorMission.text().strip() + return text if text else None -# TODO fix mission + description missing + def get_description(self) -> str | None: + text = self.ui.sectorDescription.toPlainText().strip() + return text if text else None diff --git a/src/warchron/view/ui/ui_main_window.py b/src/warchron/view/ui/ui_main_window.py index 234c75f..cb66fbd 100644 --- a/src/warchron/view/ui/ui_main_window.py +++ b/src/warchron/view/ui/ui_main_window.py @@ -272,7 +272,7 @@ class Ui_MainWindow(object): self.sectorsTable.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) self.sectorsTable.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) self.sectorsTable.setObjectName("sectorsTable") - self.sectorsTable.setColumnCount(6) + self.sectorsTable.setColumnCount(7) self.sectorsTable.setRowCount(0) item = QtWidgets.QTableWidgetItem() self.sectorsTable.setHorizontalHeaderItem(0, item) @@ -286,6 +286,8 @@ class Ui_MainWindow(object): self.sectorsTable.setHorizontalHeaderItem(4, item) item = QtWidgets.QTableWidgetItem() self.sectorsTable.setHorizontalHeaderItem(5, item) + item = QtWidgets.QTableWidgetItem() + self.sectorsTable.setHorizontalHeaderItem(6, item) self.sectorsTable.horizontalHeader().setStretchLastSection(False) self.verticalLayout_5.addWidget(self.sectorsTable) self.verticalLayout_7.addWidget(self.groupBox_3) @@ -381,7 +383,7 @@ class Ui_MainWindow(object): self.battlesTable.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) self.battlesTable.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) self.battlesTable.setObjectName("battlesTable") - self.battlesTable.setColumnCount(3) + self.battlesTable.setColumnCount(5) self.battlesTable.setRowCount(0) item = QtWidgets.QTableWidgetItem() self.battlesTable.setHorizontalHeaderItem(0, item) @@ -389,6 +391,10 @@ class Ui_MainWindow(object): self.battlesTable.setHorizontalHeaderItem(1, item) item = QtWidgets.QTableWidgetItem() self.battlesTable.setHorizontalHeaderItem(2, item) + item = QtWidgets.QTableWidgetItem() + self.battlesTable.setHorizontalHeaderItem(3, item) + item = QtWidgets.QTableWidgetItem() + self.battlesTable.setHorizontalHeaderItem(4, item) self.battlesTable.horizontalHeader().setStretchLastSection(False) self.horizontalLayout_12.addWidget(self.battlesTable) self.verticalLayout_8.addWidget(self.groupBox_6) @@ -546,12 +552,14 @@ class Ui_MainWindow(object): item = self.sectorsTable.horizontalHeaderItem(1) item.setText(_translate("MainWindow", "Round")) item = self.sectorsTable.horizontalHeaderItem(2) - item.setText(_translate("MainWindow", "Major obj.")) + item.setText(_translate("MainWindow", "Mission")) item = self.sectorsTable.horizontalHeaderItem(3) - item.setText(_translate("MainWindow", "Minor opp.")) + item.setText(_translate("MainWindow", "Major obj.")) item = self.sectorsTable.horizontalHeaderItem(4) - item.setText(_translate("MainWindow", "Influence imp.")) + item.setText(_translate("MainWindow", "Minor opp.")) item = self.sectorsTable.horizontalHeaderItem(5) + item.setText(_translate("MainWindow", "Influence imp.")) + item = self.sectorsTable.horizontalHeaderItem(6) item.setText(_translate("MainWindow", "Description")) self.groupBox_4.setTitle(_translate("MainWindow", "Participants")) self.addCampaignParticipantBtn.setText(_translate("MainWindow", "Add participant")) @@ -585,6 +593,10 @@ class Ui_MainWindow(object): item.setText(_translate("MainWindow", "Player 1")) item = self.battlesTable.horizontalHeaderItem(2) item.setText(_translate("MainWindow", "Player 2")) + item = self.battlesTable.horizontalHeaderItem(3) + item.setText(_translate("MainWindow", "Score")) + item = self.battlesTable.horizontalHeaderItem(4) + item.setText(_translate("MainWindow", "Victory condition")) self.endRoundBtn.setText(_translate("MainWindow", "End round")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.warsTab), _translate("MainWindow", "Wars")) self.menuFile.setTitle(_translate("MainWindow", "File")) diff --git a/src/warchron/view/ui/ui_main_window.ui b/src/warchron/view/ui/ui_main_window.ui index 735b3c0..12b1653 100644 --- a/src/warchron/view/ui/ui_main_window.ui +++ b/src/warchron/view/ui/ui_main_window.ui @@ -662,6 +662,11 @@ Round + + + Mission + + Major obj. @@ -917,6 +922,16 @@ Player 2 + + + Score + + + + + Victory condition + + diff --git a/src/warchron/view/view.py b/src/warchron/view/view.py index e7b999b..75be8c3 100644 --- a/src/warchron/view/view.py +++ b/src/warchron/view/view.py @@ -431,15 +431,19 @@ class View(QtWidgets.QMainWindow, Ui_MainWindow): round_item = QtWidgets.QTableWidgetItem( format_round_label(sect.round_index) ) + mission_item = QtWidgets.QTableWidgetItem(sect.mission) major_item = QtWidgets.QTableWidgetItem(sect.major) minor_item = QtWidgets.QTableWidgetItem(sect.minor) influence_item = QtWidgets.QTableWidgetItem(sect.influence) + description_item = QtWidgets.QTableWidgetItem(sect.description) name_item.setData(Qt.ItemDataRole.UserRole, sect.id) table.setItem(row, 0, name_item) table.setItem(row, 1, round_item) - table.setItem(row, 2, major_item) - table.setItem(row, 3, minor_item) - table.setItem(row, 4, influence_item) + table.setItem(row, 2, mission_item) + table.setItem(row, 3, major_item) + table.setItem(row, 4, minor_item) + table.setItem(row, 5, influence_item) + table.setItem(row, 6, description_item) table.resizeColumnsToContents() def display_campaign_participants(