new: dev: initialize the GTK client #11
This commit is contained in:
109
gtk-client/mineseeker/ui/app_window.py
Normal file
109
gtk-client/mineseeker/ui/app_window.py
Normal file
@@ -0,0 +1,109 @@
|
||||
"""
|
||||
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()
|
||||
Reference in New Issue
Block a user