fix sector missing fields

This commit is contained in:
Maxime Réaux 2026-02-12 09:10:03 +01:00
parent 6cbb7c6534
commit 93aae78f0d
10 changed files with 102 additions and 14 deletions

View file

@ -36,6 +36,8 @@ class CampaignController:
major=war.get_objective_name(sect.major_objective_id), major=war.get_objective_name(sect.major_objective_id),
minor=war.get_objective_name(sect.minor_objective_id), minor=war.get_objective_name(sect.minor_objective_id),
influence=war.get_objective_name(sect.influence_objective_id), influence=war.get_objective_name(sect.influence_objective_id),
mission=sect.mission,
description=sect.description,
) )
for sect in sectors for sect in sectors
] ]
@ -214,6 +216,8 @@ class CampaignController:
major_id = dialog.get_major_id() major_id = dialog.get_major_id()
minor_id = dialog.get_minor_id() minor_id = dialog.get_minor_id()
influence_id = dialog.get_influence_id() influence_id = dialog.get_influence_id()
mission = dialog.get_mission()
description = dialog.get_description()
if not self._validate_sector_inputs( if not self._validate_sector_inputs(
name, round_id, major_id, minor_id, influence_id name, round_id, major_id, minor_id, influence_id
): ):
@ -225,6 +229,8 @@ class CampaignController:
major_id, major_id,
minor_id, minor_id,
influence_id, influence_id,
mission,
description,
) )
self.app.is_dirty = True self.app.is_dirty = True
self.app.navigation.refresh(RefreshScope.CURRENT_SELECTION_DETAILS) self.app.navigation.refresh(RefreshScope.CURRENT_SELECTION_DETAILS)
@ -251,6 +257,8 @@ class CampaignController:
default_major_id=sect.major_objective_id, default_major_id=sect.major_objective_id,
default_minor_id=sect.minor_objective_id, default_minor_id=sect.minor_objective_id,
default_influence_id=sect.influence_objective_id, default_influence_id=sect.influence_objective_id,
default_mission=sect.mission,
default_description=sect.description,
) )
if sect_dialog.exec() == QDialog.DialogCode.Accepted: if sect_dialog.exec() == QDialog.DialogCode.Accepted:
name = sect_dialog.get_sector_name() name = sect_dialog.get_sector_name()
@ -258,6 +266,8 @@ class CampaignController:
major_id = sect_dialog.get_major_id() major_id = sect_dialog.get_major_id()
minor_id = sect_dialog.get_minor_id() minor_id = sect_dialog.get_minor_id()
influence_id = sect_dialog.get_influence_id() influence_id = sect_dialog.get_influence_id()
mission = sect_dialog.get_mission()
description = sect_dialog.get_description()
self.app.model.update_sector( self.app.model.update_sector(
sector_id, sector_id,
name=name, name=name,
@ -265,4 +275,6 @@ class CampaignController:
major_id=major_id, major_id=major_id,
minor_id=minor_id, minor_id=minor_id,
influence_id=influence_id, influence_id=influence_id,
mission=mission,
description=description,
) )

View file

@ -66,6 +66,8 @@ class SectorDTO:
major: str | None major: str | None
minor: str | None minor: str | None
influence: str | None influence: str | None
mission: str | None
description: str | None
@dataclass @dataclass

View file

@ -152,8 +152,12 @@ class Campaign:
major_id: str | None, major_id: str | None,
minor_id: str | None, minor_id: str | None,
influence_id: str | None, influence_id: str | None,
mission: str | None,
description: str | None,
) -> Sector: ) -> 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 self.sectors[sect.id] = sect
return sect return sect
@ -177,6 +181,8 @@ class Campaign:
major_id: str | None, major_id: str | None,
minor_id: str | None, minor_id: str | None,
influence_id: str | None, influence_id: str | None,
mission: str | None,
description: str | None,
) -> None: ) -> None:
sect = self.get_sector(sector_id) sect = self.get_sector(sector_id)
old_round_id = sect.round_id old_round_id = sect.round_id
@ -187,6 +193,8 @@ class Campaign:
sect.set_major(major_id) sect.set_major(major_id)
sect.set_minor(minor_id) sect.set_minor(minor_id)
sect.set_influence(influence_id) sect.set_influence(influence_id)
sect.set_mission(mission)
sect.set_description(description)
if old_round_id == round_id: if old_round_id == round_id:
apply_update() apply_update()

View file

@ -301,9 +301,13 @@ class Model:
major_id: str | None, major_id: str | None,
minor_id: str | None, minor_id: str | None,
influence_id: str | None, influence_id: str | None,
mission: str | None,
description: str | None,
) -> Sector: ) -> Sector:
camp = self.get_campaign(campaign_id) 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 # TODO replace multiloops by internal has_* method
def get_sector(self, sector_id: str) -> Sector: def get_sector(self, sector_id: str) -> Sector:
@ -323,6 +327,8 @@ class Model:
major_id: str | None, major_id: str | None,
minor_id: str | None, minor_id: str | None,
influence_id: str | None, influence_id: str | None,
mission: str | None,
description: str | None,
) -> None: ) -> None:
war = self.get_war_by_sector(sector_id) war = self.get_war_by_sector(sector_id)
war.update_sector( war.update_sector(
@ -332,6 +338,8 @@ class Model:
major_id=major_id, major_id=major_id,
minor_id=minor_id, minor_id=minor_id,
influence_id=influence_id, influence_id=influence_id,
mission=mission,
description=description,
) )
def remove_sector(self, sector_id: str) -> None: def remove_sector(self, sector_id: str) -> None:

View file

@ -11,6 +11,8 @@ class Sector:
major_id: str | None, major_id: str | None,
minor_id: str | None, minor_id: str | None,
influence_id: str | None, influence_id: str | None,
mission: str | None,
description: str | None,
): ):
self.id: str = str(uuid4()) self.id: str = str(uuid4())
self.name: str = name self.name: str = name
@ -18,8 +20,8 @@ class Sector:
self.major_objective_id: str | None = major_id # ref to War.objectives 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.minor_objective_id: str | None = minor_id # ref to War.objectives
self.influence_objective_id: str | None = influence_id # ref to War.objectives self.influence_objective_id: str | None = influence_id # ref to War.objectives
self.mission: str | None = None self.mission: str | None = mission
self.description: str | None = None self.description: str | None = description
def set_id(self, new_id: str) -> None: def set_id(self, new_id: str) -> None:
self.id = new_id self.id = new_id
@ -39,6 +41,12 @@ class Sector:
def set_influence(self, new_influence_id: str | None) -> None: def set_influence(self, new_influence_id: str | None) -> None:
self.influence_objective_id = new_influence_id 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]: def toDict(self) -> Dict[str, Any]:
return { return {
"id": self.id, "id": self.id,
@ -59,6 +67,8 @@ class Sector:
data.get("major_objective_id") or None, data.get("major_objective_id") or None,
data.get("minor_objective_id") or None, data.get("minor_objective_id") or None,
data.get("influence_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.set_id(data["id"])
sec.mission = data.get("mission") or None sec.mission = data.get("mission") or None

View file

@ -233,9 +233,13 @@ class War:
major_id: str, major_id: str,
minor_id: str, minor_id: str,
influence_id: str, influence_id: str,
mission: str,
description: str,
) -> Sector: ) -> Sector:
camp = self.get_campaign(campaign_id) 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 # TODO replace multiloops by internal has_* method
def get_sector(self, sector_id: str) -> Sector: def get_sector(self, sector_id: str) -> Sector:
@ -254,6 +258,8 @@ class War:
major_id: str | None, major_id: str | None,
minor_id: str | None, minor_id: str | None,
influence_id: str | None, influence_id: str | None,
mission: str | None,
description: str | None,
) -> None: ) -> None:
camp = self.get_campaign_by_sector(sector_id) camp = self.get_campaign_by_sector(sector_id)
camp.update_sector( camp.update_sector(
@ -263,6 +269,8 @@ class War:
major_id=major_id, major_id=major_id,
minor_id=minor_id, minor_id=minor_id,
influence_id=influence_id, influence_id=influence_id,
mission=mission,
description=description,
) )
def remove_sector(self, sector_id: str) -> None: def remove_sector(self, sector_id: str) -> None:

View file

