diff --git a/arcade/gui/experimental/focus.py b/arcade/gui/experimental/focus.py index 02c660c189..e806150120 100644 --- a/arcade/gui/experimental/focus.py +++ b/arcade/gui/experimental/focus.py @@ -87,7 +87,11 @@ def on_event(self, event: UIEvent) -> bool | None: self.set_focus() return EVENT_HANDLED - if isinstance(event, UIKeyPressEvent): + if self.focused_widget is None: + # no focused widget, ignore events + return EVENT_UNHANDLED + + elif isinstance(event, UIKeyPressEvent): if event.symbol == arcade.key.TAB: if event.modifiers & arcade.key.MOD_SHIFT: self.focus_previous() diff --git a/arcade/scene.py b/arcade/scene.py index 0d9a3fb060..101f54a779 100644 --- a/arcade/scene.py +++ b/arcade/scene.py @@ -11,6 +11,7 @@ """ from collections.abc import Iterable +from typing import TypeVar from warnings import warn from arcade import Sprite, SpriteList @@ -20,6 +21,8 @@ __all__ = ["Scene", "SceneKeyError"] +_S = TypeVar("_S", bound=Sprite) + class SceneKeyError(KeyError): """ @@ -151,7 +154,7 @@ def __getitem__(self, key: str) -> SpriteList: raise SceneKeyError(key) - def add_sprite(self, name: str, sprite: Sprite) -> None: + def add_sprite(self, name: str, sprite: _S) -> _S: """ Add a Sprite to the SpriteList with the specified name. @@ -177,12 +180,14 @@ def add_sprite(self, name: str, sprite: Sprite) -> None: new_list.append(sprite) self.add_sprite_list(name=name, sprite_list=new_list) + return sprite + def add_sprite_list( self, name: str, use_spatial_hash: bool = False, sprite_list: SpriteList | None = None, - ) -> None: + ) -> SpriteList: """ Add a SpriteList to the scene with the specified name. @@ -207,6 +212,7 @@ def add_sprite_list( ) self._name_mapping[name] = sprite_list self._sprite_lists.append(sprite_list) + return sprite_list def add_sprite_list_before( self, @@ -214,7 +220,7 @@ def add_sprite_list_before( before: str, use_spatial_hash: bool = False, sprite_list: SpriteList | None = None, - ) -> None: + ) -> SpriteList: """ Add a sprite list to the scene with the specified name before another SpriteList. @@ -244,6 +250,7 @@ def add_sprite_list_before( before_list = self._name_mapping[before] index = self._sprite_lists.index(before_list) self._sprite_lists.insert(index, sprite_list) + return sprite_list def move_sprite_list_before( self, @@ -279,7 +286,7 @@ def add_sprite_list_after( after: str, use_spatial_hash: bool = False, sprite_list: SpriteList | None = None, - ) -> None: + ) -> SpriteList: """ Add a SpriteList to the scene with the specified name after a specific SpriteList. @@ -309,6 +316,7 @@ def add_sprite_list_after( after_list = self._name_mapping[after] index = self._sprite_lists.index(after_list) + 1 self._sprite_lists.insert(index, sprite_list) + return sprite_list def move_sprite_list_after( self, @@ -338,19 +346,21 @@ def move_sprite_list_after( old_index = self._sprite_lists.index(name_list) self._sprite_lists.insert(new_index, self._sprite_lists.pop(old_index)) - def remove_sprite_list_by_index(self, index: int) -> None: + def remove_sprite_list_by_index(self, index: int) -> SpriteList: """ Remove a layer from the scene by its index in the draw order. Args: index: The index of the sprite list to remove. """ - self.remove_sprite_list_by_object(self._sprite_lists[index]) + sprite_list = self._sprite_lists[index] + self.remove_sprite_list_by_object(sprite_list) + return sprite_list def remove_sprite_list_by_name( self, name: str, - ) -> None: + ) -> SpriteList: """ Remove a layer from the scene by its name. @@ -363,6 +373,7 @@ def remove_sprite_list_by_name( sprite_list = self._name_mapping[name] self._sprite_lists.remove(sprite_list) del self._name_mapping[name] + return sprite_list def remove_sprite_list_by_object(self, sprite_list: SpriteList) -> None: """