]> git.sesse.net Git - kdenlive/commitdiff
cleanup keyframe moving
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Wed, 27 Jan 2010 22:40:40 +0000 (22:40 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Wed, 27 Jan 2010 22:40:40 +0000 (22:40 +0000)
svn path=/trunk/kdenlive/; revision=4250

src/abstractclipitem.cpp
src/clipitem.cpp
src/customtrackview.cpp
src/effectstackedit.cpp
src/keyframeedit.cpp
src/keyframeedit.h

index 39ed506de31e7d0e9780c113ae58c78f377a3022..a0f860f0351bc5ba0b6367000b50aac44c3a5ece 100644 (file)
@@ -271,7 +271,7 @@ void AbstractClipItem::drawKeyFrames(QPainter *painter, QRectF /*exposedRect*/)
     y1 = br.bottom() - i.value() * maxh;
     QLineF l2;
     while (i != m_keyframes.constEnd()) {
-        if (i.key() == m_selectedKeyframe) color = QColor(Qt::red);
+        if (i.key() == m_editedKeyframe) color = QColor(Qt::red);
         else color = QColor(Qt::blue);
         ++i;
         if (i == m_keyframes.constEnd() && m_keyframes.count() != 1) {
index c59c33bf59c69e5f0b7a995c17eb543eedcebe84..f97ed7195f425e018fef3aee7a7182b2b9c3e4b1 100644 (file)
@@ -327,7 +327,6 @@ void ClipItem::setKeyframes(const int ix, const QString keyframes)
                 m_keyframeFactor = 100.0 / (max - min);
                 m_keyframeDefault = e.attribute("default").toDouble();
                 m_selectedKeyframe = 0;
-                m_editedKeyframe = -1;
                 // parse keyframes
                 const QStringList keyframes = e.attribute("keyframes").split(';', QString::SkipEmptyParts);
                 foreach(const QString &str, keyframes) {
@@ -335,6 +334,8 @@ void ClipItem::setKeyframes(const int ix, const QString keyframes)
                     double val = str.section(':', 1, 1).toDouble();
                     m_keyframes[pos] = val;
                 }
+                if (m_keyframes.find(m_editedKeyframe) == m_keyframes.end()) m_editedKeyframe = -1;
+                if (m_keyframes.find(m_editedKeyframe) == m_keyframes.end()) m_editedKeyframe = -1;
                 update();
                 return;
             }
@@ -360,7 +361,7 @@ void ClipItem::setSelectedEffect(const int ix)
                     m_keyframeFactor = 100.0 / (max - min);
                     m_keyframeDefault = e.attribute("default").toDouble();
                     m_selectedKeyframe = 0;
-                    m_editedKeyframe = -1;
+
                     // parse keyframes
                     const QStringList keyframes = e.attribute("keyframes").split(';', QString::SkipEmptyParts);
                     foreach(const QString &str, keyframes) {
@@ -368,6 +369,7 @@ void ClipItem::setSelectedEffect(const int ix)
                         double val = str.section(':', 1, 1).toDouble();
                         m_keyframes[pos] = val;
                     }
+                    if (m_keyframes.find(m_editedKeyframe) == m_keyframes.end()) m_editedKeyframe = -1;
                     update();
                     return;
                 }
@@ -852,8 +854,11 @@ OPERATIONTYPE ClipItem::operationMode(QPointF pos)
     const double scale = projectScene()->scale().x();
     double maximumOffset = 6 / scale;
     if (isSelected() || (parentItem() && parentItem()->isSelected())) {
-        m_editedKeyframe = mouseOverKeyFrames(pos, maximumOffset);
-        if (m_editedKeyframe != -1) return KEYFRAME;
+        int kf = mouseOverKeyFrames(pos, maximumOffset);
+        if (kf != -1) {
+            m_editedKeyframe = kf;
+            return KEYFRAME;
+        }
     }
     QRectF rect = sceneBoundingRect();
     int addtransitionOffset = 10;
@@ -1631,6 +1636,8 @@ bool ClipItem::isVideoOnly() const
 void ClipItem::insertKeyframe(QDomElement effect, int pos, int val)
 {
     if (effect.attribute("disabled") == "1") return;
+    effect.setAttribute("active_keyframe", pos);
+    m_editedKeyframe = pos;
     QDomNodeList params = effect.elementsByTagName("parameter");
     for (int i = 0; i < params.count(); i++) {
         QDomElement e = params.item(i).toElement();
@@ -1658,6 +1665,7 @@ void ClipItem::insertKeyframe(QDomElement effect, int pos, int val)
 void ClipItem::movedKeyframe(QDomElement effect, int oldpos, int newpos, double value)
 {
     if (effect.attribute("disabled") == "1") return;
+    effect.setAttribute("active_keyframe", newpos);
     QDomNodeList params = effect.elementsByTagName("parameter");
     int start = cropStart().frames(m_fps);
     int end = (cropStart() + cropDuration()).frames(m_fps) - 1;
index 2ac233668ccae4a2b285eeae1ae5d97868740a6d..17ddcc7802b875bf397facb22cd8169c74094a65 100644 (file)
@@ -1169,7 +1169,7 @@ void CustomTrackView::groupSelectedItems(bool force, bool createNewGroup)
 void CustomTrackView::mouseDoubleClickEvent(QMouseEvent *event)
 {
     if (m_dragItem && m_dragItem->hasKeyFrames()) {
-        if (m_moveOpMode == KEYFRAME) {
+        /*if (m_moveOpMode == KEYFRAME) {
             // user double clicked on a keyframe, open edit dialog
             //TODO: update for effects with several values per keyframe
             QDialog d(parentWidget());
@@ -1191,7 +1191,7 @@ void CustomTrackView::mouseDoubleClickEvent(QMouseEvent *event)
                 emit clipItemSelected(item, item->selectedEffectIndex());
             }
 
-        } else  {
+        } else*/  {
             // add keyframe
             GenTime keyFramePos = GenTime((int)(mapToScene(event->pos()).x()), m_document->fps()) - m_dragItem->startPos() + m_dragItem->cropStart();
             int val = m_dragItem->addKeyFrame(keyFramePos, mapToScene(event->pos()).toPoint().y());
index 0d92a36f2ca10b24545cafc85a2a904c27368dbb..e9ae636bbbd478abe1e83c7b2a3dd7ce6b70fb93 100644 (file)
@@ -236,12 +236,12 @@ void EffectStackEdit::transferParamDesc(const QDomElement d, int in, int out)
             // keyframe editor widget
             kDebug() << "min: " << m_in << ", MAX: " << m_out;
             if (m_keyframeEditor == NULL) {
-                KeyframeEdit *geo = new KeyframeEdit(pa, m_in, m_in + m_out, pa.attribute("min").toInt(), pa.attribute("max").toInt(), m_timecode);
+                KeyframeEdit *geo = new KeyframeEdit(pa, m_in, m_in + m_out, pa.attribute("min").toInt(), pa.attribute("max").toInt(), m_timecode, e.attribute("active_keyframe", "-1").toInt());
                 m_vbox->addWidget(geo);
                 m_valueItems[paramName+"keyframe"] = geo;
                 m_keyframeEditor = geo;
                 connect(geo, SIGNAL(parameterChanged()), this, SLOT(collectAllParameters()));
-               connect(geo, SIGNAL(seekToPos(int)), this, SLOT(slotSeekToPos(int)));
+                connect(geo, SIGNAL(seekToPos(int)), this, SLOT(slotSeekToPos(int)));
             } else {
                 // we already have a keyframe editor, so just add another column for the new param
                 m_keyframeEditor->addParameter(pa);
index 7d98db463b0a99e1adf4518381ee557b6eced35f..b6dbca0121f63a5b88ff3b05740ea55ec64f44af 100644 (file)
 #include <QHeaderView>
 
 
-KeyframeEdit::KeyframeEdit(QDomElement e, int minFrame, int maxFrame, int minVal, int maxVal, Timecode tc, QWidget* parent) :
+KeyframeEdit::KeyframeEdit(QDomElement e, int minFrame, int maxFrame, int minVal, int maxVal, Timecode tc, int active_keyframe, QWidget* parent) :
         QWidget(parent),
         m_min(minFrame),
         m_max(maxFrame),
         m_minVal(minVal),
         m_maxVal(maxVal),
         m_timecode(tc),
-        m_previousPos(0)
+        m_previousPos(0),
+        m_active_keyframe(active_keyframe)
 {
+    kDebug() << " / / / /MODIFIED KFR: " << m_active_keyframe;
     setupUi(this);
     m_params.append(e);
     keyframe_list->setFont(KGlobalSettings::generalFont());
@@ -44,21 +46,22 @@ KeyframeEdit::KeyframeEdit(QDomElement e, int minFrame, int maxFrame, int minVal
     button_delete->setIcon(KIcon("list-remove"));
     button_delete->setToolTip(i18n("Delete keyframe"));
     connect(keyframe_list, SIGNAL(itemSelectionChanged()), this, SLOT(slotAdjustKeyframeInfo()));
-    //keyframe_val->setRange(m_minVal, m_maxVal);
+    connect(keyframe_list, SIGNAL(cellChanged(int, int)), this, SLOT(slotGenerateParams(int, int)));
     setupParam();
-    //keyframe_list->sortItems(0);
+
     keyframe_list->resizeRowsToContents();
     keyframe_list->resizeColumnsToContents();
-    keyframe_list->setSelectionBehavior(QAbstractItemView::SelectRows);
     //keyframe_list->horizontalHeader()->resizeSections(QHeaderView::ResizeToContents);
     connect(button_delete, SIGNAL(clicked()), this, SLOT(slotDeleteKeyframe()));
     connect(button_add, SIGNAL(clicked()), this, SLOT(slotAddKeyframe()));
-    connect(keyframe_list, SIGNAL(cellChanged(int, int)), this, SLOT(slotGenerateParams(int, int)));
     //connect(keyframe_list, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this, SLOT(slotSaveCurrentParam(QTreeWidgetItem *, int)));
     connect(keyframe_pos, SIGNAL(valueChanged(int)), this, SLOT(slotAdjustKeyframePos(int)));
     //connect(keyframe_val, SIGNAL(valueChanged(int)), this, SLOT(slotAdjustKeyframeValue(int)));
     keyframe_pos->setPageStep(1);
-
+    if (!keyframe_list->currentItem()) {
+        keyframe_list->setCurrentCell(0, 0);
+        keyframe_list->selectRow(0);
+    }
     /*m_delegate = new KeyItemDelegate(minVal, maxVal);
     keyframe_list->setItemDelegate(m_delegate);*/
 }
@@ -114,7 +117,6 @@ void KeyframeEdit::addParameter(QDomElement e)
         }
     }
     keyframe_list->resizeColumnsToContents();
-    keyframe_list->selectRow(0);
     keyframe_list->blockSignals(false);
     slotAdjustKeyframeInfo(false);
 }
@@ -136,18 +138,26 @@ void KeyframeEdit::setupParam()
     connect(sl, SIGNAL(valueChanged(int)), this, SLOT(slotAdjustKeyframeValue(int)));
     m_slidersLayout->addWidget(sl, 0, 1);
     param_sliders->setLayout(m_slidersLayout);
+    keyframe_list->setSelectionBehavior(QAbstractItemView::SelectRows);
+    keyframe_list->setSelectionMode(QAbstractItemView::SingleSelection);
+
     QStringList frames = m_params.at(0).attribute("keyframes").split(";", QString::SkipEmptyParts);
     for (int i = 0; i < frames.count(); i++) {
         keyframe_list->insertRow(i);
-        QString framePos = m_timecode.getTimecodeFromFrames(frames.at(i).section(':', 0, 0).toInt());
+        int currentpos = frames.at(i).section(':', 0, 0).toInt();
+        QString framePos = m_timecode.getTimecodeFromFrames(currentpos);
         keyframe_list->setVerticalHeaderItem(i, new QTableWidgetItem(framePos));
         keyframe_list->setItem(i, col, new QTableWidgetItem(frames.at(i).section(':', 1, 1)));
+        if ((m_active_keyframe > -1) && (m_active_keyframe == currentpos)) {
+            keyframe_list->setCurrentCell(i, 0);
+            keyframe_list->selectRow(i);
+        }
         //item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled);
     }
     /*QTreeWidgetItem *first = keyframe_list->topLevelItem(0);
     if (first) keyframe_list->setCurrentItem(first);*/
     keyframe_list->blockSignals(false);
-    keyframe_list->setCurrentCell(0, 0);
+    //keyframe_list->setCurrentCell(0, 0);
     //slotAdjustKeyframeInfo();
     button_delete->setEnabled(keyframe_list->rowCount() > 1);
 }
@@ -160,6 +170,7 @@ void KeyframeEdit::slotDeleteKeyframe()
     keyframe_list->removeRow(keyframe_list->currentRow());
     row = qMin(row, keyframe_list->rowCount() - 1);
     keyframe_list->setCurrentCell(row, col);
+    keyframe_list->selectRow(row);
     generateAllParams();
     button_delete->setEnabled(keyframe_list->rowCount() > 1);
 }
@@ -202,6 +213,7 @@ void KeyframeEdit::slotAddKeyframe()
     generateAllParams();
     button_delete->setEnabled(keyframe_list->rowCount() > 1);
     keyframe_list->setCurrentCell(newrow, col);
+    keyframe_list->selectRow(newrow);
     //slotGenerateParams(newrow, 0);
 }
 
index 7a30db949a415620c5ee87f7f4810dfa98ff183f..91b3a7a1925a3938010e5d31239e277b6364269e 100644 (file)
@@ -75,7 +75,7 @@ class KeyframeEdit : public QWidget, public Ui::KeyframeEditor_UI
 {
     Q_OBJECT
 public:
-    explicit KeyframeEdit(QDomElement e, int minFrame, int maxFrame, int minVal, int maxVal, Timecode tc, QWidget* parent = 0);
+    explicit KeyframeEdit(QDomElement e, int minFrame, int maxFrame, int minVal, int maxVal, Timecode tc, int active_keyframe, QWidget* parent = 0);
     virtual ~KeyframeEdit();
     void setupParam();
     void addParameter(QDomElement e);
@@ -91,6 +91,7 @@ private:
     KeyItemDelegate *m_delegate;
     void generateAllParams();
     QGridLayout *m_slidersLayout;
+    int m_active_keyframe;
 
 public slots: