File indexing completed on 2025-03-09 04:05:59

0001 /* This file is part of the KDE project
0002  * SPDX-FileCopyrightText: 2014 Dan Leinir Turthra Jensen <admin@leinir.dk>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005  *
0006  */
0007 
0008 #include "CurveEditorItem.h"
0009 
0010 #include "kis_curve_widget.h"
0011 #include <QPainter>
0012 #include <QMouseEvent>
0013 #include <kis_debug.h>
0014 
0015 class CurveEditorItem::Private
0016 {
0017 public:
0018     Private(CurveEditorItem* qq)
0019         : q(qq)
0020     {
0021         curveWidget = new KisCurveWidget();
0022     }
0023     ~Private()
0024     {
0025         delete curveWidget;
0026     }
0027     void repaint();
0028 
0029     CurveEditorItem* q;
0030     KisCurveWidget* curveWidget;
0031     QImage contents;
0032 
0033 };
0034 
0035 CurveEditorItem::CurveEditorItem(QQuickItem* parent)
0036     : QQuickPaintedItem(parent)
0037     , d(new Private(this))
0038 {
0039     setFlag(QQuickItem::ItemHasContents, true);
0040     setAcceptedMouseButtons( Qt::LeftButton | Qt::RightButton | Qt::MiddleButton );
0041     connect(d->curveWidget, SIGNAL(pointSelectedChanged()), SIGNAL(pointSelectedChanged()));
0042     connect(d->curveWidget, SIGNAL(modified()), SIGNAL(curveChanged()));
0043     qRegisterMetaType<KisCubicCurve>();
0044 }
0045 
0046 CurveEditorItem::~CurveEditorItem()
0047 {
0048     delete d;
0049 }
0050 
0051 void CurveEditorItem::paint(QPainter* p)
0052 {
0053     p->drawImage(boundingRect(), d->contents);
0054 }
0055 
0056 KisCubicCurve CurveEditorItem::curve() const
0057 {
0058     return d->curveWidget->curve();
0059 }
0060 
0061 void CurveEditorItem::setCurve(KisCubicCurve curve)
0062 {
0063     d->curveWidget->setCurve(curve);
0064     emit curveChanged();
0065 }
0066 
0067 bool CurveEditorItem::pointSelected() const
0068 {
0069     return d->curveWidget->pointSelected();
0070 }
0071 
0072 void CurveEditorItem::deleteSelectedPoint()
0073 {
0074     if(pointSelected()) {
0075         QKeyEvent* event = new QKeyEvent(QEvent::KeyPress, Qt::Key_Delete, Qt::NoModifier);
0076         d->curveWidget->keyPressEvent(event);
0077         d->repaint();
0078     }
0079 }
0080 
0081 void CurveEditorItem::Private::repaint()
0082 {
0083     curveWidget->resize(q->boundingRect().size().toSize());
0084     contents = QImage(q->boundingRect().size().toSize(), QImage::Format_ARGB32_Premultiplied);
0085     contents.fill(Qt::blue);
0086     curveWidget->render(&contents);
0087     q->update();
0088 }
0089 
0090 void CurveEditorItem::geometryChanged(const QRectF& newGeometry, const QRectF& oldGeometry)
0091 {
0092     d->repaint();
0093     QQuickPaintedItem::geometryChanged(newGeometry, oldGeometry);
0094 }
0095 
0096 void CurveEditorItem::mousePressEvent(QMouseEvent* event)
0097 {
0098     QMouseEvent* mouseEvent = new QMouseEvent(event->type(), event->pos(), event->button(), event->buttons(), event->modifiers());
0099     d->curveWidget->mousePressEvent(mouseEvent);
0100     if(mouseEvent->isAccepted()) {
0101         event->accept();
0102     }
0103     d->repaint();
0104 }
0105 
0106 void CurveEditorItem::mouseMoveEvent(QMouseEvent* event)
0107 {
0108     QMouseEvent* mouseEvent = new QMouseEvent(event->type(), event->pos(), event->button(), event->buttons(), event->modifiers());
0109     d->curveWidget->mouseMoveEvent(mouseEvent);
0110     if(mouseEvent->isAccepted()) {
0111         event->accept();
0112     }
0113     d->repaint();
0114 }
0115 
0116 void CurveEditorItem::mouseReleaseEvent(QMouseEvent* event)
0117 {
0118     QMouseEvent* mouseEvent = new QMouseEvent(event->type(), event->pos(), event->button(), event->buttons(), event->modifiers());
0119     d->curveWidget->mouseReleaseEvent(mouseEvent);
0120     if(mouseEvent->isAccepted()) {
0121         event->accept();
0122     }
0123     d->repaint();
0124 }
0125