swift
colorselector.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2015 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #include <QColor>
7 #include <QColorDialog>
8 #include <QCompleter>
9 #include <QDrag>
10 #include <QDragEnterEvent>
11 #include <QDragLeaveEvent>
12 #include <QDragMoveEvent>
13 #include <QDropEvent>
14 #include <QLabel>
15 #include <QLineEdit>
16 #include <QMimeData>
17 #include <QMouseEvent>
18 #include <QPalette>
19 #include <QPixmap>
20 #include <QToolButton>
21 #include <QVariant>
22 #include <Qt>
23 #include <QtGlobal>
24 
25 #include "ui_colorselector.h"
26 
27 #include "gui/guiutility.h"
28 #include "misc/icons.h"
30 #include "misc/rgbcolor.h"
31 #include "misc/variant.h"
32 
33 using namespace swift::misc;
34 
35 namespace swift::gui::components
36 {
37  CColorSelector::CColorSelector(QWidget *parent) : QFrame(parent), ui(new Ui::CColorSelector)
38  {
39  ui->setupUi(this);
40  ui->tb_ColorDialog->setIcon(CIcons::color16());
41  this->setAcceptDrops(true);
42  connect(ui->tb_ColorDialog, &QToolButton::clicked, this, &CColorSelector::colorDialog);
43  connect(ui->le_Color, &QLineEdit::editingFinished, this, &CColorSelector::onReturnPressed);
44  connect(ui->le_Color, &QLineEdit::returnPressed, this, &CColorSelector::onReturnPressed);
45 
46  QCompleter *completer = new QCompleter(QColor::colorNames(), this);
47  completer->setCaseSensitivity(Qt::CaseInsensitive);
48  completer->setMaxVisibleItems(10);
49  completer->setCompletionMode(QCompleter::PopupCompletion);
50  ui->le_Color->setCompleter(completer);
51  connect(completer, qOverload<const QString &>(&QCompleter::activated), this, &CColorSelector::setColorByName);
52  }
53 
55 
57  {
58  if (color == m_lastColor) { return; }
59  if (!color.isValid())
60  {
61  this->clear();
62  m_lastColor = CRgbColor();
63  }
64  else
65  {
66  ui->le_Color->setText(color.hex());
67  ui->lbl_ColorIcon->setPixmap(color.toPixmap());
68  m_lastColor = color;
69  }
70  emit colorChanged(color);
71  }
72 
73  void CColorSelector::setColor(const QColor &color) { this->setColor(CRgbColor(color)); }
74 
76  {
77  CRgbColor q(ui->le_Color->text());
78  return q;
79  }
80 
81  void CColorSelector::setReadOnly(bool readOnly)
82  {
83  ui->le_Color->setReadOnly(readOnly);
84  ui->tb_ColorDialog->setVisible(!readOnly);
85  this->setAcceptDrops(!readOnly);
86  }
87 
89  {
90  ui->le_Color->clear();
91  ui->lbl_ColorIcon->setPixmap(QPixmap());
92  }
93 
94  void CColorSelector::dragEnterEvent(QDragEnterEvent *event)
95  {
96  if (!event) { return; }
97  setBackgroundRole(QPalette::Highlight);
98  event->acceptProposedAction();
99  }
100 
101  void CColorSelector::dragMoveEvent(QDragMoveEvent *event)
102  {
103  if (!event) { return; }
104  event->acceptProposedAction();
105  }
106 
107  void CColorSelector::dragLeaveEvent(QDragLeaveEvent *event) { event->accept(); }
108 
109  void CColorSelector::dropEvent(QDropEvent *event)
110  {
111  if (!event) { return; }
112  const QMimeData *mime = event->mimeData();
113  if (!mime) { return; }
114 
115  if (mime->hasColor())
116  {
117  const QColor color = qvariant_cast<QColor>(event->mimeData()->colorData());
118  if (!color.isValid()) { return; }
119  this->setColor(color);
120  }
122  {
123  const CVariant valueVariant(CGuiUtility::fromSwiftDragAndDropData(mime));
124  if (valueVariant.isValid())
125  {
126  if (valueVariant.canConvert<CRgbColor>())
127  {
128  const CRgbColor rgb(valueVariant.value<CRgbColor>());
129  if (!rgb.isValid()) { return; }
130  this->setColor(rgb);
131  }
132  else if (valueVariant.canConvert<QColor>())
133  {
134  const QColor qColor(valueVariant.value<QColor>());
135  if (!qColor.isValid()) { return; }
136  this->setColor(qColor);
137  }
138  }
139  }
140  else if (mime->hasText())
141  {
142  const QString t = mime->text();
143  if (t.isEmpty()) { return; }
144  if (!t.contains("{"))
145  {
146  // we assume a color string, not an object (because there are no {})
147  const CRgbColor c(t);
148  if (!c.isValid()) { return; }
149  this->setColor(c);
150  }
151  }
152  }
153 
154  void CColorSelector::mousePressEvent(QMouseEvent *event)
155  {
156  if (!event || event->button() != Qt::LeftButton) { QFrame::mousePressEvent(event); }
157  const CRgbColor c(this->getColor());
158  if (!c.isValid()) { return; }
159 
160  QDrag *drag = new QDrag(this);
161  QMimeData *mimeData = new QMimeData;
162 
163  mimeData->setColorData(QVariant::fromValue(c.toQColor()));
164  drag->setMimeData(mimeData);
165  drag->setPixmap(c.toPixmap());
166 
167  Qt::DropAction dropAction = drag->exec(Qt::CopyAction);
168  Q_UNUSED(dropAction);
169  }
170 
171  void CColorSelector::colorDialog()
172  {
173  QColor q = this->getColor().toQColor();
174  if (!q.isValid()) { q = m_lastColor.toQColor(); }
175  QColor newColor = QColorDialog::getColor(q, this, "Color picker");
176  if (!newColor.isValid()) { return; }
177  this->setColor(newColor);
178  }
179 
180  void CColorSelector::onReturnPressed()
181  {
182  const CRgbColor color = this->getColor();
183  if (color.isValid()) { this->setColor(color); }
184  }
185 
186  void CColorSelector::setColorByName(const QString &colorName)
187  {
188  if (colorName.isEmpty()) { return; }
189  const CRgbColor c(colorName, true);
190  if (c.isValid()) { this->setColor(c); }
191  }
192 
193  void CColorSelector::resetToLastValidColor()
194  {
195  if (!m_lastColor.isValid()) { return; }
196  this->setColor(m_lastColor);
197  }
198 } // namespace swift::gui::components
static swift::misc::CVariant fromSwiftDragAndDropData(const QMimeData *mime)
From text dropped.
Definition: guiutility.cpp:368
static bool hasSwiftVariantMimeType(const QMimeData *mime)
Mime data with swift type.
Definition: guiutility.cpp:363
void setReadOnly(bool readOnly)
Read only.
void colorChanged(const swift::misc::CRgbColor &color)
Color has been changed.
virtual void mousePressEvent(QMouseEvent *event)
For dragging the color.
virtual void dropEvent(QDropEvent *event)
virtual void dragEnterEvent(QDragEnterEvent *event)
virtual void dragLeaveEvent(QDragLeaveEvent *event)
swift::misc::CRgbColor getColor() const
Selected color.
virtual void dragMoveEvent(QDragMoveEvent *event)
void setColor(const swift::misc::CRgbColor &color)
Color.
QString hex(bool withHash=false) const
Hex value.
Definition: rgbcolor.cpp:100
QPixmap toPixmap() const
Icon as pixmap.
Definition: rgbcolor.cpp:30
QColor toQColor() const
To QColor.
Definition: rgbcolor.cpp:52
bool isValid() const
Valid?
Definition: rgbcolor.cpp:140
Wrapper around QVariant which provides transparent access to CValueObject methods of the contained ob...
Definition: variant.h:66
T value() const
Return the value converted to the type T.
Definition: variant.h:169
bool isValid() const
True if this variant is valid.
Definition: variant.h:252
bool canConvert(int typeId) const
True if this variant can be converted to the type with the given metatype ID.
High level reusable GUI components.
Definition: aboutdialog.cpp:13
Free functions in swift::misc.