Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qtcolorbutton.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5
6#include <QtWidgets/qapplication.h>
7#include <QtWidgets/qcolordialog.h>
8
9#include <QtGui/qdrag.h>
10#include <QtGui/qevent.h>
11#include <QtGui/qpainter.h>
12
13#include <QtCore/qmimedata.h>
14
16
18{
19 Q_OBJECT
20 QtColorButton *q_ptr;
22public:
24#ifndef QT_NO_DRAGANDDROP
28#endif
30
34};
35
37{
38 const QColor newColor = QColorDialog::getColor(m_color, q_ptr, QString(), QColorDialog::ShowAlphaChannel);
39 if (!newColor.isValid() || newColor == q_ptr->color())
40 return;
41 q_ptr->setColor(newColor);
42 emit q_ptr->colorChanged(m_color);
43}
44
46{
47#ifndef QT_NO_DRAGANDDROP
48 if (m_dragging)
49 return m_dragColor;
50#endif
51 return m_color;
52}
53
55{
56 QPixmap pix(24, 24);
57
58 int pixSize = 20;
59 QBrush br(shownColor());
60
61 QPixmap pm(2 * pixSize, 2 * pixSize);
62 QPainter pmp(&pm);
63 pmp.fillRect(0, 0, pixSize, pixSize, Qt::lightGray);
64 pmp.fillRect(pixSize, pixSize, pixSize, pixSize, Qt::lightGray);
65 pmp.fillRect(0, pixSize, pixSize, pixSize, Qt::darkGray);
66 pmp.fillRect(pixSize, 0, pixSize, pixSize, Qt::darkGray);
67 pmp.fillRect(0, 0, 2 * pixSize, 2 * pixSize, shownColor());
68 br = QBrush(pm);
69
70 QPainter p(&pix);
71 int corr = 1;
72 QRect r = pix.rect().adjusted(corr, corr, -corr, -corr);
73 p.setBrushOrigin((r.width() % pixSize + pixSize) / 2 + corr, (r.height() % pixSize + pixSize) / 2 + corr);
74 p.fillRect(r, br);
75
76 p.fillRect(r.width() / 4 + corr, r.height() / 4 + corr,
77 r.width() / 2, r.height() / 2,
78 QColor(shownColor().rgb()));
79 p.drawRect(pix.rect().adjusted(0, 0, -1, -1));
80
81 return pix;
82}
83
84///////////////
85
86QtColorButton::QtColorButton(QWidget *parent)
87 : QToolButton(parent), d_ptr(new QtColorButtonPrivate)
88{
89 d_ptr->q_ptr = this;
90 d_ptr->m_dragging = false;
91 d_ptr->m_backgroundCheckered = true;
92
93 setAcceptDrops(true);
94
95 connect(this, &QToolButton::clicked, d_ptr.data(), &QtColorButtonPrivate::slotEditColor);
96 setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred));
97}
98
102
103void QtColorButton::setColor(QColor color)
104{
105 if (d_ptr->m_color == color)
106 return;
107 d_ptr->m_color = color;
108 update();
109}
110
112{
113 return d_ptr->m_color;
114}
115
117{
118 if (d_ptr->m_backgroundCheckered == checkered)
119 return;
120 d_ptr->m_backgroundCheckered = checkered;
121 update();
122}
123
125{
126 return d_ptr->m_backgroundCheckered;
127}
128
129void QtColorButton::paintEvent(QPaintEvent *event)
130{
131 QToolButton::paintEvent(event);
132 if (!isEnabled())
133 return;
134
135 const int pixSize = 10;
136 QBrush br(d_ptr->shownColor());
137 if (d_ptr->m_backgroundCheckered) {
138 QPixmap pm(2 * pixSize, 2 * pixSize);
139 QPainter pmp(&pm);
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());
145 br = QBrush(pm);
146 }
147
148 QPainter p(this);
149 const int corr = 4;
150 QRect r = rect().adjusted(corr, corr, -corr, -corr);
151 p.setBrushOrigin((r.width() % pixSize + pixSize) / 2 + corr, (r.height() % pixSize + pixSize) / 2 + corr);
152 p.fillRect(r, br);
153
154 //const int adjX = qRound(r.width() / 4.0);
155 //const int adjY = qRound(r.height() / 4.0);
156 //p.fillRect(r.adjusted(adjX, adjY, -adjX, -adjY),
157 // QColor(d_ptr->shownColor().rgb()));
158 /*
159 p.fillRect(r.adjusted(0, r.height() * 3 / 4, 0, 0),
160 QColor(d_ptr->shownColor().rgb()));
161 p.fillRect(r.adjusted(0, 0, 0, -r.height() * 3 / 4),
162 QColor(d_ptr->shownColor().rgb()));
163 */
164 /*
165 const QColor frameColor0(0, 0, 0, qRound(0.2 * (0xFF - d_ptr->shownColor().alpha())));
166 p.setPen(frameColor0);
167 p.drawRect(r.adjusted(adjX, adjY, -adjX - 1, -adjY - 1));
168 */
169
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));
176}
177
178void QtColorButton::mousePressEvent(QMouseEvent *event)
179{
180#ifndef QT_NO_DRAGANDDROP
181 if (event->button() == Qt::LeftButton)
182 d_ptr->m_dragStart = event->pos();
183#endif
184 QToolButton::mousePressEvent(event);
185}
186
187void QtColorButton::mouseMoveEvent(QMouseEvent *event)
188{
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());
197 setDown(false);
198 event->accept();
199 drg->exec(Qt::CopyAction);
200 return;
201 }
202#endif
203 QToolButton::mouseMoveEvent(event);
204}
205
206#ifndef QT_NO_DRAGANDDROP
207void QtColorButton::dragEnterEvent(QDragEnterEvent *event)
208{
209 const QMimeData *mime = event->mimeData();
210 if (!mime->hasColor())
211 return;
212
213 event->accept();
214 d_ptr->m_dragColor = qvariant_cast<QColor>(mime->colorData());
215 d_ptr->m_dragging = true;
216 update();
217}
218
219void QtColorButton::dragLeaveEvent(QDragLeaveEvent *event)
220{
221 event->accept();
222 d_ptr->m_dragging = false;
223 update();
224}
225
226void QtColorButton::dropEvent(QDropEvent *event)
227{
228 event->accept();
229 d_ptr->m_dragging = false;
230 if (d_ptr->m_dragColor == color())
231 return;
232 setColor(d_ptr->m_dragColor);
233 emit colorChanged(color());
234}
235#endif
236
237QT_END_NAMESPACE
238
239#include "qtcolorbutton.moc"
QColor shownColor() const
QPixmap generatePixmap() const
QColor color() const
void mouseMoveEvent(QMouseEvent *event) override
\reimp
void paintEvent(QPaintEvent *event) override
\reimp
void dragLeaveEvent(QDragLeaveEvent *event) override
void setBackgroundCheckered(bool checkered)
void dragEnterEvent(QDragEnterEvent *event) override
void dropEvent(QDropEvent *event) override
bool isBackgroundCheckered() const
void mousePressEvent(QMouseEvent *event) override
\reimp
~QtColorButton() override
Combined button and popup list for selecting options.