예제 #1
0
class ColorRange:
    '''
    Graphical interface to choose colors

    Advise: choose a dimension with a 9/5 ration

    Selected color stored in: chosen_color

    '''
    def __init__(self, dim, pos):

        dim_cr = (round(dim[0] * 5 / 9), dim[1])
        dim_bar = (round(dim[0] * 1 / 18), dim[1])
        dim_ptr = (round(dim[0] / 90), round(dim[0] / 90))
        dim_view = (round(dim[0] * 5 / 18), dim[1])

        pos_ptr = (round(pos[0] + dim_cr[0] / 2),
                   round(pos[1] + dim_cr[1] / 2))
        pos_bar = (pos[0] + dim_cr[0] + dim_bar[0], pos[1])
        pos_view = (pos[0] + dim_cr[0] + 3 * dim_bar[0], pos[1])

        self.cadre = Cadre(dim, pos, set_transparent=True)
        # create color range img
        self.arr_color = get_color_range([255, 0, 0])
        self.color_range = Button(dim_cr,
                                  pos,
                                  surface=self.arr_color,
                                  highlight=False)

        self.pointer = Form(dim_ptr, pos_ptr, C.LIGHT_GREY)
        self.bar_pointer = Form((dim_bar[0], dim_ptr[0]), pos_bar,
                                C.LIGHT_GREY)

        self.arr_bar = create_color_bar(150)
        self.color_bar = Button(dim_bar,
                                pos_bar,
                                surface=self.arr_bar,
                                highlight=False)

        self.color_view = Form(dim_view, pos_view)

        self.range_active = False
        self.bar_active = False
        self.chosen_color = None

    def react_events(self, events, pressed):
        if self.color_range.pushed(events):
            self.range_active = not self.range_active  # activate/deactivate color selection

        if self.color_bar.pushed(events):
            self.bar_active = not self.bar_active

        # update pointer position
        if self.range_active:
            mouse_pos = Interface.mouse_pos
            # check that pointer is still on surf
            if self.color_range.on_it():
                self.pointer.set_pos(mouse_pos, center=True)
            else:
                self.range_active = False

        # update bar pointer position
        if self.bar_active:
            mouse_pos = Interface.mouse_pos
            # check that pointer is still on surf
            if self.color_bar.on_it():
                self.bar_pointer.set_pos(
                    (self.bar_pointer.pos[0], mouse_pos[1]))
            else:
                self.bar_active = False
                # set last color range
                self.set_color_range()

    def set_color_range(self):
        '''Create a new color range based on the current bar color'''
        # first get base_color
        y = self.bar_pointer.pos[1] - self.cadre.pos[1]
        y = int(y * 6 * 256 / self.cadre.dim[1])

        base_color = self.arr_bar[0, y, :]

        # create a new color range
        self.arr_color = get_color_range(base_color)
        self.color_range.set_surf(surface=self.arr_color)

    @set_color_range_deco
    def check_set_color_range(self):
        '''Use a delayer to avoid freaking out the cpu for no reason (creating the color range is quite heavy)'''
        if self.bar_active:
            self.set_color_range()
            return True

    def set_view_color(self):
        '''
        Get the selected color in color range, get the correct pixel of arr_color and set color_view's color
        '''
        # get color
        x = self.pointer.pos[0] - self.cadre.pos[0]
        x = int(x * 256 / self.color_range.dim[0])
        y = self.pointer.pos[1] - self.cadre.pos[1]
        y = int(y * 256 / self.color_range.dim[1])

        if x < 0:
            x = 0
        if y < 0:
            y = 0

        color = self.arr_color[x, y, :]
        # set new color
        self.color_view.set_color(color)
        # store color
        self.chosen_color = list(color)

    def display(self):
        # update colors
        self.set_view_color()
        self.check_set_color_range()
        # display everything
        self.color_range.display()
        self.color_bar.display()
        self.pointer.display()
        self.bar_pointer.display()
        self.color_view.display()
        self.cadre.display()