65
65
#include "widgets/kis_slider_spin_box.h"
66
66
#include "kis_canvas_resource_provider.h"
67
67
#include <recorder/kis_recorded_paint_action.h>
68
#include <kis_cubic_curve.h>
69
#include "kis_color_picker_utils.h"
70
72
KisToolPaint::KisToolPaint(KoCanvasBase * canvas, const QCursor & cursor)
71
: KisTool(canvas, cursor), m_previousNode(0)
73
: KisTool(canvas, cursor)
73
75
m_optionWidgetLayout = 0;
80
80
m_opacity = OPACITY_OPAQUE_U8;
83
updateTabletPressureSamples();
83
85
m_supportOutline = false;
87
KisCanvas2 * kiscanvas = static_cast<KisCanvas2*>(canvas);
90
connect(kiscanvas->view()->resourceProvider(), SIGNAL(sigCompositeOpChanged(QString)), this, SLOT(slotSetCompositeMode(QString)));
91
connect(this, SIGNAL(sigFavoritePaletteCalled(const QPoint&)), kiscanvas, SIGNAL(favoritePaletteCalled(const QPoint&)));
92
connect(this, SIGNAL(sigPaintingFinished()), kiscanvas->view()->resourceProvider(), SLOT(slotPainting()));
93
102
KisTool::resourceChanged(key, v);
96
case(KisCanvasResourceProvider::CurrentKritaNode):
97
updateCompositeOpComboBox();
98
// Deconnect colorspace change of previous node
100
if (m_previousNode->paintDevice()) {
101
disconnect(m_previousNode->paintDevice().data(), SIGNAL(colorSpaceChanged(const KoColorSpace*)), this, SLOT(updateCompositeOpComboBox()));
104
// Reconnect colorspace change of node
105
m_previousNode = currentNode();
106
if (m_previousNode && m_previousNode->paintDevice()) {
107
connect(m_previousNode->paintDevice().data(), SIGNAL(colorSpaceChanged(const KoColorSpace*)), SLOT(updateCompositeOpComboBox()));
105
case(KisCanvasResourceProvider::CurrentKritaNode):
106
slotSetCompositeMode(canvas()->resourceManager()->resource(KisCanvasResourceProvider::CurrentCompositeOp).toString());
114
112
connect(KisConfigNotifier::instance(), SIGNAL(configChanged()), SLOT(resetCursorStyle()));
113
connect(KisConfigNotifier::instance(), SIGNAL(configChanged()), SLOT(updateTabletPressureSamples()));
131
void KisToolPaint::mouseReleaseEvent(KoPointerEvent *e)
133
if (e->button() == Qt::RightButton) {
134
//CALLING POP UP PALETTE
135
emit sigFavoritePaletteCalled(e->pos());
137
// KoResourceManager * resourceProvider = 0;
138
// if (canvas() && (resourceProvider = canvas()->resourceProvider())) {
139
// QVariant fg = resourceProvider->resource(KoCanvasResource::ForegroundColor);
140
// if (!fg.isValid()) return;
141
// QVariant bg = resourceProvider->resource(KoCanvasResource::BackgroundColor);
142
// if (!bg.isValid()) return;
143
// resourceProvider->setResource(KoCanvasResource::ForegroundColor, bg);
144
// resourceProvider->setResource(KoCanvasResource::BackgroundColor, fg);
131
void KisToolPaint::setMode(ToolMode mode)
133
if(this->mode() == KisTool::PAINT_MODE &&
134
mode != KisTool::PAINT_MODE) {
136
// Let's add history information about recently used colors
137
emit sigPaintingFinished();
140
KisTool::setMode(mode);
143
void KisToolPaint::mousePressEvent(KoPointerEvent *event)
145
if(mode() == KisTool::HOVER_MODE &&
146
(event->button() == Qt::LeftButton || event->button() == Qt::RightButton) &&
147
event->modifiers() & Qt::ControlModifier &&
148
!specialModifierActive()) {
150
setMode(SECONDARY_PAINT_MODE);
151
useCursor(KisCursor::pickerCursor());
153
m_toForegroundColor = event->button() == Qt::LeftButton;
154
pickColor(event->point, event->modifiers() & Qt::AltModifier,
155
m_toForegroundColor);
158
else if(mode() == KisTool::HOVER_MODE &&
159
event->button() == Qt::RightButton &&
160
event->modifiers() == Qt::NoModifier &&
161
!specialModifierActive()) {
163
emit sigFavoritePaletteCalled(event->pos());
167
KisTool::mousePressEvent(event);
171
void KisToolPaint::mouseMoveEvent(KoPointerEvent *event)
173
if(mode() == KisTool::SECONDARY_PAINT_MODE) {
174
pickColor(event->point, event->modifiers() & Qt::AltModifier,
175
m_toForegroundColor);
179
KisTool::mouseMoveEvent(event);
183
void KisToolPaint::mouseReleaseEvent(KoPointerEvent *event)
185
if(mode() == KisTool::SECONDARY_PAINT_MODE) {
186
setMode(KisTool::HOVER_MODE);
191
KisTool::mouseReleaseEvent(event);
195
void KisToolPaint::keyPressEvent(QKeyEvent *event)
197
KisTool::keyPressEvent(event);
200
void KisToolPaint::keyReleaseEvent(QKeyEvent* event)
202
KisTool::keyReleaseEvent(event);
205
void KisToolPaint::pickColor(const QPointF &documentPixel,
206
bool fromCurrentNode,
207
bool toForegroundColor)
209
if(m_colorPickerDelayTimer.isActive()) {
213
m_colorPickerDelayTimer.setSingleShot(true);
214
m_colorPickerDelayTimer.start(100);
217
int resource = toForegroundColor ?
218
KoCanvasResource::ForegroundColor : KoCanvasResource::BackgroundColor;
220
KisPaintDeviceSP device = fromCurrentNode ?
221
currentNode()->paintDevice() : image()->projection();
223
QPoint imagePoint = image()->documentToIntPixel(documentPixel);
225
canvas()->resourceManager()->
226
setResource(resource, KisToolUtils::pick(device, imagePoint));
150
229
QWidget * KisToolPaint::createOptionWidget()
153
232
QWidget * optionWidget = new QWidget();
154
233
optionWidget->setObjectName(toolId());
156
m_lbComposite = new QLabel(i18n("Mode: "), optionWidget);
157
m_lbComposite->setAlignment(Qt::AlignVCenter | Qt::AlignRight);
158
m_cmbComposite = new KisCmbComposite(optionWidget);
159
updateCompositeOpComboBox();
160
connect(m_cmbComposite, SIGNAL(activated(const QString&)), this, SLOT(slotSetCompositeMode(const QString&)));
162
235
m_lbOpacity = new QLabel(i18n("Opacity: "), optionWidget);
163
236
m_lbOpacity->setAlignment(Qt::AlignVCenter | Qt::AlignRight);
164
237
m_slOpacity = new KisSliderSpinBox(optionWidget);
176
249
m_optionWidgetLayout->setSpacing(1);
177
250
m_optionWidgetLayout->setMargin(0);
179
m_optionWidgetLayout->addWidget(m_lbComposite, 0, 0);
180
m_optionWidgetLayout->addWidget(m_cmbComposite, 0, 1);
182
252
m_optionWidgetLayout->addWidget(m_lbOpacity, 1, 0);
183
253
m_optionWidgetLayout->addWidget(m_slOpacity, 1, 1);
242
void KisToolPaint::updateCompositeOpComboBox()
244
if (m_cmbComposite && currentNode()) {
245
KisPaintDeviceSP device = currentNode()->paintDevice();
248
QList<KoCompositeOp*> compositeOps = device->colorSpace()->compositeOps();
249
m_cmbComposite->setCompositeOpList(compositeOps);
251
if (m_compositeOp == 0 || compositeOps.indexOf(const_cast<KoCompositeOp*>(m_compositeOp)) < 0) {
252
m_compositeOp = device->colorSpace()->compositeOp(COMPOSITE_OVER);
254
m_cmbComposite->setCurrent(m_compositeOp);
255
m_cmbComposite->setEnabled(true);
257
m_cmbComposite->setEnabled(false);
262
312
void KisToolPaint::slotPopupQuickHelp()
264
314
QWhatsThis::showText(QCursor::pos(), quickHelp());
350
void KisToolPaint::updateTabletPressureSamples()
354
curve.fromString(cfg.pressureTabletCurve());
355
m_pressureSamples = curve.floatTransfer(LEVEL_OF_PRESSURE_RESOLUTION + 1);
358
void KisToolPaint::setupPainter(KisPainter* painter)
360
KisTool::setupPainter(painter);
361
painter->setOpacity(m_opacity);
362
painter->setCompositeOp(m_compositeOp);
296
365
void KisToolPaint::setupPaintAction(KisRecordedPaintAction* action)
298
367
KisTool::setupPaintAction(action);
299
action->setOpacity(m_opacity / (qreal) 255.0);
368
action->setOpacity(m_opacity / qreal(255.0));
300
369
if (m_compositeOp) {
301
370
action->setCompositeOp(m_compositeOp->id());
374
KisToolPaint::NodePaintAbility KisToolPaint::nodePaintAbility()
376
KisNodeSP node = currentNode();
377
if (!node || node->systemLocked() || node->inherits("KisSelectionMask")) {
380
if (node->inherits("KisShapeLayer")) {
383
if (node->paintDevice()) {
305
390
#include "kis_tool_paint.moc"