Krita Source Code Documentation
Loading...
Searching...
No Matches
KisCurveWidget Class Reference

#include <kis_curve_widget.h>

+ Inheritance diagram for KisCurveWidget:

Public Types

enum  PointConstrain { PointConstrain_None , PointConstrain_AlwaysCorner , PointConstrain_AlwaysSmooth }
 

Public Slots

void setCurve (KisCubicCurve inlist)
 

Signals

void compressorShouldEmitModified ()
 
void curveChanged (const KisCubicCurve &)
 
void modified (void)
 
void pointSelectedChanged ()
 
void shouldFocusIOControls ()
 
void shouldSyncIOControls ()
 

Public Member Functions

void addPointInTheMiddle ()
 
void applyGlobalPointConstrain ()
 
std::optional< KisCubicCurvePointcurrentPoint () const
 
std::optional< QPointF > currentPointPosition () const
 
KisCubicCurve curve ()
 
void drawGrid (QPainter &p, int wWidth, int wHeight)
 
void dropInOutControls ()
 
QPixmap getPixmap ()
 
PointConstrain globalPointConstrain () const
 
std::optional< bool > isCurrentPointSetAsCorner () const
 
bool jumpOverExistingPoints (QPointF &pt, int skipIndex)
 
 KisCurveWidget (QWidget *parent=nullptr, Qt::WindowFlags f=Qt::WindowFlags())
 
int nearestPointInRange (QPointF pt, int wWidth, int wHeight) const
 
bool pointSelected () const
 
 Private (KisCurveWidget *parent)
 
void reset (void)
 
bool setCurrentPoint (const QPointF &position, bool setAsCorner)
 
bool setCurrentPointAsCorner (bool setAsCorner)
 
bool setCurrentPointPosition (const QPointF &position)
 
void setCurveModified (bool rewriteSpinBoxesValues=true)
 
void setCurveRepaint ()
 
void setGlobalPointConstrain (PointConstrain constrain)
 
void setPixmap (const QPixmap &pix)
 
void setState (enumState st)
 
void setupInOutControls (QSpinBox *in, QSpinBox *out, int inMin, int inMax, int outMin, int outMax)
 
enumState state () const
 
void syncIOControls ()
 
 ~KisCurveWidget () override
 

Public Attributes

KisCubicCurve m_curve
 
KisCubicCurvePoint m_draggedAwayPoint
 
int m_draggedAwayPointIndex {0}
 
KisCurveWidget::PointConstrain m_globalPointConstrain {KisCurveWidget::PointConstrain_None}
 
int m_grab_point_index {-1}
 
double m_grabOffsetX {0.0}
 
double m_grabOffsetY {0.0}
 
double m_grabOriginalX {0.0}
 
double m_grabOriginalY {0.0}
 
int m_handleSize {12}
 
KisThreadSafeSignalCompressor m_modifiedSignalsCompressor
 
QPixmap m_pix
 
QPixmap * m_pixmapCache {nullptr}
 
bool m_pixmapDirty {true}
 
bool m_readOnlyMode {false}
 
bool m_splineDirty {false}
 
enumState m_state {enumState::ST_NORMAL}
 

Protected Slots

void notifyModified ()
 
void slotCompressorShouldEmitModified ()
 

Protected Member Functions

void keyPressEvent (QKeyEvent *) override
 
void leaveEvent (QEvent *) override
 
void mouseMoveEvent (QMouseEvent *e) override
 
void mousePressEvent (QMouseEvent *e) override
 
void mouseReleaseEvent (QMouseEvent *e) override
 
void paintEvent (QPaintEvent *) override
 
void resizeEvent (QResizeEvent *e) override
 

Properties

bool pointSelected
 

Private Attributes

Private *const d {nullptr}
 
KisCurveWidgetm_curveWidget {nullptr}
 
- Private Attributes inherited from Private
KisCanvas2canvas
 
int displayedFrame
 
int intendedFrame
 

Friends

class CurveEditorItem
 

Additional Inherited Members

- Private Member Functions inherited from Private
 Private (KisCanvas2 *c)
 

Detailed Description

KisCurveWidget is a widget that shows a single curve that can be edited by the user. The user can grab the curve and move it; this creates a new control point. Control points can be deleted by selecting a point and pressing the delete key.

