connect(m_helper, SIGNAL(positionChanged(int)), this, SLOT(slotPositionChanged(int)));
connect(m_helper, SIGNAL(keyframeMoved(int)), this, SLOT(slotKeyframeMoved(int)));
-
+ connect(m_helper, SIGNAL(addKeyframe(int)), this, SLOT(slotAddFrame(int)));
+ connect(m_helper, SIGNAL(removeKeyframe(int)), this, SLOT(slotDeleteFrame(int)));
m_scene = new GraphicsSceneRectMove(this);
m_scene->setTool(TITLE_SELECT);
m_paramRect->setBrush(QColor(255, 0, 0, item.mix()));
}
-void Geometryval::slotDeleteFrame()
+void Geometryval::slotDeleteFrame(int pos)
{
// check there is more than one keyframe
Mlt::GeometryItem item;
- const int pos = m_ui.spinPos->value();
+ if (pos == -1) pos = m_ui.spinPos->value();
int error = m_geom->next_key(&item, pos + 1);
if (error) {
error = m_geom->prev_key(&item, pos - 1);
emit parameterChanged();
}
-void Geometryval::slotAddFrame()
+void Geometryval::slotAddFrame(int pos)
{
- int pos = m_ui.spinPos->value();
+ if (pos = -1) pos = m_ui.spinPos->value();
Mlt::GeometryItem item;
item.frame(pos);
item.x(m_paramRect->pos().x());
void slotNextFrame();
void slotPreviousFrame();
void slotPositionChanged(int pos, bool seek = true);
- void slotDeleteFrame();
- void slotAddFrame();
+ void slotDeleteFrame(int pos = -1);
+ void slotAddFrame(int pos = -1);
void slotUpdateTransitionProperties();
void slotTransparencyChanged(int transp);
void slotResize50();
m_movingItem.w(item.w());
m_movingItem.h(item.h());
m_movingItem.mix(item.mix());
- m_geom->remove(item.frame());
+ m_movingItem.frame(item.frame());
m_dragStart = event->pos();
m_movingKeyframe = true;
return;
void KeyframeHelper::mouseMoveEvent(QMouseEvent * event)
{
if (m_movingKeyframe) {
- if (!m_dragStart.isNull() && (event->pos() - m_dragStart).manhattanLength() < QApplication::startDragDistance()) return;
- m_dragStart = QPoint();
+ if (!m_dragStart.isNull()) {
+ if ((event->pos() - m_dragStart).manhattanLength() < QApplication::startDragDistance()) return;
+ m_dragStart = QPoint();
+ m_geom->remove(m_movingItem.frame());
+ }
int pos = qMax(0, (int)(event->x() / m_scale));
pos = qMin(m_length, pos);
m_movingItem.frame(pos);
update();
}
+void KeyframeHelper::mouseDoubleClickEvent(QMouseEvent * event)
+{
+ if (m_geom != NULL && event->button() == Qt::LeftButton) {
+ // check if we want to move a keyframe
+ int mousePos = qMax((int)(event->x() / m_scale - 5), 0);
+ Mlt::GeometryItem item;
+ if (m_geom->next_key(&item, mousePos) == 0 && item.frame() - mousePos < 10) {
+ // There is already a keyframe close to mouse click
+ emit removeKeyframe(item.frame());
+ return;
+ }
+ // add new keyframe
+ emit addKeyframe((int)(event->x() / m_scale));
+ }
+}
+
// virtual
void KeyframeHelper::mouseReleaseEvent(QMouseEvent * event)
{
virtual void mousePressEvent(QMouseEvent * event);
virtual void mouseMoveEvent(QMouseEvent * event);
virtual void mouseReleaseEvent(QMouseEvent * event);
+ virtual void mouseDoubleClickEvent(QMouseEvent * event);
private:
Mlt::Geometry *m_geom;
signals:
void positionChanged(int);
void keyframeMoved(int);
+ void addKeyframe(int);
+ void removeKeyframe(int);
};
#endif