""" This file is part of the SplendidBear Websites' projects. Copyright (c) 2026 @ www.splendidbear.org For the full copyright and license information, please view the LICENSE file that was distributed with this source code. """ from __future__ import annotations import gi gi.require_version("Gtk", "4.0") gi.require_version("Adw", "1") from gi.repository import Gtk, Adw from mineseeker.ui.login_page import LoginPage from mineseeker.ui.totp_page import TotpPage from mineseeker.ui.lobby_page import LobbyPage from mineseeker.ui.game_page import GamePage class AppWindow(Adw.ApplicationWindow): """ Main application window containing a Gtk.Stack that navigates between: - "login" : LoginPage - "totp" : TotpPage - "lobby" : LobbyPage - "game" : GamePage (replaced on each new game) """ def __init__(self, application: Adw.Application) -> None: super().__init__(application=application) self.set_title("MineSeeker") self.set_default_size(980, 680) # Stack — child names serve as page IDs self._stack = Gtk.Stack() self._stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE) self._stack.set_transition_duration(200) # Build pages self._login_page = LoginPage(on_success=self._on_login_success, on_guest=self._on_guest) self._totp_page = TotpPage(on_success=self._on_totp_success, on_back=self._show_login) self._lobby_page = LobbyPage(on_game_start=self._on_game_start) self._game_page: GamePage | None = None self._stack.add_named(self._login_page, "login") self._stack.add_named(self._totp_page, "totp") self._stack.add_named(self._lobby_page, "lobby") # Wrap in a NavigationView-style container using Adw.ToolbarView toolbar_view = Adw.ToolbarView() header = Adw.HeaderBar() toolbar_view.add_top_bar(header) toolbar_view.set_content(self._stack) self.set_content(toolbar_view) # Start on the login page self._stack.set_visible_child_name("login") # ------------------------------------------------------------------ # Navigation helpers # ------------------------------------------------------------------ def _show_login(self) -> None: self._stack.set_visible_child_name("login") def _show_totp(self) -> None: self._stack.set_visible_child_name("totp") def _show_lobby(self) -> None: self._lobby_page.refresh() self._stack.set_visible_child_name("lobby") # ------------------------------------------------------------------ # Callbacks from child pages # ------------------------------------------------------------------ def _on_login_success(self, needs_totp: bool) -> None: if needs_totp: self._show_totp() else: self._show_lobby() def _on_guest(self) -> None: self._show_lobby() def _on_totp_success(self) -> None: self._show_lobby() def _on_game_start(self, game_assoc: str, mercure_jwt: str, color: str) -> None: """Replace or create the GamePage and switch to it.""" # Remove previous game page if present if self._game_page is not None: self._stack.remove(self._game_page) self._game_page = GamePage( game_assoc=game_assoc, mercure_jwt=mercure_jwt, color=color, on_leave=self._on_game_leave, ) self._stack.add_named(self._game_page, "game") self._stack.set_visible_child_name("game") def _on_game_leave(self) -> None: self._show_lobby()