(From: https://techbase.kde.org/Projects/Widgets_and_Classes#KisCurveWidget) KisCurveWidget allows editing of spline based y=f(x) curves. Handy for cases where you want the user to control such things as tablet pressure response, color transformations, acceleration by time, aeroplane lift by angle of attack.

Private members for KisCurveWidget class

Definition at line 40 of file kis_curve_widget.h.

Member Enumeration Documentation

◆ PointConstrain

Enumerator
PointConstrain_None 
PointConstrain_AlwaysCorner 
PointConstrain_AlwaysSmooth 

Definition at line 80 of file kis_curve_widget.h.

Constructor & Destructor Documentation

◆ KisCurveWidget()

KisCurveWidget::KisCurveWidget ( QWidget * parent = nullptr,
Qt::WindowFlags f = Qt::WindowFlags() )

Create a new curve widget with a default curve, that is a straight line from bottom-left to top-right.

Definition at line 53 of file kis_curve_widget.cpp.

54 : QWidget(parent, f), d(new KisCurveWidget::Private(this))
55{
56 setObjectName("KisCurveWidget");
57
58 connect(&d->m_modifiedSignalsCompressor, SIGNAL(timeout()), SLOT(notifyModified()));
60
61 setMouseTracking(true);
62 setAutoFillBackground(false);
63 setAttribute(Qt::WA_OpaquePaintEvent);
64 setMinimumSize(150, 50);
65 setMaximumSize(250, 250);
66
67
68 setFocusPolicy(Qt::StrongFocus);
69}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
Private *const d
void slotCompressorShouldEmitModified()
void compressorShouldEmitModified()
Private(KisCurveWidget *parent)

References compressorShouldEmitModified(), connect(), d, notifyModified(), and slotCompressorShouldEmitModified().

◆ ~KisCurveWidget()

KisCurveWidget::~KisCurveWidget ( )
override

Definition at line 71 of file kis_curve_widget.cpp.

72{
73 delete d->m_pixmapCache;
74 delete d;
75}

References d.

Member Function Documentation

◆ addPointInTheMiddle()

void KisCurveWidget::addPointInTheMiddle ( )

Handy function that creates new point in the middle of the curve and sets focus on the m_intIn field, so the user can move this point anywhere in a moment

Definition at line 245 of file kis_curve_widget.cpp.

246{
247 QPointF position(0.5, d->m_curve.value(0.5));
248
249 if (!d->jumpOverExistingPoints(position, -1))
250 return;
251
252 const bool setAsCorner = d->m_globalPointConstrain == PointConstrain_AlwaysCorner;
253
254 d->m_grab_point_index = d->m_curve.addPoint(position, setAsCorner);
255 Q_EMIT pointSelectedChanged();
256
257 Q_EMIT shouldFocusIOControls();
258 d->setCurveModified();
259}
void pointSelectedChanged()
void shouldFocusIOControls()

References d, PointConstrain_AlwaysCorner, pointSelectedChanged(), and shouldFocusIOControls().

◆ applyGlobalPointConstrain()

void KisCurveWidget::applyGlobalPointConstrain ( )

Ensure that all points conform to the global constrain set

◆ compressorShouldEmitModified

void KisCurveWidget::compressorShouldEmitModified ( )
signal

Emitted to notify that the start() function in compressor can be activated. Thanks to that, blocking signals in curve widget blocks "sending signals" (calling start() function) to the signal compressor. It effectively makes signals work nearly the same way they worked before adding the signal compressor in between.

◆ currentPoint()

std::optional< KisCubicCurvePoint > KisCurveWidget::currentPoint ( ) const

Definition at line 142 of file kis_curve_widget.cpp.

143{
144 return d->m_grab_point_index >= 0 && d->m_grab_point_index < d->m_curve.curvePoints().count()
145 ? std::make_optional(d->m_curve.curvePoints()[d->m_grab_point_index])
146 : std::nullopt;
147}

References d.

◆ currentPointPosition()

std::optional< QPointF > KisCurveWidget::currentPointPosition ( ) const

Definition at line 149 of file kis_curve_widget.cpp.

150{
151 return d->m_grab_point_index >= 0 && d->m_grab_point_index < d->m_curve.curvePoints().count()
152 ? std::make_optional(d->m_curve.curvePoints()[d->m_grab_point_index].position())
153 : std::nullopt;
154}

References d.

◆ curve()

KisCubicCurve KisCurveWidget::curve ( )
Returns
get a list with all defined points. If you want to know what the y value for a given x is on the curve defined by these points, use getCurveValue().
See also
getCurveValue

Definition at line 519 of file kis_curve_widget.cpp.

520{
521 return d->m_curve;
522}

References d.

◆ curveChanged

void KisCurveWidget::curveChanged ( const KisCubicCurve & )
signal

◆ drawGrid()

void KisCurveWidget::drawGrid ( QPainter & p,
int wWidth,
int wHeight )
inline

Nothing to be said! =)

◆ dropInOutControls()

void KisCurveWidget::dropInOutControls ( )

◆ getPixmap()

QPixmap KisCurveWidget::getPixmap ( )

Definition at line 188 of file kis_curve_widget.cpp.

189{
190 return d->m_pix;
191}

References d.

◆ globalPointConstrain()

KisCurveWidget::PointConstrain KisCurveWidget::globalPointConstrain ( ) const

Definition at line 163 of file kis_curve_widget.cpp.

164{
165 return d->m_globalPointConstrain;
166}

References d.

◆ isCurrentPointSetAsCorner()

std::optional< bool > KisCurveWidget::isCurrentPointSetAsCorner ( ) const

Definition at line 156 of file kis_curve_widget.cpp.

157{
158 return d->m_grab_point_index >= 0 && d->m_grab_point_index < d->m_curve.curvePoints().count()
159 ? std::make_optional(d->m_curve.curvePoints()[d->m_grab_point_index].isSetAsCorner())
160 : std::nullopt;
161}

References d.

◆ jumpOverExistingPoints()

bool KisCurveWidget::jumpOverExistingPoints ( QPointF & pt,
int skipIndex )

Check whether newly created/moved point pt doesn't overlap with any of existing ones from m_points and adjusts its coordinates. skipIndex is the index of the point, that shouldn't be taken into account during the search (e.g. because it's pt itself)

Returns false in case the point can't be placed anywhere without overlapping

◆ keyPressEvent()

void KisCurveWidget::keyPressEvent ( QKeyEvent * e)
overrideprotected

Definition at line 198 of file kis_curve_widget.cpp.

199{
200 if (e->key() == Qt::Key_Delete || e->key() == Qt::Key_Backspace) {
201 if (d->m_grab_point_index > 0 && d->m_grab_point_index < d->m_curve.curvePoints().count() - 1) {
202 //x() find closest point to get focus afterwards
203 double grab_point_x = d->m_curve.curvePoints()[d->m_grab_point_index].x();
204
205 int left_of_grab_point_index = d->m_grab_point_index - 1;
206 int right_of_grab_point_index = d->m_grab_point_index + 1;
207 int new_grab_point_index;
208
209 if (fabs(d->m_curve.curvePoints()[left_of_grab_point_index].x() - grab_point_x) <
210 fabs(d->m_curve.curvePoints()[right_of_grab_point_index].x() - grab_point_x)) {
211 new_grab_point_index = left_of_grab_point_index;
212 } else {
213 new_grab_point_index = d->m_grab_point_index;
214 }
215 d->m_curve.removePoint(d->m_grab_point_index);
216 d->m_grab_point_index = new_grab_point_index;
217 Q_EMIT pointSelectedChanged();
218 setCursor(Qt::ArrowCursor);
219 d->setState(ST_NORMAL);
220 }
221 e->accept();
222 d->setCurveModified();
223 } else if (e->key() == Qt::Key_Escape && d->state() != ST_NORMAL) {
224 d->m_curve.setPointPosition(d->m_grab_point_index, QPointF(d->m_grabOriginalX, d->m_grabOriginalY) );
225 setCursor(Qt::ArrowCursor);
226 d->setState(ST_NORMAL);
227
228 e->accept();
229 d->setCurveModified();
230 } else if ((e->key() == Qt::Key_A || e->key() == Qt::Key_Insert) && d->state() == ST_NORMAL) {
231 /* FIXME: Lets user choose the hotkeys */
233 e->accept();
234 } else if (e->key() == Qt::Key_S &&
235 d->m_globalPointConstrain == PointConstrain_None &&
236 pointSelected() &&
237 d->state() == ST_NORMAL) {
238 /* FIXME: Lets user choose the hotkeys */
240 e->accept();
241 } else
242 QWidget::keyPressEvent(e);
243}
std::optional< bool > isCurrentPointSetAsCorner() const
bool setCurrentPointAsCorner(bool setAsCorner)
@ ST_NORMAL

References addPointInTheMiddle(), d, isCurrentPointSetAsCorner(), PointConstrain_None, pointSelected, pointSelectedChanged(), setCurrentPointAsCorner(), and ST_NORMAL.

◆ leaveEvent()

void KisCurveWidget::leaveEvent ( QEvent * )
overrideprotected

Definition at line 533 of file kis_curve_widget.cpp.

534{
535}

◆ modified

void KisCurveWidget::modified ( void )
signal

Emitted whenever a control point has changed position.

◆ mouseMoveEvent()

void KisCurveWidget::mouseMoveEvent ( QMouseEvent * e)
overrideprotected

Definition at line 444 of file kis_curve_widget.cpp.

445{
446 if (d->m_readOnlyMode) return;
447
448 double x = e->pos().x() / (double)(width() - 1);
449 double y = 1.0 - e->pos().y() / (double)(height() - 1);
450
451 if (d->state() == ST_NORMAL) { // If no point is selected set the cursor shape if on top
452 int nearestPointIndex = d->nearestPointInRange(QPointF(x, y), width(), height());
453
454 if (nearestPointIndex < 0)
455 setCursor(Qt::ArrowCursor);
456 else
457 setCursor(Qt::CrossCursor);
458 } else { // Else, drag the selected point
459 bool crossedHoriz = e->pos().x() - width() > MOUSE_AWAY_THRES ||
460 e->pos().x() < -MOUSE_AWAY_THRES;
461 bool crossedVert = e->pos().y() - height() > MOUSE_AWAY_THRES ||
462 e->pos().y() < -MOUSE_AWAY_THRES;
463
464 bool removePoint = (crossedHoriz || crossedVert);
465
466 if (!removePoint && d->m_draggedAwayPointIndex >= 0) {
467 // point is no longer dragged away so reinsert it
468 KisCubicCurvePoint newPoint(d->m_draggedAwayPoint);
469 d->m_grab_point_index = d->m_curve.addPoint(newPoint);
470 d->m_draggedAwayPointIndex = -1;
471 }
472
473 if (removePoint &&
474 (d->m_draggedAwayPointIndex >= 0))
475 return;
476
477
478 setCursor(Qt::CrossCursor);
479
480 x += d->m_grabOffsetX;
481 y += d->m_grabOffsetY;
482
483 double leftX;
484 double rightX;
485 if (d->m_grab_point_index == 0) {
486 leftX = 0.0;
487 if (d->m_curve.curvePoints().count() > 1)
488 rightX = d->m_curve.curvePoints()[d->m_grab_point_index + 1].x() - POINT_AREA;
489 else
490 rightX = 1.0;
491 } else if (d->m_grab_point_index == d->m_curve.curvePoints().count() - 1) {
492 leftX = d->m_curve.curvePoints()[d->m_grab_point_index - 1].x() + POINT_AREA;
493 rightX = 1.0;
494 } else {
495 Q_ASSERT(d->m_grab_point_index > 0 && d->m_grab_point_index < d->m_curve.curvePoints().count() - 1);
496
497 // the 1E-4 addition so we can grab the dot later.
498 leftX = d->m_curve.curvePoints()[d->m_grab_point_index - 1].x() + POINT_AREA;
499 rightX = d->m_curve.curvePoints()[d->m_grab_point_index + 1].x() - POINT_AREA;
500 }
501
502 x = bounds(x, leftX, rightX);
503 y = bounds(y, 0., 1.);
504
505 d->m_curve.setPointPosition(d->m_grab_point_index, QPointF(x, y));
506
507 if (removePoint && d->m_curve.curvePoints().count() > 2) {
508 d->m_draggedAwayPoint = d->m_curve.curvePoints()[d->m_grab_point_index];
509 d->m_draggedAwayPointIndex = d->m_grab_point_index;
510 d->m_curve.removePoint(d->m_grab_point_index);
511 d->m_grab_point_index = bounds(d->m_grab_point_index, 0, d->m_curve.curvePoints().count() - 1);
512 Q_EMIT pointSelectedChanged();
513 }
514
515 d->setCurveModified();
516 }
517}
#define MOUSE_AWAY_THRES
#define POINT_AREA
#define bounds(x, a, b)

References bounds, d, MOUSE_AWAY_THRES, POINT_AREA, pointSelectedChanged(), and ST_NORMAL.

◆ mousePressEvent()

void KisCurveWidget::mousePressEvent ( QMouseEvent * e)
overrideprotected

Definition at line 385 of file kis_curve_widget.cpp.

386{
387 if (d->m_readOnlyMode) return;
388
389 if (e->button() != Qt::LeftButton)
390 return;
391
392 double x = e->pos().x() / (double)(width() - 1);
393 double y = 1.0 - e->pos().y() / (double)(height() - 1);
394
395
396
397 int closest_point_index = d->nearestPointInRange(QPointF(x, y), width(), height());
398 if (closest_point_index < 0) {
399 QPointF newPoint(x, y);
400 if (!d->jumpOverExistingPoints(newPoint, -1))
401 return;
402
403 const bool setAsCorner = d->m_globalPointConstrain == PointConstrain_AlwaysCorner;
404 d->m_grab_point_index = d->m_curve.addPoint(newPoint, setAsCorner);
405 Q_EMIT pointSelectedChanged();
406 } else {
407 d->m_grab_point_index = closest_point_index;
408 Q_EMIT pointSelectedChanged();
409 }
410
411 const KisCubicCurvePoint &currentPoint = d->m_curve.curvePoints()[d->m_grab_point_index];
412
413 d->m_grabOriginalX = currentPoint.x();
414 d->m_grabOriginalY = currentPoint.y();
415 d->m_grabOffsetX = currentPoint.x() - x;
416 d->m_grabOffsetY = currentPoint.y() - y;
417 if (e->modifiers().testFlag(Qt::ControlModifier) && d->m_globalPointConstrain == PointConstrain_None) {
418 d->m_curve.setPointAsCorner(d->m_grab_point_index, !currentPoint.isSetAsCorner());
419 }
420 d->m_curve.setPointPosition(d->m_grab_point_index, QPointF(x + d->m_grabOffsetX, y + d->m_grabOffsetY));
421
422 d->m_draggedAwayPointIndex = -1;
423 d->setState(ST_DRAG);
424
425
426 d->setCurveModified();
427}
std::optional< KisCubicCurvePoint > currentPoint() const
@ ST_DRAG

References currentPoint(), d, PointConstrain_AlwaysCorner, PointConstrain_None, pointSelectedChanged(), and ST_DRAG.

◆ mouseReleaseEvent()

void KisCurveWidget::mouseReleaseEvent ( QMouseEvent * e)
overrideprotected

Definition at line 430 of file kis_curve_widget.cpp.

431{
432 if (d->m_readOnlyMode) return;
433
434 if (e->button() != Qt::LeftButton)
435 return;
436
437 setCursor(Qt::ArrowCursor);
438 d->setState(ST_NORMAL);
439
440 d->setCurveModified();
441}

References d, and ST_NORMAL.

◆ nearestPointInRange()

int KisCurveWidget::nearestPointInRange ( QPointF pt,
int wWidth,
int wHeight ) const

Find the nearest point to pt from m_points

◆ notifyModified

void KisCurveWidget::notifyModified ( )
protectedslot

Definition at line 537 of file kis_curve_widget.cpp.

538{
539 Q_EMIT modified();
540 Q_EMIT curveChanged(d->m_curve);
541}
void modified(void)
void curveChanged(const KisCubicCurve &)

References curveChanged(), d, and modified().

◆ paintEvent()

void KisCurveWidget::paintEvent ( QPaintEvent * )
overrideprotected

Keep in mind that QLineF rounds doubles to ints mathematically, not just rounds down like in C

Definition at line 267 of file kis_curve_widget.cpp.

268{
269 int wWidth = width() - 1;
270 int wHeight = height() - 1;
271
272
273 QPainter p(this);
274
275 // Antialiasing is not a good idea here, because
276 // the grid will drift one pixel to any side due to rounding of int
277 // FIXME: let's user tell the last word (in config)
278 //p.setRenderHint(QPainter::Antialiasing);
279 QPalette appPalette = QApplication::palette();
280 p.fillRect(rect(), appPalette.color(QPalette::Base)); // clear out previous paint call results
281
282 // make the entire widget grayed out if it is disabled
283 if (!this->isEnabled()) {
284 p.setOpacity(0.2);
285 }
286
287
288
289 // draw background
290 if (!d->m_pix.isNull()) {
291 if (d->m_pixmapDirty || !d->m_pixmapCache) {
292 delete d->m_pixmapCache;
293 d->m_pixmapCache = new QPixmap(width(), height());
294 QPainter cachePainter(d->m_pixmapCache);
295
296 cachePainter.scale(1.0*width() / d->m_pix.width(), 1.0*height() / d->m_pix.height());
297 cachePainter.drawPixmap(0, 0, d->m_pix);
298 d->m_pixmapDirty = false;
299 }
300 p.drawPixmap(0, 0, *d->m_pixmapCache);
301 }
302
303 d->drawGrid(p, wWidth, wHeight);
304
305 KisConfig cfg(true);
306 if (cfg.antialiasCurves()) {
307 p.setRenderHint(QPainter::Antialiasing);
308 }
309
310 // Draw curve.
311 double curY;
312 double normalizedX;
313 int x;
314
315 QPolygonF poly;
316
317 p.setPen(QPen(appPalette.color(QPalette::Text), 2, Qt::SolidLine));
318 for (x = 0 ; x < wWidth ; x++) {
319 normalizedX = double(x) / wWidth;
320 curY = wHeight - d->m_curve.value(normalizedX) * wHeight;
321
327 poly.append(QPointF(x, curY));
328 }
329 poly.append(QPointF(x, wHeight - d->m_curve.value(1.0) * wHeight));
330 p.drawPolyline(poly);
331
332 QPainterPath fillCurvePath;
333 QPolygonF fillPoly = poly;
334 fillPoly.append(QPoint(rect().width(), rect().height()));
335 fillPoly.append(QPointF(0,rect().height()));
336
337 // add a couple points to the edges so it fills in below always
338
339 QColor fillColor = appPalette.color(QPalette::Text);
340 fillColor.setAlphaF(0.2);
341
342 fillCurvePath.addPolygon(fillPoly);
343 p.fillPath(fillCurvePath, fillColor);
344
345
346
347 // Drawing curve handles.
348 if (!d->m_readOnlyMode) {
349 const qreal halfHandleSize = d->m_handleSize * 0.5;
350
351 for (int i = 0; i < d->m_curve.curvePoints().count(); ++i) {
352 const KisCubicCurvePoint &point = d->m_curve.points().at(i);
353
354 if (i == d->m_grab_point_index) {
355 // active point is slightly more "bold"
356 p.setPen(QPen(appPalette.color(QPalette::Text), 4, Qt::SolidLine));
357 } else {
358 p.setPen(QPen(appPalette.color(QPalette::Text), 2, Qt::SolidLine));
359 }
360
361 const QPointF handleCenter(point.x() * wWidth, wHeight - point.y() * wHeight);
362
363 if (point.isSetAsCorner()) {
364 QPolygonF rhombusHandle;
365 rhombusHandle.append(QPointF(handleCenter.x() - halfHandleSize, handleCenter.y()));
366 rhombusHandle.append(QPointF(handleCenter.x(), handleCenter.y() - halfHandleSize));
367 rhombusHandle.append(QPointF(handleCenter.x() + halfHandleSize, handleCenter.y()));
368 rhombusHandle.append(QPointF(handleCenter.x(), handleCenter.y() + halfHandleSize));
369 p.drawPolygon(rhombusHandle);
370 } else {
371 p.drawEllipse(handleCenter, halfHandleSize, halfHandleSize);
372 }
373 }
374 }
375
376 // add border around widget to help contain everything
377 QPainterPath widgetBoundsPath;
378 widgetBoundsPath.addRect(rect());
379 p.strokePath(widgetBoundsPath, appPalette.color(QPalette::Text));
380
381
382 p.setOpacity(1.0); // reset to 1.0 in case we were drawing a disabled widget before
383}
const Params2D p
bool isSetAsCorner() const

References KisConfig::antialiasCurves(), d, KisCubicCurvePoint::isSetAsCorner(), p, KisCubicCurvePoint::x(), and KisCubicCurvePoint::y().

◆ pointSelected()

bool KisCurveWidget::pointSelected ( ) const

Whether or not there is a point selected This does NOT include the first and last points

Definition at line 193 of file kis_curve_widget.cpp.

194{
195 return d->m_grab_point_index > 0 && d->m_grab_point_index < d->m_curve.curvePoints().count();
196}

References d.

◆ pointSelectedChanged

void KisCurveWidget::pointSelectedChanged ( )
signal

Emitted whenever the status of whether a control point is selected or not changes

◆ Private()

KisCurveWidget::Private ( KisCurveWidget * parent)

◆ reset()

void KisCurveWidget::reset ( void )

Reset the curve to the default shape

Definition at line 168 of file kis_curve_widget.cpp.

169{
170 d->m_grab_point_index = -1;
171 Q_EMIT pointSelectedChanged();
172
173 //remove total - 2 points.
174 while (d->m_curve.curvePoints().count() - 2 ) {
175 d->m_curve.removePoint(d->m_curve.curvePoints().count() - 2);
176 }
177
178 d->setCurveModified();
179}

References d, and pointSelectedChanged().

◆ resizeEvent()

void KisCurveWidget::resizeEvent ( QResizeEvent * e)
overrideprotected

Definition at line 261 of file kis_curve_widget.cpp.

262{
263 d->m_pixmapDirty = true;
264 QWidget::resizeEvent(e);
265}

References d.

◆ setCurrentPoint()

bool KisCurveWidget::setCurrentPoint ( const QPointF & position,
bool setAsCorner )

Definition at line 77 of file kis_curve_widget.cpp.

78{
79 Q_ASSERT(d->m_grab_point_index >= 0);
80
81 bool needResyncControls = true;
82 bool isCorner;
83
84 if (d->m_globalPointConstrain == PointConstrain_None) {
85 d->m_curve.setPointAsCorner(d->m_grab_point_index, setAsCorner);
86 isCorner = setAsCorner;
87 } else {
88 isCorner = d->m_globalPointConstrain == PointConstrain_AlwaysCorner;
89 }
90
91 QPointF newPosition(position);
92
93 if (d->jumpOverExistingPoints(newPosition, d->m_grab_point_index)) {
94 needResyncControls = false;
95 d->m_curve.setPointPosition(d->m_grab_point_index, newPosition);
96 d->m_grab_point_index = d->m_curve.curvePoints().indexOf(
97 KisCubicCurvePoint(newPosition, isCorner)
98 );
99 Q_EMIT pointSelectedChanged();
100 }
101
102 d->setCurveModified(false);
103 return needResyncControls;
104}

References d, PointConstrain_AlwaysCorner, PointConstrain_None, and pointSelectedChanged().

◆ setCurrentPointAsCorner()

bool KisCurveWidget::setCurrentPointAsCorner ( bool setAsCorner)

Definition at line 113 of file kis_curve_widget.cpp.

114{
115 Q_ASSERT(d->m_grab_point_index >= 0);
116
117 // Setting the point corner flag is not allowed if there is some global constrain set
118 if (d->m_globalPointConstrain != PointConstrain_None) {
119 return false;
120 }
121
122 if (setAsCorner != d->m_curve.curvePoints()[d->m_grab_point_index].isSetAsCorner()) {
123 d->m_curve.setPointAsCorner(d->m_grab_point_index, setAsCorner);
124 d->setCurveModified(false);
125 }
126
127 return false;
128}

References d, and PointConstrain_None.

◆ setCurrentPointPosition()

bool KisCurveWidget::setCurrentPointPosition ( const QPointF & position)

Definition at line 106 of file kis_curve_widget.cpp.

107{
108 Q_ASSERT(d->m_grab_point_index >= 0);
109
110 return setCurrentPoint(position, d->m_curve.curvePoints()[d->m_grab_point_index].isSetAsCorner());
111}
bool setCurrentPoint(const QPointF &position, bool setAsCorner)

References d, and setCurrentPoint().

◆ setCurve

void KisCurveWidget::setCurve ( KisCubicCurve inlist)
slot

Replace the current curve with a curve specified by the curve defined by the control points in inlist.

Definition at line 524 of file kis_curve_widget.cpp.

525{
526 d->m_curve = inlist;
527 d->m_grab_point_index = qBound(0, d->m_grab_point_index, d->m_curve.curvePoints().count() - 1);
528 d->applyGlobalPointConstrain();
529 d->setCurveModified();
530 Q_EMIT pointSelectedChanged();
531}

References d, and pointSelectedChanged().

◆ setCurveModified()

void KisCurveWidget::setCurveModified ( bool rewriteSpinBoxesValues = true)

Common update routines

◆ setCurveRepaint()

void KisCurveWidget::setCurveRepaint ( )

◆ setGlobalPointConstrain()

void KisCurveWidget::setGlobalPointConstrain ( PointConstrain constrain)

Definition at line 130 of file kis_curve_widget.cpp.

131{
132 if (d->m_globalPointConstrain == constrain) {
133 return;
134 }
135
136 d->m_globalPointConstrain = constrain;
137 d->applyGlobalPointConstrain();
138
139 d->setCurveModified(false);
140}

References d.

◆ setPixmap()

void KisCurveWidget::setPixmap ( const QPixmap & pix)

Set a background pixmap. The background pixmap will be drawn under the grid and the curve.

XXX: or is the pixmap what is drawn to the left and bottom of the curve itself?

Definition at line 181 of file kis_curve_widget.cpp.

182{
183 d->m_pix = pix;
184 d->m_pixmapDirty = true;
185 d->setCurveRepaint();
186}

References d.

◆ setState()

void KisCurveWidget::setState ( enumState st)
inline

◆ setupInOutControls()

void KisCurveWidget::setupInOutControls ( QSpinBox * in,
QSpinBox * out,
int inMin,
int inMax,
int outMin,
int outMax )

Connect/disconnect external spinboxes to the curve inMin / inMax - is the range for input values outMin / outMax - is the range for output values

◆ shouldFocusIOControls

void KisCurveWidget::shouldFocusIOControls ( )
signal

◆ shouldSyncIOControls

void KisCurveWidget::shouldSyncIOControls ( )
signal

◆ slotCompressorShouldEmitModified

void KisCurveWidget::slotCompressorShouldEmitModified ( )
protectedslot

This function is called when compressorShouldEmitModified() is emitted. For why it's needed,

See also
compressorShouldEmitModified()

Definition at line 543 of file kis_curve_widget.cpp.

544{
545 d->m_modifiedSignalsCompressor.start();
546}

References d.

◆ state()

enumState KisCurveWidget::state ( ) const
inline

◆ syncIOControls()

void KisCurveWidget::syncIOControls ( )

Synchronize In/Out spinboxes with the curve

Friends And Related Symbol Documentation

◆ CurveEditorItem

friend class CurveEditorItem
friend

Definition at line 46 of file kis_curve_widget.h.

Member Data Documentation

◆ d

Private* const KisCurveWidget::d {nullptr}
private

Definition at line 175 of file kis_curve_widget.h.

175{nullptr};

◆ m_curve

KisCubicCurve KisCurveWidget::m_curve

Definition at line 42 of file kis_curve_widget_p.h.

◆ m_curveWidget

KisCurveWidget* KisCurveWidget::m_curveWidget {nullptr}
private

Definition at line 24 of file kis_curve_widget_p.h.

24{nullptr};

◆ m_draggedAwayPoint

KisCubicCurvePoint KisCurveWidget::m_draggedAwayPoint

Definition at line 35 of file kis_curve_widget_p.h.

◆ m_draggedAwayPointIndex

int KisCurveWidget::m_draggedAwayPointIndex {0}

Definition at line 36 of file kis_curve_widget_p.h.

36{0};

◆ m_globalPointConstrain

◆ m_grab_point_index

int KisCurveWidget::m_grab_point_index {-1}

Definition at line 30 of file kis_curve_widget_p.h.

30{-1};

◆ m_grabOffsetX

double KisCurveWidget::m_grabOffsetX {0.0}

Definition at line 31 of file kis_curve_widget_p.h.

31{0.0};

◆ m_grabOffsetY

double KisCurveWidget::m_grabOffsetY {0.0}

Definition at line 32 of file kis_curve_widget_p.h.

32{0.0};

◆ m_grabOriginalX

double KisCurveWidget::m_grabOriginalX {0.0}

Definition at line 33 of file kis_curve_widget_p.h.

33{0.0};

◆ m_grabOriginalY

double KisCurveWidget::m_grabOriginalY {0.0}

Definition at line 34 of file kis_curve_widget_p.h.

34{0.0};

◆ m_handleSize

int KisCurveWidget::m_handleSize {12}

Definition at line 50 of file kis_curve_widget_p.h.

50{12}; // size of the control points (diameter, in logical pixels) - both for painting and for detecting clicks

◆ m_modifiedSignalsCompressor

KisThreadSafeSignalCompressor KisCurveWidget::m_modifiedSignalsCompressor

Compresses the modified() signals

Definition at line 64 of file kis_curve_widget_p.h.

◆ m_pix

QPixmap KisCurveWidget::m_pix

Definition at line 45 of file kis_curve_widget_p.h.

◆ m_pixmapCache

QPixmap* KisCurveWidget::m_pixmapCache {nullptr}

Definition at line 47 of file kis_curve_widget_p.h.

47{nullptr};

◆ m_pixmapDirty

bool KisCurveWidget::m_pixmapDirty {true}

Definition at line 46 of file kis_curve_widget_p.h.

46{true};

◆ m_readOnlyMode

bool KisCurveWidget::m_readOnlyMode {false}

Definition at line 38 of file kis_curve_widget_p.h.

38{false};

◆ m_splineDirty

bool KisCurveWidget::m_splineDirty {false}

Definition at line 41 of file kis_curve_widget_p.h.

41{false};

◆ m_state

enumState KisCurveWidget::m_state {enumState::ST_NORMAL}

State functions. At the moment used only for dragging.

Definition at line 56 of file kis_curve_widget_p.h.

Property Documentation

◆ pointSelected

bool KisCurveWidget::pointSelected
read

Definition at line 43 of file kis_curve_widget.h.


The documentation for this class was generated from the following files: