From b0844e981a7c33fca6f85d89735264669cbbbd60 Mon Sep 17 00:00:00 2001 From: Faraphel Date: Thu, 16 Feb 2023 08:58:42 +0100 Subject: [PATCH] added a GameGrid widget, a on_hover event for the BoxWidget --- assets/image/grid/background.png | Bin 0 -> 40129 bytes assets/image/{ => grid}/boat/body.png | Bin assets/image/{ => grid}/boat/broken.png | Bin assets/image/{ => grid}/boat/edge.png | Bin .../bomb/animation/bomb_anim_i1.png | Bin .../bomb/animation/bomb_anim_i10.png | Bin .../bomb/animation/bomb_anim_i11.png | Bin .../bomb/animation/bomb_anim_i12.png | Bin .../bomb/animation/bomb_anim_i13.png | Bin .../bomb/animation/bomb_anim_i14.png | Bin .../bomb/animation/bomb_anim_i15.png | Bin .../bomb/animation/bomb_anim_i16.png | Bin .../bomb/animation/bomb_anim_i17.png | Bin .../bomb/animation/bomb_anim_i18.png | Bin .../bomb/animation/bomb_anim_i19.png | Bin .../bomb/animation/bomb_anim_i2.png | Bin .../bomb/animation/bomb_anim_i20.png | Bin .../bomb/animation/bomb_anim_i21.png | Bin .../bomb/animation/bomb_anim_i22.png | Bin .../bomb/animation/bomb_anim_i23.png | Bin .../bomb/animation/bomb_anim_i3.png | Bin .../bomb/animation/bomb_anim_i4.png | Bin .../bomb/animation/bomb_anim_i5.png | Bin .../bomb/animation/bomb_anim_i6.png | Bin .../bomb/animation/bomb_anim_i7.png | Bin .../bomb/animation/bomb_anim_i8.png | Bin .../bomb/animation/bomb_anim_i9.png | Bin assets/image/{ => grid}/bomb/missed.png | Bin assets/image/{ => grid}/bomb/touched.png | Bin source/gui/scene/Settings.py | 14 ++- source/gui/widget/GameGrid.py | 106 ++++++++++++++++++ source/gui/widget/Scroller.py | 2 +- source/gui/widget/__init__.py | 1 + source/gui/widget/abc/BoxWidget.py | 20 +++- 34 files changed, 136 insertions(+), 7 deletions(-) create mode 100644 assets/image/grid/background.png rename assets/image/{ => grid}/boat/body.png (100%) rename assets/image/{ => grid}/boat/broken.png (100%) rename assets/image/{ => grid}/boat/edge.png (100%) rename assets/image/{ => grid}/bomb/animation/bomb_anim_i1.png (100%) rename assets/image/{ => grid}/bomb/animation/bomb_anim_i10.png (100%) rename assets/image/{ => grid}/bomb/animation/bomb_anim_i11.png (100%) rename assets/image/{ => grid}/bomb/animation/bomb_anim_i12.png (100%) rename assets/image/{ => grid}/bomb/animation/bomb_anim_i13.png (100%) rename assets/image/{ => grid}/bomb/animation/bomb_anim_i14.png (100%) rename assets/image/{ => grid}/bomb/animation/bomb_anim_i15.png (100%) rename assets/image/{ => grid}/bomb/animation/bomb_anim_i16.png (100%) rename assets/image/{ => grid}/bomb/animation/bomb_anim_i17.png (100%) rename assets/image/{ => grid}/bomb/animation/bomb_anim_i18.png (100%) rename assets/image/{ => grid}/bomb/animation/bomb_anim_i19.png (100%) rename assets/image/{ => grid}/bomb/animation/bomb_anim_i2.png (100%) rename assets/image/{ => grid}/bomb/animation/bomb_anim_i20.png (100%) rename assets/image/{ => grid}/bomb/animation/bomb_anim_i21.png (100%) rename assets/image/{ => grid}/bomb/animation/bomb_anim_i22.png (100%) rename assets/image/{ => grid}/bomb/animation/bomb_anim_i23.png (100%) rename assets/image/{ => grid}/bomb/animation/bomb_anim_i3.png (100%) rename assets/image/{ => grid}/bomb/animation/bomb_anim_i4.png (100%) rename assets/image/{ => grid}/bomb/animation/bomb_anim_i5.png (100%) rename assets/image/{ => grid}/bomb/animation/bomb_anim_i6.png (100%) rename assets/image/{ => grid}/bomb/animation/bomb_anim_i7.png (100%) rename assets/image/{ => grid}/bomb/animation/bomb_anim_i8.png (100%) rename assets/image/{ => grid}/bomb/animation/bomb_anim_i9.png (100%) rename assets/image/{ => grid}/bomb/missed.png (100%) rename assets/image/{ => grid}/bomb/touched.png (100%) create mode 100644 source/gui/widget/GameGrid.py diff --git a/assets/image/grid/background.png b/assets/image/grid/background.png new file mode 100644 index 0000000000000000000000000000000000000000..44a705bea345bab1b4fa642175588128c827d5ae GIT binary patch literal 40129 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

