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

Source Code for Module muntjac.addon.colorpicker.color_picker_popup

  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  import sys 
 17  import traceback 
 18   
 19  from colorsys import hsv_to_rgb 
 20   
 21  from muntjac.ui.window import Window 
 22  from muntjac.ui.button import IClickListener, Button 
 23  from muntjac.ui.tab_sheet import TabSheet 
 24  from muntjac.ui.vertical_layout import VerticalLayout 
 25   
 26  from muntjac.addon.colorpicker.color import Color 
 27   
 28   
 29  from muntjac.addon.colorpicker.color_picker \ 
 30      import ICoordinates2Color, IColorChangeListener 
 31   
 32  from muntjac.addon.colorpicker.color_picker_history import ColorPickerHistory 
 33  from muntjac.addon.colorpicker.color_change_event import ColorChangeEvent 
 34  from muntjac.addon.colorpicker.color_picker_preview import ColorPickerPreview 
 35  from muntjac.addon.colorpicker.color_picker_select import ColorPickerSelect 
 36  from muntjac.addon.colorpicker.color_selector import IColorSelector 
 37  from muntjac.addon.colorpicker.color_picker_gradient import ColorPickerGradient 
 38  from muntjac.ui.horizontal_layout import HorizontalLayout 
 39  from muntjac.ui.alignment import Alignment 
 40  from muntjac.ui.slider import Slider, ValueOutOfBoundsException 
 41  from muntjac.data.property import IValueChangeListener 
 42   
 43   
 44  _COLOR_CHANGE_METHOD = getattr(IColorChangeListener, 'colorChanged') 
 45   
 46   
