def get_selection_rectangle(self): rect = Rectangle( stroke_color=self.selection_rectangle_stroke_color, stroke_width=self.selection_rectangle_stroke_width, ) rect.fix_in_frame() rect.fixed_corner = ORIGIN rect.add_updater(self.update_selection_rectangle) return rect
class ColorSliders(Group): CONFIG = { "sliders_kwargs": {}, "rect_kwargs": { "width": 2.0, "height": 0.5, "stroke_opacity": 1.0 }, "background_grid_kwargs": { "colors": [GREY_A, GREY_C], "single_square_len": 0.1 }, "sliders_buff": MED_LARGE_BUFF, "default_rgb_value": 255, "default_a_value": 1, } def __init__(self, **kwargs): digest_config(self, kwargs) rgb_kwargs = { "value": self.default_rgb_value, "min_value": 0, "max_value": 255, "step": 1 } a_kwargs = { "value": self.default_a_value, "min_value": 0, "max_value": 1, "step": 0.04 } self.r_slider = LinearNumberSlider(**self.sliders_kwargs, **rgb_kwargs) self.g_slider = LinearNumberSlider(**self.sliders_kwargs, **rgb_kwargs) self.b_slider = LinearNumberSlider(**self.sliders_kwargs, **rgb_kwargs) self.a_slider = LinearNumberSlider(**self.sliders_kwargs, **a_kwargs) self.sliders = Group(self.r_slider, self.g_slider, self.b_slider, self.a_slider) self.sliders.arrange(DOWN, buff=self.sliders_buff) self.r_slider.slider.set_color(RED) self.g_slider.slider.set_color(GREEN) self.b_slider.slider.set_color(BLUE) self.a_slider.slider.set_color_by_gradient([BLACK, WHITE]) self.selected_color_box = Rectangle(**self.rect_kwargs) self.selected_color_box.add_updater(lambda mob: mob.set_fill( self.get_picked_color(), self.get_picked_opacity())) self.background = self.get_background() super().__init__( Group(self.background, self.selected_color_box).fix_in_frame(), self.sliders, **kwargs) self.arrange(DOWN) def get_background(self): single_square_len = self.background_grid_kwargs["single_square_len"] colors = self.background_grid_kwargs["colors"] width = self.rect_kwargs["width"] height = self.rect_kwargs["height"] rows = int(height / single_square_len) cols = int(width / single_square_len) cols = (cols + 1) if (cols % 2 == 0) else cols single_square = Square(single_square_len) grid = single_square.get_grid(n_rows=rows, n_cols=cols, buff=0.0) grid.stretch_to_fit_width(width) grid.stretch_to_fit_height(height) grid.move_to(self.selected_color_box) for idx, square in enumerate(grid): assert (isinstance(square, Square)) square.set_stroke(width=0.0, opacity=0.0) square.set_fill(colors[idx % len(colors)], 1.0) return grid def set_value(self, r, g, b, a): self.r_slider.set_value(r) self.g_slider.set_value(g) self.b_slider.set_value(b) self.a_slider.set_value(a) def get_value(self): r = self.r_slider.get_value() / 255 g = self.g_slider.get_value() / 255 b = self.b_slider.get_value() / 255 alpha = self.a_slider.get_value() return color_to_rgba(rgb_to_color((r, g, b)), alpha=alpha) def get_picked_color(self): rgba = self.get_value() return rgb_to_hex(rgba[:3]) def get_picked_opacity(self): rgba = self.get_value() return rgba[3]