Krita Source Code Documentation
Loading...
Searching...
No Matches
KisSegmentGradientSlider.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2004 Cyrille Berger <cberger@cberger.net>
3 * SPDX-FileCopyrightText: 2004 Sven Langkamp <sven.langkamp@gmail.com>
4 * SPDX-FileCopyrightText: 2021 Deif Lou <ginoba@gmail.com>
5 *
6 * SPDX-License-Identifier: GPL-2.0-or-later
7 */
8
9#ifndef _KIS_SEGMENT_GRADIENT_SLIDER_H_
10#define _KIS_SEGMENT_GRADIENT_SLIDER_H_
11
12#include <QWidget>
13
14#include <KoSegmentGradient.h>
16
17class QAction;
18class QMenu;
19
21
22#include "kritaui_export.h"
23
27class KRITAUI_EXPORT KisSegmentGradientSlider : public QWidget
28{
29 Q_OBJECT
30
31public:
39
40 struct Handle
41 {
42 HandleType type{HandleType_None};
43 int index{0};
44 };
45
46 static constexpr qreal shrinkEpsilon = 0.00001;
47
48 KisSegmentGradientSlider(QWidget *parent = nullptr, const char* name = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
49
50 Handle selectedHandle() { return m_selectedHandle; }
51
52 QSize sizeHint() const override;
53 QSize minimumSizeHint() const override;
54
55public Q_SLOTS:
56 void setGradientResource(KoSegmentGradientSP agr);
57 void chooseSelectedStopColor();
58 void selectPreviousHandle();
59 void selectNextHandle();
60 void moveHandle(Handle handle, qreal distance, bool useShrinkEpsilon = true);
61 void moveHandleLeft(Handle handle, qreal distance, bool useShrinkEpsilon = true);
62 void moveHandleRight(Handle handle, qreal distance, bool useShrinkEpsilon = true);
63 void moveSelectedHandle(qreal distance, bool useShrinkEpsilon = true);
64 void moveSelectedHandleLeft(qreal distance, bool useShrinkEpsilon = true);
65 void moveSelectedHandleRight(qreal distance, bool useShrinkEpsilon = true);
66 void deleteHandle(Handle handle);
67 void centerSelectedHandle();
68 void deleteSelectedHandle();
69 void collapseSelectedSegment();
70 void splitSelectedSegment();
71 void duplicateSelectedSegment();
72 void mirrorSelectedSegment();
73 void flipGradient();
74 void distributeStopsEvenly();
75
76Q_SIGNALS:
79
80protected:
81 void paintEvent(QPaintEvent *) override;
82 void mousePressEvent(QMouseEvent * e) override;
83 void mouseReleaseEvent(QMouseEvent * e) override;
84 void mouseMoveEvent(QMouseEvent * e) override;
85 void mouseDoubleClickEvent(QMouseEvent *e) override;
86 void wheelEvent(QWheelEvent *e) override;
87 void keyPressEvent(QKeyEvent *e) override;
88 void leaveEvent(QEvent *e) override;
89
90private Q_SLOTS:
91 void updateHandleSize();
92
93private:
95 {
96 Handle handle {HandleType_None, 0};
99 qreal leftEndPointOffset {0.0};
100 qreal rightEndPointOffset {0.0};
103 int leftInterpolationType {0};
104 int rightInterpolationType {0};
105 int leftColorInterpolationType {0};
106 int rightColorInterpolationType {0};
107 qreal leftMiddleOffset {0.0};
108 qreal rightMiddleOffset {0.0};
109 };
110
111 // This epsilon controls how much can shrink a segment when dragging
112 static constexpr int removeStopDistance{32};
114 Handle m_selectedHandle {HandleType_None, 0};
115 Handle m_hoveredHandle {HandleType_None, 0};
116 QMenu* m_segmentMenu {nullptr};
117 bool m_drag {false};
118 qreal m_dragT {0.0};
119 qreal m_relativeDragOffset {0.0};
120 QAction *m_removeSegmentAction {nullptr};
124
125 QRect sliderRect() const;
126 QRect gradientStripeRect() const;
127 QRect handlesStripeRect() const;
128 int minimalHeight() const;
129 void handleIncrementInput(int direction, Qt::KeyboardModifiers modifiers);
130 bool deleteHandleImpl(Handle handle);
131};
132
133#endif
qreal distance(const QPointF &p1, const QPointF &p2)
KoGradientSegmentEndpointType
@ COLOR_ENDPOINT
The KisSegmentGradientSlider class makes it possible to edit gradients.
TemporallyDeletedHandleInfo m_temporallyDeletedHandleInfo
Write API docs here.