X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fgeometryval.cpp;h=f14c9875e03a998e4528b504bf8bf1d312339528;hb=459decee5e330552ef73b7cb363dbbe38fdc7e87;hp=d6e277829d7e84a4164ddb6b791e3a92556847d6;hpb=000c8e2337fe448a6e35896f3ef1a95dedbb39c7;p=kdenlive diff --git a/src/geometryval.cpp b/src/geometryval.cpp index d6e27782..f14c9875 100644 --- a/src/geometryval.cpp +++ b/src/geometryval.cpp @@ -37,14 +37,14 @@ Geometryval::Geometryval(const MltVideoProfile profile, QPoint frame_size, QWidg m_fixedMode(false), m_frameSize(frame_size) { - m_ui.setupUi(this); - QVBoxLayout* vbox = new QVBoxLayout(m_ui.widget); + setupUi(this); + QVBoxLayout* vbox = new QVBoxLayout(widget); QGraphicsView *view = new QGraphicsView(this); view->setBackgroundBrush(QBrush(Qt::black)); vbox->addWidget(view); vbox->setContentsMargins(0, 0, 0, 0); - QVBoxLayout* vbox2 = new QVBoxLayout(m_ui.keyframeWidget); + QVBoxLayout* vbox2 = new QVBoxLayout(keyframeWidget); m_helper = new KeyframeHelper(this); vbox2->addWidget(m_helper); vbox2->setContentsMargins(0, 0, 0, 0); @@ -57,25 +57,28 @@ Geometryval::Geometryval(const MltVideoProfile profile, QPoint frame_size, QWidg m_scene = new GraphicsSceneRectMove(this); m_scene->setTool(TITLE_SELECT); view->setScene(m_scene); - 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)); - m_scene->addItem(m_frameBorder); - - m_ui.buttonNext->setIcon(KIcon("media-skip-forward")); - m_ui.buttonNext->setToolTip(i18n("Go to next keyframe")); - m_ui.buttonPrevious->setIcon(KIcon("media-skip-backward")); - m_ui.buttonPrevious->setToolTip(i18n("Go to previous keyframe")); - m_ui.buttonAdd->setIcon(KIcon("document-new")); - m_ui.buttonAdd->setToolTip(i18n("Add keyframe")); - m_ui.buttonDelete->setIcon(KIcon("edit-delete")); - m_ui.buttonDelete->setToolTip(i18n("Delete keyframe")); + 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); + 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); - m_ui.buttonMenu->setIcon(KIcon("system-run")); - m_ui.buttonMenu->setMenu(m_configMenu); - m_ui.buttonMenu->setPopupMode(QToolButton::QToolButton::InstantPopup); + buttonMenu->setIcon(KIcon("system-run")); + buttonMenu->setMenu(m_configMenu); + buttonMenu->setPopupMode(QToolButton::QToolButton::InstantPopup); m_editGeom = m_configMenu->addAction(i18n("Edit keyframe"), this, SLOT(slotGeometry())); @@ -109,11 +112,11 @@ Geometryval::Geometryval(const MltVideoProfile profile, QPoint frame_size, QWidg QRectF srect = view->sceneRect(); view->setSceneRect(srect.x(), -srect.height() / 3 + 10, srect.width(), srect.height() + srect.height() / 3 * 2 - 10); m_scene->setZoom(sc); - view->centerOn(m_frameBorder); - connect(m_ui.buttonNext , SIGNAL(clicked()) , this , SLOT(slotNextFrame())); - connect(m_ui.buttonPrevious , SIGNAL(clicked()) , this , SLOT(slotPreviousFrame())); - connect(m_ui.buttonDelete , SIGNAL(clicked()) , this , SLOT(slotDeleteFrame())); - connect(m_ui.buttonAdd , SIGNAL(clicked()) , this , SLOT(slotAddFrame())); + view->centerOn(frameBorder); + 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())); connect(m_scene, SIGNAL(doubleClickEvent()), this, SLOT(slotGeometry())); @@ -138,33 +141,33 @@ Geometryval::~Geometryval() void Geometryval::slotAlignCenter() { - int pos = m_ui.spinPos->value(); + int pos = spinPos->value(); Mlt::GeometryItem item; int error = m_geom->fetch(&item, pos); if (error || item.key() == false) { // no keyframe under cursor return; } - m_paramRect->setPos((m_profile.width - m_paramRect->rect().width()) / 2, (m_profile.height - m_paramRect->rect().height()) / 2); + m_paramRect->setPos((m_realWidth - m_paramRect->rect().width()) / 2, (m_profile.height - m_paramRect->rect().height()) / 2); slotUpdateTransitionProperties(); } void Geometryval::slotAlignHCenter() { - int pos = m_ui.spinPos->value(); + int pos = spinPos->value(); Mlt::GeometryItem item; int error = m_geom->fetch(&item, pos); if (error || item.key() == false) { // no keyframe under cursor return; } - m_paramRect->setPos((m_profile.width - m_paramRect->rect().width()) / 2, m_paramRect->pos().y()); + m_paramRect->setPos((m_realWidth - m_paramRect->rect().width()) / 2, m_paramRect->pos().y()); slotUpdateTransitionProperties(); } void Geometryval::slotAlignVCenter() { - int pos = m_ui.spinPos->value(); + int pos = spinPos->value(); Mlt::GeometryItem item; int error = m_geom->fetch(&item, pos); if (error || item.key() == false) { @@ -177,7 +180,7 @@ void Geometryval::slotAlignVCenter() void Geometryval::slotAlignTop() { - int pos = m_ui.spinPos->value(); + int pos = spinPos->value(); Mlt::GeometryItem item; int error = m_geom->fetch(&item, pos); if (error || item.key() == false) { @@ -190,7 +193,7 @@ void Geometryval::slotAlignTop() void Geometryval::slotAlignBottom() { - int pos = m_ui.spinPos->value(); + int pos = spinPos->value(); Mlt::GeometryItem item; int error = m_geom->fetch(&item, pos); if (error || item.key() == false) { @@ -203,7 +206,7 @@ void Geometryval::slotAlignBottom() void Geometryval::slotAlignLeft() { - int pos = m_ui.spinPos->value(); + int pos = spinPos->value(); Mlt::GeometryItem item; int error = m_geom->fetch(&item, pos); if (error || item.key() == false) { @@ -216,60 +219,60 @@ void Geometryval::slotAlignLeft() void Geometryval::slotAlignRight() { - int pos = m_ui.spinPos->value(); + int pos = spinPos->value(); Mlt::GeometryItem item; int error = m_geom->fetch(&item, pos); if (error || item.key() == false) { // no keyframe under cursor return; } - m_paramRect->setPos(m_profile.width - m_paramRect->rect().width(), m_paramRect->pos().y()); + m_paramRect->setPos(m_realWidth - m_paramRect->rect().width(), m_paramRect->pos().y()); slotUpdateTransitionProperties(); } void Geometryval::slotResize50() { - int pos = m_ui.spinPos->value(); + int pos = spinPos->value(); Mlt::GeometryItem item; int error = m_geom->fetch(&item, pos); if (error || item.key() == false) { // no keyframe under cursor return; } - m_paramRect->setRect(0, 0, m_profile.width / 2, m_profile.height / 2); + m_paramRect->setRect(0, 0, m_realWidth / 2, m_profile.height / 2); slotUpdateTransitionProperties(); } void Geometryval::slotResize100() { - int pos = m_ui.spinPos->value(); + int pos = spinPos->value(); Mlt::GeometryItem item; int error = m_geom->fetch(&item, pos); if (error || item.key() == false) { // no keyframe under cursor return; } - m_paramRect->setRect(0, 0, m_profile.width, m_profile.height); + m_paramRect->setRect(0, 0, m_realWidth, m_profile.height); slotUpdateTransitionProperties(); } void Geometryval::slotResize200() { - int pos = m_ui.spinPos->value(); + int pos = spinPos->value(); Mlt::GeometryItem item; int error = m_geom->fetch(&item, pos); if (error || item.key() == false) { // no keyframe under cursor return; } - m_paramRect->setRect(0, 0, m_profile.width * 2, m_profile.height * 2); + m_paramRect->setRect(0, 0, m_realWidth * 2, m_profile.height * 2); slotUpdateTransitionProperties(); } void Geometryval::slotResizeOriginal() { if (m_frameSize.isNull()) slotResize100(); - int pos = m_ui.spinPos->value(); + int pos = spinPos->value(); Mlt::GeometryItem item; int error = m_geom->fetch(&item, pos); if (error || item.key() == false) { @@ -282,24 +285,24 @@ void Geometryval::slotResizeOriginal() void Geometryval::slotResizeCustom() { - int pos = m_ui.spinPos->value(); + int pos = spinPos->value(); Mlt::GeometryItem item; int error = m_geom->fetch(&item, pos); if (error || item.key() == false) { // no keyframe under cursor return; } - int scale = m_paramRect->rect().width() * 100 / m_profile.width; + int scale = m_paramRect->rect().width() * 100 / m_realWidth; bool ok; scale = QInputDialog::getInteger(this, i18n("Resize..."), i18n("Scale"), scale, 1, 2147483647, 10, &ok); if (!ok) return; - m_paramRect->setRect(0, 0, m_profile.width * scale / 100, m_profile.height * scale / 100); + m_paramRect->setRect(0, 0, m_realWidth * scale / 100, m_profile.height * scale / 100); slotUpdateTransitionProperties(); } void Geometryval::slotTransparencyChanged(int transp) { - int pos = m_ui.spinPos->value(); + int pos = spinPos->value(); Mlt::GeometryItem item; int error = m_geom->fetch(&item, pos); if (error || item.key() == false) { @@ -320,31 +323,32 @@ void Geometryval::slotSyncCursor() void Geometryval::slotPositionChanged(int pos, bool seek) { if (seek && KdenliveSettings::transitionfollowcursor()) emit seekToPos(pos); - m_ui.spinPos->setValue(pos); + spinPos->setValue(pos); m_helper->setValue(pos); Mlt::GeometryItem item; int error = m_geom->fetch(&item, pos); if (error || item.key() == false) { // no keyframe under cursor, adjust buttons - m_ui.buttonAdd->setEnabled(true); - m_ui.buttonDelete->setEnabled(false); - m_ui.widget->setEnabled(false); - m_ui.spinTransp->setEnabled(false); + buttonAdd->setEnabled(true); + buttonDelete->setEnabled(false); + widget->setEnabled(false); + 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.widget->setEnabled(true); - m_ui.spinTransp->setEnabled(true); + buttonAdd->setEnabled(false); + buttonDelete->setEnabled(true); + widget->setEnabled(true); + 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->setValue(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())); } @@ -352,18 +356,18 @@ void Geometryval::slotDeleteFrame(int pos) { // check there is more than one keyframe Mlt::GeometryItem item; - if (pos == -1) pos = m_ui.spinPos->value(); + if (pos == -1) pos = spinPos->value(); 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(m_ui.spinPos->value()); - m_ui.buttonAdd->setEnabled(true); - m_ui.buttonDelete->setEnabled(false); - m_ui.widget->setEnabled(false); - m_ui.spinTransp->setEnabled(false); + m_geom->remove(spinPos->value()); + buttonAdd->setEnabled(true); + buttonDelete->setEnabled(false); + widget->setEnabled(false); + spinTransp->setEnabled(false); m_scaleMenu->setEnabled(false); m_alignMenu->setEnabled(false); m_editGeom->setEnabled(false); @@ -375,19 +379,21 @@ void Geometryval::slotDeleteFrame(int pos) void Geometryval::slotAddFrame(int pos) { - if (pos = -1) pos = m_ui.spinPos->value(); + if (pos == -1) pos = spinPos->value(); Mlt::GeometryItem item; item.frame(pos); - item.x(m_paramRect->pos().x()); - item.y(m_paramRect->pos().y()); - item.w(m_paramRect->rect().width()); - item.h(m_paramRect->rect().height()); - item.mix(m_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); - m_ui.buttonAdd->setEnabled(false); - m_ui.buttonDelete->setEnabled(true); - m_ui.widget->setEnabled(true); - m_ui.spinTransp->setEnabled(true); + buttonAdd->setEnabled(false); + buttonDelete->setEnabled(true); + widget->setEnabled(true); + spinTransp->setEnabled(true); m_scaleMenu->setEnabled(true); m_alignMenu->setEnabled(true); m_editGeom->setEnabled(true); @@ -402,11 +408,11 @@ void Geometryval::slotNextFrame() kDebug() << "// SEEK TO NEXT KFR: " << error; if (error) { // Go to end - m_ui.spinPos->setValue(m_ui.spinPos->maximum()); + spinPos->setValue(spinPos->maximum()); return; } int pos = item.frame(); - m_ui.spinPos->setValue(pos); + spinPos->setValue(pos); } void Geometryval::slotPreviousFrame() @@ -416,31 +422,28 @@ void Geometryval::slotPreviousFrame() kDebug() << "// SEEK TO NEXT KFR: " << error; if (error) return; int pos = item.frame(); - m_ui.spinPos->setValue(pos); + spinPos->setValue(pos); } -QDomElement Geometryval::getParamDesc() +QString Geometryval::getValue() const { - m_param.setAttribute("value", m_geom->serialise()); - kDebug() << " / / UPDATING TRANSITION VALUE: " << m_param.attribute("value"); - return m_param; + return m_geom->serialise(); } void Geometryval::setupParam(const QDomElement par, int minFrame, int maxFrame) { - m_param = par; QString val = par.attribute("value"); if (par.attribute("fixed") == "1") { m_fixedMode = true; - m_ui.buttonPrevious->setHidden(true); - m_ui.buttonNext->setHidden(true); - m_ui.buttonDelete->setHidden(true); - m_ui.buttonAdd->setHidden(true); - m_ui.spinTransp->setMaximum(500); - m_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); - m_ui.spinPos->setHidden(true); + spinPos->setHidden(true); } char *tmp = (char *) qstrdup(val.toUtf8().data()); @@ -456,7 +459,7 @@ void Geometryval::setupParam(const QDomElement par, int minFrame, int maxFrame) /*QDomDocument doc; doc.appendChild(doc.importNode(par, true)); kDebug() << "IMPORTED TRANS: " << doc.toString();*/ - m_ui.spinPos->setMaximum(maxFrame - minFrame - 1); + spinPos->setMaximum(maxFrame - minFrame - 1); if (m_path == NULL) { m_path = new QGraphicsPathItem(); m_path->setPen(QPen(Qt::red)); @@ -468,17 +471,18 @@ void Geometryval::setupParam(const QDomElement par, int minFrame, int maxFrame) m_geom->fetch(&item, 0); delete m_paramRect; - m_paramRect = new QGraphicsRectItem(QRectF(0, 0, item.w(), item.h())); - m_paramRect->setPos(item.x(), item.y()); + 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); if (!m_fixedMode) { - connect(m_ui.spinPos, SIGNAL(valueChanged(int)), this , SLOT(slotPositionChanged(int))); + connect(spinPos, SIGNAL(valueChanged(int)), this , SLOT(slotPositionChanged(int))); } - connect(m_ui.spinTransp, SIGNAL(valueChanged(int)), this , SLOT(slotTransparencyChanged(int))); + connect(spinTransp, SIGNAL(valueChanged(int)), this , SLOT(slotTransparencyChanged(int))); } void Geometryval::updateTransitionPath() @@ -492,9 +496,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++; @@ -504,7 +508,7 @@ void Geometryval::updateTransitionPath() void Geometryval::slotUpdateTransitionProperties() { - int pos = m_ui.spinPos->value(); + int pos = spinPos->value(); Mlt::GeometryItem item; int error = m_geom->next_key(&item, pos); if (error || item.frame() != pos) { @@ -512,9 +516,10 @@ void Geometryval::slotUpdateTransitionProperties() return; } QRectF r = m_paramRect->rect().normalized(); - item.x(m_paramRect->pos().x()); - item.y(m_paramRect->pos().y()); - item.w(r.width()); + 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(); @@ -523,7 +528,7 @@ void Geometryval::slotUpdateTransitionProperties() void Geometryval::slotGeometry() { - int pos = m_ui.spinPos->value(); + int pos = spinPos->value(); Mlt::GeometryItem item; int error = m_geom->fetch(&item, pos); if (error || item.key() == false) { @@ -563,7 +568,7 @@ void Geometryval::slotResetPosition() m_view.value_y->setValue(0); if (m_frameSize.isNull()) { - m_view.value_width->setValue(m_profile.width); + m_view.value_width->setValue(m_realWidth); m_view.value_height->setValue(m_profile.height); } else { m_view.value_width->setValue(m_frameSize.x());