Skip to content

Commit e582743

Browse files
authored
Merge pull request #500 from JaskRendix/get-scrollbar
Add `get_scrollbar(position)` to access scrollbars by position
2 parents ab251b5 + 77a6a49 commit e582743

File tree

2 files changed

+93
-0
lines changed

2 files changed

+93
-0
lines changed

pygame_menu/_scrollarea.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1259,6 +1259,18 @@ def collide(
12591259
widget_rect = widget
12601260
return bool(widget_rect.collidepoint(*get_finger_pos(self._menu, event)))
12611261

1262+
def get_scrollbar(self, position: str) -> Optional['ScrollBar']:
1263+
"""
1264+
Returns the scrollbar at the given position, or None if not present.
1265+
:param position: The position of the scrollbar (e.g., POSITION_NORTH, POSITION_EAST).
1266+
:return: The ScrollBar object or None.
1267+
"""
1268+
assert_position(position) # Ensure valid position string
1269+
for sbar, pos in zip(self._scrollbars, self._scrollbar_positions):
1270+
if pos == position:
1271+
return sbar
1272+
return None
1273+
12621274
def get_decorator(self) -> 'Decorator':
12631275
"""
12641276
Return the ScrollArea decorator API.

test/test_scrollarea.py

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,3 +365,84 @@ def test_change_area_color(self) -> None:
365365
sf = sa._bg_surface
366366
self.assertEqual(sa.update_area_color('red'), sa)
367367
self.assertNotEqual(sf, sa._bg_surface)
368+
369+
def test_get_scrollbar_default_config_returns_south(self) -> None:
370+
"""
371+
Test get_scrollbar returns the South scrollbar for default config (SOUTH_EAST).
372+
"""
373+
menu = MenuUtils.generic_menu()
374+
sa = menu.get_scrollarea()
375+
south_scrollbar = sa.get_scrollbar(POSITION_SOUTH)
376+
self.assertIsNotNone(south_scrollbar)
377+
self.assertEqual(south_scrollbar.get_orientation(), ORIENTATION_HORIZONTAL)
378+
379+
def test_get_scrollbar_default_config_returns_east(self) -> None:
380+
"""
381+
Test get_scrollbar returns the East scrollbar for default config (SOUTH_EAST).
382+
"""
383+
menu = MenuUtils.generic_menu()
384+
sa = menu.get_scrollarea()
385+
east_scrollbar = sa.get_scrollbar(POSITION_EAST)
386+
self.assertIsNotNone(east_scrollbar)
387+
self.assertEqual(east_scrollbar.get_orientation(), ORIENTATION_VERTICAL)
388+
389+
def test_get_scrollbar_default_config_returns_none_for_north(self) -> None:
390+
"""
391+
Test get_scrollbar returns None for North scrollbar on default config.
392+
"""
393+
menu = MenuUtils.generic_menu()
394+
sa = menu.get_scrollarea()
395+
self.assertIsNone(sa.get_scrollbar(POSITION_NORTH))
396+
397+
def test_get_scrollbar_default_config_returns_none_for_west(self) -> None:
398+
"""
399+
Test get_scrollbar returns None for West scrollbar on default config.
400+
"""
401+
menu = MenuUtils.generic_menu()
402+
sa = menu.get_scrollarea()
403+
self.assertIsNone(sa.get_scrollbar(POSITION_WEST))
404+
405+
def test_get_scrollbar_returns_none_for_center_position(self) -> None:
406+
"""
407+
Test get_scrollbar returns None for POSITION_CENTER (not a scrollbar position).
408+
"""
409+
menu = MenuUtils.generic_menu()
410+
sa = menu.get_scrollarea()
411+
# POSITION_CENTER is a valid position string but not a scrollbar position
412+
self.assertIsNone(sa.get_scrollbar(POSITION_CENTER))
413+
414+
def test_get_scrollbar_full_config_returns_all_scrollbars(self) -> None:
415+
"""
416+
Test get_scrollbar returns all scrollbars for SCROLLAREA_POSITION_FULL config.
417+
"""
418+
theme_full = TEST_THEME.copy()
419+
theme_full.scrollarea_position = SCROLLAREA_POSITION_FULL
420+
menu_full = MenuUtils.generic_menu(theme=theme_full)
421+
sa_full = menu_full.get_scrollarea()
422+
423+
self.assertIsNotNone(sa_full.get_scrollbar(POSITION_NORTH))
424+
self.assertIsNotNone(sa_full.get_scrollbar(POSITION_SOUTH))
425+
self.assertIsNotNone(sa_full.get_scrollbar(POSITION_EAST))
426+
self.assertIsNotNone(sa_full.get_scrollbar(POSITION_WEST))
427+
428+
def test_get_scrollbar_none_config_returns_no_scrollbars(self) -> None:
429+
"""
430+
Test get_scrollbar returns None for all positions when SCROLLAREA_POSITION_NONE.
431+
"""
432+
theme_none = TEST_THEME.copy()
433+
theme_none.scrollarea_position = SCROLLAREA_POSITION_NONE
434+
menu_none = MenuUtils.generic_menu(theme=theme_none)
435+
sa_none = menu_none.get_scrollarea()
436+
437+
self.assertIsNone(sa_none.get_scrollbar(POSITION_NORTH))
438+
self.assertIsNone(sa_none.get_scrollbar(POSITION_EAST))
439+
self.assertIsNone(sa_none.get_scrollbar(POSITION_SOUTH))
440+
self.assertIsNone(sa_none.get_scrollbar(POSITION_WEST))
441+
442+
def test_get_scrollbar_raises_value_error_for_invalid_string(self) -> None:
443+
"""
444+
Test get_scrollbar raises ValueError for a genuinely invalid position string.
445+
"""
446+
menu = MenuUtils.generic_menu()
447+
sa = menu.get_scrollarea()
448+
self.assertRaises(AssertionError, lambda: sa.get_scrollbar("INVALID_POSITION_STRING"))

0 commit comments

Comments
 (0)