From de4d8c489d95333f311a755b37a418a9a6074763 Mon Sep 17 00:00:00 2001 From: DA344 <108473820+DA-344@users.noreply.github.com> Date: Sat, 26 Apr 2025 13:40:13 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20LayoutView=E2=80=99s=20duplicating=20ite?= =?UTF-8?q?ms?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- discord/ui/view.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/discord/ui/view.py b/discord/ui/view.py index a13141432..a3ec58928 100644 --- a/discord/ui/view.py +++ b/discord/ui/view.py @@ -47,6 +47,7 @@ import logging import sys import time import os +import copy from .item import Item, ItemCallbackType from .dynamic import DynamicItem from ..components import ( @@ -197,7 +198,7 @@ class BaseView: __discord_ui_view__: ClassVar[bool] = False __discord_ui_modal__: ClassVar[bool] = False __discord_ui_container__: ClassVar[bool] = False - __view_children_items__: ClassVar[List[ItemLike]] = [] + __view_children_items__: ClassVar[Dict[str, ItemLike]] = [] def __init__(self, *, timeout: Optional[float] = 180.0) -> None: self.__timeout = timeout @@ -218,15 +219,17 @@ class BaseView: def _init_children(self) -> List[Item[Self]]: children = [] - for raw in self.__view_children_items__: + for name, raw in self.__view_children_items__.items(): if isinstance(raw, Item): - raw._view = self - parent = getattr(raw, '__discord_ui_parent__', None) + item = copy.deepcopy(raw) + setattr(self, name, item) + item._view = self + parent = getattr(item, '__discord_ui_parent__', None) if parent and parent._view is None: parent._view = self - if getattr(raw, '__discord_ui_update_view__', False): - raw._update_children_view(self) # type: ignore - children.append(raw) + if getattr(item, '__discord_ui_update_view__', False): + item._update_children_view(self) # type: ignore + children.append(item) else: item: Item = raw.__discord_ui_model_type__(**raw.__discord_ui_model_kwargs__) item.callback = _ViewCallback(raw, self, item) # type: ignore @@ -594,7 +597,7 @@ class View(BaseView): if len(children) > 25: raise TypeError('View cannot have more than 25 children') - cls.__view_children_items__ = list(children.values()) + cls.__view_children_items__ = children def __init__(self, *, timeout: Optional[float] = 180.0): super().__init__(timeout=timeout) @@ -715,7 +718,7 @@ class LayoutView(BaseView): super().__init__(timeout=timeout) def __init_subclass__(cls) -> None: - children: Dict[str, Item[Any]] = {} + children: Dict[str, ItemLike] = {} callback_children: Dict[str, ItemCallbackType[Any]] = {} row = 0 @@ -732,7 +735,8 @@ class LayoutView(BaseView): if len(children) > 10: raise TypeError('LayoutView cannot have more than 10 top-level children') - cls.__view_children_items__ = list(children.values()) + list(callback_children.values()) + children.update(callback_children) + cls.__view_children_items__ = children def _is_v2(self) -> bool: return True