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)));
+ 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_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);
+ 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("Original size"), this, SLOT(slotResizeOriginal()));
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());
connect(m_ui.buttonDelete , SIGNAL(clicked()) , this , SLOT(slotDeleteFrame()));
connect(m_ui.buttonAdd , SIGNAL(clicked()) , this , SLOT(slotAddFrame()));
connect(m_scene, SIGNAL(actionFinished()), this, SLOT(slotUpdateTransitionProperties()));
+ connect(m_scene, SIGNAL(doubleClickEvent()), this, SLOT(slotGeometry()));
+
+}
+
+
+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;
+ delete m_geom;
+ delete m_scene;
}
+
void Geometryval::slotAlignCenter()
{
int pos = m_ui.spinPos->value();
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_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);
m_ui.spinTransp->setEnabled(false);
m_scaleMenu->setEnabled(false);
m_alignMenu->setEnabled(false);
+ m_editGeom->setEnabled(false);
m_helper->update();
slotPositionChanged(pos, false);
updateTransitionPath();
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());
m_ui.spinTransp->setEnabled(true);
m_scaleMenu->setEnabled(true);
m_alignMenu->setEnabled(true);
+ m_editGeom->setEnabled(true);
m_helper->update();
emit parameterChanged();
}
return m_param;
}
-void Geometryval::setupParam(const QDomElement& par, int minFrame, int maxFrame)
+void Geometryval::setupParam(const QDomElement par, int minFrame, int maxFrame)
{
m_param = par;
QString val = par.attribute("value");
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);
updateTransitionPath();
emit parameterChanged();
}
+
+void Geometryval::slotGeometry()
+{
+ int pos = m_ui.spinPos->value();
+ Mlt::GeometryItem item;
+ int error = m_geom->fetch(&item, pos);
+ if (error || item.key() == false) {
+ // no keyframe under cursor
+ return;
+ }
+ QRectF r = m_paramRect->rect().normalized();
+
+ QDialog d(this);
+ m_view.setupUi(&d);
+ d.setWindowTitle(i18n("Frame Geometry"));
+ m_view.value_x->setMaximum(10000);
+ m_view.value_x->setMinimum(-10000);
+ m_view.value_y->setMaximum(10000);
+ m_view.value_y->setMinimum(-10000);
+ m_view.value_width->setMaximum(500000);
+ m_view.value_width->setMinimum(1);
+ m_view.value_height->setMaximum(500000);
+ m_view.value_height->setMinimum(1);
+
+ m_view.value_x->setValue(m_paramRect->pos().x());
+ m_view.value_y->setValue(m_paramRect->pos().y());
+ m_view.value_width->setValue(r.width());
+ m_view.value_height->setValue(r.height());
+ connect(m_view.button_reset , SIGNAL(clicked()) , this , SLOT(slotResetPosition()));
+
+ if (d.exec() == QDialog::Accepted) {
+ m_paramRect->setPos(m_view.value_x->value(), m_view.value_y->value());
+ m_paramRect->setRect(0, 0, m_view.value_width->value(), m_view.value_height->value());
+ slotUpdateTransitionProperties();
+ }
+}
+
+void Geometryval::slotResetPosition()
+{
+ m_view.value_x->setValue(0);
+ m_view.value_y->setValue(0);
+
+ if (m_frameSize.isNull()) {
+ m_view.value_width->setValue(m_profile.width);
+ m_view.value_height->setValue(m_profile.height);
+ } else {
+ m_view.value_width->setValue(m_frameSize.x());
+ m_view.value_height->setValue(m_frameSize.y());
+ }
+}
+
+void Geometryval::setFrameSize(QPoint p)
+{
+ m_frameSize = p;
+}
+
+
+void Geometryval::slotKeyframeMoved(int pos)
+{
+ slotPositionChanged(pos);
+ slotUpdateTransitionProperties();
+}
+