add campaign & round

This commit is contained in:
Maxime Réaux 2026-01-21 07:43:04 +01:00
parent 9e966baf9b
commit 1218f32752
10 changed files with 365 additions and 24 deletions

View file

@ -1,20 +1,29 @@
from pathlib import Path
from PyQt6.QtWidgets import QMessageBox, QDialog
from warchron.model.model import Model
from warchron.view.view import View
from warchron.view.view import PlayerDialog, WarDialog
from warchron.view.view import PlayerDialog, WarDialog, CampaignDialog
class Controller:
def __init__(self, model, view):
def __init__(self, model: Model, view: View):
self.model = model
self.view = view
self.current_file: Path | None = None
self.selected_war_id = None
self.selected_campaign_id = None
self.selected_round_id = None
self.view.on_close_callback = self.on_app_close
self.is_dirty = False
self.__connect()
self.refresh_players_view()
self.refresh_wars_view()
self.update_window_title()
self.update_actions_state()
self.view.on_tree_selection_changed = self.on_tree_selection_changed
self.view.on_add_campaign = self.add_campaign
self.view.on_add_round = self.add_round
def __connect(self):
self.view.actionExit.triggered.connect(self.view.close)
@ -107,6 +116,27 @@ class Controller:
players = self.model.get_all_players()
self.view.display_players(players)
def refresh_wars_view(self):
wars = self.model.get_all_wars()
self.view.display_wars(wars)
def on_tree_selection_changed(self, selection):
self.selected_war_id = None
self.selected_campaign_id = None
self.selected_round_id = None
if selection:
if selection["type"] == "war":
self.selected_war_id = selection["id"]
elif selection["type"] == "campaign":
self.selected_campaign_id = selection["id"]
elif selection["type"] == "round":
self.selected_round_id = selection["id"]
self.update_actions_state()
def update_actions_state(self):
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 add_player(self):
dialog = PlayerDialog(self.view)
result = dialog.exec() # modal blocking dialog
@ -123,11 +153,7 @@ class Controller:
self.is_dirty = True
self.refresh_players_view()
self.update_window_title()
def refresh_wars_view(self):
wars = self.model.get_all_wars()
self.view.display_wars(wars)
def add_war(self):
dialog = WarDialog(self.view)
result = dialog.exec() # modal blocking dialog
@ -144,3 +170,25 @@ class Controller:
self.is_dirty = True
self.refresh_wars_view()
self.update_window_title()
def add_campaign(self):
if not self.selected_war_id:
return
dialog = CampaignDialog(self.view)
if dialog.exec() != QDialog.DialogCode.Accepted:
return
name = dialog.get_campaign_name()
if not name:
return
self.model.add_campaign(self.selected_war_id, name)
self.is_dirty = True
self.refresh_wars_view()
self.update_window_title()
def add_round(self):
if not self.selected_campaign_id:
return
self.model.add_round(self.selected_campaign_id)
self.is_dirty = True
self.refresh_wars_view()
self.update_window_title()