@ -19,6 +19,8 @@ class SectorDialog(QDialog):
default_major_id: str | None = None, default_major_id: str | None = None,
default_minor_id: str | None = None, default_minor_id: str | None = None,
default_influence_id: str | None = None, default_influence_id: str | None = None,
default_mission: str | None = None,
default_description: str | None = None,
) -> None: ) -> None:
super().__init__(parent) super().__init__(parent)
self.ui: Ui_sectorDialog = Ui_sectorDialog() 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.majorComboBox, default_major_id)
select_if_exists(self.ui.minorComboBox, default_minor_id) select_if_exists(self.ui.minorComboBox, default_minor_id)
select_if_exists(self.ui.influenceComboBox, default_influence_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: def get_sector_name(self) -> str:
return self.ui.sectorName.text().strip() return self.ui.sectorName.text().strip()
@ -58,5 +62,10 @@ class SectorDialog(QDialog):
text = cast(str, self.ui.influenceComboBox.currentData()) text = cast(str, self.ui.influenceComboBox.currentData())
return text if text else None 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

View file

@ -272,7 +272,7 @@ class Ui_MainWindow(object):
self.sectorsTable.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) self.sectorsTable.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers)
self.sectorsTable.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) self.sectorsTable.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows)
self.sectorsTable.setObjectName("sectorsTable") self.sectorsTable.setObjectName("sectorsTable")
self.sectorsTable.setColumnCount(6) self.sectorsTable.setColumnCount(7)
self.sectorsTable.setRowCount(0) self.sectorsTable.setRowCount(0)
item = QtWidgets.QTableWidgetItem() item = QtWidgets.QTableWidgetItem()
self.sectorsTable.setHorizontalHeaderItem(0, item) self.sectorsTable.setHorizontalHeaderItem(0, item)
@ -286,6 +286,8 @@ class Ui_MainWindow(object):
self.sectorsTable.setHorizontalHeaderItem(4, item) self.sectorsTable.setHorizontalHeaderItem(4, item)
item = QtWidgets.QTableWidgetItem() item = QtWidgets.QTableWidgetItem()
self.sectorsTable.setHorizontalHeaderItem(5, item) self.sectorsTable.setHorizontalHeaderItem(5, item)
item = QtWidgets.QTableWidgetItem()
self.sectorsTable.setHorizontalHeaderItem(6, item)
self.sectorsTable.horizontalHeader().setStretchLastSection(False) self.sectorsTable.horizontalHeader().setStretchLastSection(False)
self.verticalLayout_5.addWidget(self.sectorsTable) self.verticalLayout_5.addWidget(self.sectorsTable)
self.verticalLayout_7.addWidget(self.groupBox_3) self.verticalLayout_7.addWidget(self.groupBox_3)
@ -381,7 +383,7 @@ class Ui_MainWindow(object):
self.battlesTable.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) self.battlesTable.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers)
self.battlesTable.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) self.battlesTable.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows)
self.battlesTable.setObjectName("battlesTable") self.battlesTable.setObjectName("battlesTable")
self.battlesTable.setColumnCount(3) self.battlesTable.setColumnCount(5)
self.battlesTable.setRowCount(0) self.battlesTable.setRowCount(0)
item = QtWidgets.QTableWidgetItem() item = QtWidgets.QTableWidgetItem()
self.battlesTable.setHorizontalHeaderItem(0, item) self.battlesTable.setHorizontalHeaderItem(0, item)
@ -389,6 +391,10 @@ class Ui_MainWindow(object):
self.battlesTable.setHorizontalHeaderItem(1, item) self.battlesTable.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem() item = QtWidgets.QTableWidgetItem()
self.battlesTable.setHorizontalHeaderItem(2, item) 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.battlesTable.horizontalHeader().setStretchLastSection(False)
self.horizontalLayout_12.addWidget(self.battlesTable) self.horizontalLayout_12.addWidget(self.battlesTable)
self.verticalLayout_8.addWidget(self.groupBox_6) self.verticalLayout_8.addWidget(self.groupBox_6)
@ -546,12 +552,14 @@ class Ui_MainWindow(object):
item = self.sectorsTable.horizontalHeaderItem(1) item = self.sectorsTable.horizontalHeaderItem(1)
item.setText(_translate("MainWindow", "Round")) item.setText(_translate("MainWindow", "Round"))
item = self.sectorsTable.horizontalHeaderItem(2) item = self.sectorsTable.horizontalHeaderItem(2)
item.setText(_translate("MainWindow", "Major obj.")) item.setText(_translate("MainWindow", "Mission"))
item = self.sectorsTable.horizontalHeaderItem(3) item = self.sectorsTable.horizontalHeaderItem(3)
item.setText(_translate("MainWindow", "Minor opp.")) item.setText(_translate("MainWindow", "Major obj."))
item = self.sectorsTable.horizontalHeaderItem(4) item = self.sectorsTable.horizontalHeaderItem(4)
item.setText(_translate("MainWindow", "Influence imp.")) item.setText(_translate("MainWindow", "Minor opp."))
item = self.sectorsTable.horizontalHeaderItem(5) item = self.sectorsTable.horizontalHeaderItem(5)
item.setText(_translate("MainWindow", "Influence imp."))
item = self.sectorsTable.horizontalHeaderItem(6)
item.setText(_translate("MainWindow", "Description")) item.setText(_translate("MainWindow", "Description"))
self.groupBox_4.setTitle(_translate("MainWindow", "Participants")) self.groupBox_4.setTitle(_translate("MainWindow", "Participants"))
self.addCampaignParticipantBtn.setText(_translate("MainWindow", "Add participant")) self.addCampaignParticipantBtn.setText(_translate("MainWindow", "Add participant"))
@ -585,6 +593,10 @@ class Ui_MainWindow(object):
item.setText(_translate("MainWindow", "Player 1")) item.setText(_translate("MainWindow", "Player 1"))
item = self.battlesTable.horizontalHeaderItem(2) item = self.battlesTable.horizontalHeaderItem(2)
item.setText(_translate("MainWindow", "Player 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.endRoundBtn.setText(_translate("MainWindow", "End round"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.warsTab), _translate("MainWindow", "Wars")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.warsTab), _translate("MainWindow", "Wars"))
self.menuFile.setTitle(_translate("MainWindow", "File")) self.menuFile.setTitle(_translate("MainWindow", "File"))

View file

@ -662,6 +662,11 @@
<string>Round</string> <string>Round</string>
</property> </property>
</column> </column>
<column>
<property name="text">
<string>Mission</string>
</property>
</column>
<column> <column>
<property name="text"> <property name="text">
<string>Major obj.</string> <string>Major obj.</string>
@ -917,6 +922,16 @@
<string>Player 2</string> <string>Player 2</string>
</property> </property>
</column> </column>
<column>
<property name="text">
<string>Score</string>
</property>
</column>
<column>
<property name="text">
<string>Victory condition</string>
</property>
</column>
</widget> </widget>
</item> </item>
</layout> </layout>

View file

@ -431,15 +431,19 @@ class View(QtWidgets.QMainWindow, Ui_MainWindow):
round_item = QtWidgets.QTableWidgetItem( round_item = QtWidgets.QTableWidgetItem(
format_round_label(sect.round_index) format_round_label(sect.round_index)
) )
mission_item = QtWidgets.QTableWidgetItem(sect.mission)
major_item = QtWidgets.QTableWidgetItem(sect.major) major_item = QtWidgets.QTableWidgetItem(sect.major)
minor_item = QtWidgets.QTableWidgetItem(sect.minor) minor_item = QtWidgets.QTableWidgetItem(sect.minor)
influence_item = QtWidgets.QTableWidgetItem(sect.influence) influence_item = QtWidgets.QTableWidgetItem(sect.influence)
description_item = QtWidgets.QTableWidgetItem(sect.description)
name_item.setData(Qt.ItemDataRole.UserRole, sect.id) name_item.setData(Qt.ItemDataRole.UserRole, sect.id)
table.setItem(row, 0, name_item) table.setItem(row, 0, name_item)
table.setItem(row, 1, round_item) table.setItem(row, 1, round_item)
table.setItem(row, 2, major_item) table.setItem(row, 2, mission_item)
table.setItem(row, 3, minor_item) table.setItem(row, 3, major_item)
table.setItem(row, 4, influence_item) table.setItem(row, 4, minor_item)
table.setItem(row, 5, influence_item)
table.setItem(row, 6, description_item)
table.resizeColumnsToContents() table.resizeColumnsToContents()
def display_campaign_participants( def display_campaign_participants(