diff --git a/src/warchron/controller/controller.py b/src/warchron/controller/controller.py index d653ff8..2f54c32 100644 --- a/src/warchron/controller/controller.py +++ b/src/warchron/controller/controller.py @@ -361,136 +361,39 @@ class Controller: self.refresh(scope) self.view.select_tree_item(item_type=item_type, item_id=item_id) - # TODO separate routing and dedicated edit methods def edit_item(self, item_type: str, item_id: str) -> None: if item_type == ItemType.PLAYER: - play = self.model.get_player(item_id) - player_dialog = PlayerDialog(self.view, default_name=play.name) - if player_dialog.exec() == QDialog.DialogCode.Accepted: - name = player_dialog.get_player_name() - if not self._validate_player_inputs(name): - return - self.model.update_player(item_id, name=name) - self.refresh(RefreshScope.PLAYERS_LIST) + self.edit_player(item_id) + self.refresh(RefreshScope.PLAYERS_LIST) elif item_type == ItemType.WAR: - war = self.model.get_war(item_id) - war_dialog = WarDialog( - self.view, default_name=war.name, default_year=war.year + self.edit_war(item_id) + self.refresh_and_select( + RefreshScope.WARS_TREE, item_type=ItemType.WAR, item_id=item_id ) - if war_dialog.exec() == QDialog.DialogCode.Accepted: - name = war_dialog.get_war_name() - year = war_dialog.get_war_year() - if not self._validate_war_inputs(name, year): - return - self.model.update_war(item_id, name=name, year=year) - self.refresh_and_select( - RefreshScope.WARS_TREE, item_type=ItemType.WAR, item_id=war.id - ) elif item_type == ItemType.CAMPAIGN: - camp = self.model.get_campaign(item_id) - camp_dialog = CampaignDialog( - self.view, default_name=camp.name, default_month=camp.month + self.edit_campaign(item_id) + self.refresh_and_select( + RefreshScope.WARS_TREE, item_type=ItemType.CAMPAIGN, item_id=item_id ) - if camp_dialog.exec() == QDialog.DialogCode.Accepted: - name = camp_dialog.get_campaign_name() - month = camp_dialog.get_campaign_month() - if not self._validate_campaign_inputs(name, month): - return - self.model.update_campaign(item_id, name=name, month=month) - self.refresh_and_select( - RefreshScope.WARS_TREE, item_type=ItemType.CAMPAIGN, item_id=camp.id - ) elif item_type == ItemType.OBJECTIVE: - obj = self.model.get_objective(item_id) - obj_dialog = ObjectiveDialog( - self.view, default_name=obj.name, default_description=obj.description - ) - if obj_dialog.exec() == QDialog.DialogCode.Accepted: - name = obj_dialog.get_objective_name() - description = obj_dialog.get_objective_description() - if not self._validate_objective_inputs(name, description): - return - self.model.update_objective(item_id, name=name, description=description) - self.refresh(RefreshScope.WAR_DETAILS) + self.edit_objective(item_id) + self.refresh(RefreshScope.WAR_DETAILS) elif item_type == ItemType.WAR_PARTICIPANT: - war_part = self.model.get_war_participant(item_id) - player = self.model.get_player(war_part.player_id) - play_opt = ParticipantOption(id=player.id, name=player.name) - war_part_dialog = WarParticipantDialog( - self.view, - players=[play_opt], - default_player_id=war_part.id, - default_faction=war_part.faction, - editable_player=False, - ) - if war_part_dialog.exec() == QDialog.DialogCode.Accepted: - faction = war_part_dialog.get_participant_faction() - self.model.update_war_participant(item_id, faction=faction) - self.refresh(RefreshScope.WAR_DETAILS) + self.edit_war_participant(item_id) + self.refresh(RefreshScope.WAR_DETAILS) elif item_type == ItemType.SECTOR: - sect = self.model.get_sector(item_id) - camp = self.model.get_campaign_by_sector(item_id) - war = self.model.get_war_by_campaign(camp.id) - rounds = camp.get_all_rounds() - rnd_dto: List[RoundDTO] = [ - RoundDTO(id=rnd.id, index=i) for i, rnd in enumerate(rounds, start=1) - ] - objectives = war.get_all_objectives() - obj_dto: List[ObjectiveDTO] = [ - ObjectiveDTO(id=obj.id, name=obj.name, description=obj.description) - for obj in objectives - ] - sect_dialog = SectorDialog( - self.view, - default_name=sect.name, - rounds=rnd_dto, - default_round_id=sect.round_id, - objectives=obj_dto, - default_major_id=sect.major_objective_id, - default_minor_id=sect.minor_objective_id, - default_influence_id=sect.influence_objective_id, - ) - if sect_dialog.exec() == QDialog.DialogCode.Accepted: - name = sect_dialog.get_sector_name() - round_id = sect_dialog.get_round_id() - major_id = sect_dialog.get_major_id() - minor_id = sect_dialog.get_minor_id() - influence_id = sect_dialog.get_influence_id() - self.model.update_sector( - item_id, - name=name, - round_id=round_id, - major_id=major_id, - minor_id=minor_id, - influence_id=influence_id, - ) - self.refresh(RefreshScope.CAMPAIGN_DETAILS) + self.edit_sector(item_id) + self.refresh(RefreshScope.CAMPAIGN_DETAILS) elif item_type == ItemType.CAMPAIGN_PARTICIPANT: - camp_part = self.model.get_campaign_participant(item_id) - war_part = self.model.get_war_participant(camp_part.war_participant_id) - player = self.model.get_player(war_part.player_id) - part_opt = [ParticipantOption(id=player.id, name=player.name)] - camp_part_dialog = CampaignParticipantDialog( - self.view, - participants=part_opt, - default_participant_id=camp_part.id, - default_leader=camp_part.leader, - default_theme=camp_part.theme, - editable_player=False, - ) - if camp_part_dialog.exec() == QDialog.DialogCode.Accepted: - leader = camp_part_dialog.get_participant_leader() - theme = camp_part_dialog.get_participant_theme() - self.model.update_campaign_participant( - item_id, leader=leader, theme=theme - ) - self.refresh(RefreshScope.CAMPAIGN_DETAILS) + self.edit_campaign_participant(item_id) + self.refresh(RefreshScope.CAMPAIGN_DETAILS) 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) + self.is_dirty = True def delete_item(self, item_type: str, item_id: str) -> None: reply = QMessageBox.question( @@ -556,6 +459,15 @@ class Controller: self.is_dirty = True self.refresh(RefreshScope.PLAYERS_LIST) + def edit_player(self, player_id: str) -> None: + play = self.model.get_player(player_id) + player_dialog = PlayerDialog(self.view, default_name=play.name) + if player_dialog.exec() == QDialog.DialogCode.Accepted: + name = player_dialog.get_player_name() + if not self._validate_player_inputs(name): + return + self.model.update_player(player_id, name=name) + # War methods def _validate_war_inputs(self, name: str, year: int) -> bool: @@ -585,6 +497,16 @@ class Controller: RefreshScope.WARS_TREE, item_type=ItemType.WAR, item_id=war.id ) + def edit_war(self, war_id: str) -> None: + war = self.model.get_war(war_id) + war_dialog = WarDialog(self.view, default_name=war.name, default_year=war.year) + if war_dialog.exec() == QDialog.DialogCode.Accepted: + name = war_dialog.get_war_name() + year = war_dialog.get_war_year() + if not self._validate_war_inputs(name, year): + return + self.model.update_war(war_id, name=name, year=year) + # Objective methods def _validate_objective_inputs(self, name: str, description: str) -> bool: @@ -609,6 +531,20 @@ class Controller: self.is_dirty = True self.refresh(RefreshScope.WAR_DETAILS) + def edit_objective(self, objective_id: str) -> None: + obj = self.model.get_objective(objective_id) + obj_dialog = ObjectiveDialog( + self.view, default_name=obj.name, default_description=obj.description + ) + if obj_dialog.exec() == QDialog.DialogCode.Accepted: + name = obj_dialog.get_objective_name() + description = obj_dialog.get_objective_description() + if not self._validate_objective_inputs(name, description): + return + self.model.update_objective( + objective_id, name=name, description=description + ) + # War participant methods def add_war_participant(self) -> None: @@ -629,6 +565,21 @@ class Controller: self.is_dirty = True self.refresh(RefreshScope.WAR_DETAILS) + def edit_war_participant(self, participant_id: str) -> None: + war_part = self.model.get_war_participant(participant_id) + player = self.model.get_player(war_part.player_id) + play_opt = ParticipantOption(id=player.id, name=player.name) + war_part_dialog = WarParticipantDialog( + self.view, + players=[play_opt], + default_player_id=war_part.id, + default_faction=war_part.faction, + editable_player=False, + ) + if war_part_dialog.exec() == QDialog.DialogCode.Accepted: + faction = war_part_dialog.get_participant_faction() + self.model.update_war_participant(participant_id, faction=faction) + # Campaign methods def _validate_campaign_inputs(self, name: str, month: int) -> bool: @@ -665,6 +616,18 @@ class Controller: RefreshScope.WARS_TREE, item_type=ItemType.CAMPAIGN, item_id=camp.id ) + def edit_campaign(self, campaign_id: str) -> None: + camp = self.model.get_campaign(campaign_id) + camp_dialog = CampaignDialog( + self.view, default_name=camp.name, default_month=camp.month + ) + if camp_dialog.exec() == QDialog.DialogCode.Accepted: + name = camp_dialog.get_campaign_name() + month = camp_dialog.get_campaign_month() + if not self._validate_campaign_inputs(name, month): + return + self.model.update_campaign(campaign_id, name=name, month=month) + # Campaign participant methods def add_campaign_participant(self) -> None: @@ -691,6 +654,26 @@ class Controller: self.is_dirty = True self.refresh(RefreshScope.CAMPAIGN_DETAILS) + def edit_campaign_participant(self, participant_id: str) -> None: + camp_part = self.model.get_campaign_participant(participant_id) + war_part = self.model.get_war_participant(camp_part.war_participant_id) + player = self.model.get_player(war_part.player_id) + part_opt = [ParticipantOption(id=player.id, name=player.name)] + camp_part_dialog = CampaignParticipantDialog( + self.view, + participants=part_opt, + default_participant_id=camp_part.id, + default_leader=camp_part.leader, + default_theme=camp_part.theme, + editable_player=False, + ) + if camp_part_dialog.exec() == QDialog.DialogCode.Accepted: + leader = camp_part_dialog.get_participant_leader() + theme = camp_part_dialog.get_participant_theme() + self.model.update_campaign_participant( + participant_id, leader=leader, theme=theme + ) + # Sector methods def _validate_sector_inputs( @@ -739,6 +722,44 @@ class Controller: self.is_dirty = True self.refresh(RefreshScope.CAMPAIGN_DETAILS) + def edit_sector(self, sector_id: str) -> None: + sect = self.model.get_sector(sector_id) + camp = self.model.get_campaign_by_sector(sector_id) + war = self.model.get_war_by_campaign(camp.id) + rounds = camp.get_all_rounds() + rnd_dto: List[RoundDTO] = [ + RoundDTO(id=rnd.id, index=i) for i, rnd in enumerate(rounds, start=1) + ] + objectives = war.get_all_objectives() + obj_dto: List[ObjectiveDTO] = [ + ObjectiveDTO(id=obj.id, name=obj.name, description=obj.description) + for obj in objectives + ] + sect_dialog = SectorDialog( + self.view, + default_name=sect.name, + rounds=rnd_dto, + default_round_id=sect.round_id, + objectives=obj_dto, + default_major_id=sect.major_objective_id, + default_minor_id=sect.minor_objective_id, + default_influence_id=sect.influence_objective_id, + ) + if sect_dialog.exec() == QDialog.DialogCode.Accepted: + name = sect_dialog.get_sector_name() + round_id = sect_dialog.get_round_id() + major_id = sect_dialog.get_major_id() + minor_id = sect_dialog.get_minor_id() + influence_id = sect_dialog.get_influence_id() + self.model.update_sector( + sector_id, + name=name, + round_id=round_id, + major_id=major_id, + minor_id=minor_id, + influence_id=influence_id, + ) + # Round methods def add_round(self) -> None: