Module game_qu.gui_components.component

Expand source code
from game_qu.base.history_keeper import HistoryKeeper
from game_qu.base.velocity_calculator import VelocityCalculator
from game_qu.gui_components.dimensions import Dimensions
from game_qu.base.utility_functions import load_image, render_image, render_rectangle, mouse_is_clicked, \
    is_mouse_collision, do_nothing
from game_qu.base.id_creator import id_creator
from game_qu.base.events import Event


class Component(Dimensions):
    """ The components that are added to the game's window. If a screen's get_components() method returns a component,
        that components run and render methods will be called"""

    color = None
    path_to_image = None
    name = ""
    is_addable = True
    is_runnable = True  # Sometimes the screen has to run the player, so some components shouldn't be run
    last_frame_id_when_visible = 0
    image_length = 1
    image_height = 1

    # So these functions by default do nothing when called
    mouse_enter_function = do_nothing
    mouse_exit_function = do_nothing
    mouse_enter_event = None
    mouse_exit_event = None

    def __init__(self, path_to_image=""):
        """Initializes the object and loads an image if the path_to_image is not empty"""

        self.path_to_image = path_to_image

        if path_to_image != "":
            self.image_length, self.image_height = load_image(path_to_image)

        self.name = id_creator.get_unique_id()
        self.mouse_enter_event = Event()
        self.mouse_exit_event = Event()

    def run(self):
        """Runs everything the component needs every game cycle"""

        self.mouse_enter_event.run(is_mouse_collision(self))
        self.mouse_exit_event.run(not is_mouse_collision(self))

        # 'is_click()' in this circumstance means whether the mouse has either first exited this component or first
        # entered this component
        if self.mouse_enter_event.is_click():
            self.mouse_enter_function()

        if self.mouse_exit_event.is_click():
            self.mouse_exit_function()

    def render(self):
        """ Renders the component onto the screen- it will either render the image if 'self.path_to_image' is not empty
            otherwise it will render a rectangle with the color from 'self.color'"""

        if self.path_to_image != "":
            render_image(self.path_to_image, self.left_edge, self.top_edge, self.length, self.height)

        else:
            render_rectangle(self.left_edge, self.top_edge, self.length, self.height, self.color)

        self.last_frame_id_when_visible = HistoryKeeper.get_frame_id(VelocityCalculator.current_cycle_number)

    def got_clicked(self):
        """
             Returns:
                bool: the mouse is over the component and the mouse was clicked"""

        was_visible_last_cycle = self.last_frame_id_when_visible == HistoryKeeper.last_frame_id
        return mouse_is_clicked() and is_mouse_collision(self) and was_visible_last_cycle

    def get_scaled_dimensions(self, unscaled_length, unscaled_height):
        """
             Returns:
                list[float]: [scaled_length, scaled_height]; the length and height of the image that is scaled by the
                smallest of the two, so there is no stretching"""

        horizontal_scale_factor = unscaled_length / self.image_length
        vertical_scale_factor = unscaled_height / self.image_height

        smaller_scale_factor = horizontal_scale_factor if horizontal_scale_factor < vertical_scale_factor else vertical_scale_factor

        return [self.image_length * smaller_scale_factor, self.image_height * smaller_scale_factor]

    def set_mouse_functions(self, mouse_enter_function, mouse_exit_function):
        """Sets the functions that are called when the mouse enters and exits the component"""

        self.set_mouse_enter_function(mouse_enter_function)
        self.mouse_exit_function(mouse_exit_function)

    def set_mouse_enter_function(self, mouse_enter_function):
        """Sets the action that happens when a mouse enters this object"""

        self.mouse_enter_function = mouse_enter_function

    def set_mouse_exit_function(self, mouse_exit_function):
        """Sets the function that is called when the mouse exits this object"""

        self.mouse_exit_function = mouse_exit_function

    def set_color(self, color):
        """ Sets the color of the component. Only matters if 'path_to_image' is not set. If 'path_to_image' is set,
            then the image will be rendered instead of the default rectangle with a color of 'color'"""

        self.color = color

    def get_color(self):
        return self.color

Classes

class Component (path_to_image='')

The components that are added to the game's window. If a screen's get_components() method returns a component, that components run and render methods will be called

