Krita Source Code Documentation
Loading...
Searching...
No Matches
KoColorPopupAction.cpp
Go to the documentation of this file.
1/* This file is part of the KDE project
2 * SPDX-FileCopyrightText: 2007 C. Boemann <cbo@boemann.dk>
3 * SPDX-FileCopyrightText: 2007 Fredy Yanardi <fyanardi@gmail.com>
4 *
5 * SPDX-License-Identifier: LGPL-2.0-or-later
6 */
7
9
10#include "KoColorSetWidget.h"
12#include "KoColorSlider.h"
14#include "KoResourceServer.h"
17#include <KoColor.h>
18
19#include <WidgetsDebug.h>
20#include <klocalizedstring.h>
21
22#include <QPainter>
23#include <QWidgetAction>
24#include <QMenu>
25#include <QHBoxLayout>
26#include <QGridLayout>
27#include <QToolButton>
28
61
63 : QAction(parent),
65{
66 d->menu = new QMenu();
67 QWidget *widget = new QWidget(d->menu);
68 QWidgetAction *wdgAction = new QWidgetAction(d->menu);
69 d->colorSetWidget = new KoColorSetWidget(widget);
71
72 KoColorSetSP defaultColorSet = rServer->resource("", "", "Default");
73 if (!defaultColorSet && rServer->resourceCount() > 0) {
74 defaultColorSet = rServer->firstResource();
75 }
76 d->colorSetWidget->setColorSet(defaultColorSet);
77
78 d->colorChooser = new KoTriangleColorSelector( widget );
79 // prevent mouse release on color selector from closing popup
80 d->colorChooser->setAttribute( Qt::WA_NoMousePropagation );
81 d->opacitySlider = new KoColorSlider( Qt::Vertical, widget );
82 d->opacitySlider->setFixedWidth(25);
83 d->opacitySlider->setRange(0, 255);
84 d->opacitySlider->setValue(255);
85 d->opacitySlider->setToolTip( i18n( "Opacity" ) );
86
87 QGridLayout * layout = new QGridLayout( widget );
88 layout->addWidget( d->colorSetWidget, 0, 0, 1, -1 );
89 layout->addWidget( d->colorChooser, 1, 0 );
90 layout->addWidget( d->opacitySlider, 1, 1 );
91 layout->setContentsMargins(4, 4, 4, 4);
92
93 wdgAction->setDefaultWidget(widget);
94 d->menu->addAction(wdgAction);
95 setMenu(d->menu);
96 new QHBoxLayout(d->menu);
97 d->menu->layout()->addWidget(widget);
98 d->menu->layout()->setContentsMargins(0, 0, 0, 0);
99
100 connect(this, SIGNAL(triggered()), this, SLOT(emitColorChanged()));
101
103 this, SLOT(colorWasSelected(KoColor,bool)));
104 connect(d->colorChooser, SIGNAL(colorChanged(QColor)),
105 this, SLOT(colorWasEdited(QColor)));
106 connect(d->opacitySlider, SIGNAL(valueChanged(int)),
107 this, SLOT(opacityWasChanged(int)));
108}
109
114
116{
117 KoColor minColor( color );
118 d->currentColor = minColor;
119
120 d->colorChooser->blockSignals(true);
121 d->colorChooser->slotSetColor(color);
122 d->colorChooser->blockSignals(false);
123
124 KoColor maxColor( color );
126 maxColor.setOpacity( OPACITY_OPAQUE_U8 );
127
128 d->opacitySlider->blockSignals( true );
129 d->opacitySlider->setColors( minColor, maxColor );
130 d->opacitySlider->setValue( color.opacityU8() );
131 d->opacitySlider->blockSignals( false );
132
133 updateIcon();
134}
135
136void KoColorPopupAction::setCurrentColor( const QColor &_color )
137{
138#ifndef NDEBUG
139 if (!_color.isValid()) {
140 warnWidgets << "Invalid color given, defaulting to black";
141 }
142#endif
143 const QColor color(_color.isValid() ? _color : QColor(0,0,0,255));
145}
146
148{
149 return d->currentColor.toQColor();
150}
151
156
158{
159 QSize iconSize;
160 QToolButton *toolButton = dynamic_cast<QToolButton*>(parentWidget());
161 if (toolButton) {
162 iconSize = QSize(toolButton->iconSize());
163 } else {
164 iconSize = QSize(16, 16);
165 }
166
167 // This must be a QImage, as drawing to a QPixmap outside the
168 // UI thread will cause sporadic crashes.
169 QImage pm;
170
171 if (icon().isNull()) {
172 d->applyMode = false;
173 }
174
175 if(d->applyMode) {
176 pm = icon().pixmap(iconSize).toImage();
177 if (pm.isNull()) {
178 pm = QImage(iconSize, QImage::Format_ARGB32_Premultiplied);
179 pm.fill(Qt::transparent);
180 }
181 QPainter p(&pm);
182 p.fillRect(0, iconSize.height() - 4, iconSize.width(), 4, d->currentColor.toQColor());
183 p.end();
184 } else {
185 pm = QImage(iconSize, QImage::Format_ARGB32_Premultiplied);
186 pm.fill(Qt::transparent);
187 QPainter p(&pm);
188 d->checkerPainter.paint(p, QRect(QPoint(),iconSize));
189 p.fillRect(0, 0, iconSize.width(), iconSize.height(), d->currentColor.toQColor());
190 p.end();
191 }
192 setIcon(QIcon(QPixmap::fromImage(pm)));
193}
194
199
200void KoColorPopupAction::colorWasSelected(const KoColor &color, bool final)
201{
202 d->currentColor = color;
203 if (final) {
204 menu()->hide();
206 }
207 updateIcon();
208}
209
210void KoColorPopupAction::colorWasEdited( const QColor &color )
211{
213 quint8 opacity = d->opacitySlider->value();
214 d->currentColor.setOpacity( opacity );
215
216 KoColor minColor = d->currentColor;
218 KoColor maxColor = minColor;
219 maxColor.setOpacity( OPACITY_OPAQUE_U8 );
220
221 d->opacitySlider->setColors( minColor, maxColor );
222
224
225 updateIcon();
226}
227
229{
230 d->currentColor.setOpacity( quint8(opacity) );
231
233}
const Params2D p
const quint8 OPACITY_TRANSPARENT_U8
const quint8 OPACITY_OPAQUE_U8
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
#define warnWidgets
int iconSize(qreal width, qreal height)
void paint(QPainter &painter, const QRectF &rect, const QPointF &patternOrigin) const
void updateIcon()
update the icon - only needed if you resize the iconsize in the widget that shows the action
void colorWasSelected(const KoColor &color, bool final)
KoColorPopupActionPrivate *const d
KoColor currentKoColor() const
Returns the current color as a KoColor.
void colorChanged(const KoColor &color)
QColor currentColor() const
Returns the current color.
KoColorPopupAction(QObject *parent=0)
void opacityWasChanged(int opacity)
void colorWasEdited(const QColor &color)
void setCurrentColor(const QColor &color)
Sets a new color to be displayed.
A colormanaged widget for choosing a color from a colorset.
void setColorSet(KoColorSetSP colorSet)
void setOpacity(quint8 alpha)
Definition KoColor.cpp:333
quint8 opacityU8() const
Definition KoColor.cpp:341
void toQColor(QColor *c) const
a convenience method for the above.
Definition KoColor.cpp:198
int resourceCount() const
QSharedPointer< T > resource(const QString &md5, const QString &fileName, const QString &name)
resource retrieves a resource. If the md5sum is not empty, the resource will only be retrieved if a r...
QSharedPointer< T > firstResource() const
Return the first resource available.
void setColors(const KoColor &minColor, const KoColor &maxColor)
static KoColorSpaceRegistry * instance()
static KoResourceServerProvider * instance()
KoResourceServer< KoColorSet > * paletteServer
void slotSetColor(const KoColor &) override