X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fgeometryval.cpp;h=7fa246e65c99893f9003940ea58f35efe66ccfea;hb=56aee6aedeeed3efd10ada8fe3c229eddc01ef05;hp=2c40d6e098e651b1b95b8a045ab0a495ecc215fa;hpb=4148ddc9a73641901804af847bd0d4e3f4c2543c;p=kdenlive diff --git a/src/geometryval.cpp b/src/geometryval.cpp index 2c40d6e0..7fa246e6 100644 --- a/src/geometryval.cpp +++ b/src/geometryval.cpp @@ -15,219 +15,217 @@ * * ***************************************************************************/ +#include "geometryval.h" +#include "graphicsscenerectmove.h" +#include "kdenlivesettings.h" +#include #include #include -#include #include -#include #include - -#include - -#include "graphicsscenerectmove.h" -#include "geometryval.h" -#include "kdenlivesettings.h" - -Geometryval::Geometryval(const MltVideoProfile profile, QWidget* parent): QWidget(parent), m_profile(profile), m_geom(NULL), m_path(NULL), paramRect(NULL), m_fixedMode(false) { - ui.setupUi(this); - QVBoxLayout* vbox = new QVBoxLayout(ui.widget); - QGraphicsView *view = new QGraphicsView(this); - view->setBackgroundBrush(QBrush(Qt::black)); - vbox->addWidget(view); +#include +#include + + +Geometryval::Geometryval(const MltVideoProfile &profile, const Timecode &t, const QPoint &frame_size, int startPoint, QWidget* parent) : + QWidget(parent), + m_profile(profile), + m_paramRect(NULL), + m_geom(NULL), + m_path(NULL), + m_fixedMode(false), + m_frameSize(frame_size), + m_startPoint(startPoint), + m_timePos(t) +{ + setupUi(this); + toolbarlayout->addWidget(&m_timePos); + toolbarlayout->insertStretch(-1); + + QVBoxLayout* vbox = new QVBoxLayout(widget); + m_sceneview = new QGraphicsView(this); + m_sceneview->setBackgroundBrush(QBrush(Qt::black)); + vbox->addWidget(m_sceneview); vbox->setContentsMargins(0, 0, 0, 0); - QVBoxLayout* vbox2 = new QVBoxLayout(ui.keyframeWidget); + QVBoxLayout* vbox2 = new QVBoxLayout(keyframeWidget); m_helper = new KeyframeHelper(this); vbox2->addWidget(m_helper); vbox2->setContentsMargins(0, 0, 0, 0); connect(m_helper, SIGNAL(positionChanged(int)), this, SLOT(slotPositionChanged(int))); - - scene = new GraphicsSceneRectMove(this); - scene->setTool(TITLE_SELECT); - view->setScene(scene); - double aspect = (double) profile.sample_aspect_num / profile.sample_aspect_den * profile.width / profile.height; - QGraphicsRectItem *m_frameBorder = new QGraphicsRectItem(QRectF(0, 0, profile.width, profile.height)); - m_frameBorder->setZValue(-1100); - m_frameBorder->setBrush(QColor(255, 255, 0, 30)); - m_frameBorder->setPen(QPen(QBrush(QColor(255, 255, 255, 255)), 1.0, Qt::DashLine)); - scene->addItem(m_frameBorder); - - ui.buttonNext->setIcon(KIcon("media-skip-forward")); - ui.buttonNext->setToolTip(i18n("Go to next keyframe")); - ui.buttonPrevious->setIcon(KIcon("media-skip-backward")); - ui.buttonPrevious->setToolTip(i18n("Go to previous keyframe")); - ui.buttonAdd->setIcon(KIcon("document-new")); - ui.buttonAdd->setToolTip(i18n("Add keyframe")); - ui.buttonDelete->setIcon(KIcon("edit-delete")); - ui.buttonDelete->setToolTip(i18n("Delete keyframe")); - - QMenu *configMenu = new QMenu(i18n("Misc..."), this); - ui.buttonMenu->setIcon(KIcon("system-run")); - ui.buttonMenu->setMenu(configMenu); - ui.buttonMenu->setPopupMode(QToolButton::QToolButton::InstantPopup); - - - m_scaleMenu = new QMenu(i18n("Resize..."), this); - 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_alignMenu = new QMenu(i18n("Align..."), this); - 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("Right"), this, SLOT(slotAlignRight())); - m_alignMenu->addAction(i18n("Left"), this, SLOT(slotAlignLeft())); - m_alignMenu->addAction(i18n("Top"), this, SLOT(slotAlignTop())); - m_alignMenu->addAction(i18n("Bottom"), this, SLOT(slotAlignBottom())); - - - m_syncAction = configMenu->addAction(i18n("Sync timeline cursor"), this, SLOT(slotSyncCursor())); + 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_sceneview->setScene(m_scene); + m_dar = (m_profile.height * m_profile.display_aspect_num / (double) m_profile.display_aspect_den) / (double) m_profile.width; + + m_realWidth = (int)(profile.height * profile.display_aspect_num / (double) profile.display_aspect_den + 0.5); + QGraphicsRectItem *frameBorder = new QGraphicsRectItem(QRectF(0, 0, m_realWidth, profile.height)); + frameBorder->setZValue(-1100); + frameBorder->setBrush(QColor(255, 255, 0, 30)); + frameBorder->setPen(QPen(QBrush(QColor(255, 255, 255, 255)), 1.0, Qt::DashLine)); + m_scene->addItem(frameBorder); + + buttonNext->setIcon(KIcon("media-skip-forward")); + buttonNext->setToolTip(i18n("Go to next keyframe")); + buttonPrevious->setIcon(KIcon("media-skip-backward")); + buttonPrevious->setToolTip(i18n("Go to previous keyframe")); + buttonAdd->setIcon(KIcon("document-new")); + buttonAdd->setToolTip(i18n("Add keyframe")); + buttonDelete->setIcon(KIcon("edit-delete")); + buttonDelete->setToolTip(i18n("Delete keyframe")); + + m_configMenu = new QMenu(i18n("Misc..."), this); + buttonMenu->setMenu(m_configMenu); + buttonMenu->setPopupMode(QToolButton::MenuButtonPopup); + + m_editOptions = m_configMenu->addAction(KIcon("system-run"), i18n("Show/Hide options")); + m_editOptions->setCheckable(true); + buttonMenu->setDefaultAction(m_editOptions); + connect(m_editOptions, SIGNAL(triggered()), this, SLOT(slotSwitchOptions())); + slotSwitchOptions(); + + m_reset = m_configMenu->addAction(KIcon("view-refresh"), i18n("Reset"), this, SLOT(slotResetPosition())); + + m_syncAction = m_configMenu->addAction(i18n("Sync timeline cursor"), this, SLOT(slotSyncCursor())); m_syncAction->setCheckable(true); m_syncAction->setChecked(KdenliveSettings::transitionfollowcursor()); //scene->setSceneRect(0, 0, profile.width * 2, profile.height * 2); //view->fitInView(m_frameBorder, Qt::KeepAspectRatio); const double sc = 100.0 / profile.height * 0.8; - QRectF srect = view->sceneRect(); - view->setSceneRect(srect.x(), -srect.height() / 3, srect.width(), srect.height() + srect.height() / 3 * 2); - scene->setZoom(sc); - view->centerOn(m_frameBorder); - connect(ui.buttonNext , SIGNAL(clicked()) , this , SLOT(slotNextFrame())); - connect(ui.buttonPrevious , SIGNAL(clicked()) , this , SLOT(slotPreviousFrame())); - connect(ui.buttonDelete , SIGNAL(clicked()) , this , SLOT(slotDeleteFrame())); - connect(ui.buttonAdd , SIGNAL(clicked()) , this , SLOT(slotAddFrame())); - connect(scene, SIGNAL(actionFinished()), this, SLOT(slotUpdateTransitionProperties())); -} - -void Geometryval::slotAlignCenter() { - int pos = ui.spinPos->value(); - Mlt::GeometryItem item; - int error = m_geom->fetch(&item, pos); - if (error || item.key() == false) { - // no keyframe under cursor - return; - } - paramRect->setPos((m_profile.width - paramRect->rect().width()) / 2, (m_profile.height - paramRect->rect().height()) / 2); - slotUpdateTransitionProperties(); + QRectF srect = m_sceneview->sceneRect(); + m_sceneview->setSceneRect(srect.x(), -srect.height() / 3 + 10, srect.width(), srect.height() + srect.height() / 3 * 2 - 10); + m_scene->setZoom(sc); + m_sceneview->centerOn(frameBorder); + m_sceneview->setMouseTracking(true); + connect(buttonNext , SIGNAL(clicked()) , this , SLOT(slotNextFrame())); + connect(buttonPrevious , SIGNAL(clicked()) , this , SLOT(slotPreviousFrame())); + connect(buttonDelete , SIGNAL(clicked()) , this , SLOT(slotDeleteFrame())); + connect(buttonAdd , SIGNAL(clicked()) , this , SLOT(slotAddFrame())); + connect(m_scene, SIGNAL(actionFinished()), this, SLOT(slotUpdateTransitionProperties())); + + buttonhcenter->setIcon(KIcon("kdenlive-align-hor")); + buttonhcenter->setToolTip(i18n("Align item horizontally")); + buttonvcenter->setIcon(KIcon("kdenlive-align-vert")); + buttonvcenter->setToolTip(i18n("Align item vertically")); + buttontop->setIcon(KIcon("kdenlive-align-top")); + buttontop->setToolTip(i18n("Align item to top")); + buttonbottom->setIcon(KIcon("kdenlive-align-bottom")); + buttonbottom->setToolTip(i18n("Align item to bottom")); + buttonright->setIcon(KIcon("kdenlive-align-right")); + buttonright->setToolTip(i18n("Align item to right")); + buttonleft->setIcon(KIcon("kdenlive-align-left")); + buttonleft->setToolTip(i18n("Align item to left")); + + connect(buttonhcenter, SIGNAL(clicked()), this, SLOT(slotAlignHCenter())); + connect(buttonvcenter, SIGNAL(clicked()), this, SLOT(slotAlignVCenter())); + connect(buttontop, SIGNAL(clicked()), this, SLOT(slotAlignTop())); + connect(buttonbottom, SIGNAL(clicked()), this, SLOT(slotAlignBottom())); + connect(buttonright, SIGNAL(clicked()), this, SLOT(slotAlignRight())); + connect(buttonleft, SIGNAL(clicked()), this, SLOT(slotAlignLeft())); + connect(spinX, SIGNAL(valueChanged(int)), this, SLOT(slotGeometryX(int))); + connect(spinY, SIGNAL(valueChanged(int)), this, SLOT(slotGeometryY(int))); + connect(spinWidth, SIGNAL(valueChanged(int)), this, SLOT(slotGeometryWidth(int))); + connect(spinHeight, SIGNAL(valueChanged(int)), this, SLOT(slotGeometryHeight(int))); + connect(spinResize, SIGNAL(editingFinished()), this, SLOT(slotResizeCustom())); + connect(buttonResize, SIGNAL(clicked()), this, SLOT(slotResizeOriginal())); + + connect(this, SIGNAL(parameterChanged()), this, SLOT(slotUpdateGeometry())); } -void Geometryval::slotAlignHCenter() { - int pos = ui.spinPos->value(); - Mlt::GeometryItem item; - int error = m_geom->fetch(&item, pos); - if (error || item.key() == false) { - // no keyframe under cursor - return; - } - paramRect->setPos((m_profile.width - paramRect->rect().width()) / 2, paramRect->pos().y()); - slotUpdateTransitionProperties(); + +Geometryval::~Geometryval() +{ + m_scene->disconnect(); + delete m_syncAction; + delete m_configMenu; + delete m_paramRect; + delete m_path; + delete m_helper; + delete m_geom; + delete m_sceneview; + delete m_scene; } -void Geometryval::slotAlignVCenter() { - int pos = ui.spinPos->value(); - Mlt::GeometryItem item; - int error = m_geom->fetch(&item, pos); - if (error || item.key() == false) { - // no keyframe under cursor + +void Geometryval::slotAlignHCenter() +{ + if (!keyframeSelected()) return; - } - paramRect->setPos(paramRect->pos().x(), (m_profile.height - paramRect->rect().height()) / 2); + m_paramRect->setPos((m_realWidth - m_paramRect->rect().width()) / 2, m_paramRect->pos().y()); slotUpdateTransitionProperties(); } -void Geometryval::slotAlignTop() { - int pos = ui.spinPos->value(); - Mlt::GeometryItem item; - int error = m_geom->fetch(&item, pos); - if (error || item.key() == false) { - // no keyframe under cursor +void Geometryval::slotAlignVCenter() +{ + if (!keyframeSelected()) return; - } - paramRect->setPos(paramRect->pos().x(), 0); + m_paramRect->setPos(m_paramRect->pos().x(), (m_profile.height - m_paramRect->rect().height()) / 2); slotUpdateTransitionProperties(); } -void Geometryval::slotAlignBottom() { - int pos = ui.spinPos->value(); - Mlt::GeometryItem item; - int error = m_geom->fetch(&item, pos); - if (error || item.key() == false) { - // no keyframe under cursor +void Geometryval::slotAlignTop() +{ + if (!keyframeSelected()) return; - } - paramRect->setPos(paramRect->pos().x(), m_profile.height - paramRect->rect().height()); + m_paramRect->setPos(m_paramRect->pos().x(), 0); slotUpdateTransitionProperties(); } -void Geometryval::slotAlignLeft() { - int pos = ui.spinPos->value(); - Mlt::GeometryItem item; - int error = m_geom->fetch(&item, pos); - if (error || item.key() == false) { - // no keyframe under cursor +void Geometryval::slotAlignBottom() +{ + if (!keyframeSelected()) return; - } - paramRect->setPos(0, paramRect->pos().y()); + m_paramRect->setPos(m_paramRect->pos().x(), m_profile.height - m_paramRect->rect().height()); slotUpdateTransitionProperties(); } -void Geometryval::slotAlignRight() { - int pos = ui.spinPos->value(); - Mlt::GeometryItem item; - int error = m_geom->fetch(&item, pos); - if (error || item.key() == false) { - // no keyframe under cursor +void Geometryval::slotAlignLeft() +{ + if (!keyframeSelected()) return; - } - paramRect->setPos(m_profile.width - paramRect->rect().width(), paramRect->pos().y()); + m_paramRect->setPos(0, m_paramRect->pos().y()); slotUpdateTransitionProperties(); } -void Geometryval::slotResize50() { - int pos = ui.spinPos->value(); - Mlt::GeometryItem item; - int error = m_geom->fetch(&item, pos); - if (error || item.key() == false) { - // no keyframe under cursor +void Geometryval::slotAlignRight() +{ + if (!keyframeSelected()) return; - } - paramRect->setRect(0, 0, m_profile.width / 2, m_profile.height / 2); + m_paramRect->setPos(m_realWidth - m_paramRect->rect().width(), m_paramRect->pos().y()); slotUpdateTransitionProperties(); } -void Geometryval::slotResize100() { - int pos = ui.spinPos->value(); - Mlt::GeometryItem item; - int error = m_geom->fetch(&item, pos); - if (error || item.key() == false) { - // no keyframe under cursor +void Geometryval::slotResizeOriginal() +{ + if (!keyframeSelected()) return; - } - paramRect->setRect(0, 0, m_profile.width, m_profile.height); + if (m_frameSize.isNull()) + m_paramRect->setRect(0, 0, m_realWidth, m_profile.height); + else + m_paramRect->setRect(0, 0, m_frameSize.x(), m_frameSize.y()); slotUpdateTransitionProperties(); } -void Geometryval::slotResize200() { - int pos = ui.spinPos->value(); - Mlt::GeometryItem item; - int error = m_geom->fetch(&item, pos); - if (error || item.key() == false) { - // no keyframe under cursor +void Geometryval::slotResizeCustom() +{ + if (!keyframeSelected()) return; - } - paramRect->setRect(0, 0, m_profile.width * 2, m_profile.height * 2); + int value = spinResize->value(); + m_paramRect->setRect(0, 0, m_realWidth * value / 100, m_profile.height * value / 100); slotUpdateTransitionProperties(); } -void Geometryval::slotTransparencyChanged(int transp) { - int pos = ui.spinPos->value(); +void Geometryval::slotTransparencyChanged(int transp) +{ + int pos = m_timePos.getValue(); Mlt::GeometryItem item; int error = m_geom->fetch(&item, pos); if (error || item.key() == false) { @@ -235,129 +233,161 @@ void Geometryval::slotTransparencyChanged(int transp) { return; } item.mix(transp); - paramRect->setBrush(QColor(255, 0, 0, transp)); + m_paramRect->setBrush(QColor(255, 0, 0, transp)); m_geom->insert(item); emit parameterChanged(); } -void Geometryval::slotSyncCursor() { +void Geometryval::slotSyncCursor() +{ KdenliveSettings::setTransitionfollowcursor(m_syncAction->isChecked()); } -void Geometryval::slotPositionChanged(int pos, bool seek) { - if (seek && KdenliveSettings::transitionfollowcursor()) emit seekToPos(pos); - ui.spinPos->setValue(pos); +void Geometryval::updateTimecodeFormat() +{ + m_timePos.slotUpdateTimeCodeFormat(); +} + +void Geometryval::slotPositionChanged(int pos, bool seek) +{ + if (pos == -1) { + pos = m_timePos.getValue(); + } + if (seek && KdenliveSettings::transitionfollowcursor()) emit seekToPos(pos + m_startPoint); + m_timePos.setValue(pos); + //spinPos->setValue(pos); + m_helper->blockSignals(true); m_helper->setValue(pos); + m_helper->blockSignals(false); Mlt::GeometryItem item; int error = m_geom->fetch(&item, pos); if (error || item.key() == false) { // no keyframe under cursor, adjust buttons - ui.buttonAdd->setEnabled(true); - ui.buttonDelete->setEnabled(false); - ui.widget->setEnabled(false); - ui.spinTransp->setEnabled(false); - m_scaleMenu->setEnabled(false); - m_alignMenu->setEnabled(false); + buttonAdd->setEnabled(true); + buttonDelete->setEnabled(false); + widget->setEnabled(false); + spinTransp->setEnabled(false); + frameOptions->setEnabled(false); + m_reset->setEnabled(false); } else { - ui.buttonAdd->setEnabled(false); - ui.buttonDelete->setEnabled(true); - ui.widget->setEnabled(true); - ui.spinTransp->setEnabled(true); - m_scaleMenu->setEnabled(true); - m_alignMenu->setEnabled(true); + buttonAdd->setEnabled(false); + buttonDelete->setEnabled(true); + widget->setEnabled(true); + spinTransp->setEnabled(true); + frameOptions->setEnabled(true); + m_reset->setEnabled(true); } - paramRect->setPos(item.x(), item.y()); - paramRect->setRect(0, 0, item.w(), item.h()); - ui.spinTransp->setValue(item.mix()); - paramRect->setBrush(QColor(255, 0, 0, item.mix())); + + m_paramRect->setPos(item.x() * m_dar, item.y()); + m_paramRect->setRect(0, 0, item.w() * m_dar, item.h()); + spinTransp->setValue(item.mix()); + m_paramRect->setBrush(QColor(255, 0, 0, item.mix())); + slotUpdateGeometry(); } -void Geometryval::slotDeleteFrame() { +void Geometryval::slotDeleteFrame(int pos) +{ // check there is more than one keyframe Mlt::GeometryItem item; - const int pos = ui.spinPos->value(); + int frame = m_timePos.getValue(); + + if (pos == -1) pos = frame; int error = m_geom->next_key(&item, pos + 1); if (error) { error = m_geom->prev_key(&item, pos - 1); if (error || item.frame() == pos) return; } - m_geom->remove(ui.spinPos->value()); - ui.buttonAdd->setEnabled(true); - ui.buttonDelete->setEnabled(false); - ui.widget->setEnabled(false); - ui.spinTransp->setEnabled(false); - m_scaleMenu->setEnabled(false); - m_alignMenu->setEnabled(false); + m_geom->remove(frame); + buttonAdd->setEnabled(true); + buttonDelete->setEnabled(false); + widget->setEnabled(false); + spinTransp->setEnabled(false); + frameOptions->setEnabled(false); + m_reset->setEnabled(false); m_helper->update(); + slotPositionChanged(pos, false); + updateTransitionPath(); + emit parameterChanged(); } -void Geometryval::slotAddFrame() { - int pos = ui.spinPos->value(); +void Geometryval::slotAddFrame(int pos) +{ + int frame = m_timePos.getValue(); + if (pos == -1) pos = frame; Mlt::GeometryItem item; item.frame(pos); - item.x(paramRect->pos().x()); - item.y(paramRect->pos().y()); - item.w(paramRect->rect().width()); - item.h(paramRect->rect().height()); - item.mix(ui.spinTransp->value()); + QRectF r = m_paramRect->rect().normalized(); + QPointF rectpos = m_paramRect->pos(); + item.x(rectpos.x() / m_dar); + item.y(rectpos.y()); + item.w(r.width() / m_dar); + item.h(r.height()); + item.mix(spinTransp->value()); m_geom->insert(item); - ui.buttonAdd->setEnabled(false); - ui.buttonDelete->setEnabled(true); - ui.widget->setEnabled(true); - ui.spinTransp->setEnabled(true); - m_scaleMenu->setEnabled(true); - m_alignMenu->setEnabled(true); + buttonAdd->setEnabled(false); + buttonDelete->setEnabled(true); + widget->setEnabled(true); + spinTransp->setEnabled(true); + frameOptions->setEnabled(true); + m_reset->setEnabled(true); m_helper->update(); + emit parameterChanged(); } -void Geometryval::slotNextFrame() { +void Geometryval::slotNextFrame() +{ Mlt::GeometryItem item; int error = m_geom->next_key(&item, m_helper->value() + 1); + int pos; kDebug() << "// SEEK TO NEXT KFR: " << error; if (error) { // Go to end - ui.spinPos->setValue(ui.spinPos->maximum()); - return; - } - int pos = item.frame(); - ui.spinPos->setValue(pos); + pos = m_helper->frameLength; + } else pos = item.frame(); + m_timePos.setValue(pos); + slotPositionChanged(); } -void Geometryval::slotPreviousFrame() { +void Geometryval::slotPreviousFrame() +{ Mlt::GeometryItem item; int error = m_geom->prev_key(&item, m_helper->value() - 1); kDebug() << "// SEEK TO NEXT KFR: " << error; if (error) return; int pos = item.frame(); - ui.spinPos->setValue(pos); + m_timePos.setValue(pos); + slotPositionChanged(); } -QDomElement Geometryval::getParamDesc() { - param.setAttribute("value", m_geom->serialise()); - kDebug() << " / / UPDATING TRANSITION VALUE: " << param.attribute("value"); - return param; +QString Geometryval::getValue() const +{ + return m_geom->serialise(); } -void Geometryval::setupParam(const QDomElement& par, int minFrame, int maxFrame) { - param = par; +void Geometryval::setupParam(const QDomElement par, int minFrame, int maxFrame) +{ QString val = par.attribute("value"); if (par.attribute("fixed") == "1") { m_fixedMode = true; - ui.buttonPrevious->setHidden(true); - ui.buttonNext->setHidden(true); - ui.buttonDelete->setHidden(true); - ui.buttonAdd->setHidden(true); - ui.spinTransp->setMaximum(500); - ui.label_pos->setHidden(true); + buttonPrevious->setHidden(true); + buttonNext->setHidden(true); + buttonDelete->setHidden(true); + buttonAdd->setHidden(true); + spinTransp->setMaximum(500); + label_pos->setHidden(true); m_helper->setHidden(true); - ui.spinPos->setHidden(true); + m_timePos.setHidden(true); } - char *tmp = (char *) qstrdup(val.toUtf8().data()); - if (m_geom) m_geom->parse(tmp, maxFrame - minFrame, m_profile.width, m_profile.height); - else m_geom = new Mlt::Geometry(tmp, maxFrame - minFrame, m_profile.width, m_profile.height); - delete[] tmp; + if (par.attribute("opacity") == "false") { + label_opacity->setHidden(true); + spinTransp->setHidden(true); + } + if (m_geom) + m_geom->parse(val.toUtf8().data(), maxFrame - minFrame, m_profile.width, m_profile.height); + else + m_geom = new Mlt::Geometry(val.toUtf8().data(), maxFrame - minFrame, m_profile.width, m_profile.height); //kDebug() << " / / UPDATING TRANSITION VALUE: " << m_geom->serialise(); //read param her and set rect @@ -367,32 +397,45 @@ void Geometryval::setupParam(const QDomElement& par, int minFrame, int maxFrame) /*QDomDocument doc; doc.appendChild(doc.importNode(par, true)); kDebug() << "IMPORTED TRANS: " << doc.toString();*/ - ui.spinPos->setMaximum(maxFrame - minFrame - 1); if (m_path == NULL) { m_path = new QGraphicsPathItem(); m_path->setPen(QPen(Qt::red)); - scene->addItem(m_path); + m_scene->addItem(m_path); } updateTransitionPath(); } Mlt::GeometryItem item; m_geom->fetch(&item, 0); - if (paramRect) delete paramRect; - paramRect = new QGraphicsRectItem(QRectF(0, 0, item.w(), item.h())); - paramRect->setPos(item.x(), item.y()); - paramRect->setZValue(0); - - paramRect->setPen(QPen(QBrush(QColor(255, 0, 0, 255)), 1.0)); - scene->addItem(paramRect); + delete m_paramRect; + m_paramRect = new QGraphicsRectItem(QRectF(0, 0, item.w() * m_dar, item.h())); + m_paramRect->setPos(item.x() * m_dar, item.y()); + m_paramRect->setZValue(0); + m_paramRect->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); + + m_paramRect->setPen(QPen(QBrush(QColor(255, 0, 0, 255)), 1.0)); + m_scene->addItem(m_paramRect); slotPositionChanged(0, false); + slotUpdateGeometry(); if (!m_fixedMode) { - connect(ui.spinPos, SIGNAL(valueChanged(int)), this , SLOT(slotPositionChanged(int))); + m_timePos.setRange(0, maxFrame - minFrame - 1); + connect(&m_timePos, SIGNAL(timeCodeEditingFinished()), this , SLOT(slotPositionChanged())); + } + connect(spinTransp, SIGNAL(valueChanged(int)), this , SLOT(slotTransparencyChanged(int))); +} + +void Geometryval::slotSyncPosition(int relTimelinePos) +{ + if (m_timePos.maximum() > 0 && KdenliveSettings::transitionfollowcursor()) { + relTimelinePos = qMax(0, relTimelinePos); + relTimelinePos = qMin(relTimelinePos, m_timePos.maximum()); + if (relTimelinePos != m_timePos.getValue()) + slotPositionChanged(relTimelinePos, false); } - connect(ui.spinTransp, SIGNAL(valueChanged(int)), this , SLOT(slotTransparencyChanged(int))); } -void Geometryval::updateTransitionPath() { +void Geometryval::updateTransitionPath() +{ if (m_fixedMode) return; Mlt::GeometryItem item; int pos = 0; @@ -402,9 +445,9 @@ void Geometryval::updateTransitionPath() { if (m_geom->next_key(&item, pos) == 1) break; pos = item.frame(); if (counter == 0) { - path.moveTo(item.x() + item.w() / 2, item.y() + item.h() / 2); + path.moveTo(item.x() * m_dar + item.w() * m_dar / 2, item.y() + item.h() / 2); } else { - path.lineTo(item.x() + item.w() / 2, item.y() + item.h() / 2); + path.lineTo(item.x() * m_dar + item.w() * m_dar / 2, item.y() + item.h() / 2); } counter++; pos++; @@ -412,19 +455,134 @@ void Geometryval::updateTransitionPath() { m_path->setPath(path); } -void Geometryval::slotUpdateTransitionProperties() { - int pos = ui.spinPos->value(); +void Geometryval::slotUpdateTransitionProperties() +{ + int pos = m_timePos.getValue(); Mlt::GeometryItem item; int error = m_geom->next_key(&item, pos); if (error || item.frame() != pos) { // no keyframe under cursor return; } - item.x(paramRect->pos().x()); - item.y(paramRect->pos().y()); - item.w(paramRect->rect().width()); - item.h(paramRect->rect().height()); + QRectF r = m_paramRect->rect().normalized(); + QPointF rectpos = m_paramRect->pos(); + item.x(rectpos.x() / m_dar); + item.y(rectpos.y()); + item.w(r.width() / m_dar); + item.h(r.height()); m_geom->insert(item); updateTransitionPath(); emit parameterChanged(); } + +void Geometryval::slotResetPosition() +{ + spinX->setValue(0); + spinY->setValue(0); + + if (m_frameSize.isNull()) { + spinWidth->setValue(m_realWidth); + spinHeight->setValue(m_profile.height); + } else { + spinWidth->setValue(m_frameSize.x()); + spinHeight->setValue(m_frameSize.y()); + } +} + +void Geometryval::setFrameSize(const QPoint &p) +{ + m_frameSize = p; +} + + +void Geometryval::slotKeyframeMoved(int pos) +{ + slotPositionChanged(pos); + slotUpdateTransitionProperties(); + QTimer::singleShot(100, this, SIGNAL(parameterChanged())); +} + +void Geometryval::slotSwitchOptions() +{ + if (frameOptions->isHidden()) { + frameOptions->setHidden(false); + m_editOptions->setChecked(true); + } else { + frameOptions->setHidden(true); + m_editOptions->setChecked(false); + } + //adjustSize(); +} + +void Geometryval::slotGeometryX(int value) +{ + if (!keyframeSelected()) + return; + m_paramRect->setPos(value, spinY->value()); + slotUpdateTransitionProperties(); +} + +void Geometryval::slotGeometryY(int value) +{ + if (!keyframeSelected()) + return; + m_paramRect->setPos(spinX->value(), value); + slotUpdateTransitionProperties(); +} + +void Geometryval::slotGeometryWidth(int value) +{ + if (!keyframeSelected()) + return; + m_paramRect->setRect(0, 0, value, spinHeight->value()); + slotUpdateTransitionProperties(); +} + +void Geometryval::slotGeometryHeight(int value) +{ + if (!keyframeSelected()) + return; + m_paramRect->setRect(0, 0, spinWidth->value(), value); + slotUpdateTransitionProperties(); +} + +void Geometryval::slotUpdateGeometry() +{ + QRectF r = m_paramRect->rect().normalized(); + + spinX->blockSignals(true); + spinY->blockSignals(true); + spinWidth->blockSignals(true); + spinHeight->blockSignals(true); + spinResize->blockSignals(true); + + spinX->setValue(m_paramRect->pos().x()); + spinY->setValue(m_paramRect->pos().y()); + spinWidth->setValue(r.width()); + spinHeight->setValue(r.height()); + spinResize->setValue(m_paramRect->rect().width() * 100 / m_realWidth); + + spinX->blockSignals(false); + spinY->blockSignals(false); + spinWidth->blockSignals(false); + spinHeight->blockSignals(false); + spinResize->blockSignals(false); +} + +bool Geometryval::keyframeSelected() +{ + Mlt::GeometryItem item; + int pos = m_timePos.getValue(); + if (m_geom->fetch(&item, pos) || item.key() == false) return false; + return true; +} + + +void Geometryval::slotUpdateRange(int inPoint, int outPoint) +{ + m_helper->setKeyGeometry(m_geom, outPoint - inPoint - 1); + m_helper->update(); + m_timePos.setRange(0, outPoint - inPoint - 1); +} + +#include "geometryval.moc"