47 -class ColorPickerPopup(Window, IClickListener, IColorChangeListener, 48 IColorSelector):
49 """The Class ColorPickerPopup. 50 51 @author: John Ahlroos / ITMill Oy 52 @author: Richard Lincoln 53 """ 54 55 _STYLENAME = 'v-colorpicker-popup' 56
57 - def __init__(self, initialColor):
58 """Instantiates a new color picker popup.""" 59 60 #: The tabs. 61 self._tabs = TabSheet() 62 63 #: The layout. 64 self._layout = VerticalLayout() 65 66 #: The ok button. 67 self._ok = Button('OK') 68 69 #: The cancel button. 70 self._cancel = Button('Cancel') 71 72 #: The resize button. 73 self._resize = Button('...') 74 75 #: The selected color. 76 self._selectedColor = Color.WHITE 77 78 #: The history. 79 self._history = None 80 81 #: The history container. 82 self._historyContainer = None 83 84 #: The rgb gradient. 85 self._rgbGradient = None 86 87 #: The hsv gradient. 88 self._hsvGradient = None 89 90 #: The red slider. 91 self._redSlider = None 92 93 #: The green slider. 94 self._greenSlider = None 95 96 #: The blue slider. 97 self._blueSlider = None 98 99 #: The hue slider. 100 self._hueSlider = None 101 102 #: The saturation slider. 103 self._saturationSlider = None 104 105 #: The value slider. 106 self._valueSlider = None 107 108 #: The preview on the rgb tab. 109 self._rgbPreview = None 110 111 #: The preview on the hsv tab. 112 self._hsvPreview = None 113 114 #: The preview on the swatches tab. 115 self._selPreview = None 116 117 #: The color select. 118 self._colorSelect = None 119 120 #: The selectors. 121 self._selectors = set() 122 123 super(ColorPickerPopup, self).__init__() 124 125 self._selectedColor = initialColor 126 127 self.setWidth('250px') 128 self.setScrollable(False) 129 self.setStyleName(self._STYLENAME) 130 self.setResizable(False) 131 self.setImmediate(True) 132 133 # Create the history 134 self._history = ColorPickerHistory() 135 self._history.addListener(self, IColorChangeListener) 136 137 # Create the preview on the rgb tab 138 self._rgbPreview = ColorPickerPreview(self._selectedColor) 139 self._rgbPreview.setWidth('220px') 140 self._rgbPreview.setHeight('20px') 141 self._rgbPreview.addListener(self, IColorChangeListener) 142 self._selectors.add(self._rgbPreview) 143 144 # Create the preview on the hsv tab 145 self._hsvPreview = ColorPickerPreview(self._selectedColor) 146 self._hsvPreview.setWidth('220px') 147 self._hsvPreview.setHeight('20px') 148 self._hsvPreview.addListener(self, IColorChangeListener) 149 self._selectors.add(self._hsvPreview) 150 151 # Create the preview on the swatches tab 152 self._selPreview = ColorPickerPreview(self._selectedColor) 153 self._selPreview.setWidth('220px') 154 self._selPreview.setHeight('20px') 155 self._selPreview.addListener(self, IColorChangeListener) 156 self._selectors.add(self._selPreview) 157 158 # Set the layout 159 self._layout.setSpacing(False) 160 self._layout.setSizeFull() 161 self.setContent(self._layout) 162 163 # Create the tabs 164 self._rgbTab = self.createRGBTab(self._selectedColor) 165 self._tabs.addTab(self._rgbTab, 'RGB', None) 166 167 self._hsvTab = self.createHSVTab(self._selectedColor) 168 self._tabs.addTab(self._hsvTab, 'HSV', None) 169 170 self._swatchesTab = self.createSelectTab() 171 self._tabs.addTab(self._swatchesTab, 'Swatches', None) 172 173 # Add the tabs 174 self._tabs.setWidth('100%') 175 176 self._layout.addComponent(self._tabs) 177 178 # Add the history 179 self._history.setWidth('97%') 180 self._history.setHeight('27px') 181 182 # Create the default colors 183 defaultColors = list() 184 defaultColors.append(Color.BLACK) 185 defaultColors.append(Color.WHITE) 186 187 # Create the history 188 innerContainer = VerticalLayout() 189 innerContainer.setSizeFull() 190 innerContainer.addComponent(self._history) 191 innerContainer.setExpandRatio(self._history, 1) 192 193 outerContainer = VerticalLayout() 194 outerContainer.setWidth('99%') 195 outerContainer.setHeight('27px') 196 outerContainer.addComponent(innerContainer) 197 self._historyContainer = outerContainer 198 199 self._layout.addComponent(self._historyContainer) 200 201 # Add the resize button for the history 202 self._resize.addListener(self, IClickListener) 203 self._resize.setData(False) 204 self._resize.setWidth('100%') 205 self._resize.setHeight('10px') 206 self._resize.setStyleName('resize-button') 207 self._layout.addComponent(self._resize) 208 209 # Add the buttons 210 self._ok.setWidth('70px') 211 self._ok.addListener(self, IClickListener) 212 213 self._cancel.setWidth('70px') 214 self._cancel.addListener(self, IClickListener) 215 216 buttons = HorizontalLayout() 217 buttons.addComponent(self._ok) 218 buttons.addComponent(self._cancel) 219 buttons.setWidth('100%') 220 buttons.setHeight('30px') 221 buttons.setComponentAlignment(self._ok, Alignment.MIDDLE_CENTER) 222 buttons.setComponentAlignment(self._cancel, Alignment.MIDDLE_CENTER) 223 self._layout.addComponent(buttons) 224 225 self.setHeight(self.calculateHeight())
226 227
228 - def calculateHeight(self):
229 """Calculates the height of the popup menu 230 231 @return: Returns the height in CSS string representation 232 """ 233 if self._historyContainer.isVisible(): 234 historyHeight = self._historyContainer.getHeight() 235 else: 236 historyHeight = 0 237 238 tabsHeight = 0 if self._tabs.areTabsHidden() else 32 239 contentHeight = 370 240 buttonsHeight = 30 241 previewHeight = 20 if self._rgbPreview.isVisible() else 0 242 243 return (str(historyHeight + tabsHeight + contentHeight + buttonsHeight 244 + previewHeight + 10) + 'px')
245 246
247 - def createRGBTab(self, color):
248 """Creates the rgb tab. 249 250 @return: the component 251 """ 252 rgbLayout = VerticalLayout() 253 rgbLayout.setMargin(False, False, True, False) 254 rgbLayout.addComponent(self._rgbPreview) 255 256 # Add the RGB color gradient 257 self._rgbGradient = ColorPickerGradient('rgb-gradient', RGBConverter()) 258 self._rgbGradient.setColor(color) 259 self._rgbGradient.addListener(self, IColorChangeListener) 260 rgbLayout.addComponent(self._rgbGradient) 261 self._selectors.add(self._rgbGradient) 262 263 # Add the RGB sliders 264 sliders = VerticalLayout() 265 sliders.setStyleName('rgb-sliders') 266 267 self._redSlider = Slider('Red', 0, 255) 268 try: 269 self._redSlider.setValue(color.getRed()) 270 except ValueOutOfBoundsException: 271 pass 272 273 self._redSlider.setImmediate(True) 274 self._redSlider.setWidth('220px') 275 self._redSlider.setStyleName('rgb-slider') 276 self._redSlider.addStyleName('red') 277 self._redSlider.addListener(RedValueChangeListener(self), 278 IValueChangeListener) 279 sliders.addComponent(self._redSlider) 280 281 self._greenSlider = Slider('Green', 0, 255) 282 try: 283 self._greenSlider.setValue(color.getGreen()) 284 except ValueOutOfBoundsException: 285 pass 286 287 self._greenSlider.setStyleName('rgb-slider') 288 self._greenSlider.addStyleName('green') 289 self._greenSlider.setWidth('220px') 290 self._greenSlider.setImmediate(True) 291 self._greenSlider.addListener(GreenValueChangeListener(self), 292 IValueChangeListener) 293 sliders.addComponent(self._greenSlider) 294 295 self._blueSlider = Slider('Blue', 0, 255) 296 try: 297 self._blueSlider.setValue(color.getBlue()) 298 except ValueOutOfBoundsException: 299 pass 300 301 self._blueSlider.setStyleName('rgb-slider') 302 self._blueSlider.setStyleName('blue') 303 self._blueSlider.setImmediate(True) 304 self._blueSlider.setWidth('220px') 305 self._blueSlider.addListener(BlueValueChangeListener(self), 306 IValueChangeListener) 307 sliders.addComponent(self._blueSlider) 308 309 rgbLayout.addComponent(sliders) 310 311 return rgbLayout
312 313
314 - def createHSVTab(self, color):
315 """Creates the hsv tab. 316 317 @return: the component 318 """ 319 hsvLayout = VerticalLayout() 320 hsvLayout.setMargin(False, False, True, False) 321 hsvLayout.addComponent(self._hsvPreview) 322 323 # Add the hsv gradient 324 self._hsvGradient = ColorPickerGradient('hsv-gradient', 325 HSVConverter(self)) 326 self._hsvGradient.setColor(color) 327 self._hsvGradient.addListener(self, IColorChangeListener) 328 hsvLayout.addComponent(self._hsvGradient) 329 self._selectors.add(self._hsvGradient) 330 331 # Add the hsv sliders 332 hsv = color.getHSV() 333 sliders = VerticalLayout() 334 sliders.setStyleName('hsv-sliders') 335 336 self._hueSlider = Slider('Hue', 0, 360) 337 try: 338 self._hueSlider.setValue(hsv[0]) 339 except ValueOutOfBoundsException: 340 pass 341 342 self._hueSlider.setStyleName('hsv-slider') 343 self._hueSlider.addStyleName('hue-slider') 344 self._hueSlider.setWidth('220px') 345 self._hueSlider.setImmediate(True) 346 self._hueSlider.addListener(HueValueChangeListener(self), 347 IColorChangeListener) 348 sliders.addComponent(self._hueSlider) 349 350 self._saturationSlider = Slider('Saturation', 0, 100) 351 try: 352 self._saturationSlider.setValue(hsv[1]) 353 except ValueOutOfBoundsException: 354 pass 355 356 self._saturationSlider.setStyleName('hsv-slider') 357 self._saturationSlider.setWidth('220px') 358 self._saturationSlider.setImmediate(True) 359 self._saturationSlider.addListener(SaturationValueChangeListener(self), 360 IColorChangeListener) 361 sliders.addComponent(self._saturationSlider) 362 363 self._valueSlider = Slider('Value', 0, 100) 364 try: 365 self._valueSlider.setValue(hsv[2]) 366 except ValueOutOfBoundsException: 367 pass 368 369 self._valueSlider.setStyleName('hsv-slider') 370 self._valueSlider.setWidth('220px') 371 self._valueSlider.setImmediate(True) 372 self._valueSlider.addListener(BrightnessValueChangeListener(self), 373 IColorChangeListener) 374 sliders.addComponent(self._valueSlider) 375 376 hsvLayout.addComponent(sliders) 377 378 return hsvLayout
379 380
381 - def createSelectTab(self):
382 """Creates the select tab. 383 384 @return: the component 385 """ 386 selLayout = VerticalLayout() 387 selLayout.setMargin(False, False, True, False) 388 selLayout.addComponent(self._selPreview) 389 390 self._colorSelect = ColorPickerSelect() 391 self._colorSelect.addListener(self, IColorChangeListener) 392 selLayout.addComponent(self._colorSelect) 393 394 return selLayout
395 396
397 - def buttonClick(self, event):
398 # History resize was clicked 399 if event.getButton() == self._resize: 400 state = self._resize.getData() 401 402 # minimize 403 if state: 404 self._historyContainer.setHeight('27px') 405 self._history.setHeight('27px') 406 407 # maximize 408 else: 409 self._historyContainer.setHeight('90px') 410 self._history.setHeight('80px') 411 412 self.setHeight(self.calculateHeight()) 413 414 self._resize.setData(bool(not state)) 415 416 # Ok button was clicked 417 elif event.getButton() == self._ok: 418 self._history.setColor(self.getColor()) 419 self.fireColorChanged() 420 self.close() 421 422 # Cancel button was clicked 423 elif event.getButton() == self._cancel: 424 self.close()
425 426
427 - def fireColorChanged(self):
428 """Notifies the listeners that the color changed""" 429 self.fireEvent(ColorChangeEvent(self, self.getColor()))
430 431
432 - def getHistory(self):
433 """Gets the history. 434 435 @return: the history 436 """ 437 return self._history
438 439
440 - def setColor(self, color):
441 if color is None: 442 return 443 444 self._selectedColor = color 445 446 self._hsvGradient.setColor(self._selectedColor) 447 self._hsvPreview.setColor(self._selectedColor) 448 449 self._rgbGradient.setColor(self._selectedColor) 450 self._rgbPreview.setColor(self._selectedColor) 451 452 self._selPreview.setColor(self._selectedColor)
453 454
455 - def getColor(self):
456 return self._selectedColor
457 458
459 - def getColorHistory(self):
460 """Gets the color history. 461 462 @return: the color history 463 """ 464 return list(self._history.getHistory())
465 466
467 - def colorChanged(self, event):
468 self._selectedColor = event.getColor() 469 try: 470 self._redSlider.setValue(self._selectedColor.getRed()) 471 self._blueSlider.setValue(self._selectedColor.getBlue()) 472 self._greenSlider.setValue(self._selectedColor.getGreen()) 473 474 hsv = self._selectedColor.getHSV() 475 476 self._hueSlider.setValue(hsv[0] * 360.0) 477 self._saturationSlider.setValue(hsv[1] * 100.0) 478 self._valueSlider.setValue(hsv[2] * 100.0) 479 except ValueOutOfBoundsException: 480 traceback.print_exc(file=sys.stdout) 481 482 for s in self._selectors: 483 if (event.getSource() != s and s is not self 484 and s.getColor() != self._selectedColor): 485 s.setColor(self._selectedColor)
486 487
488 - def addListener(self, listener, iface=None):
489 """Adds a color change listener 490 491 @param listener: 492 The color change listener 493 """ 494 if (isinstance(listener, IColorChangeListener) and 495 (iface is None or issubclass(iface, IColorChangeListener))): 496 self.registerListener(ColorChangeEvent, listener, 497 _COLOR_CHANGE_METHOD) 498 499 super(ColorPickerPopup, self).addListener(listener, iface)
500 501
502 - def addCallback(self, callback, eventType=None, *args):
503 if eventType is None: 504 eventType = callback._eventType # set by decorator 505 506 if issubclass(eventType, ColorChangeEvent): 507 self.registerCallback(ColorChangeEvent, callback, None, *args) 508 else: 509 super(ColorPickerPopup, self).addCallback(callback, eventType, 510 *args)
511 512
513 - def removeListener(self, listener, iface=None):
514 """Removes a color change listener 515 516 @param listener: 517 The listener 518 """ 519 if (isinstance(listener, IColorChangeListener) and 520 (iface is None or issubclass(iface, IColorChangeListener))): 521 self.withdrawListener(ColorChangeEvent, listener) 522 523 super(ColorPickerPopup, self).removeListener(listener, iface)
524 525
526 - def removeCallback(self, callback, eventType=None):
527 if eventType is None: 528 eventType = callback._eventType 529 530 if issubclass(eventType, ColorChangeEvent): 531 self.withdrawCallback(ColorChangeEvent, callback) 532 533 else: 534 super(ColorPickerPopup, self).removeCallback(callback, eventType)
535 536
537 - def tabIsVisible(self, tab):
538 """Is the tab visible 539 540 @param tab: 541 The tab to check 542 """ 543 tabIterator = self._tabs.getComponentIterator() 544 for t in tabIterator: 545 if t == tab: 546 return True 547 return False
548 549
550 - def tabsNumVisible(self):
551 """How many tabs are visible 552 553 @return: The number of tabs visible 554 """ 555 tabIterator = self._tabs.getComponentIterator() 556 tabCounter = 0 557 for _ in tabIterator: 558 tabCounter += 1 559 return tabCounter
560 561
562 - def checkIfTabsNeeded(self):
563 """Checks if tabs are needed and hides them if not""" 564 if self.tabsNumVisible() == 1: 565 self._tabs.hideTabs(True) 566 self.setHeight(self.calculateHeight()) 567 else: 568 self._tabs.hideTabs(False) 569 self.setHeight(self.calculateHeight())
570 571
572 - def setRGBTabVisible(self, visible):
573 """Set RGB tab visibility 574 575 @param visible: 576 The visibility of the RGB tab 577 """ 578 if visible and not self.tabIsVisible(self._rgbTab): 579 self._tabs.addTab(self._rgbTab, 'RGB', None) 580 self.checkIfTabsNeeded() 581 elif not visible and self.tabIsVisible(self._rgbTab): 582 self._tabs.removeComponent(self._rgbTab) 583 self.checkIfTabsNeeded()
584 585
586 - def setHSVTabVisible(self, visible):
587 """Set HSV tab visibility 588 589 @param visible: 590 The visibility of the HSV tab 591 """ 592 if visible and not self.tabIsVisible(self._hsvTab): 593 self._tabs.addTab(self._hsvTab, 'HSV', None) 594 self.checkIfTabsNeeded() 595 elif not visible and self.tabIsVisible(self._hsvTab): 596 self._tabs.removeComponent(self._hsvTab) 597 self.checkIfTabsNeeded()
598 599
600 - def setSwatchesTabVisible(self, visible):
601 """Set Swatches tab visibility 602 603 @param visible: 604 The visibility of the Swatches tab 605 """ 606 if visible and not self.tabIsVisible(self._swatchesTab): 607 self._tabs.addTab(self._swatchesTab, 'Swatches', None) 608 self.checkIfTabsNeeded() 609 elif not visible and self.tabIsVisible(self._swatchesTab): 610 self._tabs.removeComponent(self._swatchesTab) 611 self.checkIfTabsNeeded()
612 613
614 - def setHistoryVisible(self, visible):
615 """Set the History visibility 616 """ 617 self._historyContainer.setVisible(visible) 618 self._resize.setVisible(visible) 619 self.setHeight(self.calculateHeight())
620 621
622 - def setPreviewVisible(self, visible):
623 """Set the preview visibility 624 """ 625 self._hsvPreview.setVisible(visible) 626 self._rgbPreview.setVisible(visible) 627 self._selPreview.setVisible(visible) 628 self.setHeight(self.calculateHeight())
629 630
631 - def attach(self):
632 self.setHeight(self.calculateHeight())
633 634 635 # Implement the RGB color converter
636 -class RGBConverter(ICoordinates2Color):
637
638 - def calculate(self, c_or_x, y=None):
639 if y is None: 640 c = c_or_x 641 hsv = c.getHSV() 642 643 x = round(hsv[0] * 220.0) 644 y = 0 645 646 # lower half 647 if hsv[1] == 1.0: 648 y = round(110.0 - ((hsv[1] + hsv[2]) * 110.0)) 649 else: 650 y = round(hsv[1] * 110.0) 651 652 return [x, y] 653 else: 654 x = c_or_x 655 h = x / 220.0 656 s = 1.0 657 v = 1.0 658 659 if y < 110: 660 s = y / 110.0 661 elif y > 110: 662 v = 1.0 - ((y - 110.0) / 110.0) 663 664 return Color(*hsv_to_rgb(h, s, v))
665 666 667 # Implement the HSV color converter
668 -class HSVConverter(ICoordinates2Color):
669
670 - def __init__(self, cpp):
671 self._cpp = cpp
672 673
674 - def calculate(self, c_or_x, y=None):
675 if y is None: 676 c = c_or_x 677 hsv = c.getHSV() 678 679 # Calculate coordinates 680 x = round(hsv[2] * 220.0) 681 y = round(220 - (hsv[1] * 220.0)) 682 683 # Create background color of clean color 684 bgColor = Color(*hsv_to_rgb(hsv[0], 1.0, 1.0)) 685 self._cpp._hsvGradient.setBackgroundColor(bgColor) 686 687 return [x, y] 688 else: 689 x = c_or_x 690 saturation = 1.0 - (y / 220.0) 691 value = x / 220.0 692 hue = float(str(self._cpp._hueSlider.getValue())) / 360.0 693 694 color = Color(*hsv_to_rgb(hue, saturation, value)) 695 return color
696 697
698 -class _ColorValueChangeListener(IValueChangeListener):
699
700 - def __init__(self, cpp):
701 self._cpp = cpp
702 703
704 -class RedValueChangeListener(_ColorValueChangeListener):
705
706 - def valueChange(self, event):
707 red = event.getProperty().getValue() 708 newColor = Color(int(red), self._cpp._selectedColor.getGreen(), 709 self._cpp._selectedColor.getBlue()) 710 self._cpp.setColor(newColor)
711 712
713 -class GreenValueChangeListener(_ColorValueChangeListener):
714
715 - def valueChange(self, event):
716 green = event.getProperty().getValue() 717 newColor = Color(self._cpp._selectedColor.getRed(), int(green), 718 self._cpp._selectedColor.getBlue()) 719 self._cpp.setColor(newColor)
720 721
722 -class BlueValueChangeListener(_ColorValueChangeListener):
723
724 - def valueChange(self, event):
725 blue = event.getProperty().getValue() 726 newColor = Color(self._cpp._selectedColor.getRed(), 727 self._cpp._selectedColor.getGreen(), int(blue)) 728 self._cpp.setColor(newColor)
729 730
731 -class HueValueChangeListener(_ColorValueChangeListener):
732
733 - def valueChange(self, event):
734 hue = float(str(event.getProperty().getValue())) / 360.0 735 saturation = float(str(self._cpp._saturationSlider.getValue())) / 100.0 736 value = float(str(self._cpp._valueSlider.getValue())) / 100.0 737 738 # Set the color 739 color = Color(*hsv_to_rgb(hue, saturation, value)) 740 self._cpp.setColor(color) 741 742 # Set the background color of the hue gradient. This has to be 743 # done here since in the conversion the base color information 744 # is lost when color is black/white 745 bgColor = Color(*hsv_to_rgb(hue, 1.0, 1.0)) 746 self._cpp._hsvGradient.setBackgroundColor(bgColor)
747 748
749 -class SaturationValueChangeListener(_ColorValueChangeListener):
750
751 - def valueChange(self, event):
752 hue = float(str(self._cpp._hueSlider.getValue())) / 360.0 753 saturation = float(str(event.getProperty().getValue())) / 100.0 754 value = float(str(self._cpp._valueSlider.getValue())) / 100.0 755 756 self._cpp.setColor( Color(*hsv_to_rgb(hue, saturation, value)) )
757 758
759 -class BrightnessValueChangeListener(_ColorValueChangeListener):
760
761 - def valueChange(self, event):
762 hue = float(str(self._cpp._hueSlider.getValue())) / 360.0 763 saturation = float(str(self._cpp._saturationSlider.getValue())) / 100.0 764 value = float(str(event.getProperty().getValue())) / 100.0 765 766 self._cpp.setColor( Color(*hsv_to_rgb(hue, saturation, value)) )
767