~ubuntu-branches/ubuntu/trusty/spyder/trusty-backports

« back to all changes in this revision

Viewing changes to spyderlib/widgets/colors.py

  • Committer: Bazaar Package Importer
  • Author(s): Picca Frédéric-Emmanuel
  • Date: 2011-03-05 18:03:43 UTC
  • mfrom: (1.1.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20110305180343-its88tucbyvtevjf
Tags: 2.0.8-1
* Imported Upstream version 2.0.8 (Closes: #609789)
* add a watch file
* build for all python2 versions (it can be use as module by other packages)
* change the documentation section to Programming/Python
* use the Recommendes found in the documentation.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: utf-8 -*-
 
2
 
 
3
from PyQt4.QtGui import (QLineEdit, QIcon, QHBoxLayout, QColor, QPushButton,
 
4
                         QColorDialog, QPixmap)
 
5
from PyQt4.QtCore import SIGNAL, QSize, QString, pyqtSignature, pyqtProperty
 
6
 
 
7
 
 
8
class ColorButton(QPushButton):
 
9
    """
 
10
    Color choosing push button
 
11
    """
 
12
    __pyqtSignals__ = ("colorChanged(QColor)",)
 
13
    
 
14
    def __init__(self, parent=None):
 
15
        QPushButton.__init__(self, parent)
 
16
        self.setFixedSize(20, 20)
 
17
        self.setIconSize(QSize(12, 12))
 
18
        self.connect(self, SIGNAL("clicked()"), self.choose_color)
 
19
        self._color = QColor()
 
20
    
 
21
    def choose_color(self):
 
22
        rgba, valid = QColorDialog.getRgba(self._color.rgba(),
 
23
                                           self.parentWidget())
 
24
        if valid:
 
25
            color = QColor.fromRgba(rgba)
 
26
            self.set_color(color)
 
27
    
 
28
    def get_color(self):
 
29
        return self._color
 
30
    
 
31
    @pyqtSignature("QColor")
 
32
    def set_color(self, color):
 
33
        if color != self._color:
 
34
            self._color = color
 
35
            self.emit(SIGNAL("colorChanged(QColor)"), self._color)
 
36
            pixmap = QPixmap(self.iconSize())
 
37
            pixmap.fill(color)
 
38
            self.setIcon(QIcon(pixmap))
 
39
    
 
40
    color = pyqtProperty("QColor", get_color, set_color)
 
41
 
 
42
 
 
43
def text_to_qcolor(text):
 
44
    """
 
45
    Create a QColor from specified string
 
46
    Avoid warning from Qt when an invalid QColor is instantiated
 
47
    """
 
48
    color = QColor()
 
49
    if isinstance(text, QString):
 
50
        text = str(text)
 
51
    if not isinstance(text, (unicode, str)):
 
52
        return color
 
53
    if text.startswith('#') and len(text)==7:
 
54
        correct = '#0123456789abcdef'
 
55
        for char in text:
 
56
            if char.lower() not in correct:
 
57
                return color
 
58
    elif text not in list(QColor.colorNames()):
 
59
        return color
 
60
    color.setNamedColor(text)
 
61
    return color
 
62
 
 
63
 
 
64
class ColorLayout(QHBoxLayout):
 
65
    """Color-specialized QLineEdit layout"""
 
66
    def __init__(self, color, parent=None):
 
67
        QHBoxLayout.__init__(self)
 
68
        assert isinstance(color, QColor)
 
69
        self.lineedit = QLineEdit(color.name(), parent)
 
70
        self.connect(self.lineedit, SIGNAL("textChanged(QString)"),
 
71
                     self.update_color)
 
72
        self.addWidget(self.lineedit)
 
73
        self.colorbtn = ColorButton(parent)
 
74
        self.colorbtn.color = color
 
75
        self.connect(self.colorbtn, SIGNAL("colorChanged(QColor)"),
 
76
                     self.update_text)
 
77
        self.addWidget(self.colorbtn)
 
78
 
 
79
    def update_color(self, text):
 
80
        color = text_to_qcolor(text)
 
81
        if color.isValid():
 
82
            self.colorbtn.color = color
 
83
 
 
84
    def update_text(self, color):
 
85
        self.lineedit.setText(color.name())
 
86
        
 
87
    def text(self):
 
88
        return self.lineedit.text()