summaryrefslogtreecommitdiff
path: root/src/sliceitoff/menu/menu.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/sliceitoff/menu/menu.py')
-rw-r--r--src/sliceitoff/menu/menu.py70
1 files changed, 70 insertions, 0 deletions
diff --git a/src/sliceitoff/menu/menu.py b/src/sliceitoff/menu/menu.py
new file mode 100644
index 0000000..c0d63af
--- /dev/null
+++ b/src/sliceitoff/menu/menu.py
@@ -0,0 +1,70 @@
+""" menu.menu - Skeleton for menus """
+import pygame
+
+from sliceitoff.display import Scaling
+
+from .explodeout import ExplodeOutGroup
+
+MOUSE_TRESHOLD = 100
+
+class Menu(ExplodeOutGroup):
+ """ sprite group with imputs to make selection """
+ def __init__(self, screen, items):
+ super().__init__()
+ self.items = items
+ self.selection = 0
+ self.mousey = 0
+ self.screen = screen
+ self.add(self.screen(self.selection))
+
+ def do_selection(self):
+ """ Default selection handler. Every action just ends menu. """
+ self.do_fadeout()
+
+ def update(self, dt = 0, **kwargs):
+ """ Does it all. Reads keyboard and updates screen """
+ if not super().update(dt = dt, **kwargs) or self.explode:
+ return
+
+ for event in pygame.event.get():
+ if event.type == pygame.QUIT:
+ self.selection = self.items - 1
+ self.do_selection()
+ break
+ if event.type == pygame.MOUSEBUTTONDOWN and event.button <= 3:
+ self.do_selection()
+ break
+ if event.type == pygame.KEYDOWN:
+ if self.process_key(event.key):
+ break
+ elif event.type == pygame.MOUSEMOTION:
+ self.process_mouse_motion()
+ self.empty()
+ self.add(self.screen(self.selection))
+
+ def process_mouse_motion(self):
+ """ Mouse movement up or down moves menu selection """
+ self.mousey += pygame.mouse.get_rel()[1]
+ pygame.mouse.set_pos(Scaling.center)
+ if abs(self.mousey) > MOUSE_TRESHOLD:
+ self.selection += 1 if self.mousey > 0 else -1
+ self.selection %= self.items
+ self.mousey = 0
+
+ def process_key(self, key):
+ """ Processes known key presses """
+ match key:
+ case pygame.K_KP_ENTER | pygame.K_RETURN | pygame.K_RIGHT:
+ self.do_selection()
+ return True
+ case pygame.K_ESCAPE | pygame.K_q | pygame.K_LEFT:
+ self.selection = self.items - 1
+ self.do_selection()
+ return True
+ case pygame.K_UP:
+ self.selection -= 1
+ self.selection %= self.items
+ case pygame.K_DOWN:
+ self.selection += 1
+ self.selection %= self.items
+ return False