3 #include <QColorDialog> 6 #include <QDragEnterEvent> 8 #include <QApplication> 16 class ColorButtonPrivate
19 Q_DECLARE_PUBLIC(ColorButton)
22 #ifndef QT_NO_DRAGANDDROP 27 bool m_backgroundCheckered;
30 QColor shownColor()
const;
31 QPixmap generatePixmap()
const;
34 void ColorButtonPrivate::slotEditColor()
36 const QColor newColor = QColorDialog::getColor(m_color, q_ptr, QString(), QColorDialog::ShowAlphaChannel);
37 if (!newColor.isValid() || newColor == q_ptr->color())
39 q_ptr->setColor(newColor);
40 emit q_ptr->colorChanged(m_color);
43 QColor ColorButtonPrivate::shownColor()
const 45 #ifndef QT_NO_DRAGANDDROP 52 QPixmap ColorButtonPrivate::generatePixmap()
const 57 QBrush br(shownColor());
59 QPixmap pm(2 * pixSize, 2 * pixSize);
61 pmp.fillRect(0, 0, pixSize, pixSize, Qt::lightGray);
62 pmp.fillRect(pixSize, pixSize, pixSize, pixSize, Qt::lightGray);
63 pmp.fillRect(0, pixSize, pixSize, pixSize, Qt::darkGray);
64 pmp.fillRect(pixSize, 0, pixSize, pixSize, Qt::darkGray);
65 pmp.fillRect(0, 0, 2 * pixSize, 2 * pixSize, shownColor());
70 QRect r = pix.rect().adjusted(corr, corr, -corr, -corr);
71 p.setBrushOrigin((r.width() % pixSize + pixSize) / 2 + corr, (r.height() % pixSize + pixSize) / 2 + corr);
74 p.fillRect(r.width() / 4 + corr, r.height() / 4 + corr,
75 r.width() / 2, r.height() / 2,
76 QColor(shownColor().rgb()));
77 p.drawRect(pix.rect().adjusted(0, 0, -1, -1));
87 : QToolButton(parent), d_ptr(new ColorButtonPrivate)
90 d_ptr->m_dragging =
false;
91 d_ptr->m_backgroundCheckered =
true;
95 connect(
this, SIGNAL(clicked()),
this, SLOT(slotEditColor()));
96 setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred));
105 if (d_ptr->m_color == color)
107 d_ptr->m_color =
color;
113 return d_ptr->m_color;
118 if (d_ptr->m_backgroundCheckered == checkered)
120 d_ptr->m_backgroundCheckered = checkered;
126 return d_ptr->m_backgroundCheckered;
131 QToolButton::paintEvent(event);
135 const int pixSize = 10;
136 QBrush br(d_ptr->shownColor());
137 if (d_ptr->m_backgroundCheckered) {
138 QPixmap pm(2 * pixSize, 2 * pixSize);
140 pmp.fillRect(0, 0, pixSize, pixSize, Qt::white);
141 pmp.fillRect(pixSize, pixSize, pixSize, pixSize, Qt::white);
142 pmp.fillRect(0, pixSize, pixSize, pixSize, Qt::black);
143 pmp.fillRect(pixSize, 0, pixSize, pixSize, Qt::black);
144 pmp.fillRect(0, 0, 2 * pixSize, 2 * pixSize, d_ptr->shownColor());
150 QRect r = rect().adjusted(corr, corr, -corr, -corr);
151 p.setBrushOrigin((r.width() % pixSize + pixSize) / 2 + corr, (r.height() % pixSize + pixSize) / 2 + corr);
170 const QColor frameColor1(0, 0, 0, 26);
171 p.setPen(frameColor1);
172 p.drawRect(r.adjusted(1, 1, -2, -2));
173 const QColor frameColor2(0, 0, 0, 51);
174 p.setPen(frameColor2);
175 p.drawRect(r.adjusted(0, 0, -1, -1));
180 #ifndef QT_NO_DRAGANDDROP 181 if (event->button() == Qt::LeftButton)
182 d_ptr->m_dragStart = event->pos();
184 QToolButton::mousePressEvent(event);
189 #ifndef QT_NO_DRAGANDDROP 190 if (event->buttons() & Qt::LeftButton &&
191 (d_ptr->m_dragStart -
event->pos()).manhattanLength() > QApplication::startDragDistance()) {
192 QMimeData *mime =
new QMimeData;
193 mime->setColorData(
color());
194 QDrag *drg =
new QDrag(
this);
195 drg->setMimeData(mime);
196 drg->setPixmap(d_ptr->generatePixmap());
203 QToolButton::mouseMoveEvent(event);
206 #ifndef QT_NO_DRAGANDDROP 209 const QMimeData *mime =
event->mimeData();
210 if (!mime->hasColor())
214 d_ptr->m_dragColor = qvariant_cast<QColor>(mime->colorData());
215 d_ptr->m_dragging =
true;
222 d_ptr->m_dragging =
false;
229 d_ptr->m_dragging =
false;
230 if (d_ptr->m_dragColor ==
color())
239 #include "moc_colorbutton.cpp"