edit/delete player/war/campaign/round
This commit is contained in:
parent
dc854b4065
commit
185733b5d4
9 changed files with 363 additions and 58 deletions
|
|
@ -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()
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue