]> git.mar77i.info Git - zenbook_gui/commitdiff
HSMap: basic event handling
authormar77i <mar77i@protonmail.ch>
Sun, 20 Jul 2025 09:10:04 +0000 (11:10 +0200)
committermar77i <mar77i@protonmail.ch>
Sun, 20 Jul 2025 09:10:04 +0000 (11:10 +0200)
bookpaint/color_menu.py

index b585f6c7d328e72284f89b32875d6433a6d4be1e..275eff16e85828a2766993604f3f3ceccdb09d7f 100644 (file)
@@ -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):