Source code for pygame_menu.widgets.core.selection

"""
pygame-menu
https://github.com/ppizarror/pygame-menu

SELECTION
Widget selection effect.
"""

from __future__ import annotations

__all__ = ["Selection"]

import copy

import pygame

import pygame_menu
from pygame_menu._types import (
    ColorInputType,
    ColorType,
    NumberInstance,
    NumberType,
    Tuple2IntType,
    Tuple4IntType,
)
from pygame_menu.utils import assert_color


[docs] class Selection: """ Widget selection effect class. .. note:: All selection classes must be copyable. :param margin_left: Left margin :param margin_right: Right margin :param margin_top: Top margin :param margin_bottom: Bottom margin """ color: ColorType color_bg: ColorType | None margin_bottom: NumberType margin_left: NumberType margin_right: NumberType margin_top: NumberType widget_apply_font_color: bool def __init__( self, margin_left: NumberType, margin_right: NumberType, margin_top: NumberType, margin_bottom: NumberType, widget_apply_font_color: bool = True, # Widgets apply "selected_color" if selected ) -> None: assert isinstance(margin_left, NumberInstance) assert isinstance(margin_right, NumberInstance) assert isinstance(margin_top, NumberInstance) assert isinstance(margin_bottom, NumberInstance) assert margin_left >= 0, "left margin of widget selection cannot be negative" assert margin_right >= 0, "right margin of widget selection cannot be negative" assert margin_top >= 0, "top margin of widget selection cannot be negative" assert margin_bottom >= 0, ( "bottom margin of widget selection cannot be negative" ) self.color = (0, 0, 0) # Main color of the selection effect self.color_bg = None self.margin_bottom = margin_bottom self.margin_left = margin_left self.margin_right = margin_right self.margin_top = margin_top self.widget_apply_font_color = widget_apply_font_color
[docs] def margin_xy(self, x: NumberType, y: NumberType) -> Selection: """ Set margins at left-right / top-bottom. :param x: Left-Right margin in px :param y: Top-Bottom margin in px :return: Self reference """ assert isinstance(x, NumberInstance) and x >= 0 assert isinstance(y, NumberInstance) and y >= 0 self.margin_left = x self.margin_right = x self.margin_top = y self.margin_bottom = y return self
[docs] def zero_margin(self) -> Selection: """ Makes selection margin zero. :return: Self reference """ self.margin_top = 0 self.margin_left = 0 self.margin_right = 0 self.margin_bottom = 0 return self
[docs] def copy(self) -> Selection: """ Creates a deep copy of the object. :return: Copied selection effect """ return copy.deepcopy(self)
def __copy__(self) -> Selection: """ Copy method. :return: Copied selection """ return self.copy()
[docs] def set_color(self, color: ColorInputType) -> Selection: """ Set the selection effect color. :param color: Selection color :return: Self reference """ self.color = assert_color(color) return self
[docs] def set_background_color( self, color: ColorInputType | pygame_menu.BaseImage ) -> Selection: """ Set the selection background color. It will replace the background color of the widget if selected. :param color: Background color :return: Self reference """ self.color_bg = color if not isinstance(color, pygame_menu.BaseImage): self.color_bg = assert_color(self.color_bg) return self
[docs] def get_background_color(self) -> ColorType | pygame_menu.BaseImage | None: """ Return the background color. :return: Background color or None """ return self.color_bg
[docs] def get_margin(self) -> Tuple4IntType: """ Return the top, left, bottom and right margins of the selection. :return: Tuple of (top, left, bottom, right) margins in px """ return ( int(self.margin_top), int(self.margin_left), int(self.margin_bottom), int(self.margin_right), )
[docs] def get_xy_margin(self) -> Tuple2IntType: """ Return the x/y margins of the selection. :return: Margin tuple on x-axis and y-axis (x, y) in px """ return int(self.margin_left + self.margin_right), int( self.margin_top + self.margin_bottom )
[docs] def get_width(self) -> int: """ Return the selection width as sum of left and right margins. :return: Width in px """ _, l, _, r = self.get_margin() return l + r
[docs] def get_height(self) -> int: """ Return the selection height as sum of top and bottom margins. :return: Height in px """ t, _, b, _ = self.get_margin() return t + b
[docs] def inflate( self, rect: pygame.Rect, inflate: Tuple2IntType | None = None ) -> pygame.Rect: """ Grow or shrink the rectangle size according to margins. :param rect: Rect object :param inflate: Extra border inflate :return: Inflated rect """ if inflate is None: inflate = (0, 0) assert isinstance(rect, pygame.Rect) return pygame.Rect( int(rect.x - self.margin_left - inflate[0] / 2), int(rect.y - self.margin_top - inflate[1] / 2), int(rect.width + self.margin_left + self.margin_right + inflate[0]), int(rect.height + self.margin_top + self.margin_bottom + inflate[1]), )
[docs] def draw( self, surface: pygame.Surface, widget: pygame_menu.widgets.Widget ) -> Selection: """ Draw the selection. :param surface: Surface to draw :param widget: Widget object :return: Self reference """ raise NotImplementedError("override is mandatory")