Package muntjac :: Package addon :: Package colorpicker :: Module color_picker
[hide private]
[frames] | no frames]

Source Code for Module muntjac.addon.colorpicker.color_picker

  1  # Copyright (C) 2012 Vaadin Ltd.  
  2  # Copyright (C) 2012 Richard Lincoln 
  3  #  
  4  # Licensed under the Apache License, Version 2.0 (the "License");  
  5  # you may not use this file except in compliance with the License.  
  6  # You may obtain a copy of the License at  
  7  #  
  8  #     http://www.apache.org/licenses/LICENSE-2.0  
  9  #  
 10  # Unless required by applicable law or agreed to in writing, software  
 11  # distributed under the License is distributed on an "AS IS" BASIS,  
 12  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
 13  # See the License for the specific language governing permissions and  
 14  # limitations under the License. 
 15   
 16  from muntjac.addon.colorpicker.color import Color 
 17   
 18  from muntjac.ui.abstract_component import AbstractComponent 
 19  from muntjac.ui.window import ICloseListener 
 20   
 21  from muntjac.addon.colorpicker.color_change_event import ColorChangeEvent 
 22  from muntjac.addon.colorpicker.color_selector import IColorSelector 
 23   
 24   
25 -class IColorChangeListener(object):
26 """The listener interface for receiving colorChange events. The class that 27 is interested in processing a colorChange event implements this 28 interface, and the object created with that class is registered with a 29 component using the component's C{addColorChangeListener} method. When 30 the colorChange event occurs, that object's appropriate 31 method is invoked. 32 33 @see: L{ColorChangeEvent} 34 """ 35
36 - def colorChanged(self, event):
37 raise NotImplementedError
38 39 40 _COLOR_CHANGE_METHOD = getattr(IColorChangeListener, 'colorChanged') 41 42
43 -class ColorPicker(AbstractComponent, ICloseListener, IColorSelector, 44 IColorChangeListener):
45 """ColorPicker 46 47 @author: John Ahlroos / ITMill Oy 48 @author: Richard Lincoln 49 """ 50 51 CLIENT_WIDGET = None #ClientWidget(VColorPickerButton) 52 53 TYPE_MAPPING = 'com.vaadin.addon.colorpicker.ColorPicker' 54
55 - def __init__(self, caption='Colors', initialColor=None):
56 """Instantiates a new color picker. 57 58 @param caption: 59 the caption 60 @param initialColor: 61 the initial color 62 """ 63 self.buttonStyle = str(ButtonStyle.BUTTON_NORMAL) 64 65 self.popupStyle = PopupStyle.POPUP_NORMAL 66 67 self.buttonCaption = '' 68 69 # The window. 70 self._window = None 71 72 # The window. 73 self._parent_window = None 74 75 # The popup status. 76 self._popupStatus = False 77 78 self._positionX = 0 79 self._positionY = 0 80 81 self.rgbVisible = True 82 self.hsvVisible = True 83 self.swatchesVisible = True 84 self.historyVisible = True 85 self.textfieldVisible = True 86 87 if initialColor is None: 88 initialColor = Color(0, 0, 0) 89 90 # The color. 91 self.color = initialColor 92 self.caption = caption 93 94 super(ColorPicker, self).__init__()
95 96
97 - def setColor(self, color):
98 self.color = color 99 if self._window is not None: 100 self._window.setColor(color) 101 self.requestRepaint()
102 103
104 - def getColor(self):
105 return self.color
106 107
108 - def setPosition(self, x, y):
109 """Sets the position of the popup window 110 111 @param x: 112 the x-coordinate 113 @param y: 114 the y-coordinate 115 """ 116 self._positionX = x 117 self._positionY = y 118 if self._window is not None: 119 self._window.setPositionX(x) 120 self._window.setPositionY(y)
121 122
123 - def addListener(self, listener, iface=None):
124 125 if (isinstance(listener, IColorChangeListener) and 126 (iface is None or issubclass(iface, IColorChangeListener))): 127 self.registerListener(ColorChangeEvent, listener, 128 _COLOR_CHANGE_METHOD) 129 130 super(ColorPicker, self).addListener(listener, iface)
131 132
133 - def addCallback(self, callback, eventType=None, *args):
134 if eventType is None: 135 eventType = callback._eventType # set by decorator 136 137 if issubclass(eventType, ColorChangeEvent): 138 self.registerCallback(ColorChangeEvent, callback, None, *args) 139 else: 140 super(ColorPicker, self).addCallback(callback, eventType, *args)
141 142
143 - def removeListener(self, listener, iface=None):
144 145 if (isinstance(listener, IColorChangeListener) and 146 (iface is None or issubclass(iface, IColorChangeListener))): 147 self.withdrawListener(ColorChangeEvent, listener) 148 149 super(ColorPicker, self).removeListener(listener, iface)
150 151
152 - def removeCallback(self, callback, eventType=None):
153 if eventType is None: 154 eventType = callback._eventType 155 156 if issubclass(eventType, ColorChangeEvent): 157 self.withdrawCallback(ColorChangeEvent, callback) 158 159 else: 160 super(ColorPicker, self).removeCallback(callback, eventType)
161 162
163 - def paintContent(self, target):
164 target.addAttribute('red', '%.2x' % self.color.getRed()) 165 target.addAttribute('green', '%.2x' % self.color.getGreen()) 166 target.addAttribute('blue', '%.2x' % self.color.getBlue()) 167 target.addAttribute('alpha', self.color.getAlpha()) 168 target.addAttribute('popup', self._popupStatus) 169 target.addAttribute('btnstyle', self.buttonStyle) 170 target.addAttribute('btncaption', self.buttonCaption)
171 172
173 - def changeVariables(self, source, variables):
174 if 'popup' in variables: 175 openPopup = variables['popup'] 176 if openPopup and not self.isReadOnly(): 177 if self._parent_window is None: 178 self._parent_window = self.getWindow() 179 180 # Check that the parent is actually a browser 181 # level window and not another sub-window 182 if self._parent_window.getParent() is not None: 183 self._parent_window = self._parent_window.getParent() 184 185 if self._window is None: 186 # Create the popup 187 188 from muntjac.addon.colorpicker.color_picker_popup \ 189 import ColorPickerPopup 190 191 self._window = ColorPickerPopup(self.color) 192 self._window.setCaption(self.caption) 193 194 self._window.setRGBTabVisible(self.rgbVisible) 195 self._window.setHSVTabVisible(self.hsvVisible) 196 self._window.setSwatchesTabVisible(self.swatchesVisible) 197 self._window.setHistoryVisible(self.historyVisible) 198 self._window.setPreviewVisible(self.textfieldVisible) 199 200 self._window.setImmediate(True) 201 self._window.addListener(self, ICloseListener) 202 self._window.addListener(self, IColorChangeListener) 203 204 self._window.getHistory().setColor(self.color) 205 self._parent_window.addWindow(self._window) 206 self._window.setVisible(True) 207 self._window.setPositionX(self._positionX) 208 self._window.setPositionY(self._positionY) 209 else: 210 self._window.setRGBTabVisible(self.rgbVisible) 211 self._window.setHSVTabVisible(self.hsvVisible) 212 self._window.setSwatchesTabVisible(self.swatchesVisible) 213 self._window.setHistoryVisible(self.historyVisible) 214 self._window.setPreviewVisible(self.textfieldVisible) 215 216 self._window.setColor(self.color) 217 self._window.getHistory().setColor(self.color) 218 self._window.setVisible(True) 219 self._parent_window.addWindow(self._window) 220 elif self._window is not None: 221 self._window.setVisible(False) 222 self._parent_window.removeWindow(self._window)
223 224
225 - def windowClose(self, e):
226 if e.getWindow() == self._window: 227 self._popupStatus = False 228 self.requestRepaint()
229 230
231 - def colorChanged(self, event):
232 """Fired when a color change event occurs 233 234 @param event: 235 The color change event 236 """ 237 self.color = event.getColor() 238 self.fireColorChanged()
239 240
241 - def fireColorChanged(self):
242 """Notifies the listeners that the selected color has changed""" 243 self.fireEvent(ColorChangeEvent(self, self.color))
244 245
246 - def setButtonStyle(self, style):
247 """Sets the style of the button 248 249 @param style: 250 The style 251 """ 252 self.buttonStyle = str(style)
253 254
255 - def setPopupStyle(self, style):
256 """The style for the popup window 257 258 @param style: 259 The style 260 """ 261 self.popupStyle = style 262 263 if style == self.POPUP_NORMAL: 264 self.setRGBVisibility(True) 265 self.setHSVVisibility(True) 266 self.setSwatchesVisibility(True) 267 self.setHistoryVisibility(True) 268 self.setTextfieldVisibility(True) 269 elif style == self.POPUP_SIMPLE: 270 self.setRGBVisibility(False) 271 self.setHSVVisibility(False) 272 self.setSwatchesVisibility(True) 273 self.setHistoryVisibility(False) 274 self.setTextfieldVisibility(False)
275 276
277 - def setButtonCaption(self, caption):
278 """Sets the caption of the button. This replaces the css color code 279 displayed as the caption. 280 281 @param caption: 282 The caption of the button 283 """ 284 self.buttonCaption = '' if caption is None else caption
285 286
287 - def setRGBVisibility(self, visible):
288 """Set the visibility of the RGB Tab 289 290 @param visible: 291 The visibility 292 """ 293 if not visible and not self.hsvVisible and not self.swatchesVisible: 294 raise ValueError('Cannot hide all tabs.') 295 296 self.rgbVisible = visible 297 if self._window is not None: 298 self._window.setRGBTabVisible(visible)
299 300
301 - def setHSVVisibility(self, visible):
302 """Set the visibility of the HSV Tab 303 304 @param visible: 305 The visibility 306 """ 307 if not visible and not self.rgbVisible and not self.swatchesVisible: 308 raise ValueError('Cannot hide all tabs.') 309 310 self.hsvVisible = visible 311 if self._window is not None: 312 self._window.setHSVTabVisible(visible)
313 314
315 - def setSwatchesVisibility(self, visible):
316 """Set the visibility of the Swatches Tab 317 318 @param visible: 319 The visibility 320 """ 321 if not visible and not self.hsvVisible and not self.rgbVisible: 322 raise ValueError('Cannot hide all tabs.') 323 324 self.swatchesVisible = visible 325 if self._window is not None: 326 self._window.setSwatchesTabVisible(visible)
327 328
329 - def setHistoryVisibility(self, visible):
330 """Sets the visibility of the Color History 331 332 @param visible: 333 The visibility 334 """ 335 self.historyVisible = visible 336 if self._window is not None: 337 self._window.setHistoryVisible(visible)
338 339
340 - def setTextfieldVisibility(self, visible):
341 """Sets tje visibility of the CSS color code text field 342 343 @param visible: 344 The visibility 345 """ 346 self.textfieldVisible = visible 347 if self._window is not None: 348 self._window.setPreviewVisible(visible)
349 350
351 -class ICoordinates2Color(object):
352 """Interface for converting 2d-coordinates to a Color""" 353
354 - def calculate(self, c_or_x, y=None):
355 """Calculate color from coordinates 356 357 @param c_or_x: 358 the c or the x-coordinate 359 @param y 360 the y-coordinate 361 362 @return the integer array with the coordinates or the color 363 """ 364 raise NotImplementedError
365 366
367 -class ButtonStyle(object):
368 369 BUTTON_NORMAL = None 370 BUTTON_AREA = None 371 372 _style = None 373
374 - def __init__(self, styleName):
375 self._style = styleName
376
377 - def __str__(self):
378 return self._style
379 380 ButtonStyle.BUTTON_NORMAL = ButtonStyle('normal') 381 ButtonStyle.BUTTON_AREA = ButtonStyle('area') 382 383
384 -class PopupStyle(object):
385 386 POPUP_NORMAL = None 387 POPUP_SIMPLE = None 388 389 _style = None 390
391 - def __init__(self, styleName):
392 self._style = styleName
393
394 - def __str__(self):
395 return self._style
396 397 PopupStyle.POPUP_NORMAL = PopupStyle('normal') 398 PopupStyle.POPUP_SIMPLE = PopupStyle('simple') 399