2026-02-10 09:53:49 +01:00
|
|
|
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,
|
2026-02-12 15:12:28 +01:00
|
|
|
is_over=w.is_over,
|
2026-02-10 09:53:49 +01:00
|
|
|
_campaigns=[
|
|
|
|
|
CampaignDTO(
|
|
|
|
|
id=c.id,
|
|
|
|
|
name=c.name,
|
|
|
|
|
month=c.month,
|
2026-02-12 15:12:28 +01:00
|
|
|
is_over=c.is_over,
|
2026-02-10 09:53:49 +01:00
|
|
|
_rounds=[
|
2026-02-12 15:12:28 +01:00
|
|
|
RoundDTO(
|
|
|
|
|
id=r.id,
|
|
|
|
|
index=c.get_round_index(r.id),
|
|
|
|
|
is_over=r.is_over,
|
|
|
|
|
)
|
2026-02-10 09:53:49 +01:00
|
|
|
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()
|
2026-02-10 11:09:58 +01:00
|
|
|
case RefreshScope.CURRENT_SELECTION_DETAILS:
|
2026-02-10 09:53:49 +01:00
|
|
|
if self.selected_war_id:
|
|
|
|
|
self.app.view.show_details(ItemType.WAR)
|
|
|
|
|
self.app.wars._fill_war_details(self.selected_war_id)
|
2026-02-10 11:09:58 +01:00
|
|
|
elif self.selected_campaign_id:
|
2026-02-10 09:53:49 +01:00
|
|
|
self.app.view.show_details(ItemType.CAMPAIGN)
|
|
|
|
|
self.app.campaigns._fill_campaign_details(self.selected_campaign_id)
|
2026-02-10 11:09:58 +01:00
|
|
|
elif self.selected_round_id:
|
2026-02-10 09:53:49 +01:00
|
|
|
self.app.view.show_details(ItemType.ROUND)
|
|
|
|
|
self.app.rounds._fill_round_details(self.selected_round_id)
|
2026-02-10 11:09:58 +01:00
|
|
|
else:
|
|
|
|
|
self.app.view.show_details(None)
|
2026-02-10 09:53:49 +01:00
|
|
|
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)
|