Initializes the object and loads an image if the path_to_image is not empty

Expand source code
class Component(Dimensions):
    """ The components that are added to the game's window. If a screen's get_components() method returns a component,
        that components run and render methods will be called"""

    color = None
    path_to_image = None
    name = ""
    is_addable = True
    is_runnable = True  # Sometimes the screen has to run the player, so some components shouldn't be run
    last_frame_id_when_visible = 0
    image_length = 1
    image_height = 1

    # So these functions by default do nothing when called
    mouse_enter_function = do_nothing
    mouse_exit_function = do_nothing
    mouse_enter_event = None
    mouse_exit_event = None

    def __init__(self, path_to_image=""):
        """Initializes the object and loads an image if the path_to_image is not empty"""

        self.path_to_image = path_to_image

        if path_to_image != "":
            self.image_length, self.image_height = load_image(path_to_image)

        self.name = id_creator.get_unique_id()
        self.mouse_enter_event = Event()
        self.mouse_exit_event = Event()

    def run(self):
        """Runs everything the component needs every game cycle"""

        self.mouse_enter_event.run(is_mouse_collision(self))
        self.mouse_exit_event.run(not is_mouse_collision(self))

        # 'is_click()' in this circumstance means whether the mouse has either first exited this component or first
        # entered this component
        if self.mouse_enter_event.is_click():
            self.mouse_enter_function()

        if self.mouse_exit_event.is_click():
            self.mouse_exit_function()

    def render(self):
        """ Renders the component onto the screen- it will either render the image if 'self.path_to_image' is not empty
            otherwise it will render a rectangle with the color from 'self.color'"""

        if self.path_to_image != "":
            render_image(self.path_to_image, self.left_edge, self.top_edge, self.length, self.height)

        else:
            render_rectangle(self.left_edge, self.top_edge, self.length, self.height, self.color)

        self.last_frame_id_when_visible = HistoryKeeper.get_frame_id(VelocityCalculator.current_cycle_number)

    def got_clicked(self):
        """
             Returns:
                bool: the mouse is over the component and the mouse was clicked"""

        was_visible_last_cycle = self.last_frame_id_when_visible == HistoryKeeper.last_frame_id
        return mouse_is_clicked() and is_mouse_collision(self) and was_visible_last_cycle

    def get_scaled_dimensions(self, unscaled_length, unscaled_height):
        """
             Returns:
                list[float]: [scaled_length, scaled_height]; the length and height of the image that is scaled by the
                smallest of the two, so there is no stretching"""

        horizontal_scale_factor = unscaled_length / self.image_length
        vertical_scale_factor = unscaled_height / self.image_height

        smaller_scale_factor = horizontal_scale_factor if horizontal_scale_factor < vertical_scale_factor else vertical_scale_factor

        return [self.image_length * smaller_scale_factor, self.image_height * smaller_scale_factor]

    def set_mouse_functions(self, mouse_enter_function, mouse_exit_function):
        """Sets the functions that are called when the mouse enters and exits the component"""

        self.set_mouse_enter_function(mouse_enter_function)
        self.mouse_exit_function(mouse_exit_function)

    def set_mouse_enter_function(self, mouse_enter_function):
        """Sets the action that happens when a mouse enters this object"""

        self.mouse_enter_function = mouse_enter_function

    def set_mouse_exit_function(self, mouse_exit_function):
        """Sets the function that is called when the mouse exits this object"""

        self.mouse_exit_function = mouse_exit_function

    def set_color(self, color):
        """ Sets the color of the component. Only matters if 'path_to_image' is not set. If 'path_to_image' is set,
            then the image will be rendered instead of the default rectangle with a color of 'color'"""

        self.color = color

    def get_color(self):
        return self.color

Ancestors

Subclasses

Class variables

var color
var image_height
var image_length
var is_addable
var is_runnable
var last_frame_id_when_visible
var mouse_enter_event
var mouse_exit_event
var name
var path_to_image

Methods

def get_color(self)
Expand source code
def get_color(self):
    return self.color
def get_scaled_dimensions(self, unscaled_length, unscaled_height)

Returns

list[float]
[scaled_length, scaled_height]; the length and height of the image that is scaled by the