ImSQohEv7 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 tuple[int, int]: + """ + Return the cell of the grid from a point relative position + """ + + return int(rel_x / self.cell_width), int(rel_y / self.cell_height) + + # refresh + + def _refresh_size(self): + self.background.x, self.background.y = self.x, self.y + self.background.width, self.background.height = self.width, self.height + + for column, line in enumerate(self.lines[:self._columns-1], start=1): + line.x = self.x + self.cell_width * column + line.x2 = line.x + line.y = self.y + line.y2 = self.y + self.height + + for row, line in enumerate(self.lines[-self._rows+1:], start=1): + line.x = self.x + line.x2 = self.x + self.width + line.y = self.y + self.cell_height * row + line.y2 = line.y + + # property + + @property + def cell_width(self) -> float: + return self.width / self._columns + + @property + def cell_height(self) -> float: + return self.height / self._rows + + @property + def cell_size(self) -> tuple[float, float]: + return self.cell_width, self.cell_height + + # event + + def on_hover(self, rel_x: int, rel_y: int): + cell_x, cell_y = self.get_cell_from_rel(rel_x, rel_y) + + self.cursor.x = self.x + cell_x * self.width / self._columns + self.cursor.y = self.y + cell_y * self.height / self._rows + self.cursor.width, self.cursor.height = self.cell_size + + def on_hover_leave(self, rel_x: int, rel_y: int): + self.cursor.width, self.cursor.height = 0, 0 + + def on_release(self, rel_x: int, rel_y: int, button: int, modifiers: int): + print("click", (rel_x, rel_y), self.get_cell_from_rel(rel_x, rel_y)) + + def on_resize(self, width: int, height: int): + self._refresh_size() + + def draw(self): + self.background.draw() + self.cursor.draw() + for line in self.lines: line.draw() diff --git a/source/gui/widget/Scroller.py b/source/gui/widget/Scroller.py index 12cdfde..1272d32 100644 --- a/source/gui/widget/Scroller.py +++ b/source/gui/widget/Scroller.py @@ -26,7 +26,7 @@ class Scroller(BoxWidget): value: float = 0.5, to: float = 1, - cursor_width: Percentage = 0.1, + cursor_width: Distance = 0.1, text_transform: Callable[[float], Any] = lambda value: value, **kwargs): diff --git a/source/gui/widget/__init__.py b/source/gui/widget/__init__.py index 096854d..4b98369 100644 --- a/source/gui/widget/__init__.py +++ b/source/gui/widget/__init__.py @@ -4,3 +4,4 @@ from .Input import Input from .Image import Image from .Checkbox import Checkbox from .Scroller import Scroller +from .GameGrid import GameGrid diff --git a/source/gui/widget/abc/BoxWidget.py b/source/gui/widget/abc/BoxWidget.py index ddca25c..1cf53cc 100644 --- a/source/gui/widget/abc/BoxWidget.py +++ b/source/gui/widget/abc/BoxWidget.py @@ -133,16 +133,26 @@ class BoxWidget(Widget, ABC): old_hovering = self.hovering self.hovering = in_bbox((x, y), self.bbox) - if old_hovering != self.hovering: # if the hover changed - if self.hovering: self.on_hover_enter() # call the hover enter event - else: self.on_hover_leave() # call the hover leave event + rel_x, rel_y = x - self.x, y - self.y - def on_hover_enter(self): + if old_hovering != self.hovering: # if the hover changed + if self.hovering: self.on_hover_enter(rel_x, rel_y) # call the hover enter event + else: self.on_hover_leave(rel_x, rel_y) # call the hover leave event + + if self.hovering: # if the mouse motion is inside the collision + self.on_hover(rel_x, rel_y) # call the hover event + + def on_hover(self, rel_x: int, rel_y: int): + """ + This event is called when the mouse move in the bbox of the widget + """ + + def on_hover_enter(self, rel_x: int, rel_y: int): """ This event is called when the mouse enter the bbox of the widget """ - def on_hover_leave(self): + def on_hover_leave(self, rel_x: int, rel_y: int): """ This event is called when the mouse leave the bbox of the widget """