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

#include <KisAnimCurvesKeyDelegate.h>

+ Inheritance diagram for KisAnimCurvesKeyDelegate:

Classes

struct  Private
 

Public Member Functions

QRect frameRect (const QModelIndex index) const
 
bool hasHandle (const QModelIndex index, int handle) const
 
QRect itemRect (const QModelIndex index) const
 
 KisAnimCurvesKeyDelegate (const KisAnimTimelineTimeHeader *horizontalRuler, const KisAnimCurvesValuesHeader *verticalRuler, QObject *parent)
 
QPointF leftHandle (const QModelIndex index, bool active) const
 
QPointF nodeCenter (const QModelIndex index, bool selected) const
 
void paint (QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
 
QPointF rightHandle (const QModelIndex index, bool active) const
 
void setHandleAdjustment (QPointF offset, int handle)
 
void setSelectedItemVisualOffset (QPointF offset, bool axisSnap=false)
 
QSize sizeHint (const QStyleOptionViewItem &option, const QModelIndex &index) const override
 
QPointF unscaledTangent (QPointF handlePosition) const
 
QRect visualRect (const QModelIndex index) const
 
 ~KisAnimCurvesKeyDelegate () override
 

Private Member Functions

QPointF handlePosition (const QModelIndex index, bool active, int handle) const
 
void paintHandle (QPainter *painter, QPointF nodePos, QPointF tangent) const
 

Private Attributes

const QScopedPointer< Privatem_d
 

Detailed Description

Definition at line 15 of file KisAnimCurvesKeyDelegate.h.

Constructor & Destructor Documentation

◆ KisAnimCurvesKeyDelegate()

KisAnimCurvesKeyDelegate::KisAnimCurvesKeyDelegate ( const KisAnimTimelineTimeHeader * horizontalRuler,
const KisAnimCurvesValuesHeader * verticalRuler,
QObject * parent )

Definition at line 36 of file KisAnimCurvesKeyDelegate.cpp.

37 : QAbstractItemDelegate(parent)
38 , m_d(new Private(horizontalRuler, verticalRuler))
39{
40}
const QScopedPointer< Private > m_d

◆ ~KisAnimCurvesKeyDelegate()

KisAnimCurvesKeyDelegate::~KisAnimCurvesKeyDelegate ( )
override

Definition at line 42 of file KisAnimCurvesKeyDelegate.cpp.

43{}

Member Function Documentation

◆ frameRect()

QRect KisAnimCurvesKeyDelegate::frameRect ( const QModelIndex index) const

Definition at line 192 of file KisAnimCurvesKeyDelegate.cpp.

193{
194 int section = m_d->horizontalRuler->logicalIndex(index.column());
195 int x = m_d->horizontalRuler->sectionViewportPosition(section);
196 int xSize = m_d->horizontalRuler->sectionSize(section);
197
198 float value = index.data(KisAnimCurvesModel::ScalarValueRole).toReal();
199 float y = m_d->verticalRuler->valueToWidget(value);
200 int ySize = m_d->verticalRuler->height();
201
202 return QRect(x, y, xSize, ySize);
203}
float value(const T *src, size_t ch)

References m_d, KisAnimCurvesModel::ScalarValueRole, and value().

◆ handlePosition()

QPointF KisAnimCurvesKeyDelegate::handlePosition ( const QModelIndex index,
bool active,
int handle ) const
private

Definition at line 129 of file KisAnimCurvesKeyDelegate.cpp.

130{
131 int role = (handle == 0) ? KisAnimCurvesModel::LeftTangentRole : KisAnimCurvesModel::RightTangentRole;
132 QPointF tangent = index.data(role).toPointF();
133
134 float x = tangent.x() * m_d->horizontalRuler->defaultSectionSize();
135 float y = m_d->verticalRuler->valueToPixelOffset(tangent.y());
136 QPointF handlePos = QPointF(x, y);
137
138 if (active && !m_d->handleAdjustment.isNull()) {
139 if (handle == m_d->adjustedHandle) {
140 handlePos += m_d->handleAdjustment;
141 if ((handle == 0 && handlePos.x() > 0) ||
142 (handle == 1 && handlePos.x() < 0)) {
143 handlePos.setX(0);
144 }
145 } else if (index.data(KisAnimCurvesModel::TangentsModeRole).toInt() == KisScalarKeyframe::Smooth) {
146 qreal length = QVector2D(handlePos).length();
147 QVector2D opposite(handlePosition(index, active, 1-handle));
148 handlePos = (-length * opposite.normalized()).toPointF();
149 }
150 }
151
152 return handlePos;
153}
qreal length(const QPointF &vec)
Definition Ellipse.cc:82
QPointF handlePosition(const QModelIndex index, bool active, int handle) const

References handlePosition(), KisAnimCurvesModel::LeftTangentRole, length(), m_d, KisAnimCurvesModel::RightTangentRole, KisScalarKeyframe::Smooth, and KisAnimCurvesModel::TangentsModeRole.

◆ hasHandle()

bool KisAnimCurvesKeyDelegate::hasHandle ( const QModelIndex index,
int handle ) const

Definition at line 101 of file KisAnimCurvesKeyDelegate.cpp.

102{
103 QModelIndex interpolatedIndex;
104
105 if (handle == 0) {
106 // Left handle: use previous keyframe's interpolation mode
107
108 QVariant previous = index.data(KisAnimCurvesModel::PreviousKeyframeTime);
109 if (!previous.isValid()) return false;
110
111 interpolatedIndex = index.model()->index(index.row(), previous.toInt());
112 } else {
113 interpolatedIndex = index;
114 }
115
116 return (interpolatedIndex.data(KisAnimCurvesModel::InterpolationModeRole).toInt() == KisScalarKeyframe::Bezier);
117}

References KisScalarKeyframe::Bezier, KisAnimCurvesModel::InterpolationModeRole, and KisAnimCurvesModel::PreviousKeyframeTime.

◆ itemRect()

QRect KisAnimCurvesKeyDelegate::itemRect ( const QModelIndex index) const

Definition at line 185 of file KisAnimCurvesKeyDelegate.cpp.

186{
187 QPointF center = nodeCenter(index, false);
188
189 return QRect(center.x() - NODE_UI_RADIUS, center.y() - NODE_UI_RADIUS, 2*NODE_UI_RADIUS, 2*NODE_UI_RADIUS);
190}
const int NODE_UI_RADIUS
QPointF nodeCenter(const QModelIndex index, bool selected) const

References NODE_UI_RADIUS, and nodeCenter().

◆ leftHandle()

QPointF KisAnimCurvesKeyDelegate::leftHandle ( const QModelIndex index,
bool active ) const

Definition at line 119 of file KisAnimCurvesKeyDelegate.cpp.

120{
121 return handlePosition(index, active, 0);
122}

References handlePosition().

◆ nodeCenter()

QPointF KisAnimCurvesKeyDelegate::nodeCenter ( const QModelIndex index,
bool selected ) const

Definition at line 87 of file KisAnimCurvesKeyDelegate.cpp.

88{
89 int section = m_d->horizontalRuler->logicalIndex(index.column());
90 int x = m_d->horizontalRuler->sectionViewportPosition(section)
91 + (m_d->horizontalRuler->sectionSize(section) / 2);
92
93 float value = index.data(KisAnimCurvesModel::ScalarValueRole).toReal();
94 float y = m_d->verticalRuler->valueToWidget(value);
95
96 QPointF center = QPointF(x, y);
97 if (selected) center += m_d->selectionOffset;
98 return center;
99}

References m_d, KisAnimCurvesModel::ScalarValueRole, and value().

◆ paint()

void KisAnimCurvesKeyDelegate::paint ( QPainter * painter,
const QStyleOptionViewItem & option,
const QModelIndex & index ) const
override

Definition at line 46 of file KisAnimCurvesKeyDelegate.cpp.

47{
48 bool selected = option.state & QStyle::State_Selected;
49 bool active = option.state & QStyle::State_HasFocus;
50 QPointF center = nodeCenter(index, selected);
51
52 QColor color;
53 QColor bgColor = qApp->palette().color(QPalette::Window);
54 if (selected) {
55 color = (bgColor.value() > 128) ? Qt::black : Qt::white;
56 } else {
57 color = index.data(KisAnimCurvesModel::CurveColorRole).value<QColor>();
58 }
59
60 painter->setPen(QPen(color, 0));
61 painter->setBrush(color);
62 painter->drawEllipse(center, NODE_RENDER_RADIUS, NODE_RENDER_RADIUS);
63
64 if (selected) {
65 painter->setPen(QPen(color, 1));
66 painter->setBrush(bgColor);
67
68 if (hasHandle(index, 0)) {
69 QPointF leftTangent = leftHandle(index, active);
70 paintHandle(painter, center, leftTangent);
71 }
72
73 if (hasHandle(index, 1)) {
74 QPointF rightTangent = rightHandle(index, active);
75 paintHandle(painter, center, rightTangent);
76 }
77 }
78}
const int NODE_RENDER_RADIUS
QPointF leftHandle(const QModelIndex index, bool active) const
bool hasHandle(const QModelIndex index, int handle) const
QPointF rightHandle(const QModelIndex index, bool active) const
void paintHandle(QPainter *painter, QPointF nodePos, QPointF tangent) const

References KisAnimCurvesModel::CurveColorRole, hasHandle(), leftHandle(), NODE_RENDER_RADIUS, nodeCenter(), paintHandle(), and rightHandle().

◆ paintHandle()

void KisAnimCurvesKeyDelegate::paintHandle ( QPainter * painter,
QPointF nodePos,
QPointF tangent ) const
private

Definition at line 177 of file KisAnimCurvesKeyDelegate.cpp.

178{
179 QPointF handlePos = nodePos + tangent;
180
181 painter->drawLine(nodePos, handlePos);
182 painter->drawEllipse(handlePos, NODE_RENDER_RADIUS, NODE_RENDER_RADIUS);
183}

References NODE_RENDER_RADIUS.

◆ rightHandle()

QPointF KisAnimCurvesKeyDelegate::rightHandle ( const QModelIndex index,
bool active ) const

Definition at line 124 of file KisAnimCurvesKeyDelegate.cpp.

125{
126 return handlePosition(index, active, 1);
127}

References handlePosition().

◆ setHandleAdjustment()

void KisAnimCurvesKeyDelegate::setHandleAdjustment ( QPointF offset,
int handle )

Definition at line 163 of file KisAnimCurvesKeyDelegate.cpp.

164{
165 m_d->adjustedHandle = handle;
166 m_d->handleAdjustment = offset;
167}

References m_d.

◆ setSelectedItemVisualOffset()

void KisAnimCurvesKeyDelegate::setSelectedItemVisualOffset ( QPointF offset,
bool axisSnap = false )

Definition at line 155 of file KisAnimCurvesKeyDelegate.cpp.

156{
157 if (axisSnap) {
158 offset = qAbs(offset.y()) >= qAbs(offset.x()) ? QPointF(0.0f, offset.y()) : QPointF(offset.x(), 0.0f);
159 }
160 m_d->selectionOffset = offset;
161}

References m_d.

◆ sizeHint()

QSize KisAnimCurvesKeyDelegate::sizeHint ( const QStyleOptionViewItem & option,
const QModelIndex & index ) const
override

Definition at line 80 of file KisAnimCurvesKeyDelegate.cpp.

81{
82 Q_UNUSED(option);
83 Q_UNUSED(index);
84 return QSize(2*NODE_UI_RADIUS, 2*NODE_UI_RADIUS);
85}

References NODE_UI_RADIUS.

◆ unscaledTangent()

QPointF KisAnimCurvesKeyDelegate::unscaledTangent ( QPointF handlePosition) const

Definition at line 169 of file KisAnimCurvesKeyDelegate.cpp.

170{
171 qreal x = handlePosition.x() / m_d->horizontalRuler->defaultSectionSize();
172 qreal y = m_d->verticalRuler->pixelsToValueOffset(handlePosition.y());
173
174 return QPointF(x, y);
175}

References handlePosition(), and m_d.

◆ visualRect()

QRect KisAnimCurvesKeyDelegate::visualRect ( const QModelIndex index) const

Definition at line 205 of file KisAnimCurvesKeyDelegate.cpp.

206{
207 QPointF center = nodeCenter(index, false);
208 QPointF leftHandlePos = center + leftHandle(index, false);
209 QPointF rightHandlePos = center + rightHandle(index, false);
210
211 int minX = qMin(center.x(), leftHandlePos.x()) - NODE_RENDER_RADIUS;
212 int maxX = qMax(center.x(), rightHandlePos.x()) + NODE_RENDER_RADIUS;
213
214 int minY = qMin(center.y(), qMin(leftHandlePos.y(), rightHandlePos.y())) - NODE_RENDER_RADIUS;
215 int maxY = qMax(center.y(), qMax(leftHandlePos.y(), rightHandlePos.y())) + NODE_RENDER_RADIUS;
216
217 return QRect(QPoint(minX, minY), QPoint(maxX, maxY));
218}

References leftHandle(), NODE_RENDER_RADIUS, nodeCenter(), and rightHandle().

Member Data Documentation

◆ m_d

const QScopedPointer<Private> KisAnimCurvesKeyDelegate::m_d
private

Definition at line 40 of file KisAnimCurvesKeyDelegate.h.


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