diff --git a/squirrelbattle/display/display.py b/squirrelbattle/display/display.py index 9cc1456..ef4053f 100644 --- a/squirrelbattle/display/display.py +++ b/squirrelbattle/display/display.py @@ -86,6 +86,13 @@ class Display: def display(self) -> None: raise NotImplementedError + def handle_click(self, y: int, x: int) -> None: + """ + A mouse click was performed on the coordinates (y, x) of the pad. + Maybe it can do something. + """ + pass + @property def rows(self) -> int: return curses.LINES if self.screen else 42 diff --git a/squirrelbattle/display/display_manager.py b/squirrelbattle/display/display_manager.py index a9429fd..708f003 100644 --- a/squirrelbattle/display/display_manager.py +++ b/squirrelbattle/display/display_manager.py @@ -64,7 +64,8 @@ class DisplayManager: # The click coordinates correspond to the coordinates # of that display display = d - raise Exception(f"click at ({y}, {x})", display) + if display: + display.handle_click(y - display.y, x - display.x) def refresh(self) -> List[Display]: displays = [] diff --git a/squirrelbattle/display/menudisplay.py b/squirrelbattle/display/menudisplay.py index d040d81..a494484 100644 --- a/squirrelbattle/display/menudisplay.py +++ b/squirrelbattle/display/menudisplay.py @@ -41,6 +41,13 @@ class MenuDisplay(Display): self.height - 2 + self.y, self.width - 2 + self.x) + def handle_click(self, y: int, x: int) -> None: + """ + We can select a menu item with the mouse. + """ + self.menu.position = y - 1 + curses.ungetch('\n') + @property def truewidth(self) -> int: return max([len(str(a)) for a in self.values]) @@ -99,6 +106,14 @@ class MainMenuDisplay(Display): menuy, menux, min(self.menudisplay.preferred_height, self.height - menuy), menuwidth) + def handle_click(self, y: int, x: int) -> None: + menuwidth = min(self.menudisplay.preferred_width, self.width) + menuy, menux = len(self.title) + 8, self.width // 2 - menuwidth // 2 - 1 + menuheight = min(self.menudisplay.preferred_height, self.height - menuy) + + if menuy <= y < menuy + menuheight and menux <= x < menux + menuwidth: + self.menudisplay.handle_click(y - menuy, x - menux) + class InventoryDisplay(MenuDisplay): def update_pad(self) -> None: