edit/delete player/war/campaign/round

This commit is contained in:
Maxime Réaux 2026-01-22 23:42:47 +01:00
parent dc854b4065
commit 185733b5d4
9 changed files with 363 additions and 58 deletions

View file

@ -1,4 +1,5 @@
from pathlib import Path
from datetime import datetime
from PyQt6.QtWidgets import QMessageBox, QDialog
from warchron.model.model import Model
@ -33,6 +34,8 @@ class Controller:
self.view.actionSave_as.triggered.connect(self.save_as)
self.view.addPlayerBtn.clicked.connect(self.add_player)
self.view.addWarBtn.clicked.connect(self.add_war)
self.view.on_edit_item = self.edit_item
self.view.on_delete_item = self.delete_item
def on_app_close(self) -> bool:
if self.is_dirty:
@ -120,6 +123,13 @@ class Controller:
wars = self.model.get_all_wars()
self.view.display_wars(wars)
def refresh_views(self):
current = self.view.get_current_tab()
if current == "players":
self.refresh_players_view()
elif current == "wars":
self.refresh_wars_view()
def on_tree_selection_changed(self, selection):
self.selected_war_id = None
self.selected_campaign_id = None
@ -137,50 +147,86 @@ class Controller:
self.view.set_add_campaign_enabled(self.selected_war_id is not None)
self.view.set_add_round_enabled(self.selected_campaign_id is not None)
def _validate_player_inputs(self, name: str) -> bool:
if not name.strip():
QMessageBox.warning(
self.view,
"Invalid name",
"Player name cannot be empty."
)
return False
return True
def add_player(self):
dialog = PlayerDialog(self.view)
result = dialog.exec() # modal blocking dialog
if result == QDialog.DialogCode.Accepted:
name = dialog.get_player_name()
if not name:
QMessageBox.warning(
self.view,
"Invalid name",
"Player name cannot be empty."
)
if not self._validate_player_inputs(name):
return
self.model.add_player(name)
self.is_dirty = True
self.refresh_players_view()
self.update_window_title()
def _validate_war_inputs(self, name: str, year: int) -> bool:
if not name.strip():
QMessageBox.warning(
self.view,
"Invalid name",
"War name cannot be empty."
)
return False
if not (1970 <= year <= 3000):
QMessageBox.warning(
self.view,
"Invalid year",
"Year must be between 1970 and 3000."
)
return False
return True
def add_war(self):
dialog = WarDialog(self.view)
dialog = WarDialog(self.view, default_year=self.model.get_default_war_values()["year"])
result = dialog.exec() # modal blocking dialog
if result == QDialog.DialogCode.Accepted:
name = dialog.get_war_name()
if not name:
QMessageBox.warning(
self.view,
"Invalid name",
"War name cannot be empty."
)
year = dialog.get_war_year()
if not self._validate_war_inputs(name, year):
return
self.model.add_war(name)
self.model.add_war(name, year)
self.is_dirty = True
self.refresh_wars_view()
self.update_window_title()
def _validate_campaign_inputs(self, name: str, month: int) -> bool:
if not name.strip():
QMessageBox.warning(
self.view,
"Invalid name",
"Campaign name cannot be empty."
)
return False
if not (1 <= month <= 12):
QMessageBox.warning(
self.view,
"Invalid month",
"Month must be between 1 and 12."
)
return False
return True
def add_campaign(self):
if not self.selected_war_id:
return
dialog = CampaignDialog(self.view)
dialog = CampaignDialog(self.view, default_month=self.model.get_default_campaign_values(self.selected_war_id)["month"])
if dialog.exec() != QDialog.DialogCode.Accepted:
return
name = dialog.get_campaign_name()
if not name:
month = dialog.get_campaign_month()
if not self._validate_campaign_inputs(name, month):
return
self.model.add_campaign(self.selected_war_id, name)
self.model.add_campaign(self.selected_war_id, name, month)
self.is_dirty = True
self.refresh_wars_view()
self.update_window_title()
@ -192,3 +238,54 @@ class Controller:
self.is_dirty = True
self.refresh_wars_view()
self.update_window_title()
def edit_item(self, item_type: str, item_id: str):
if item_type == "player":
play = self.model.get_player(item_id)
dialog = PlayerDialog(self.view, default_name=play.name)
if dialog.exec() == QDialog.DialogCode.Accepted:
name = dialog.get_player_name()
if not self._validate_player_inputs(name):
return
self.model.update_player(item_id, name=name)
elif item_type == "war":
war = self.model.get_war(item_id)
dialog = WarDialog(self.view, default_name=war.name, default_year=war.year)
if dialog.exec() == QDialog.DialogCode.Accepted:
name = dialog.get_war_name()
year = dialog.get_war_year()
if not self._validate_war_inputs(name, year):
return
self.model.update_war(item_id, name=name, year=year)
elif item_type == "campaign":
camp = self.model.get_campaign(item_id)
dialog = CampaignDialog(self.view, default_name=camp.name, default_month=camp.month)
if dialog.exec() == QDialog.DialogCode.Accepted:
name = dialog.get_campaign_name()
month = dialog.get_campaign_month()
if not self._validate_campaign_inputs(name, month):
return
self.model.update_campaign(item_id, name=name, month=month)
self.is_dirty = True
self.refresh_views()
def delete_item(self, item_type: str, item_id: str):
reply = QMessageBox.question(
self.view,
"Confirm deletion",
"Are you sure you want to delete this item?",
QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No
)
if reply != QMessageBox.StandardButton.Yes:
return
if item_type == "player":
self.model.remove_player(item_id)
elif item_type == "war":
self.model.remove_war(item_id)
elif item_type == "campaign":
self.model.remove_campaign(item_id)
elif item_type == "round":
self.model.remove_round(item_id)
self.is_dirty = True
self.refresh_views()