warchron_app/src/warchron/controller/navigation_controller.py
2026-02-12 15:42:02 +01:00

117 lines
4.4 KiB
Python

from typing import List, TYPE_CHECKING
from warchron.constants import ItemType, RefreshScope
if TYPE_CHECKING:
from warchron.controller.app_controller import AppController
from warchron.controller.dtos import (
TreeSelection,
ParticipantOption,
WarDTO,
CampaignDTO,
RoundDTO,
)
class NavigationController:
def __init__(self, app: "AppController"):
self.app: AppController = app
self.selected_war_id: str | None = None
self.selected_campaign_id: str | None = None
self.selected_round_id: str | None = None
self.update_actions_state()
# Display methods
def refresh_players_view(self) -> None:
players = self.app.model.get_all_players()
players_for_display: List[ParticipantOption] = [
ParticipantOption(id=p.id, name=p.name) for p in players
]
self.app.view.display_players(players_for_display)
def refresh_wars_view(self) -> None:
wars: List[WarDTO] = [
WarDTO(
id=w.id,
name=w.name,
year=w.year,
is_over=w.is_over,
_campaigns=[
CampaignDTO(
id=c.id,
name=c.name,
month=c.month,
is_over=c.is_over,
_rounds=[
RoundDTO(
id=r.id,
index=c.get_round_index(r.id),
is_over=r.is_over,
)
for r in c.get_all_rounds()
],
)
for c in w.get_all_campaigns()
],
)
for w in self.app.model.get_all_wars()
]
self.app.view.display_wars_tree(wars)
def refresh(self, scope: RefreshScope) -> None:
match scope:
case RefreshScope.PLAYERS_LIST:
self.app.navigation.refresh_players_view()
case RefreshScope.WARS_TREE:
self.app.navigation.refresh_wars_view()
case RefreshScope.CURRENT_SELECTION_DETAILS:
if self.selected_war_id:
self.app.view.show_details(ItemType.WAR)
self.app.wars._fill_war_details(self.selected_war_id)
elif self.selected_campaign_id:
self.app.view.show_details(ItemType.CAMPAIGN)
self.app.campaigns._fill_campaign_details(self.selected_campaign_id)
elif self.selected_round_id:
self.app.view.show_details(ItemType.ROUND)
self.app.rounds._fill_round_details(self.selected_round_id)
else:
self.app.view.show_details(None)
self.app.update_window_title()
def refresh_and_select(
self, scope: RefreshScope, *, item_type: ItemType, item_id: str
) -> None:
self.refresh(scope)
self.app.view.select_tree_item(item_type=item_type, item_id=item_id)
# Commands methods
def on_tree_selection_changed(self, selection: TreeSelection | None) -> None:
self.selected_war_id = None
self.selected_campaign_id = None
self.selected_round_id = None
if selection:
item_type = selection.type
item_id = selection.id
if item_type == ItemType.WAR:
self.selected_war_id = item_id
self.app.view.show_details(ItemType.WAR)
self.app.wars._fill_war_details(item_id)
elif item_type == ItemType.CAMPAIGN:
self.selected_campaign_id = item_id
self.app.view.show_details(ItemType.CAMPAIGN)
self.app.campaigns._fill_campaign_details(item_id)
elif item_type == ItemType.ROUND:
self.selected_round_id = item_id
self.app.view.show_details(ItemType.ROUND)
self.app.rounds._fill_round_details(item_id)
else:
self.app.view.show_details(None)
self.update_actions_state()
return
self.update_actions_state()
def update_actions_state(self) -> None:
self.app.view.set_add_campaign_enabled(self.selected_war_id is not None)
self.app.view.set_add_round_enabled(self.selected_campaign_id is not None)