Skip to content

Commit b316bbf

Browse files
committed
Merge branch 'development' into gui/controller
# Conflicts: # CHANGELOG.md # arcade/gui/widgets/slider.py
2 parents ed17c93 + 4cb0ee1 commit b316bbf

32 files changed

+860
-555
lines changed

CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,13 @@ Arcade [PyPi Release History](https://pypi.org/project/arcade/#history) page.
88
- GUI
99
- Fix `UIScrollArea.add` always returning None
1010
- Support `layer` in `UIView.add_widget()`
11+
- Fix a bug which caused `UIScrollArea` to refresh on every frame
12+
- Add stepping to `UISlider` (thanks [csd4ni3l](https://github.com/csd4ni3l))
1113
- Experimental controller support (incl. documentation)
1214
- Text objects are now lazy and can be created before the window
15+
- Introduce `arcade.SpriteSequence[T]` as a covariant supertype of `arcade.SpriteList[T]`
16+
(this is similar to Python's `Sequence[T]`, which is a supertype of `list[T]`)
17+
and various improvements to the typing of the API that leverage it
1318

1419
## Version 3.1.0
1520

arcade/__init__.py

+4
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ def configure_logging(level: int | None = None):
168168
from .sprite import PyMunk
169169
from .sprite import PymunkMixin
170170
from .sprite import SpriteType
171+
from .sprite import SpriteType_co
171172
from .sprite import Sprite
172173
from .sprite import BasicSprite
173174

@@ -176,6 +177,7 @@ def configure_logging(level: int | None = None):
176177
from .sprite import SpriteSolidColor
177178

178179
from .sprite_list import SpriteList
180+
from .sprite_list import SpriteSequence
179181
from .sprite_list import check_for_collision
180182
from .sprite_list import check_for_collision_with_list
181183
from .sprite_list import check_for_collision_with_lists
@@ -283,9 +285,11 @@ def configure_logging(level: int | None = None):
283285
"BasicSprite",
284286
"Sprite",
285287
"SpriteType",
288+
"SpriteType_co",
286289
"PymunkMixin",
287290
"SpriteCircle",
288291
"SpriteList",
292+
"SpriteSequence",
289293
"SpriteSolidColor",
290294
"Text",
291295
"Texture",

arcade/examples/gui/2_widgets.py

+37-14
Original file line numberDiff line numberDiff line change
@@ -410,12 +410,35 @@ def _show_interactive_widgets(self):
410410
size_hint=(0.3, 0),
411411
)
412412
)
413-
slider_row.add(
413+
s1 = slider_row.add(UISlider(size_hint=(0.3, 1), step=1, style=UISlider.NO_STEP_STYLE))
414+
s2 = slider_row.add(
415+
UISlider(
416+
size_hint=(0.3, 1),
417+
step=5,
418+
)
419+
)
420+
s3 = slider_row.add(
414421
UISlider(
415-
size_hint=(0.2, None),
422+
size_hint=(0.3, 1),
423+
step=10,
416424
)
417425
)
418426

427+
@s1.event("on_change")
428+
def _(event: UIOnChangeEvent):
429+
s2.value = event.new_value
430+
s3.value = event.new_value
431+
432+
@s2.event("on_change")
433+
def _(event: UIOnChangeEvent):
434+
s1.value = event.new_value
435+
s3.value = event.new_value
436+
437+
@s3.event("on_change")
438+
def _(event: UIOnChangeEvent):
439+
s1.value = event.new_value
440+
s2.value = event.new_value
441+
419442
tex_slider_row = UIBoxLayout(vertical=False, size_hint=(1, 0.1), space_between=10)
420443
box.add(tex_slider_row)
421444

@@ -428,7 +451,7 @@ def _show_interactive_widgets(self):
428451
)
429452
)
430453

431-
s1 = tex_slider_row.add(
454+
ts1 = tex_slider_row.add(
432455
UITextureSlider(
433456
thumb_texture=TEX_SLIDER_THUMB_BLUE,
434457
track_texture=NinePatchTexture(10, 10, 10, 10, TEX_SLIDER_TRACK_BLUE),
@@ -440,7 +463,7 @@ def _show_interactive_widgets(self):
440463
green_style["normal"].filled_track = arcade.uicolor.GREEN_GREEN_SEA
441464
green_style["hover"].filled_track = arcade.uicolor.GREEN_EMERALD
442465
green_style["press"].filled_track = arcade.uicolor.GREEN_GREEN_SEA
443-
s2 = tex_slider_row.add(
466+
ts2 = tex_slider_row.add(
444467
UITextureSlider(
445468
thumb_texture=TEX_SLIDER_THUMB_GREEN,
446469
track_texture=NinePatchTexture(10, 10, 10, 10, TEX_SLIDER_TRACK_GREEN),
@@ -453,7 +476,7 @@ def _show_interactive_widgets(self):
453476
red_style["normal"].filled_track = arcade.uicolor.RED_POMEGRANATE
454477
red_style["hover"].filled_track = arcade.uicolor.RED_ALIZARIN
455478
red_style["press"].filled_track = arcade.uicolor.RED_POMEGRANATE
456-
s3 = tex_slider_row.add(
479+
ts3 = tex_slider_row.add(
457480
UITextureSlider(
458481
thumb_texture=TEX_SLIDER_THUMB_RED,
459482
track_texture=NinePatchTexture(10, 10, 10, 10, TEX_SLIDER_TRACK_RED),
@@ -462,20 +485,20 @@ def _show_interactive_widgets(self):
462485
)
463486
)
464487

465-
@s1.event("on_change")
488+
@ts1.event("on_change")
466489
def _(event: UIOnChangeEvent):
467-
s2.value = event.new_value
468-
s3.value = event.new_value
490+
ts2.value = event.new_value
491+
ts3.value = event.new_value
469492

470-
@s2.event("on_change")
493+
@ts2.event("on_change")
471494
def _(event: UIOnChangeEvent):
472-
s1.value = event.new_value
473-
s3.value = event.new_value
495+
ts1.value = event.new_value
496+
ts3.value = event.new_value
474497

475-
@s3.event("on_change")
498+
@ts3.event("on_change")
476499
def _(event: UIOnChangeEvent):
477-
s1.value = event.new_value
478-
s2.value = event.new_value
500+
ts1.value = event.new_value
501+
ts2.value = event.new_value
479502

480503
box.add(UISpace(size_hint=(0.2, 0.1)))
481504
text_area = box.add(

arcade/examples/gui/6_size_hints.py

+8-6
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,9 @@ def __init__(self):
9898
width_slider_box = center_box.add(UIBoxLayout(vertical=False, size_hint=(1, 0)))
9999
width_slider_box.add(UILabel("Modify size_hint:", bold=True))
100100
width_slider = width_slider_box.add(
101-
arcade.gui.UISlider(min_value=0, max_value=10, value=0, size_hint=None, height=30)
101+
arcade.gui.UISlider(
102+
min_value=0, max_value=1, value=0, size_hint=None, height=30, step=0.1
103+
)
102104
)
103105
width_value = width_slider_box.add(UILabel(bold=True))
104106

@@ -116,17 +118,17 @@ def __init__(self):
116118

117119
def update_size_hint_value(value: float):
118120
width_value.text = f"({value:.2f})"
119-
dummy1.size_hint = (value / 10, 1)
120-
dummy1.text = f"size_hint = ({value / 10:.2f}, 1)"
121+
dummy1.size_hint = (value, 1)
122+
dummy1.text = f"size_hint = ({value:.2f}, 1)"
121123

122-
dummy2.size_hint = (1 - value / 10, 1)
123-
dummy2.text = f"size_hint = ({1 - value / 10:.2f}, 1)"
124+
dummy2.size_hint = (1 - value, 1)
125+
dummy2.text = f"size_hint = ({1 - value:.2f}, 1)"
124126

125127
@width_slider.event("on_change")
126128
def on_change(event: UIOnChangeEvent):
127129
update_size_hint_value(event.new_value)
128130

129-
initial_value = 10
131+
initial_value = 1
130132
width_slider.value = initial_value
131133
update_size_hint_value(initial_value)
132134

arcade/examples/sprite_bullets_aimed.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,9 @@ def on_draw(self):
109109
def on_mouse_press(self, x, y, button, modifiers):
110110
""" Called whenever the mouse button is clicked. """
111111

112+
# Play the gun sound
113+
self.gun_sound.play()
114+
112115
# Create a bullet
113116
bullet = arcade.Sprite(
114117
":resources:images/space_shooter/laserBlue01.png",
@@ -159,10 +162,12 @@ def on_update(self, delta_time):
159162
# Check this bullet to see if it hit a coin
160163
hit_list = arcade.check_for_collision_with_list(bullet, self.coin_list)
161164

162-
# If it did, get rid of the bullet
165+
# If it did, get rid of the bullet and play the hit sound
163166
if len(hit_list) > 0:
164167
bullet.remove_from_sprite_lists()
165168

169+
self.hit_sound.play()
170+
166171
# For every coin we hit, add to the score and remove the coin
167172
for coin in hit_list:
168173
coin.remove_from_sprite_lists()

arcade/future/input/input_manager_example.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class Player(arcade.Sprite):
2626
def __init__(
2727
self,
2828
texture,
29-
walls: arcade.SpriteList,
29+
walls: arcade.SpriteSequence[arcade.BasicSprite],
3030
input_manager_template: InputManager,
3131
controller: pyglet.input.Controller | None = None,
3232
center_x: float = 0.0,
@@ -76,11 +76,11 @@ def __init__(
7676
}
7777

7878
self.players: list[Player | None] = []
79-
self.player_list = arcade.SpriteList()
79+
self.player_list: arcade.SpriteList[Player] = arcade.SpriteList()
8080
self.device_labels_batch = pyglet.graphics.Batch()
8181
self.player_device_labels: list[arcade.Text | None] = []
8282

83-
self.wall_list = arcade.SpriteList(use_spatial_hash=True)
83+
self.wall_list: arcade.SpriteList[arcade.Sprite] = arcade.SpriteList(use_spatial_hash=True)
8484

8585
for x in range(0, self.width + 64, 64):
8686
wall = arcade.Sprite(":resources:images/tiles/grassMid.png", scale=0.5)

arcade/future/light/light_demo.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def __init__(self, width, height, title):
1818
super().__init__(width, height, title)
1919
self.background = arcade.load_texture(":resources:images/backgrounds/abstract_1.jpg")
2020

21-
self.torch_list = arcade.SpriteList()
21+
self.torch_list: arcade.SpriteList[arcade.Sprite] = arcade.SpriteList()
2222
self.torch_list.extend(
2323
[
2424
arcade.Sprite(

arcade/gui/experimental/scroll_area.py

+1
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,7 @@ def _do_render(self, surface: Surface, force=False) -> bool:
319319
self.do_render_base(surface)
320320
self.do_render(surface)
321321
self._rendered = True
322+
self._requires_render = False
322323

323324
return rendered
324325

0 commit comments

Comments
 (0)