""" 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 from collections.abc import Callable import gi gi.require_version("Gtk", "4.0") gi.require_version("Adw", "1") from gi.repository import Gtk, Adw class ResultOverlay(Gtk.Box): """ Translucent overlay shown at game end. Displays the winner, final scores, and action buttons. """ def __init__( self, on_play_again: Callable[[], None], on_lobby: Callable[[], None], ) -> None: super().__init__(orientation=Gtk.Orientation.VERTICAL, spacing=16) self._on_play_again = on_play_again self._on_lobby = on_lobby self.set_visible(False) self.set_valign(Gtk.Align.CENTER) self.set_halign(Gtk.Align.CENTER) self.set_margin_top(16) self.set_margin_bottom(16) self.set_margin_start(16) self.set_margin_end(16) self.add_css_class("card") self._title_label = Gtk.Label(label="") self._title_label.add_css_class("title-1") self.append(self._title_label) self._subtitle_label = Gtk.Label(label="") self._subtitle_label.add_css_class("title-3") self.append(self._subtitle_label) self._score_label = Gtk.Label(label="") self._score_label.add_css_class("dim-label") self.append(self._score_label) btn_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=8) btn_box.set_halign(Gtk.Align.CENTER) play_again_btn = Gtk.Button(label="Play Again") play_again_btn.add_css_class("suggested-action") play_again_btn.add_css_class("pill") play_again_btn.connect("clicked", lambda *_: self._on_play_again()) btn_box.append(play_again_btn) lobby_btn = Gtk.Button(label="Back to Lobby") lobby_btn.add_css_class("pill") lobby_btn.connect("clicked", lambda *_: self._on_lobby()) btn_box.append(lobby_btn) self.append(btn_box) def show_result( self, winner: str | None, resigned: str | None, local_color: str, red_mines: int, blue_mines: int, red_name: str, blue_name: str, ) -> None: if resigned: loser_name = red_name if resigned == "red" else blue_name self._title_label.set_label("Resignation") self._subtitle_label.set_label(f"{loser_name} resigned.") elif winner == "draw" or winner is None: self._title_label.set_label("Draw!") self._subtitle_label.set_label("Equal mines — it's a draw.") elif winner == local_color: self._title_label.set_label("You Win!") self._subtitle_label.set_label("Congratulations!") else: self._title_label.set_label("You Lose") self._subtitle_label.set_label("Better luck next time.") self._score_label.set_label( f"{red_name}: {red_mines} mines · {blue_name}: {blue_mines} mines" ) self.set_visible(True) def hide_result(self) -> None: self.set_visible(False)