Source code for pyggui.gui.page

"""
Module containing base classes for pages.
"""

from typing import List, Tuple, Callable

import pygame

from pyggui.gui.event_handler import EventHandler


[docs]class Page: """ Main class other pages should inherit from. Page object functions similarly to an Item, it can be moved and resized. """ def __init__(self, controller: 'Controller'): """ Args: controller (Controller): Main controller object throughout the game. """ self.controller = controller self.display = controller.display self.items = [] self.items_positions = [] # Positions relative to the top left corner of page self.background_color = (0, 0, 0) size = self.display.get_size() self.rect = pygame.Rect(0, 0, size[0], size[1]) # Initial position at (0, 0) self.event_handlers: List[EventHandler] = [] self.parent = None # Used if page is contained in another page @property def position(self) -> List[int]: return [self.rect.x, self.rect.y] @position.setter def position(self, pos: List[int]): self.rect.x = pos[0] self.rect.y = pos[1] @property def x(self) -> int: return self.rect.x @x.setter def x(self, new_x: int): self.rect.x = new_x @property def y(self) -> int: return self.rect.y @y.setter def y(self, new_y: int): self.rect.y = new_y @property def size(self) -> Tuple[int, int]: return self.rect.size @size.setter def size(self, new_size: Tuple[int, int]): self.rect.size = new_size @property def width(self) -> int: return self.rect.width @width.setter def width(self, new_width: int) -> None: self.rect.width = new_width @property def height(self) -> int: return self.rect.height @height.setter def height(self, new_height: int) -> None: self.rect.height = new_height @property def display_size(self): return self.controller.game.display_size
[docs] def add_event_handler(self, event_handler: EventHandler) -> None: """ Method adds a page-wide EventHandler object. This event handler is not triggered after the page has been redirected from i.e. with the redirect_to or go_back methods of Controller. Args: event_handler (EventHandler): EventHandler object to add. """ self.controller.input.add_event_handler(event_handler) self.event_handlers.append(event_handler)
[docs] def add_event_type_handler(self, event_type: int, handler: Callable): """ Method adds a single page-wide event type handler. The handler callable function gets triggered once the event_type appears in the main input loop. This event type handler is not triggered after the page has been redirected from i.e. with the redirect_to or go_back methods of Controller. Args: event_type (int): Pygame event type. handler (Callable): Callable function to get called once the event type appears in the main input loop. """ # Create an EventHandler object event_handler = EventHandler(types=event_type, handlers=handler) self.add_event_handler(event_handler)
[docs] def add_item(self, item: any) -> None: """ Method adds item to page. Items position should be set beforehand. Args: item (any): Item to add to page. Item must have the update and draw methods. """ item.parent = self self.items.append(item) self.items_positions.append(item.position)
[docs] def update(self) -> None: """ Method updates every item added to page. Once the item is added, page no longer controlls its position but it has its original position stored. """ for i, item in enumerate(self.items): item.update()
[docs] def draw(self) -> None: """ Method draws every item added to page. """ for item in self.items: item.draw()
def _on_appearance(self) -> None: """ Private method only called by controller. Method gets called once the page has been brought up again. Calls the on_appearance method. """ # Re-add all page event handlers to input for event_handler in self.event_handlers: self.controller.input.add_event_handler(event_handler) self.on_appearance()
[docs] def on_appearance(self) -> None: """ Method gets called once the page been has brought up again. Safe for overriding. """ pass
def _on_exit(self) -> None: """ Private method only called by controller. Method gets called once the page has been redirected from. Calls the on_exit method. """ # Remove all page event handlers from input self.controller.input.remove_event_handlers(self.event_handlers) self.on_exit()
[docs] def on_exit(self) -> None: """ Method gets called once the page has been redirected from. Safe for overriding. """ pass