From 6eeb7266f59ea788e9caa7f90534cc9cad765387 Mon Sep 17 00:00:00 2001 From: mar77i Date: Sun, 20 Jul 2025 11:10:04 +0200 Subject: [PATCH] HSMap: basic event handling --- bookpaint/color_menu.py | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/bookpaint/color_menu.py b/bookpaint/color_menu.py index b585f6c..275eff1 100644 --- a/bookpaint/color_menu.py +++ b/bookpaint/color_menu.py @@ -210,6 +210,7 @@ class HSMap(Child): self.rect = rect self.hs_surf = self.get_hs_surf(rect.size) self.hs_pos = (0, 0) + self.pressed = False def draw(self): pygame.draw.rect(self.surf, "green", self.rect, 1) @@ -220,11 +221,42 @@ class HSMap(Child): draw_cursor( self.surf, color, - (self.rect.left + self.hs_pos[0], self.rect.bottom - (1 + self.hs_pos[1])), + (self.rect.left + self.hs_pos[0], self.rect.bottom - 1 - self.hs_pos[1]), ) - def set_hsv(self, value, dest): - self.parent.set_hsv(value, dest, type(self)) + def handle_mousebuttondown(self, ev): + if ev.button != 1 or not self.rect.collidepoint(ev.pos): + return + self.set_rel_hs(ev.pos) + self.pressed = True + + def handle_mousemotion(self, ev): + if not self.pressed: + return + self.set_rel_hs(ev.pos) + + def handle_mousebuttonup(self, ev): + if not self.pressed: + return + self.set_rel_hs(ev.pos) + self.pressed = False + + @staticmethod + def remove_offset_and_crop(value, offset, out_range): + value -= offset + if value < out_range[0]: + value = out_range[0] + elif value >= out_range[1]: + value = out_range[1] - 1 + return value + + def set_rel_hs(self, pos): + sz = self.rect.size + x = self.remove_offset_and_crop(pos[0], self.rect.left, (0, sz[0])) + y = self.remove_offset_and_crop(pos[1], self.rect.top, (0, sz[1])) + self.hs_pos = (x, y) + self.parent.set_channel(x * 255 / sz[0], "h", self) + self.parent.set_channel((sz[1] - 1 - y) * 255 / sz[1], "s", self) class HSSlider(Slider): -- 2.51.0