diff --git a/src/engine/menu_manager.py b/src/engine/menu_manager.py index 02ec17d..7c63987 100644 --- a/src/engine/menu_manager.py +++ b/src/engine/menu_manager.py @@ -7,17 +7,18 @@ import src.engine.engine class Widget: """Classe parente des widgets de menu.""" - def __init__(self, x, y, is_window_relative): + def __init__(self, x, y, is_window_relative, widget_name): self.x = x self.y = y self.is_window_relative = is_window_relative + self.widget_name = widget_name class Label(Widget): """Un widget de texte.""" def __init__(self, x: int | float, y: int | float, text: str, size: int | float, color: tuple[int, int, int], - centered: bool = False, is_window_relative: int = -1): - super().__init__(x, y, is_window_relative) + widget_name: str, centered: bool = False, is_window_relative: int = -1): + super().__init__(x, y, is_window_relative, widget_name) self.text = text self.size = size self.centered = centered @@ -33,13 +34,16 @@ class Slider(Widget): base_image: pygame.Surface, hover_image: pygame.Surface, rail_image: pygame.Surface, + widget_name: str, + value_changed_callback: FunctionType | classmethod | staticmethod | None = None, is_window_relative: int = -1, area_name: str = "menu_slider"): - super().__init__(area_rect[0], area_rect[1], is_window_relative) + super().__init__(area_rect[0], area_rect[1], is_window_relative, widget_name) self.base_image = base_image self.hover_image = hover_image self.rail_image = rail_image self.area_name = area_name + self.value_changed_callback = value_changed_callback self.hovered = False self.follow_mouse = False self.cursor_size = cursor_size @@ -52,16 +56,25 @@ class Slider(Widget): def set_value(self, values: tuple[float, float]): """Appelée lorsque la valeur du slider est modifiée.""" - self.value = values[0] + new_value = values[0] + + if new_value != self.value: + self.value = new_value + if self.value_changed_callback is not None: + self.value_changed_callback(self.value) + + def get_value(self): + """Retourne la valeur entre 0.0 et 1.0 du slider.""" + return self.value class Button(Widget): """Un widget de bouton.""" def __init__(self, x: int | float, y: int | float, text: str, size: int | float, color: tuple[int, int, int], callback: FunctionType | classmethod | staticmethod, base_image: pygame.Surface, - hover_image: pygame.Surface, centered: bool = False, is_window_relative: int = -1, + hover_image: pygame.Surface, widget_name: str, centered: bool = False, is_window_relative: int = -1, area_name: str = "menu_button"): - super().__init__(x, y, is_window_relative) + super().__init__(x, y, is_window_relative, widget_name) self.text = text self.size = size self.color = color @@ -99,6 +112,17 @@ class MenuManager: """Ajoute le menu donné au manager de menu avec le nom donné.""" self.menus[name] = menu + def get_widgets_at_name(self, menu_name: str, widget_name: str): + """Donne le widget au nom donné dans le menu au nom donné.""" + menu = self.menus[menu_name] + + found_sliders = [] + for widget in menu.widgets: + if widget.widget_name == widget_name: + found_sliders.append(widget) + + return found_sliders + def show(self, name: str): """Affiche le menu au nom donné.""" self.active_menu = self.menus[name] diff --git a/src/main.py b/src/main.py index c7b89b9..c979574 100644 --- a/src/main.py +++ b/src/main.py @@ -47,8 +47,8 @@ class Game(Engine): slider_hover_image = pygame.image.load("assets/textures/GUI/slider_cursor_2.png").convert_alpha() slider_rail_image = pygame.image.load("assets/textures/GUI/slider_rail_1.png").convert_alpha() - menu.add_widget(Button(0.5, 0.3, "play", 0.08, (0, 0, 0), self.start_game, btn_base_image, btn_hover_image, True, 0)) - menu.add_widget(Slider((50, 50), (100, 300), 136, slider_base_image, slider_hover_image, slider_rail_image)) + menu.add_widget(Button(0.5, 0.3, "play", 0.08, (0, 0, 0), self.start_game, btn_base_image, btn_hover_image, "play_button", True, 0)) + menu.add_widget(Slider((50, 50), (100, 300), 136, slider_base_image, slider_hover_image, slider_rail_image, "test_slider", value_changed_callback=print)) self.menu_manager.register_menu(menu, "main") self.menu_manager.show("main")