Browse Source

fix: LayoutView’s duplicating items

pull/10166/head
DA344 1 month ago
committed by GitHub
parent
commit
de4d8c489d
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 24
      discord/ui/view.py

24
discord/ui/view.py

@ -47,6 +47,7 @@ import logging
import sys import sys
import time import time
import os import os
import copy
from .item import Item, ItemCallbackType from .item import Item, ItemCallbackType
from .dynamic import DynamicItem from .dynamic import DynamicItem
from ..components import ( from ..components import (
@ -197,7 +198,7 @@ class BaseView:
__discord_ui_view__: ClassVar[bool] = False __discord_ui_view__: ClassVar[bool] = False
__discord_ui_modal__: ClassVar[bool] = False __discord_ui_modal__: ClassVar[bool] = False
__discord_ui_container__: 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: def __init__(self, *, timeout: Optional[float] = 180.0) -> None:
self.__timeout = timeout self.__timeout = timeout
@ -218,15 +219,17 @@ class BaseView:
def _init_children(self) -> List[Item[Self]]: def _init_children(self) -> List[Item[Self]]:
children = [] children = []
for raw in self.__view_children_items__: for name, raw in self.__view_children_items__.items():
if isinstance(raw, Item): if isinstance(raw, Item):
raw._view = self item = copy.deepcopy(raw)
parent = getattr(raw, '__discord_ui_parent__', None) setattr(self, name, item)
item._view = self
parent = getattr(item, '__discord_ui_parent__', None)
if parent and parent._view is None: if parent and parent._view is None:
parent._view = self parent._view = self
if getattr(raw, '__discord_ui_update_view__', False): if getattr(item, '__discord_ui_update_view__', False):
raw._update_children_view(self) # type: ignore item._update_children_view(self) # type: ignore
children.append(raw) children.append(item)
else: else:
item: Item = raw.__discord_ui_model_type__(**raw.__discord_ui_model_kwargs__) item: Item = raw.__discord_ui_model_type__(**raw.__discord_ui_model_kwargs__)
item.callback = _ViewCallback(raw, self, item) # type: ignore item.callback = _ViewCallback(raw, self, item) # type: ignore
@ -594,7 +597,7 @@ class View(BaseView):
if len(children) > 25: if len(children) > 25:
raise TypeError('View cannot have more than 25 children') 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): def __init__(self, *, timeout: Optional[float] = 180.0):
super().__init__(timeout=timeout) super().__init__(timeout=timeout)
@ -715,7 +718,7 @@ class LayoutView(BaseView):
super().__init__(timeout=timeout) super().__init__(timeout=timeout)
def __init_subclass__(cls) -> None: def __init_subclass__(cls) -> None:
children: Dict[str, Item[Any]] = {} children: Dict[str, ItemLike] = {}
callback_children: Dict[str, ItemCallbackType[Any]] = {} callback_children: Dict[str, ItemCallbackType[Any]] = {}
row = 0 row = 0
@ -732,7 +735,8 @@ class LayoutView(BaseView):
if len(children) > 10: if len(children) > 10:
raise TypeError('LayoutView cannot have more than 10 top-level children') 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: def _is_v2(self) -> bool:
return True return True

Loading…
Cancel
Save