110 lines
3.6 KiB
Python
110 lines
3.6 KiB
Python
"""
|
|
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()
|