10#include <QApplication>
37 : QAbstractItemDelegate(parent)
38 , m_d(new
Private(horizontalRuler, verticalRuler))
48 bool selected = option.state & QStyle::State_Selected;
49 bool active = option.state & QStyle::State_HasFocus;
53 QColor bgColor = qApp->palette().color(QPalette::Window);
55 color = (bgColor.value() > 128) ? Qt::black : Qt::white;
60 painter->setPen(QPen(color, 0));
61 painter->setBrush(color);
65 painter->setPen(QPen(color, 1));
66 painter->setBrush(bgColor);
69 QPointF leftTangent =
leftHandle(index, active);
89 int section =
m_d->horizontalRuler->logicalIndex(index.column());
90 int x =
m_d->horizontalRuler->sectionViewportPosition(section)
91 + (
m_d->horizontalRuler->sectionSize(section) / 2);
94 float y =
m_d->verticalRuler->valueToWidget(
value);
96 QPointF center = QPointF(x, y);
97 if (selected) center +=
m_d->selectionOffset;
103 QModelIndex interpolatedIndex;
109 if (!previous.isValid())
return false;
111 interpolatedIndex = index.model()->index(index.row(), previous.toInt());
113 interpolatedIndex = index;
132 QPointF tangent = index.data(role).toPointF();
134 float x = tangent.x() *
m_d->horizontalRuler->defaultSectionSize();
135 float y =
m_d->verticalRuler->valueToPixelOffset(tangent.y());
136 QPointF handlePos = QPointF(x, y);
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)) {
146 qreal
length = QVector2D(handlePos).length();
148 handlePos = (-
length * opposite.normalized()).toPointF();
158 offset = qAbs(offset.y()) >= qAbs(offset.x()) ? QPointF(0.0f, offset.y()) : QPointF(offset.x(), 0.0f);
160 m_d->selectionOffset = offset;
165 m_d->adjustedHandle = handle;
166 m_d->handleAdjustment = offset;
174 return QPointF(x, y);
179 QPointF handlePos = nodePos + tangent;
181 painter->drawLine(nodePos, handlePos);
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);
199 float y =
m_d->verticalRuler->valueToWidget(
value);
200 int ySize =
m_d->verticalRuler->height();
202 return QRect(x, y, xSize, ySize);
208 QPointF leftHandlePos = center +
leftHandle(index,
false);
209 QPointF rightHandlePos = center +
rightHandle(index,
false);
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;
217 return QRect(QPoint(minX, minY), QPoint(maxX, maxY));
qreal length(const QPointF &vec)
float value(const T *src, size_t ch)
const int NODE_RENDER_RADIUS
QPointF unscaledTangent(QPointF handlePosition) const
QPointF handlePosition(const QModelIndex index, bool active, int handle) const
QPointF leftHandle(const QModelIndex index, bool active) const
bool hasHandle(const QModelIndex index, int handle) const
~KisAnimCurvesKeyDelegate() override
QRect itemRect(const QModelIndex index) const
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override
void setSelectedItemVisualOffset(QPointF offset, bool axisSnap=false)
QPointF nodeCenter(const QModelIndex index, bool selected) const
QRect frameRect(const QModelIndex index) const
void setHandleAdjustment(QPointF offset, int handle)
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
KisAnimCurvesKeyDelegate(const KisAnimTimelineTimeHeader *horizontalRuler, const KisAnimCurvesValuesHeader *verticalRuler, QObject *parent)
QRect visualRect(const QModelIndex index) const
QPointF rightHandle(const QModelIndex index, bool active) const
void paintHandle(QPainter *painter, QPointF nodePos, QPointF tangent) const
const QScopedPointer< Private > m_d
const KisAnimCurvesValuesHeader * verticalRuler
Private(const KisAnimTimelineTimeHeader *horizontalRuler, const KisAnimCurvesValuesHeader *verticalRuler)
const KisAnimTimelineTimeHeader * horizontalRuler