diff --git a/src/warchron/controller/controller.py b/src/warchron/controller/controller.py index 64a4c9a..2295251 100644 --- a/src/warchron/controller/controller.py +++ b/src/warchron/controller/controller.py @@ -6,7 +6,7 @@ from warchron.view.view import View from warchron.constants import ItemType, RefreshScope from warchron.controller.dtos import ParticipantOption -from warchron.view.view import PlayerDialog, WarDialog, CampaignDialog, ObjectiveDialog, WarParticipantDialog, CampaignParticipantDialog, SectorDialog, ChoicesDialog +from warchron.view.view import PlayerDialog, WarDialog, CampaignDialog, ObjectiveDialog, WarParticipantDialog, CampaignParticipantDialog, SectorDialog, ChoicesDialog, BattlesDialog class Controller: def __init__(self, model: Model, view: View): @@ -169,6 +169,7 @@ class Controller: camp = self.model.get_campaign_by_round(round_id) self.view.show_round_details(index=camp.get_round_index(round_id)) participants = self.model.get_round_participants(round_id) + sectors = camp.get_all_sectors() choices_for_display = [] for part in participants: choice = rnd.get_choice(part.id) @@ -183,6 +184,20 @@ class Controller: choice.participant_id )) self.view.display_round_choices(choices_for_display) + battles_for_display = [] + for sect in sectors: + battle = rnd.get_battle(sect.id) + if not battle: + battle=self.model.create_battle(round_id=rnd.id, sector_id=sect.id) + player_1_name = self.model.get_player_name(battle.player_1_id) if battle.player_1_id else "" + player_2_name = self.model.get_player_name(battle.player_2_id) if battle.player_2_id else "" + battles_for_display.append(( + camp.get_sector_name(battle.sector_id), + player_1_name, + player_2_name, + battle.sector_id + )) + self.view.display_round_battles(battles_for_display) def on_tree_selection_changed(self, selection): self.selected_war_id = None @@ -344,6 +359,9 @@ class Controller: elif item_type == ItemType.CHOICE: self.edit_round_choice(item_id) self.refresh(RefreshScope.ROUND_DETAILS) + elif item_type == ItemType.BATTLE: + self.edit_round_battle(item_id) + self.refresh(RefreshScope.ROUND_DETAILS) def delete_item(self, item_type: str, item_id: str): reply = QMessageBox.question( @@ -576,13 +594,16 @@ class Controller: self.is_dirty = True self.refresh_and_select(RefreshScope.WARS_TREE, item_type=ItemType.ROUND, item_id=rnd.id) -# Choices methods +# Choice methods def edit_round_choice(self, choice_id: str): round_id = self.selected_round_id if not round_id: return - camp, rnd, participants, sectors = self.model.get_round_choices_data(round_id) + # camp, rnd, participants, sectors = self.model.get_round_choices_data(round_id) + camp = self.model.get_campaign_by_round(round_id) + rnd = camp.get_round(round_id) + sectors = camp.get_sectors_in_round(round_id) choice = rnd.get_choice(choice_id) if not choice: return @@ -591,17 +612,64 @@ class Controller: part_opt = ParticipantOption(id=player.id, name=player.name) dialog = ChoicesDialog( self.view, - participants=[part_opt], + participants = [part_opt], default_participant_id=part.id, sectors=sectors, - default_priority_id=choice.priority_sector_id, - default_secondary_id=choice.secondary_sector_id, + default_priority_id = choice.priority_sector_id, + default_secondary_id = choice.secondary_sector_id, + default_comment = choice.comment, ) if dialog.exec() != QDialog.DialogCode.Accepted: return - rnd.set_choice( - participant_id=part.id, - priority_sector_id=dialog.get_priority_id(), - secondary_sector_id=dialog.get_secondary_id(), + # TODO replace by update_choice through self.model... + rnd.update_choice( + participant_id = part.id, + priority_sector_id = dialog.get_priority_id(), + secondary_sector_id = dialog.get_secondary_id(), + comment = dialog.get_comment() + ) + +# Battle methods + + def edit_round_battle(self, battle_id: str): + round_id = self.selected_round_id + if not round_id: + return + camp = self.model.get_campaign_by_round(round_id) + rnd = camp.get_round(round_id) + participants = camp.get_all_campaign_participants() + battle = rnd.get_battle(battle_id) + if not battle: + return + sect = camp.sectors[battle.sector_id] + part_opts: list[ParticipantOption] = [] + for part in participants: + player = self.model.get_player(part.id) + part_opts.append( + ParticipantOption(id=part.id, name=player.name) + ) + dialog = BattlesDialog( + self.view, + sectors = [sect], + default_sector_id = sect.id, + players = part_opts, + default_player_1_id = battle.player_1_id, + default_player_2_id = battle.player_2_id, + default_winner_id = battle.winner_id, + default_score = battle.score, + default_victory_condition = battle.victory_condition, + default_comment = battle.comment, + ) + if dialog.exec() != QDialog.DialogCode.Accepted: + return + # TODO replace by update_battle through self.model... + rnd.update_battle( + sector_id = sect.id, + player_1_id = dialog.get_player_1_id(), + player_2_id = dialog.get_player_2_id(), + winner_id = dialog.get_winner_id(), + score = dialog.get_score(), + victory_condition = dialog.get_victory_condition(), + comment = dialog.get_comment(), ) diff --git a/src/warchron/model/campaign.py b/src/warchron/model/campaign.py index 4a66536..fd57bbe 100644 --- a/src/warchron/model/campaign.py +++ b/src/warchron/model/campaign.py @@ -108,6 +108,13 @@ class Campaign: # TODO manage battles referring to it del self.sectors[sector_id] + def get_sectors_in_round(self, round_id: str) -> list[Sector]: + sectors = [ + s for s in self.sectors.values() + if s.round_id == round_id + ] + return sectors + # Round methods def has_round(self, round_id: str) -> bool: @@ -158,8 +165,18 @@ class Campaign: rnd = self.get_round(round_id) rnd.remove_choice(participant_id) +# Battle methods + + def create_battle(self, round_id: str, sector_id: str) -> Battle: + rnd = self.get_round(round_id) + return rnd.create_battle(sector_id) + + def remove_battle(self, round_id: str, sector_id: str) -> Battle: + rnd = self.get_round(round_id) + rnd.remove_battle(sector_id) + class CampaignParticipant: - def __init__(self,player_id: str, leader: str, theme: str): + def __init__(self, player_id: str, leader: str, theme: str): self.id: str = player_id # ref to War.participants self.leader: str = leader self.theme: str = theme @@ -181,6 +198,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 def set_id(self, new_id: str): self.id = new_id diff --git a/src/warchron/model/model.py b/src/warchron/model/model.py index 85713a6..edf877e 100644 --- a/src/warchron/model/model.py +++ b/src/warchron/model/model.py @@ -318,7 +318,7 @@ class Model: war = self.get_war_by_round(round_id) war.remove_round(round_id) -# Choices methods +# Choice methods def create_choice(self, round_id: str, participant_id: str) -> Choice: war = self.get_war_by_round(round_id) @@ -337,3 +337,14 @@ class Model: if s.round_id == round_id ] return camp, rnd, participants, sectors + +# Battle methods + + def create_battle(self, round_id: str, sector_id: str) -> Battle: + war = self.get_war_by_round(round_id) + return war.create_battle(round_id, sector_id) + + def remove_battle(self, round_id: str, sector_id: str): + war = self.get_war_by_round(round_id) + war.remove_battle(round_id, sector_id) + diff --git a/src/warchron/model/round.py b/src/warchron/model/round.py index d388856..a89e315 100644 --- a/src/warchron/model/round.py +++ b/src/warchron/model/round.py @@ -14,9 +14,6 @@ class Round: def set_state(self, new_state: bool): self.is_over = new_state - def set_choice(self, participant_id: str, priority_sector_id: str | None, secondary_sector_id: str | None): - self.choices[participant_id] = Choice(participant_id, priority_sector_id, secondary_sector_id) - def toDict(self): return { "id": self.id, @@ -36,7 +33,7 @@ class Round: rnd.set_state(data.get("is_over", False)) return rnd -# Choices methods +# Choice methods def get_choice(self, participant_id: str) -> Choice | None: return self.choices.get(participant_id) @@ -44,24 +41,95 @@ class Round: def create_choice(self, participant_id: str) -> Choice: if participant_id not in self.choices: choice = Choice( - participant_id=participant_id, - priority_sector_id=None, - secondary_sector_id=None + participant_id = participant_id, + priority_sector_id = None, + secondary_sector_id = None ) self.choices[participant_id] = choice return self.choices[participant_id] + def update_choice(self, participant_id: str, priority_sector_id: str | None, secondary_sector_id: str | None, comment: str | None): + choice = self.get_choice(participant_id) + choice.set_priority(priority_sector_id) + choice.set_secondary(secondary_sector_id) + choice.set_comment(comment) + def remove_choice(self,participant_id: str): del self.choices[participant_id] +# Battle methods + + def get_battle(self, sector_id: str) -> Battle | None: + return self.battles.get(sector_id) + + def create_battle(self, sector_id: str) -> Battle: + if sector_id not in self.battles: + battle = Battle( + sector_id = sector_id, + player_1_id = None, + player_2_id = None + ) + self.battles[sector_id] = battle + return self.battles[sector_id] + + def update_battle(self, sector_id: str, player_1_id: str | None, player_2_id: str | None, winner_id: str | None, score: str | None, victory_condition: str | None, comment: str | None): + bat = self.get_battle(sector_id) + bat.set_player_1(player_1_id) + bat.set_player_2(player_2_id) + bat.set_winner(winner_id) + bat.set_score(score) + bat.set_victory_condition(victory_condition) + bat.set_comment(comment) + + def remove_battle(self,sector_id: str): + del self.battles[sector_id] + class Choice: def __init__(self, participant_id: str, priority_sector_id: str | None = None, secondary_sector_id: str | None = None): self.participant_id: str = participant_id # ref to Campaign.participants self.priority_sector_id: str | None = priority_sector_id # ref to Campaign.sectors self.secondary_sector_id: str | None = secondary_sector_id # ref to Campaign.sectors + self.comment: str | None = None + + def set_id(self, new_id: str): + self.participant_id = new_id + + def set_priority(self, new_priority_id: str): + self.priority_sector_id = new_priority_id + + def set_secondary(self, new_secondary_id: str): + self.secondary_sector_id = new_secondary_id + + def set_comment(self, new_comment: str): + self.comment = new_comment class Battle: def __init__(self, sector_id: str, player_1_id: str | None = None, player_2_id: str | None = None): self.sector_id: str = sector_id # ref to Campaign.sector self.player_1_id: str | None = player_1_id # ref to Campaign.participants self.player_2_id: str | None = player_2_id # ref to Campaign.participants + self.winner_id: str | None = None + self.score: str | None = None + self.victory_condition: str | None = None + self.comment: str | None = None + + def set_id(self, new_id: str): + self.sector_id = new_id + + def set_player_1(self, new_player_id: str): + self.player_1_id = new_player_id + + def set_player_2(self, new_player_id: str): + self.player_2_id = new_player_id + + def set_winner(self, new_player_id: str): + self.winner_id = new_player_id + + def set_score(self, new_score: str): + self.score = new_score + + def set_victory_condition(self, new_victory_condition: str): + self.victory_condition = new_victory_condition + + def set_comment(self, new_comment: str): + self.comment = new_comment \ No newline at end of file diff --git a/src/warchron/model/war.py b/src/warchron/model/war.py index 8de9951..fa6d171 100644 --- a/src/warchron/model/war.py +++ b/src/warchron/model/war.py @@ -177,7 +177,7 @@ class War: def remove_sector(self, sector_id: str): camp = self.get_campaign_by_sector(sector_id) camp.remove_sector(sector_id) - + # Campaign participant methods def get_available_war_participants(self, campaign_id: str) -> list[WarParticipant]: @@ -227,6 +227,16 @@ class War: camp = self.get_campaign_by_round(round_id) camp.remove_choice(round_id, participant_id) +# Battle methods + + def create_battle(self, round_id: str, sector_id: str) -> Battle: + camp = self.get_campaign_by_round(round_id) + return camp.create_battle(round_id, sector_id) + + def remove_battle(self, round_id: str, sector_id: str): + camp = self.get_campaign_by_round(round_id) + camp.remove_battle(round_id, sector_id) + class Objective: def __init__(self, name: str, description: str): self.id: str = str(uuid4()) diff --git a/src/warchron/view/ui/ui_battle_result_dialog.py b/src/warchron/view/ui/ui_battle_result_dialog.py index 8dcc6ec..c236b14 100644 --- a/src/warchron/view/ui/ui_battle_result_dialog.py +++ b/src/warchron/view/ui/ui_battle_result_dialog.py @@ -13,15 +13,50 @@ class Ui_battleResultDialog(object): def setupUi(self, battleResultDialog): battleResultDialog.setObjectName("battleResultDialog") battleResultDialog.setWindowModality(QtCore.Qt.WindowModality.ApplicationModal) - battleResultDialog.resize(561, 246) + battleResultDialog.resize(668, 317) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(".\\src\\warchron\\view\\ui\\../resources/warchron_logo.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) battleResultDialog.setWindowIcon(icon) - self.formLayout = QtWidgets.QFormLayout(battleResultDialog) - self.formLayout.setObjectName("formLayout") + self.gridLayout = QtWidgets.QGridLayout(battleResultDialog) + self.gridLayout.setObjectName("gridLayout") + self.label_7 = QtWidgets.QLabel(parent=battleResultDialog) + self.label_7.setObjectName("label_7") + self.gridLayout.addWidget(self.label_7, 0, 0, 1, 1) + self.sectorComboBox = QtWidgets.QComboBox(parent=battleResultDialog) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.sectorComboBox.sizePolicy().hasHeightForWidth()) + self.sectorComboBox.setSizePolicy(sizePolicy) + self.sectorComboBox.setObjectName("sectorComboBox") + self.gridLayout.addWidget(self.sectorComboBox, 0, 1, 1, 1) + self.label_5 = QtWidgets.QLabel(parent=battleResultDialog) + self.label_5.setObjectName("label_5") + self.gridLayout.addWidget(self.label_5, 0, 2, 1, 1) + self.player1ComboBox = QtWidgets.QComboBox(parent=battleResultDialog) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.player1ComboBox.sizePolicy().hasHeightForWidth()) + self.player1ComboBox.setSizePolicy(sizePolicy) + self.player1ComboBox.setObjectName("player1ComboBox") + self.gridLayout.addWidget(self.player1ComboBox, 0, 3, 1, 1) + self.label_6 = QtWidgets.QLabel(parent=battleResultDialog) + self.label_6.setObjectName("label_6") + self.gridLayout.addWidget(self.label_6, 0, 4, 1, 1) + self.player2ComboBox = QtWidgets.QComboBox(parent=battleResultDialog) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.player2ComboBox.sizePolicy().hasHeightForWidth()) + self.player2ComboBox.setSizePolicy(sizePolicy) + self.player2ComboBox.setObjectName("player2ComboBox") + self.gridLayout.addWidget(self.player2ComboBox, 0, 5, 1, 1) + spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) + self.gridLayout.addItem(spacerItem, 1, 1, 1, 1) self.label = QtWidgets.QLabel(parent=battleResultDialog) self.label.setObjectName("label") - self.formLayout.setWidget(0, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label) + self.gridLayout.addWidget(self.label, 2, 0, 1, 1) self.winnerComboBox = QtWidgets.QComboBox(parent=battleResultDialog) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) sizePolicy.setHorizontalStretch(0) @@ -29,30 +64,30 @@ class Ui_battleResultDialog(object): sizePolicy.setHeightForWidth(self.winnerComboBox.sizePolicy().hasHeightForWidth()) self.winnerComboBox.setSizePolicy(sizePolicy) self.winnerComboBox.setObjectName("winnerComboBox") - self.formLayout.setWidget(0, QtWidgets.QFormLayout.ItemRole.FieldRole, self.winnerComboBox) + self.gridLayout.addWidget(self.winnerComboBox, 2, 1, 1, 1) self.label_2 = QtWidgets.QLabel(parent=battleResultDialog) self.label_2.setObjectName("label_2") - self.formLayout.setWidget(1, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_2) + self.gridLayout.addWidget(self.label_2, 3, 0, 1, 1) self.score = QtWidgets.QLineEdit(parent=battleResultDialog) self.score.setObjectName("score") - self.formLayout.setWidget(1, QtWidgets.QFormLayout.ItemRole.FieldRole, self.score) + self.gridLayout.addWidget(self.score, 3, 1, 1, 2) self.label_3 = QtWidgets.QLabel(parent=battleResultDialog) self.label_3.setObjectName("label_3") - self.formLayout.setWidget(2, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_3) + self.gridLayout.addWidget(self.label_3, 3, 3, 1, 1) self.victoryCondition = QtWidgets.QLineEdit(parent=battleResultDialog) self.victoryCondition.setObjectName("victoryCondition") - self.formLayout.setWidget(2, QtWidgets.QFormLayout.ItemRole.FieldRole, self.victoryCondition) + self.gridLayout.addWidget(self.victoryCondition, 3, 4, 1, 2) self.label_4 = QtWidgets.QLabel(parent=battleResultDialog) self.label_4.setObjectName("label_4") - self.formLayout.setWidget(3, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_4) + self.gridLayout.addWidget(self.label_4, 4, 0, 1, 1) self.battleComment = QtWidgets.QPlainTextEdit(parent=battleResultDialog) self.battleComment.setObjectName("battleComment") - self.formLayout.setWidget(3, QtWidgets.QFormLayout.ItemRole.FieldRole, self.battleComment) + self.gridLayout.addWidget(self.battleComment, 4, 1, 1, 5) self.buttonBox = QtWidgets.QDialogButtonBox(parent=battleResultDialog) self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal) self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok) self.buttonBox.setObjectName("buttonBox") - self.formLayout.setWidget(4, QtWidgets.QFormLayout.ItemRole.SpanningRole, self.buttonBox) + self.gridLayout.addWidget(self.buttonBox, 5, 4, 1, 2) self.retranslateUi(battleResultDialog) self.buttonBox.accepted.connect(battleResultDialog.accept) # type: ignore @@ -62,6 +97,9 @@ class Ui_battleResultDialog(object): def retranslateUi(self, battleResultDialog): _translate = QtCore.QCoreApplication.translate battleResultDialog.setWindowTitle(_translate("battleResultDialog", "Battle result")) + self.label_7.setText(_translate("battleResultDialog", "Sector")) + self.label_5.setText(_translate("battleResultDialog", "Player 1")) + self.label_6.setText(_translate("battleResultDialog", "Player 2")) self.label.setText(_translate("battleResultDialog", "Winner")) self.label_2.setText(_translate("battleResultDialog", "Score")) self.label_3.setText(_translate("battleResultDialog", "Victory condition")) diff --git a/src/warchron/view/ui/ui_battle_result_dialog.ui b/src/warchron/view/ui/ui_battle_result_dialog.ui index 3902a26..5a4bf2f 100644 --- a/src/warchron/view/ui/ui_battle_result_dialog.ui +++ b/src/warchron/view/ui/ui_battle_result_dialog.ui @@ -9,8 +9,8 @@ 0 0 - 561 - 246 + 668 + 317 @@ -20,15 +20,79 @@ ../resources/warchron_logo.png../resources/warchron_logo.png - + + + + Sector + + + + + + + + 0 + 0 + + + + + + + + Player 1 + + + + + + + + 0 + 0 + + + + + + + + Player 2 + + + + + + + + 0 + 0 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + Winner - + @@ -38,37 +102,37 @@ - + Score - + - + Victory condition - + - + Comment - + - + Qt::Horizontal diff --git a/src/warchron/view/ui/ui_main_window.py b/src/warchron/view/ui/ui_main_window.py index da43ca3..04374bf 100644 --- a/src/warchron/view/ui/ui_main_window.py +++ b/src/warchron/view/ui/ui_main_window.py @@ -206,7 +206,7 @@ class Ui_MainWindow(object): self.horizontalLayout_13.setObjectName("horizontalLayout_13") self.sectorsTable = QtWidgets.QTableWidget(parent=self.pageCampaign) self.sectorsTable.setObjectName("sectorsTable") - self.sectorsTable.setColumnCount(5) + self.sectorsTable.setColumnCount(6) self.sectorsTable.setRowCount(0) item = QtWidgets.QTableWidgetItem() self.sectorsTable.setHorizontalHeaderItem(0, item) @@ -218,6 +218,8 @@ class Ui_MainWindow(object): self.sectorsTable.setHorizontalHeaderItem(3, item) item = QtWidgets.QTableWidgetItem() self.sectorsTable.setHorizontalHeaderItem(4, item) + item = QtWidgets.QTableWidgetItem() + self.sectorsTable.setHorizontalHeaderItem(5, item) self.horizontalLayout_13.addWidget(self.sectorsTable) self.addSectorBtn = QtWidgets.QPushButton(parent=self.pageCampaign) self.addSectorBtn.setEnabled(True) @@ -269,10 +271,10 @@ class Ui_MainWindow(object): item = QtWidgets.QTableWidgetItem() self.battlesTable.setHorizontalHeaderItem(2, item) self.horizontalLayout_15.addWidget(self.battlesTable) - self.enterResultBtn = QtWidgets.QPushButton(parent=self.pageRound) - self.enterResultBtn.setEnabled(True) - self.enterResultBtn.setObjectName("enterResultBtn") - self.horizontalLayout_15.addWidget(self.enterResultBtn) + self.countResultBtn = QtWidgets.QPushButton(parent=self.pageRound) + self.countResultBtn.setEnabled(False) + self.countResultBtn.setObjectName("countResultBtn") + self.horizontalLayout_15.addWidget(self.countResultBtn) self.gridLayout_5.addLayout(self.horizontalLayout_15, 4, 0, 1, 3) self.horizontalLayout_16 = QtWidgets.QHBoxLayout() self.horizontalLayout_16.setObjectName("horizontalLayout_16") @@ -385,7 +387,7 @@ class Ui_MainWindow(object): self.retranslateUi(MainWindow) self.tabWidget.setCurrentIndex(1) - self.selectedDetailsStack.setCurrentIndex(2) + self.selectedDetailsStack.setCurrentIndex(3) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): @@ -450,6 +452,8 @@ class Ui_MainWindow(object): item.setText(_translate("MainWindow", "Minor opp.")) item = self.sectorsTable.horizontalHeaderItem(4) item.setText(_translate("MainWindow", "Influence imp.")) + item = self.sectorsTable.horizontalHeaderItem(5) + item.setText(_translate("MainWindow", "Description")) self.addSectorBtn.setText(_translate("MainWindow", "Add Sector")) self.campaignName.setText(_translate("MainWindow", "campaignName")) self.campaignMonth.setText(_translate("MainWindow", "campaignMonth")) @@ -462,7 +466,7 @@ class Ui_MainWindow(object): item.setText(_translate("MainWindow", "Player 1")) item = self.battlesTable.horizontalHeaderItem(2) item.setText(_translate("MainWindow", "Player 2")) - self.enterResultBtn.setText(_translate("MainWindow", "Enter results")) + self.countResultBtn.setText(_translate("MainWindow", "Count results")) item = self.choicesTable.horizontalHeaderItem(0) item.setText(_translate("MainWindow", "Player")) item = self.choicesTable.horizontalHeaderItem(1) diff --git a/src/warchron/view/ui/ui_main_window.ui b/src/warchron/view/ui/ui_main_window.ui index 0c39e26..49cde9f 100644 --- a/src/warchron/view/ui/ui_main_window.ui +++ b/src/warchron/view/ui/ui_main_window.ui @@ -150,7 +150,7 @@ - 2 + 3 @@ -446,6 +446,11 @@ Influence imp. + + + Description + + @@ -551,12 +556,12 @@ - + - true + false - Enter results + Count results diff --git a/src/warchron/view/view.py b/src/warchron/view/view.py index 2f3a452..996cefd 100644 --- a/src/warchron/view/view.py +++ b/src/warchron/view/view.py @@ -17,6 +17,7 @@ from warchron.view.ui.ui_war_participant_dialog import Ui_warParticipantDialog from warchron.view.ui.ui_campaign_participant_dialog import Ui_campaignParticipantDialog from warchron.view.ui.ui_sector_dialog import Ui_sectorDialog from warchron.view.ui.ui_choices_dialog import Ui_choicesDialog +from warchron.view.ui.ui_battle_result_dialog import Ui_battleResultDialog # utils... @@ -66,6 +67,8 @@ class View(QtWidgets.QMainWindow, Ui_MainWindow): self.sectorsTable.customContextMenuRequested.connect(self._on_sectors_table_context_menu) self.choicesTable.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu) self.choicesTable.customContextMenuRequested.connect(self._on_choices_table_context_menu) + self.battlesTable.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu) + self.battlesTable.customContextMenuRequested.connect(self._on_battles_table_context_menu) def _emit_selection_changed(self, current, previous): if not self.on_tree_selection_changed: @@ -395,6 +398,23 @@ class View(QtWidgets.QMainWindow, Ui_MainWindow): if action == edit_action and self.on_edit_item: self.on_edit_item(ItemType.CHOICE, choice_id) + def _on_battles_table_context_menu(self, pos): + item = self.battlesTable.itemAt(pos) + if not item: + return + row = item.row() + name_item = self.battlesTable.item(row, 0) + if not name_item: + return + battle_id = name_item.data(Qt.ItemDataRole.UserRole) + if battle_id is None: + return + menu = QMenu(self) + edit_action = menu.addAction("Edit") + action = menu.exec(self.battlesTable.viewport().mapToGlobal(pos)) + if action == edit_action and self.on_edit_item: + self.on_edit_item(ItemType.BATTLE, battle_id) + def show_round_details(self, *, index: int): self.roundNb.setText(f"Round {index}") @@ -412,6 +432,20 @@ class View(QtWidgets.QMainWindow, Ui_MainWindow): table.setItem(row, 2, secondary_item) table.resizeColumnsToContents() + def display_round_battles(self, sectors: list[tuple[str, str, str, str]]): + table = self.battlesTable + table.clearContents() + table.setRowCount(len(sectors)) + for row, (sector, player_1, player_2, battle_id) in enumerate(sectors): + sector_item = QtWidgets.QTableWidgetItem(sector) + player_1_item = QtWidgets.QTableWidgetItem(player_1) + player_2_item = QtWidgets.QTableWidgetItem(player_2) + sector_item.setData(Qt.ItemDataRole.UserRole, battle_id) + table.setItem(row, 0, sector_item) + table.setItem(row, 1, player_1_item) + table.setItem(row, 2, player_2_item) + table.resizeColumnsToContents() + class PlayerDialog(QDialog): def __init__(self, parent=None, *, default_name: str = ""): super().__init__(parent) @@ -540,7 +574,13 @@ class SectorDialog(QDialog): return self.ui.influenceComboBox.currentData() class ChoicesDialog(QDialog): - def __init__(self, parent=None, *, participants: list, default_participant_id=None, sectors: list, default_priority_id=None, default_secondary_id=None): + def __init__(self, parent = None, *, + participants: list, + default_participant_id = None, + sectors: list, + default_priority_id = None, + default_secondary_id = None, + default_comment = None): super().__init__(parent) self.ui = Ui_choicesDialog() self.ui.setupUi(self) @@ -555,6 +595,7 @@ class ChoicesDialog(QDialog): self.ui.secondaryComboBox.addItem(sect.name, sect.id) select_if_exists(self.ui.priorityComboBox, default_priority_id) select_if_exists(self.ui.secondaryComboBox, default_secondary_id) + self.ui.choiceComment.setPlainText(default_comment) def get_participant_id(self) -> str: return self.ui.playerComboBox.currentData() @@ -564,3 +605,62 @@ class ChoicesDialog(QDialog): def get_secondary_id(self) -> str: return self.ui.secondaryComboBox.currentData() + + def get_comment(self) -> str: + return self.ui.choiceComment.toPlainText().strip() + +class BattlesDialog(QDialog): + def __init__(self, parent = None, *, + sectors: list, + default_sector_id = None, + players: list, + default_player_1_id = None, + default_player_2_id = None, + default_winner_id = None, + default_score = None, + default_victory_condition = None, + default_comment = None): + super().__init__(parent) + self.ui = Ui_battleResultDialog() + self.ui.setupUi(self) + for sect in sectors: + self.ui.sectorComboBox.addItem(sect.name, sect.id) + select_if_exists(self.ui.sectorComboBox, default_sector_id) + self.ui.sectorComboBox.setEnabled(False) + + self.ui.player1ComboBox.addItem("(none)", None) + self.ui.player2ComboBox.addItem("(none)", None) + for play in players: + self.ui.player1ComboBox.addItem(play.name, play.id) + self.ui.player2ComboBox.addItem(play.name, play.id) + select_if_exists(self.ui.player1ComboBox, default_player_1_id) + select_if_exists(self.ui.player2ComboBox, default_player_2_id) + self.ui.winnerComboBox.addItem("(none)", None) + for play in players: + if play.id in (default_player_1_id, default_player_2_id): + self.ui.winnerComboBox.addItem(play.name, play.id) + select_if_exists(self.ui.winnerComboBox, default_winner_id) + self.ui.score.setText(default_score) + self.ui.victoryCondition.setText(default_victory_condition) + self.ui.battleComment.setPlainText(default_comment) + + def get_sector_id(self) -> str: + return self.ui.sectorComboBox.currentData() + + def get_player_1_id(self) -> str: + return self.ui.player1ComboBox.currentData() + + def get_player_2_id(self) -> str: + return self.ui.player2ComboBox.currentData() + + def get_winner_id(self) -> str: + return self.ui.winnerComboBox.currentData() + + def get_score(self) -> str: + return self.ui.score.text().strip() + + def get_victory_condition(self) -> str: + return self.ui.victoryCondition.text().strip() + + def get_comment(self) -> str: + return self.ui.battleComment.toPlainText().strip()