vbox2->setContentsMargins(0, 0, 0, 0);
connect(m_helper, SIGNAL(positionChanged(int)), this, SLOT(slotPositionChanged(int)));
+ connect(m_helper, SIGNAL(keyframeMoved(int)), this, SLOT(slotKeyframeMoved(int)));
+
m_scene = new GraphicsSceneRectMove(this);
m_scene->setTool(TITLE_SELECT);
m_ui.buttonDelete->setIcon(KIcon("edit-delete"));
m_ui.buttonDelete->setToolTip(i18n("Delete keyframe"));
- QMenu *configMenu = new QMenu(i18n("Misc..."), this);
+ m_configMenu = new QMenu(i18n("Misc..."), this);
m_ui.buttonMenu->setIcon(KIcon("system-run"));
- m_ui.buttonMenu->setMenu(configMenu);
+ m_ui.buttonMenu->setMenu(m_configMenu);
m_ui.buttonMenu->setPopupMode(QToolButton::QToolButton::InstantPopup);
- configMenu->addAction(i18n("Geometry"), this, SLOT(slotGeometry()));
+ m_editGeom = m_configMenu->addAction(i18n("Edit keyframe"), this, SLOT(slotGeometry()));
m_scaleMenu = new QMenu(i18n("Resize..."), this);
- configMenu->addMenu(m_scaleMenu);
+ m_configMenu->addMenu(m_scaleMenu);
m_scaleMenu->addAction(i18n("50%"), this, SLOT(slotResize50()));
m_scaleMenu->addAction(i18n("100%"), this, SLOT(slotResize100()));
m_scaleMenu->addAction(i18n("200%"), this, SLOT(slotResize200()));
m_scaleMenu->addAction(i18n("Custom"), this, SLOT(slotResizeCustom()));
m_alignMenu = new QMenu(i18n("Align..."), this);
- configMenu->addMenu(m_alignMenu);
+ m_configMenu->addMenu(m_alignMenu);
m_alignMenu->addAction(i18n("Center"), this, SLOT(slotAlignCenter()));
m_alignMenu->addAction(i18n("Hor. Center"), this, SLOT(slotAlignHCenter()));
m_alignMenu->addAction(i18n("Vert. Center"), this, SLOT(slotAlignVCenter()));
m_alignMenu->addAction(i18n("Bottom"), this, SLOT(slotAlignBottom()));
- m_syncAction = configMenu->addAction(i18n("Sync timeline cursor"), this, SLOT(slotSyncCursor()));
+ m_syncAction = m_configMenu->addAction(i18n("Sync timeline cursor"), this, SLOT(slotSyncCursor()));
m_syncAction->setCheckable(true);
m_syncAction->setChecked(KdenliveSettings::transitionfollowcursor());
Geometryval::~Geometryval()
{
m_scene->disconnect();
+ delete m_scaleMenu;
+ delete m_alignMenu;
+ delete m_editGeom;
+ delete m_syncAction;
+ delete m_configMenu;
delete m_paramRect;
delete m_path;
delete m_helper;
m_ui.spinTransp->setEnabled(false);
m_scaleMenu->setEnabled(false);
m_alignMenu->setEnabled(false);
+ m_editGeom->setEnabled(false);
} else {
m_ui.buttonAdd->setEnabled(false);
m_ui.buttonDelete->setEnabled(true);
m_ui.spinTransp->setEnabled(true);
m_scaleMenu->setEnabled(true);
m_alignMenu->setEnabled(true);
+ m_editGeom->setEnabled(true);
}
m_paramRect->setPos(item.x(), item.y());
m_paramRect->setRect(0, 0, item.w(), item.h());
m_ui.spinTransp->setEnabled(false);
m_scaleMenu->setEnabled(false);
m_alignMenu->setEnabled(false);
+ m_editGeom->setEnabled(false);
m_helper->update();
slotPositionChanged(pos, false);
updateTransitionPath();
m_ui.spinTransp->setEnabled(true);
m_scaleMenu->setEnabled(true);
m_alignMenu->setEnabled(true);
+ m_editGeom->setEnabled(true);
m_helper->update();
emit parameterChanged();
}
m_ui.label_pos->setHidden(true);
m_helper->setHidden(true);
m_ui.spinPos->setHidden(true);
+
}
char *tmp = (char *) qstrdup(val.toUtf8().data());
if (m_geom) m_geom->parse(tmp, maxFrame - minFrame, m_profile.width, m_profile.height);
{
m_frameSize = p;
}
+
+
+void Geometryval::slotKeyframeMoved(int pos)
+{
+ slotPositionChanged(pos);
+ slotUpdateTransitionProperties();
+}
+
#include <QMouseEvent>
#include <QStylePainter>
+#include <QApplication>
KeyframeHelper::KeyframeHelper(QWidget *parent) :
QWidget(parent),
m_geom(NULL),
m_position(0),
- m_scale(0)
+ m_scale(0),
+ m_movingKeyframe(false)
{
setFont(KGlobalSettings::toolBarFont());
}
// virtual
void KeyframeHelper::mousePressEvent(QMouseEvent * event)
{
+ if (m_geom != NULL && (event->y() < height() / 2) && 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) {
+ if (item.frame() - mousePos < 10) {
+ m_movingItem.x(item.x());
+ m_movingItem.y(item.y());
+ m_movingItem.w(item.w());
+ m_movingItem.h(item.h());
+ m_movingItem.mix(item.mix());
+ m_geom->remove(item.frame());
+ m_dragStart = event->pos();
+ m_movingKeyframe = true;
+ return;
+ }
+ }
+ }
m_position = event->x() / m_scale;
emit positionChanged(m_position);
update();
// virtual
void KeyframeHelper::mouseMoveEvent(QMouseEvent * event)
{
+ if (m_movingKeyframe) {
+ if (!m_dragStart.isNull() && (event->pos() - m_dragStart).manhattanLength() < QApplication::startDragDistance()) return;
+ m_dragStart = QPoint();
+ int pos = qMax(0, (int)(event->x() / m_scale));
+ pos = qMin(m_length, pos);
+ m_movingItem.frame(pos);
+ update();
+ return;
+ }
m_position = event->x() / m_scale;
m_position = qMax(0, m_position);
m_position = qMin(m_length, m_position);
update();
}
+// virtual
+void KeyframeHelper::mouseReleaseEvent(QMouseEvent * event)
+{
+ if (m_movingKeyframe) {
+ m_geom->insert(m_movingItem);
+ m_movingKeyframe = false;
+ emit keyframeMoved(m_position);
+ return;
+ }
+ QWidget::mouseReleaseEvent(event);
+}
// virtual
void KeyframeHelper::wheelEvent(QWheelEvent * e)
if (m_geom != NULL) {
int pos = 0;
p.setPen(QColor(255, 20, 20));
+ p.setBrush(QColor(255, 20, 20));
Mlt::GeometryItem item;
while (true) {
if (m_geom->next_key(&item, pos) == 1) break;
// draw pointer
QPolygon pa(3);
pa.setPoints(3, scaledPos - 4, 0, scaledPos + 4, 0, scaledPos, 4);
- p.setBrush(QColor(255, 20, 20));
p.drawPolygon(pa);
//p.fillRect(QRect(scaledPos - 1, 0, 2, 15), QBrush(QColor(255, 20, 20)));
pos++;
}
+ if (m_movingKeyframe) {
+ int scaledPos = (int)(m_movingItem.frame() * m_scale);
+ // draw keyframes
+ p.drawLine(scaledPos, 6, scaledPos, 10);
+ // draw pointer
+ QPolygon pa(3);
+ pa.setPoints(3, scaledPos - 4, 0, scaledPos + 4, 0, scaledPos, 4);
+ p.drawPolygon(pa);
+ }
}
p.setPen(palette().dark().color());
p.drawLine(clipRect.x(), 5, clipRect.right(), 5);