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// Qt-Security score:significant reason:default
4
6
7#include <QtWidgets/qapplication.h>
8#include <QtWidgets/qcolordialog.h>
9
10#include <QtGui/qdrag.h>
11#include <QtGui/qevent.h>
12#include <QtGui/qpainter.h>
13
14#include <QtCore/qmimedata.h>
15
17
19{
20 Q_OBJECT
21 QtColorButton *q_ptr;
23public:
25#ifndef QT_NO_DRAGANDDROP
29#endif
31
35};
36
38{
39 const QColor newColor = QColorDialog::getColor(m_color, q_ptr, QString(), QColorDialog::ShowAlphaChannel);
40 if (!newColor.isValid() || newColor == q_ptr->color())
41 return;
42 q_ptr->setColor(newColor);
43 emit q_ptr->colorChanged(m_color);
44}
45
47{
48#ifndef QT_NO_DRAGANDDROP
49 if (m_dragging)
50 return m_dragColor;
51#endif
52 return m_color;
53}
54
56{
57 QPixmap pix(24, 24);
58
59 int pixSize = 20;
60 QBrush br(shownColor());
61
62 QPixmap pm(2 * pixSize, 2 * pixSize);
63 QPainter pmp(&pm);
64 pmp.fillRect(0, 0, pixSize, pixSize, Qt::lightGray);
65 pmp.fillRect(pixSize, pixSize, pixSize, pixSize, Qt::lightGray);
66 pmp.fillRect(0, pixSize, pixSize, pixSize, Qt::darkGray);
67 pmp.fillRect(pixSize, 0, pixSize, pixSize, Qt::darkGray);
68 pmp.fillRect(0, 0, 2 * pixSize, 2 * pixSize, shownColor());
69 br = QBrush(pm);
70
71 QPainter p(&pix);
72 int corr = 1;
73 QRect r = pix.rect().adjusted(corr, corr, -corr, -corr);
74 p.setBrushOrigin((r.width() % pixSize + pixSize) / 2 + corr, (r.height() % pixSize + pixSize) / 2 + corr);
75 p.fillRect(r, br);
76
77 p.fillRect(r.width() / 4 + corr, r.height() / 4 + corr,
78 r.width() / 2, r.height() / 2,
79 QColor(shownColor().rgb()));
80 p.drawRect(pix.rect().adjusted(0, 0, -1, -1));
81
82 return pix;
83}
84
85///////////////
86
87QtColorButton::QtColorButton(QWidget *parent)
88 : QToolButton(parent), d_ptr(new QtColorButtonPrivate)
89{
90 d_ptr->q_ptr = this;
91 d_ptr->m_dragging = false;
92 d_ptr->m_backgroundCheckered = true;
93
94 setAcceptDrops(true);
95
96 connect(this, &QToolButton::clicked, d_ptr.data(), &QtColorButtonPrivate::slotEditColor);
97 setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred));
98}
99
103
104void QtColorButton::setColor(QColor color)
105{
106 if (d_ptr->m_color == color)
107 return;
108 d_ptr->m_color = color;
109 update();
110}
111
113{
114 return d_ptr->m_color;
115}
116
118{
119 if (d_ptr->m_backgroundCheckered == checkered)
120 return;
121 d_ptr->m_backgroundCheckered = checkered;
122 update();
123}
124
126{
127 return d_ptr->m_backgroundCheckered;
128}
129
130void QtColorButton::paintEvent(QPaintEvent *event)
131{
132 QToolButton::paintEvent(event);
133 if (!isEnabled())
134 return;
135
136 const int pixSize = 10;
137 QBrush br(d_ptr->shownColor());
138 if (d_ptr->m_backgroundCheckered) {
139 QPixmap pm(2 * pixSize, 2 * pixSize);
140 QPainter pmp(&pm);
141 pmp.fillRect(0, 0, pixSize, pixSize, Qt::white);
142 pmp.fillRect(pixSize, pixSize, pixSize, pixSize, Qt::white);
143 pmp.fillRect(0, pixSize, pixSize, pixSize, Qt::black);
144 pmp.fillRect(pixSize, 0, pixSize, pixSize, Qt::black);
145 pmp.fillRect(0, 0, 2 * pixSize, 2 * pixSize, d_ptr->shownColor());
146 br = QBrush(pm);
147 }
148
149 QPainter p(this);
150 const int corr = 4;
151 QRect r = rect().adjusted(corr, corr, -corr, -corr);
152 p.setBrushOrigin((r.width() % pixSize + pixSize) / 2 + corr, (r.height() % pixSize + pixSize) / 2 + corr);
153 p.fillRect(r, br);
154
155 //const int adjX = qRound(r.width() / 4.0);
156 //const int adjY = qRound(r.height() / 4.0);
157 //p.fillRect(r.adjusted(adjX, adjY, -adjX, -adjY),
158 // QColor(d_ptr->shownColor().rgb()));
159 /*
160 p.fillRect(r.adjusted(0, r.height() * 3 / 4, 0, 0),
161 QColor(d_ptr->shownColor().rgb()));
162 p.fillRect(r.adjusted(0, 0, 0, -r.height() * 3 / 4),
163 QColor(d_ptr->shownColor().rgb()));
164 */
165 /*
166 const QColor frameColor0(0, 0, 0, qRound(0.2 * (0xFF - d_ptr->shownColor().alpha())));
167 p.setPen(frameColor0);
168 p.drawRect(r.adjusted(adjX, adjY, -adjX - 1, -adjY - 1));
169 */
170
171 const QColor frameColor1(0, 0, 0, 26);
172 p.setPen(frameColor1);
173 p.drawRect(r.adjusted(1, 1, -2, -2));
174 const QColor frameColor2(0, 0, 0, 51);
175 p.setPen(frameColor2);
176 p.drawRect(r.adjusted(0, 0, -1, -1));
177}
178
179void QtColorButton::mousePressEvent(QMouseEvent *event)
180{
181#ifndef QT_NO_DRAGANDDROP
182 if (event->button() == Qt::LeftButton)
183 d_ptr->m_dragStart = event->pos();
184#endif
185 QToolButton::mousePressEvent(event);
186}
187
188void QtColorButton::mouseMoveEvent(QMouseEvent *event)
189{
190#ifndef QT_NO_DRAGANDDROP
191 if (event->buttons() & Qt::LeftButton &&
192 (d_ptr->m_dragStart - event->pos()).manhattanLength() > QApplication::startDragDistance()) {
193 QMimeData *mime = new QMimeData;
194 mime->setColorData(color());
195 QDrag *drg = new QDrag(this);
196 drg->setMimeData(mime);
197 drg->setPixmap(d_ptr->generatePixmap());
198 setDown(false);
199 event->accept();
200 drg->exec(Qt::CopyAction);
201 return;
202 }
203#endif
204 QToolButton::mouseMoveEvent(event);
205}
206
207#ifndef QT_NO_DRAGANDDROP
208void QtColorButton::dragEnterEvent(QDragEnterEvent *event)
209{
210 const QMimeData *mime = event->mimeData();
211 if (!mime->hasColor())
212 return;
213
214 event->accept();
215 d_ptr->m_dragColor = qvariant_cast<QColor>(mime->colorData());
216 d_ptr->m_dragging = true;
217 update();
218}
219
220void QtColorButton::dragLeaveEvent(QDragLeaveEvent *event)
221{
222 event->accept();
223 d_ptr->m_dragging = false;
224 update();
225}
226
227void QtColorButton::dropEvent(QDropEvent *event)
228{
229 event->accept();
230 d_ptr->m_dragging = false;
231 if (d_ptr->m_dragColor == color())
232 return;
233 setColor(d_ptr->m_dragColor);
234 emit colorChanged(color());
235}
236#endif
237
238QT_END_NAMESPACE
239
240#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.