Source code for scripts.nqp.ui_elements.title_screen
from __future__ import annotations
import logging
from typing import TYPE_CHECKING
import pygame
import pygame_gui
from pygame import Rect
from pygame_gui.core import ObjectID
from pygame_gui.elements import UIButton
from scripts.engine.internal.constant import RenderLayer
from scripts.engine.internal.event import event_hub, ExitGameEvent, LoadGameEvent, NewGameEvent
from scripts.engine.widgets.panel import Panel
if TYPE_CHECKING:
    from typing import List
    from pygame_gui import UIManager
__all__ = ["TitleScreen"]
[docs]class TitleScreen(Panel):
    """
    Initial screen menu
    """
[docs]    def __init__(self, rect: Rect, manager: UIManager):
        self.button_events = {
            "new_game": NewGameEvent(),
            "load_game": LoadGameEvent(),
            "exit_game": ExitGameEvent(),
        }
        self.buttons: List[UIButton] = []
        # complete base class init
        super().__init__(rect, RenderLayer.BOTTOM, manager, object_id=ObjectID("#title_screen", "@menu_screen"))
        self._init_buttons()
        # confirm init complete
        logging.debug(f"TitleScreen initialised.") 
[docs]    def process_event(self, event):
        super().process_event(event)
        # only progress for user events
        if event.type != pygame.USEREVENT:
            return
        if event.user_type == pygame_gui.UI_BUTTON_PRESSED:
            # Find out which button we are clicking
            button = event.ui_element
            # post the new event
            if button in self.buttons:
                # get the id
                ids = event.ui_object_id.split(".")
                button_id = ids[-1]  # get last element
                new_event = self.button_events[button_id]
                event_hub.post(new_event)
                logging.debug(f"TitleScreen button '{button_id}' pressed.") 
    def _init_buttons(self):
        """
        Init the buttons for the menu
        """
        info = self.button_events
        manager = self.ui_manager
        # set button dimensions
        max_width = self.rect.width
        max_height = self.rect.height
        height = int(max_height / 8)
        width = int(max_width / 4)
        x = int((max_width / 2) - (width / 2))
        start_y = int(max_height / 4)
        gap = int(((max_height - start_y) / len(info)) - height)
        count = 0
        for name in info.keys():
            y = start_y + ((height + gap) * count)
            friendly_name = name.replace("_", " ")
            button = UIButton(
                relative_rect=Rect((x, y), (width, height)),
                text=friendly_name.title(),
                manager=manager,
                container=self,
                object_id=f"{name}",
            )
            self.buttons.append(button)
            count += 1