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)
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):