class ColorPickerSelect(CustomComponent, IColorSelector, IValueChangeListener): """The Class ColorPickerSelect. @author: John Ahlroos / ITMill Oy LTd 2010 @author: Richard Lincoln """ def __init__(self): """Instantiates a new color picker select. @param rows the rows @param columns the columns """ super(ColorPickerSelect, self).__init__() layout = VerticalLayout() self.setCompositionRoot(layout) self.setStyleName('colorselect') self.setWidth('220px') self._range = Select() self._range.setImmediate(True) self._range.setImmediate(True) self._range.setNullSelectionAllowed(False) self._range.setNewItemsAllowed(False) self._range.setWidth('220px') self._range.addListener(self, IValueChangeListener) for Id in ColorRangePropertyId.values(): self._range.addItem(Id) layout.addComponent(self._range) self._grid = ColorPickerGrid(self.createAllColors(14, 10)) self._grid.setWidth('220px') self._grid.setHeight('270px') layout.addComponent(self._grid) self._range.select(ColorRangePropertyId.ALL) def createAllColors(self, rows, columns): """Creates the all colors. @param rows: the rows @param columns: the columns @return: the color[][] """ colors = [([None] * columns) for _ in range(rows)] for row in range(rows): for col in range(columns): # Create the color grid by varying the saturation and value if row < rows - 1: # Calculate new hue value # The last row should have the black&white gradient hue = col / columns saturation = 1.0 value = 1.0 # For the upper half use value=1 and variable saturation if row < rows / 2: saturation = (row + 1.0) / rows / 2.0 else: value = 1.0 - ((row - (rows / 2.0)) / rows / 2.0) colors[row][col] = \ Color(*hsv_to_rgb(hue, saturation, value)) else: hue = 0.0 saturation = 0.0 value = 1.0 - (col / columns) colors[row][col] = \ Color(*hsv_to_rgb(hue, saturation, value)) return colors def createColor(self, color, rows, columns): """Creates the color. @param color: the color @param rows: the rows @param columns: the columns @return: the color[][] """ colors = [([None] * columns) for _ in range(rows)] hsv = color.getHSV() hue = hsv[0] saturation = 1.0 value = 1.0 for row in range(rows): for col in range(columns): index = (row * columns) + col saturation = 1.0 value = 1.0 if index <= (rows * columns) / 2: saturation = index / (rows * columns) / 2.0 else: index -= (rows * columns) / 2 value = 1.0 - (index / (rows * columns) / 2.0) colors[row][col] = Color(*hsv_to_rgb(hue, saturation, value)) return colors def addListener(self, listener, iface=None): self._grid.addListener(listener, iface) def removeListener(self, listener, iface=None): self._grid.removeListener(listener, iface) def getColor(self): return self._grid.getColor() def setColor(self, color): self._grid.getColor() def valueChange(self, event): if self._grid is None: return if event.getProperty().getValue() == ColorRangePropertyId.ALL: self._grid.setColorGrid(self.createAllColors(14, 10)) elif event.getProperty().getValue() == ColorRangePropertyId.RED: self._grid.setColorGrid(self.createColor(Color(255, 0, 0), 14, 10)) elif event.getProperty().getValue() == ColorRangePropertyId.GREEN: self._grid.setColorGrid(self.createColor(Color(0, 255, 0), 14, 10)) elif event.getProperty().getValue() == ColorRangePropertyId.BLUE: self._grid.setColorGrid(self.createColor(Color(0, 0, 255), 14, 10))
class ColorPickerHistory(CustomComponent, IColorSelector, IColorChangeListener): """The Class ColorPickerHistory. @author: John Ahlroos @author: Richard lincoln """ _STYLENAME = 'v-colorpicker-history' #: The rows. _rows = 4 #: The columns. _columns = 15 #: The colorHistory. This is common for all colorpickers _colorHistory = deque() #: The grid. _grid = None def __init__(self): """Instantiates a new color picker history.""" super(ColorPickerHistory, self).__init__() self.removeStyleName('v-customcomponent') self.setStyleName(self._STYLENAME) self._grid = ColorPickerGrid(self._rows, self._columns) self._grid.setWidth('100%') self._grid.setPosition(0, 0) self._grid.addListener(self, IColorChangeListener) self.setCompositionRoot(self._grid) def setHeight(self, height, unit=None): super(ColorPickerHistory, self).setHeight(height, unit) self._grid.setHeight(height, unit) def setColor(self, color): # Check that the color does not already exist exists = False for c in self._colorHistory: if color == c: exists = True break # If the color does not exist then add it if not exists: self._colorHistory.append(color) colorList = list(self._colorHistory) # Invert order of colors colorList.reverse() # Move the selected color to the front of the list colorList.insert(0, colorList.pop( colorList.index(color) )) # Create 2d color map colors = [([None] * self._columns) for _ in range(self._rows)] iterator = iter(colorList) for row in range(self._rows): for col in range(self._columns): try: colors[row][col] = iterator.next() except StopIteration: colors[row][col] = Color.WHITE self._grid.setColorGrid(colors) self._grid.requestRepaint() def getColor(self): return self._colorHistory[0] def getHistory(self): """Gets the history. @return: the history """ array = list(self._colorHistory) return array def hasColor(self, c): """Checks for color. @param c: the c @return: true, if successful """ return c in self._colorHistory def addListener(self, listener, iface=None): """Adds a color change listener @param listener: The color change listener """ if (isinstance(listener, IColorChangeListener) and (iface is None or issubclass(iface, IColorChangeListener))): self.registerListener(ColorChangeEvent, listener, _COLOR_CHANGE_METHOD) super(ColorPickerHistory, self).addListener(listener, iface) def addCallback(self, callback, eventType=None, *args): if eventType is None: eventType = callback._eventType # set by decorator if issubclass(eventType, ColorChangeEvent): self.registerCallback(ColorChangeEvent, callback, None, *args) else: super(ColorPickerHistory, self).addCallback(callback, eventType, *args) def removeListener(self, listener, iface=None): """Removes a color change listener @param listener: The listener """ if (isinstance(listener, IColorChangeListener) and (iface is None or issubclass(iface, IColorChangeListener))): self.withdrawListener(ColorChangeEvent, listener) super(ColorPickerHistory, self).removeListener(listener, iface) def removeCallback(self, callback, eventType=None): if eventType is None: eventType = callback._eventType if issubclass(eventType, ColorChangeEvent): self.withdrawCallback(ColorChangeEvent, callback) else: super(ColorPickerHistory, self).removeCallback(callback, eventType) def colorChanged(self, event): self.fireEvent(ColorChangeEvent(self, event.getColor()))