smallest of the two, so there is no stretching

Expand source code
def get_scaled_dimensions(self, unscaled_length, unscaled_height):
    """
         Returns:
            list[float]: [scaled_length, scaled_height]; the length and height of the image that is scaled by the
            smallest of the two, so there is no stretching"""

    horizontal_scale_factor = unscaled_length / self.image_length
    vertical_scale_factor = unscaled_height / self.image_height

    smaller_scale_factor = horizontal_scale_factor if horizontal_scale_factor < vertical_scale_factor else vertical_scale_factor

    return [self.image_length * smaller_scale_factor, self.image_height * smaller_scale_factor]
def got_clicked(self)

Returns

bool
the mouse is over the component and the mouse was clicked
Expand source code
def got_clicked(self):
    """
         Returns:
            bool: the mouse is over the component and the mouse was clicked"""

    was_visible_last_cycle = self.last_frame_id_when_visible == HistoryKeeper.last_frame_id
    return mouse_is_clicked() and is_mouse_collision(self) and was_visible_last_cycle
def mouse_enter_function(*args)

This function does absolutely nothing (useful if you want to have a command and have it by default do nothing)

Expand source code
def do_nothing(*args):
    """This function does absolutely nothing (useful if you want to have a command and have it by default do nothing)"""

    pass
def mouse_exit_function(*args)

This function does absolutely nothing (useful if you want to have a command and have it by default do nothing)

Expand source code
def do_nothing(*args):
    """This function does absolutely nothing (useful if you want to have a command and have it by default do nothing)"""

    pass
def render(self)

Renders the component onto the screen- it will either render the image if 'self.path_to_image' is not empty otherwise it will render a rectangle with the color from 'self.color'

Expand source code
def render(self):
    """ Renders the component onto the screen- it will either render the image if 'self.path_to_image' is not empty
        otherwise it will render a rectangle with the color from 'self.color'"""

    if self.path_to_image != "":
        render_image(self.path_to_image, self.left_edge, self.top_edge, self.length, self.height)

    else:
        render_rectangle(self.left_edge, self.top_edge, self.length, self.height, self.color)

    self.last_frame_id_when_visible = HistoryKeeper.get_frame_id(VelocityCalculator.current_cycle_number)
def run(self)

Runs everything the component needs every game cycle

Expand source code
def run(self):
    """Runs everything the component needs every game cycle"""

    self.mouse_enter_event.run(is_mouse_collision(self))
    self.mouse_exit_event.run(not is_mouse_collision(self))

    # 'is_click()' in this circumstance means whether the mouse has either first exited this component or first
    # entered this component
    if self.mouse_enter_event.is_click():
        self.mouse_enter_function()

    if self.mouse_exit_event.is_click():
        self.mouse_exit_function()
def set_color(self, color)

Sets the color of the component. Only matters if 'path_to_image' is not set. If 'path_to_image' is set, then the image will be rendered instead of the default rectangle with a color of 'color'

Expand source code
def set_color(self, color):
    """ Sets the color of the component. Only matters if 'path_to_image' is not set. If 'path_to_image' is set,
        then the image will be rendered instead of the default rectangle with a color of 'color'"""

    self.color = color
def set_mouse_enter_function(self, mouse_enter_function)

Sets the action that happens when a mouse enters this object

Expand source code
def set_mouse_enter_function(self, mouse_enter_function):
    """Sets the action that happens when a mouse enters this object"""

    self.mouse_enter_function = mouse_enter_function
def set_mouse_exit_function(self, mouse_exit_function)

Sets the function that is called when the mouse exits this object

Expand source code
def set_mouse_exit_function(self, mouse_exit_function):
    """Sets the function that is called when the mouse exits this object"""

    self.mouse_exit_function = mouse_exit_function
def set_mouse_functions(self, mouse_enter_function, mouse_exit_function)

Sets the functions that are called when the mouse enters and exits the component

Expand source code
def set_mouse_functions(self, mouse_enter_function, mouse_exit_function):
    """Sets the functions that are called when the mouse enters and exits the component"""

    self.set_mouse_enter_function(mouse_enter_function)
    self.mouse_exit_function(mouse_exit_function)

Inherited members