• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • krita API Reference
  • KDE Home
  • Contact Us
 

KritaWidgets

  • sources
  • kfour-appscomplete
  • krita
  • libs
  • widgets
kis_color_button.cpp
Go to the documentation of this file.
1 /* This file is part of the KDE libraries
2  SPDX-FileCopyrightText: 1997 Martin Jones ([email protected])
3  SPDX-FileCopyrightText: 1999 Cristian Tibirna ([email protected])
4 
5  SPDX-License-Identifier: LGPL-2.0-or-later
6 */
7 
8 #include "kis_color_button.h"
9 
10 #include <QPointer>
11 #include <QPainter>
12 #include <qdrawutil.h>
13 #include <QApplication>
14 #include <QColorDialog>
15 #include <QClipboard>
16 #include <QMimeData>
17 #include <QDrag>
18 #include <QStyle>
19 #include <QMouseEvent>
20 #include <QStyleOptionButton>
21 
22 #include <KoColor.h>
23 #include <KisDlgInternalColorSelector.h>
24 
25 class KisColorButton::KisColorButtonPrivate
26 {
27 public:
28  KisColorButtonPrivate(KisColorButton *q);
29  ~KisColorButtonPrivate() {
30  if (dialogPtr) {
31  dialogPtr.data()->close();
32  }
33  }
34 
35  void _k_chooseColor();
36  void _k_colorChosen();
37 
38  KisColorButton *q;
39  KoColor m_defaultColor;
40  bool m_bdefaultColor : 1;
41  bool m_alphaChannel : 1;
42  bool m_palette : 1;
43 
44  KoColor col;
45  QPoint mPos;
46 #ifndef Q_OS_MACOS
47  QPointer<KisDlgInternalColorSelector> dialogPtr;
48 #else
49  QPointer<QColorDialog> dialogPtr;
50 #endif
51 
52  void initStyleOption(QStyleOptionButton *opt) const;
53 };
54 
56 // Functions duplicated from KColorMimeData
57 // Should be kept in sync
58 void _k_populateMimeData(QMimeData *mimeData, const KoColor &color)
59 {
60  mimeData->setColorData(color.toQColor());
61  mimeData->setText(color.toQColor().name());
62 }
63 
64 bool _k_canDecode(const QMimeData *mimeData)
65 {
66  if (mimeData->hasColor()) {
67  return true;
68  }
69  if (mimeData->hasText()) {
70  const QString colorName = mimeData->text();
71  if ((colorName.length() >= 4) && (colorName[0] == QLatin1Char('#'))) {
72  return true;
73  }
74  }
75  return false;
76 }
77 
78 QColor _k_fromMimeData(const QMimeData *mimeData)
79 {
80  if (mimeData->hasColor()) {
81  return mimeData->colorData().value<QColor>();
82  }
83  if (_k_canDecode(mimeData)) {
84  return QColor(mimeData->text());
85  }
86  return QColor();
87 }
88 
89 QDrag *_k_createDrag(const KoColor &color, QObject *dragsource)
90 {
91  QDrag *drag = new QDrag(dragsource);
92  QMimeData *mime = new QMimeData;
93  _k_populateMimeData(mime, color);
94  drag->setMimeData(mime);
95  QPixmap colorpix(25, 20);
96  colorpix.fill(color.toQColor());
97  QPainter p(&colorpix);
98  p.setPen(Qt::black);
99  p.drawRect(0, 0, 24, 19);
100  p.end();
101  drag->setPixmap(colorpix);
102  drag->setHotSpot(QPoint(-5, -7));
103  return drag;
104 }
106 
107 KisColorButton::KisColorButtonPrivate::KisColorButtonPrivate(KisColorButton *q)
108  : q(q)
109 {
110  m_bdefaultColor = false;
111  m_alphaChannel = false;
112  m_palette = true;
113  q->setAcceptDrops(true);
114 
115  connect(q, SIGNAL(clicked()), q, SLOT(_k_chooseColor()));
116 }
117 
118 KisColorButton::KisColorButton(QWidget *parent)
119  : QPushButton(parent)
120  , d(new KisColorButtonPrivate(this))
121 {
122 }
123 
124 KisColorButton::KisColorButton(const KoColor &c, QWidget *parent)
125  : QPushButton(parent)
126  , d(new KisColorButtonPrivate(this))
127 {
128  d->col = c;
129 }
130 
131 KisColorButton::KisColorButton(const KoColor &c, const KoColor &defaultColor, QWidget *parent)
132  : QPushButton(parent)
133  , d(new KisColorButtonPrivate(this))
134 {
135  d->col = c;
136  setDefaultColor(defaultColor);
137 }
138 
139 KisColorButton::~KisColorButton()
140 {
141  delete d;
142 }
143 
144 KoColor KisColorButton::color() const
145 {
146  return d->col;
147 }
148 
149 void KisColorButton::setColor(const KoColor &c)
150 {
151  d->col = c;
152  update();
153  emit changed(d->col);
154 }
155 
156 void KisColorButton::setAlphaChannelEnabled(bool alpha)
157 {
158  d->m_alphaChannel = alpha;
159 }
160 
161 bool KisColorButton::isAlphaChannelEnabled() const
162 {
163  return d->m_alphaChannel;
164 }
165 
166 void KisColorButton::setPaletteViewEnabled(bool enable)
167 {
168  d->m_palette = enable;
169 }
170 
171 bool KisColorButton::paletteViewEnabled() const
172 {
173  return d->m_palette;
174 }
175 
176 KoColor KisColorButton::defaultColor() const
177 {
178  return d->m_defaultColor;
179 }
180 
181 void KisColorButton::setDefaultColor(const KoColor &c)
182 {
183  d->m_bdefaultColor = true;
184  d->m_defaultColor = c;
185 }
186 
187 void KisColorButton::KisColorButtonPrivate::initStyleOption(QStyleOptionButton *opt) const
188 {
189  opt->initFrom(q);
190  opt->state |= q->isDown() ? QStyle::State_Sunken : QStyle::State_Raised;
191  opt->features = QStyleOptionButton::None;
192  if (q->isDefault()) {
193  opt->features |= QStyleOptionButton::DefaultButton;
194  }
195  opt->text.clear();
196  opt->icon = QIcon();
197 }
198 
199 void KisColorButton::paintEvent(QPaintEvent *)
200 {
201  QPainter painter(this);
202  QStyle *style = QWidget::style();
203 
204  //First, we need to draw the bevel.
205  QStyleOptionButton butOpt;
206  d->initStyleOption(&butOpt);
207  style->drawControl(QStyle::CE_PushButtonBevel, &butOpt, &painter, this);
208 
209  //OK, now we can muck around with drawing out pretty little color box
210  //First, sort out where it goes
211  QRect labelRect = style->subElementRect(QStyle::SE_PushButtonContents,
212  &butOpt, this);
213  int shift = style->pixelMetric(QStyle::PM_ButtonMargin, &butOpt, this) / 2;
214  labelRect.adjust(shift, shift, -shift, -shift);
215  int x, y, w, h;
216  labelRect.getRect(&x, &y, &w, &h);
217 
218  if (isChecked() || isDown()) {
219  x += style->pixelMetric(QStyle::PM_ButtonShiftHorizontal, &butOpt, this);
220  y += style->pixelMetric(QStyle::PM_ButtonShiftVertical, &butOpt, this);
221  }
222 
223  QColor fillCol = isEnabled() ? d->col.toQColor() : palette().color(backgroundRole());
224  qDrawShadePanel(&painter, x, y, w, h, palette(), true, 1, NULL);
225  if (fillCol.isValid()) {
226  const QRect rect(x + 1, y + 1, w - 2, h - 2);
227  if (fillCol.alpha() < 255) {
228  QPixmap chessboardPattern(16, 16);
229  QPainter patternPainter(&chessboardPattern);
230  patternPainter.fillRect(0, 0, 8, 8, Qt::black);
231  patternPainter.fillRect(8, 8, 8, 8, Qt::black);
232  patternPainter.fillRect(0, 8, 8, 8, Qt::white);
233  patternPainter.fillRect(8, 0, 8, 8, Qt::white);
234  patternPainter.end();
235  painter.fillRect(rect, QBrush(chessboardPattern));
236  }
237  painter.fillRect(rect, fillCol);
238  }
239 
240  if (hasFocus()) {
241  QRect focusRect = style->subElementRect(QStyle::SE_PushButtonFocusRect, &butOpt, this);
242  QStyleOptionFocusRect focusOpt;
243  focusOpt.init(this);
244  focusOpt.rect = focusRect;
245  focusOpt.backgroundColor = palette().window().color();
246  style->drawPrimitive(QStyle::PE_FrameFocusRect, &focusOpt, &painter, this);
247  }
248 }
249 
250 QSize KisColorButton::sizeHint() const
251 {
252  QStyleOptionButton opt;
253  d->initStyleOption(&opt);
254  return style()->sizeFromContents(QStyle::CT_PushButton, &opt, QSize(40, 15), this);
255 }
256 
257 QSize KisColorButton::minimumSizeHint() const
258 {
259  QStyleOptionButton opt;
260  d->initStyleOption(&opt);
261  return style()->sizeFromContents(QStyle::CT_PushButton, &opt, QSize(3, 3), this);
262 }
263 
264 void KisColorButton::dragEnterEvent(QDragEnterEvent *event)
265 {
266  event->setAccepted(_k_canDecode(event->mimeData()) && isEnabled());
267 }
268 
269 void KisColorButton::dropEvent(QDropEvent *event)
270 {
271  QColor c = _k_fromMimeData(event->mimeData());
272  if (c.isValid()) {
273  KoColor col;
274  col.fromQColor(c);
275  setColor(col);
276  }
277 }
278 
279 void KisColorButton::keyPressEvent(QKeyEvent *e)
280 {
281  int key = e->key() | e->modifiers();
282 
283  if (QKeySequence::keyBindings(QKeySequence::Copy).contains(key)) {
284  QMimeData *mime = new QMimeData;
285  _k_populateMimeData(mime, color());
286  QApplication::clipboard()->setMimeData(mime, QClipboard::Clipboard);
287  } else if (QKeySequence::keyBindings(QKeySequence::Paste).contains(key)) {
288  QColor color = _k_fromMimeData(QApplication::clipboard()->mimeData(QClipboard::Clipboard));
289  KoColor col;
290  col.fromQColor(color);
291  setColor(col);
292  } else {
293  QPushButton::keyPressEvent(e);
294  }
295 }
296 
297 void KisColorButton::mousePressEvent(QMouseEvent *e)
298 {
299  d->mPos = e->pos();
300  QPushButton::mousePressEvent(e);
301 }
302 
303 void KisColorButton::mouseMoveEvent(QMouseEvent *e)
304 {
305  if ((e->buttons() & Qt::LeftButton) &&
306  (e->pos() - d->mPos).manhattanLength() > QApplication::startDragDistance()) {
307  _k_createDrag(color(), this)->exec();
308  setDown(false);
309  }
310 }
311 
312 void KisColorButton::KisColorButtonPrivate::_k_chooseColor()
313 {
314 #ifndef Q_OS_MACOS
315  KisDlgInternalColorSelector *dialog = dialogPtr.data();
316 #else
317  QColorDialog *dialog = dialogPtr.data();
318 #endif
319  if (dialog) {
320 #ifndef Q_OS_MACOS
321  dialog->setPreviousColor(q->color());
322 #else
323  dialog->setCurrentColor(q->color().toQColor());
324 #endif
325  dialog->show();
326  dialog->raise();
327  dialog->activateWindow();
328  return;
329  }
330 
331  KisDlgInternalColorSelector::Config cfg;
332  cfg.paletteBox = q->paletteViewEnabled();
333 #ifndef Q_OS_MACOS
334  dialog = new KisDlgInternalColorSelector(q,
335  q->color(),
336  cfg,
337  i18n("Choose a color"));
338 #else
339  dialog = new QColorDialog(q);
340  dialog->setOption(QColorDialog::ShowAlphaChannel, m_alphaChannel);
341 #endif
342  dialog->setAttribute(Qt::WA_DeleteOnClose);
343  connect(dialog, SIGNAL(accepted()), q, SLOT(_k_colorChosen()));
344  dialogPtr = dialog;
345 #ifndef Q_OS_MACOS
346  dialog->setPreviousColor(q->color());
347 #else
348  dialog->setCurrentColor(q->color().toQColor());
349 #endif
350  dialog->show();
351 }
352 
353 void KisColorButton::KisColorButtonPrivate::_k_colorChosen()
354 {
355 #ifndef Q_OS_MACOS
356  KisDlgInternalColorSelector *dialog = dialogPtr.data();
357 #else
358  QColorDialog *dialog = dialogPtr.data();
359 #endif
360  if (!dialog) {
361  return;
362  }
363 #ifndef Q_OS_MACOS
364  q->setColor(dialog->getCurrentColor());
365 #else
366  KoColor c;
367  c.fromQColor(dialog->currentColor());
368  q->setColor(c);
369 #endif
370 }
371 
372 #include "moc_kis_color_button.cpp"
QPalette::color
const QColor & color(ColorGroup group, ColorRole role) const
QBrush::color
const QColor & color() const
KisDlgInternalColorSelector::Config::paletteBox
bool paletteBox
Definition: KisDlgInternalColorSelector.h:57
QMouseEvent::pos
const QPoint & pos() const
QPointer< KisDlgInternalColorSelector >
QColor
QDragEnterEvent
QWidget::y
int y() const
QPalette::window
const QBrush & window() const
_k_populateMimeData
void _k_populateMimeData(QMimeData *mimeData, const KoColor &color)
Definition: kis_color_button.cpp:58
QApplication::clipboard
QClipboard * clipboard()
QPainter::setPen
void setPen(const QColor &color)
QStyle::drawControl
virtual void drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const=0
QPushButton::keyPressEvent
virtual void keyPressEvent(QKeyEvent *e)
KisDlgInternalColorSelector.h
QMimeData::hasColor
bool hasColor() const
QMimeData::colorData
QVariant colorData() const
QWidget::palette
const QPalette & palette() const
QRect
QPainter::drawRect
void drawRect(const QRectF &rectangle)
QWidget::rect
QRect rect() const
QVariant::value
T value() const
QWidget::update
void update()
KisColorButton::changed
void changed(const KoColor &newColor)
Emitted when the color of the widget is changed, either with setColor() or via user selection.
QWidget
QPixmap::fill
void fill(const QColor &color)
QRect::adjust
void adjust(int dx1, int dy1, int dx2, int dy2)
QSize
QStyleOption::initFrom
void initFrom(const QWidget *widget)
QMimeData::hasText
bool hasText() const
QWidget::x
int x() const
KisColorButton::sizeHint
QSize sizeHint() const override
Definition: kis_color_button.cpp:250
KisColorButton::paintEvent
void paintEvent(QPaintEvent *pe) override
Definition: kis_color_button.cpp:199
QAbstractButton::isChecked
bool isChecked() const
QWidget::setAttribute
void setAttribute(Qt::WidgetAttribute attribute, bool on)
QColorDialog::setCurrentColor
void setCurrentColor(const QColor &color)
QMimeData::setColorData
void setColorData(const QVariant &color)
QPainter
KisColorButton
A pushbutton to display or allow user selection of a color.
Definition: kis_color_button.h:26
QPainter::fillRect
void fillRect(const QRectF &rectangle, const QBrush &brush)
KisDlgInternalColorSelector::setPreviousColor
void setPreviousColor(KoColor c)
setPreviousColor set the previous color.
Definition: KisDlgInternalColorSelector.cpp:256
_k_createDrag
QDrag * _k_createDrag(const KoColor &color, QObject *dragsource)
Definition: kis_color_button.cpp:89
QMouseEvent
QDrag::exec
Qt::DropAction exec(QFlags< Qt::DropAction > supportedActions)
QDrag::setPixmap
void setPixmap(const QPixmap &pixmap)
QStyle::pixelMetric
virtual int pixelMetric(PixelMetric metric, const QStyleOption *option, const QWidget *widget) const=0
QPixmap
QAbstractButton::isDown
bool isDown() const
QKeyEvent::modifiers
Qt::KeyboardModifiers modifiers() const
QPainter::end
bool end()
QPushButton
QObject
KisColorButton::setColor
void setColor(const KoColor &c)
Sets the current color to c.
Definition: kis_color_button.cpp:149
KisColorButton::setDefaultColor
void setDefaultColor(const KoColor &c)
Sets the default color to c.
Definition: kis_color_button.cpp:181
QDropEvent
QWidget::style
QStyle * style() const
kis_color_button.h
QDrag::setHotSpot
void setHotSpot(const QPoint &hotspot)
QString
QMouseEvent::buttons
Qt::MouseButtons buttons() const
QString::length
int length() const
QMimeData
KisColorButton::keyPressEvent
void keyPressEvent(QKeyEvent *e) override
Definition: kis_color_button.cpp:279
QWidget::activateWindow
void activateWindow()
KisColorButton::paletteViewEnabled
bool paletteViewEnabled() const
paletteViewEnabled
Definition: kis_color_button.cpp:171
KisColorButton::color
KoColor color
QtCreator treats KoColor as a QColor in incorrect way, so just disable using them in QtCreator https:...
Definition: kis_color_button.h:34
_k_fromMimeData
QColor _k_fromMimeData(const QMimeData *mimeData)
Definition: kis_color_button.cpp:78
KisDlgInternalColorSelector
The KisInternalColorSelector class.
Definition: KisDlgInternalColorSelector.h:29
QColor::alpha
int alpha() const
QStyleOptionButton
KisColorButton::minimumSizeHint
QSize minimumSizeHint() const override
Definition: kis_color_button.cpp:257
QRect::getRect
void getRect(int *x, int *y, int *width, int *height) const
KisColorButton::isAlphaChannelEnabled
bool isAlphaChannelEnabled() const
Returns true if the user is allowed to change the alpha component.
Definition: kis_color_button.cpp:161
QMimeData::text
QString text() const
QIcon
QWidget::setAcceptDrops
void setAcceptDrops(bool on)
KisColorButton::mousePressEvent
void mousePressEvent(QMouseEvent *e) override
Definition: kis_color_button.cpp:297
KisColorButton::~KisColorButton
~KisColorButton() override
Definition: kis_color_button.cpp:139
QBrush
QWidget::isEnabled
bool isEnabled() const
QWidget::show
void show()
QColorDialog
QStyle::sizeFromContents
virtual QSize sizeFromContents(ContentsType type, const QStyleOption *option, const QSize &contentsSize, const QWidget *widget) const=0
QMimeData::setText
void setText(const QString &text)
QPushButton::initStyleOption
void initStyleOption(QStyleOptionButton *option) const
KisColorButton::color
KoColor color() const
Returns the currently chosen color.
QWidget::hasFocus
bool hasFocus() const
QKeyEvent::key
int key() const
KisColorButton::defaultColor
KoColor defaultColor() const
Returns the default color or an invalid color if no default color is set.
QLatin1Char
QWidget::raise
void raise()
QStyle::drawPrimitive
virtual void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const=0
QApplication::startDragDistance
int startDragDistance()
QPaintEvent
KisColorButton::mouseMoveEvent
void mouseMoveEvent(QMouseEvent *e) override
Definition: kis_color_button.cpp:303
QStyle::subElementRect
virtual QRect subElementRect(SubElement element, const QStyleOption *option, const QWidget *widget) const=0
QStyleOption::init
void init(const QWidget *widget)
QPushButton::event
virtual bool event(QEvent *e)
KisColorButton::setPaletteViewEnabled
void setPaletteViewEnabled(bool enable)
Allow having a palette.
Definition: kis_color_button.cpp:166
KisColorButton::dropEvent
void dropEvent(QDropEvent *) override
Definition: kis_color_button.cpp:269
QClipboard::setMimeData
void setMimeData(QMimeData *src, Mode mode)
QColor::isValid
bool isValid() const
QPushButton::isDefault
bool isDefault() const
QAbstractButton::mousePressEvent
virtual void mousePressEvent(QMouseEvent *e)
QKeyEvent
QWidget::backgroundRole
QPalette::ColorRole backgroundRole() const
QDrag::setMimeData
void setMimeData(QMimeData *data)
KisDlgInternalColorSelector::Config
Definition: KisDlgInternalColorSelector.h:41
QKeySequence::keyBindings
QList< QKeySequence > keyBindings(StandardKey key)
QStyle
QStyleOptionFocusRect
_k_canDecode
bool _k_canDecode(const QMimeData *mimeData)
Definition: kis_color_button.cpp:64
QDrag
KisColorButton::KisColorButton
KisColorButton(QWidget *parent=0)
Creates a color button.
Definition: kis_color_button.cpp:118
KisColorButton::setAlphaChannelEnabled
void setAlphaChannelEnabled(bool alpha)
When set to true, allow the user to change the alpha component of the color.
Definition: kis_color_button.cpp:156
QPoint
KisColorButton::dragEnterEvent
void dragEnterEvent(QDragEnterEvent *) override
Definition: kis_color_button.cpp:264
This file is part of the KDE documentation.
Documentation copyright © 1996-2021 The KDE developers.
Generated on Tue Jan 19 2021 23:44:00 by doxygen 1.8.16 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KritaWidgets

Skip menu "KritaWidgets"
  • Main Page
  • Namespace List
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

krita API Reference

Skip menu "krita API Reference"
  • libs
  •   KritaBasicFlakes
  •   brush
  •   KritaUndo2
  •   KritaFlake
  •   image
  •   KritaPlugin
  •   Krita
  •   KritaPigment
  •   KritaResources
  •   KritaStore
  •   ui
  •   KritaWidgets
  •   KritaWidgetUtils
  • plugins
  •   Assitants
  •   Extensions
  •   Filters
  •   Generators
  •   Formats
  •           src
  •   PaintOps
  •     libpaintop

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal