38 #include <QColorDialog>
42 #include <QDragEnterEvent>
43 #include <QApplication>
47 class QtColorButtonPrivate
53 #ifndef QT_NO_DRAGANDDROP
58 bool m_backgroundCheckered;
61 QColor shownColor()
const;
62 QPixmap generatePixmap()
const;
65 void QtColorButtonPrivate::slotEditColor()
67 const QColor newColor = QColorDialog::getColor(m_color, q_ptr);
68 if (!newColor.isValid() || newColor == q_ptr->color())
70 q_ptr->setColor(newColor);
71 emit q_ptr->colorChanged(m_color);
74 QColor QtColorButtonPrivate::shownColor()
const
76 #ifndef QT_NO_DRAGANDDROP
83 QPixmap QtColorButtonPrivate::generatePixmap()
const
88 QBrush br(shownColor());
90 QPixmap pm(2 * pixSize, 2 * pixSize);
92 pmp.fillRect(0, 0, pixSize, pixSize, Qt::lightGray);
93 pmp.fillRect(pixSize, pixSize, pixSize, pixSize, Qt::lightGray);
94 pmp.fillRect(0, pixSize, pixSize, pixSize, Qt::darkGray);
95 pmp.fillRect(pixSize, 0, pixSize, pixSize, Qt::darkGray);
96 pmp.fillRect(0, 0, 2 * pixSize, 2 * pixSize, shownColor());
101 QRect r = pix.rect().adjusted(corr, corr, -corr, -corr);
102 p.setBrushOrigin((r.width() % pixSize + pixSize) / 2 + corr, (r.height() % pixSize + pixSize) / 2 + corr);
105 p.fillRect(r.width() / 4 + corr, r.height() / 4 + corr,
106 r.width() / 2, r.height() / 2,
107 QColor(shownColor().rgb()));
108 p.drawRect(pix.rect().adjusted(0, 0, -1, -1));
116 :
QToolButton(parent), d_ptr(new QtColorButtonPrivate)
119 d_ptr->m_dragging =
false;
120 d_ptr->m_backgroundCheckered =
true;
122 setAcceptDrops(
true);
124 connect(
this, SIGNAL(clicked()),
this, SLOT(slotEditColor()));
125 setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred));
135 if (d_ptr->m_color == color)
137 d_ptr->m_color =
color;
143 return d_ptr->m_color;
148 if (d_ptr->m_backgroundCheckered == checkered)
150 d_ptr->m_backgroundCheckered = checkered;
156 return d_ptr->m_backgroundCheckered;
161 QToolButton::paintEvent(event);
165 const int pixSize = 10;
166 QBrush br(d_ptr->shownColor());
167 if (d_ptr->m_backgroundCheckered) {
168 QPixmap pm(2 * pixSize, 2 * pixSize);
170 pmp.fillRect(0, 0, pixSize, pixSize, Qt::white);
171 pmp.fillRect(pixSize, pixSize, pixSize, pixSize, Qt::white);
172 pmp.fillRect(0, pixSize, pixSize, pixSize, Qt::black);
173 pmp.fillRect(pixSize, 0, pixSize, pixSize, Qt::black);
174 pmp.fillRect(0, 0, 2 * pixSize, 2 * pixSize, d_ptr->shownColor());
180 QRect r = rect().adjusted(corr, corr, -corr, -corr);
181 p.setBrushOrigin((r.width() % pixSize + pixSize) / 2 + corr, (r.height() % pixSize + pixSize) / 2 + corr);
200 const QColor frameColor1(0, 0, 0, 26);
201 p.setPen(frameColor1);
202 p.drawRect(r.adjusted(1, 1, -2, -2));
203 const QColor frameColor2(0, 0, 0, 51);
204 p.setPen(frameColor2);
205 p.drawRect(r.adjusted(0, 0, -1, -1));
210 #ifndef QT_NO_DRAGANDDROP
211 if (event->button() == Qt::LeftButton)
212 d_ptr->m_dragStart = event->pos();
214 QToolButton::mousePressEvent(event);
219 #ifndef QT_NO_DRAGANDDROP
220 if (event->buttons() & Qt::LeftButton &&
221 (d_ptr->m_dragStart -
event->pos()).manhattanLength() > QApplication::startDragDistance()) {
222 QMimeData *mime =
new QMimeData;
223 mime->setColorData(
color());
224 QDrag *drg =
new QDrag(
this);
225 drg->setMimeData(mime);
226 drg->setPixmap(d_ptr->generatePixmap());
233 QToolButton::mouseMoveEvent(event);
236 #ifndef QT_NO_DRAGANDDROP
239 const QMimeData *mime =
event->mimeData();
240 if (!mime->hasColor())
244 d_ptr->m_dragColor = qvariant_cast<QColor>(mime->colorData());
245 d_ptr->m_dragging =
true;
252 d_ptr->m_dragging =
false;
259 d_ptr->m_dragging =
false;
260 if (d_ptr->m_dragColor ==
color())
269 #include "qtcolorbutton.moc"