]> git.sesse.net Git - kdenlive/commitdiff
keyframes can now be edited through double click
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 23 Jun 2008 19:53:10 +0000 (19:53 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 23 Jun 2008 19:53:10 +0000 (19:53 +0000)
svn path=/branches/KDE4/; revision=2264

src/CMakeLists.txt
src/abstractclipitem.cpp
src/abstractclipitem.h
src/customtrackview.cpp
src/markerdialog.cpp
src/widgets/keyframedialog_ui.ui [new file with mode: 0644]

index cf74b7c814d80b9376ee118afb9b9d8011a35467..e528b552b94d38daee28e611d16e4b1d80ac3248 100644 (file)
@@ -49,6 +49,7 @@ kde4_add_ui_files(kdenlive_UI
   widgets/trackheader_ui.ui
   widgets/clipproperties_ui.ui
   widgets/markerdialog_ui.ui
+  widgets/keyframedialog_ui.ui
 )
  
 set(kdenlive_SRCS 
index 160021fc8731712ae16b50784b729d6ebb4e0a42..e012eeda8f414ba883cc5e87dfc928486cd3f9c2 100644 (file)
@@ -26,7 +26,7 @@
 
 #include "abstractclipitem.h"
 
-AbstractClipItem::AbstractClipItem(const ItemInfo info, const QRectF& rect, double fps): QGraphicsRectItem(rect), m_track(0), m_fps(fps), m_editedKeyframe(-1), m_selectedKeyframe(0) {
+AbstractClipItem::AbstractClipItem(const ItemInfo info, const QRectF& rect, double fps): QGraphicsRectItem(rect), m_track(0), m_fps(fps), m_editedKeyframe(-1), m_selectedKeyframe(0), m_keyframeFactor(1) {
     setFlags(QGraphicsItem::ItemClipsToShape | QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
     setTrack(info.track);
     m_startPos = info.startPos;
@@ -289,31 +289,36 @@ void AbstractClipItem::updateSelectedKeyFrame() {
     update(br.x() + maxw * (m_selectedKeyframe - m_cropStart.frames(m_fps)) - 3, br.bottom() - m_keyframes[m_selectedKeyframe] * maxh - 3, 12, 12);
 }
 
-void AbstractClipItem::updateKeyFramePos(const GenTime pos, const int value) {
+int AbstractClipItem::selectedKeyFramePos() const {
+    return m_editedKeyframe;
+}
+
+double AbstractClipItem::selectedKeyFrameValue() const {
+    return m_keyframes[m_editedKeyframe];
+}
+
+void AbstractClipItem::updateKeyFramePos(const GenTime pos, const double value) {
     if (!m_keyframes.contains(m_selectedKeyframe)) return;
-    QRectF br = rect();
-    double maxh = 100.0 / br.height();
-    double newval = (br.bottom() - value) * maxh;
     int newpos = (int) pos.frames(m_fps);
     int start = m_cropStart.frames(m_fps);
     int end = (m_cropStart + m_cropDuration).frames(m_fps);
     newpos = qMax(newpos, start);
     newpos = qMin(newpos, end);
-    if (newval < -50 && m_selectedKeyframe != start && m_selectedKeyframe != end) {
+    if (value < -50 && m_selectedKeyframe != start && m_selectedKeyframe != end) {
         // remove kexframe if it is dragged outside
         m_keyframes.remove(m_selectedKeyframe);
         m_selectedKeyframe = -1;
         update();
         return;
     }
-    if (newval > 150 && m_selectedKeyframe != start && m_selectedKeyframe != end) {
+    if (value > 150 && m_selectedKeyframe != start && m_selectedKeyframe != end) {
         // remove kexframe if it is dragged outside
         m_keyframes.remove(m_selectedKeyframe);
         m_selectedKeyframe = -1;
         update();
         return;
     }
-    newval = qMax(newval, 0.0);
+    double newval = qMax(value, 0.0);
     newval = qMin(newval, 100.0);
     newval = newval / m_keyframeFactor;
     if (m_selectedKeyframe != newpos) m_keyframes.remove(m_selectedKeyframe);
@@ -322,7 +327,11 @@ void AbstractClipItem::updateKeyFramePos(const GenTime pos, const int value) {
     update();
 }
 
-void AbstractClipItem::addKeyFrame(const GenTime pos, const int value) {
+double AbstractClipItem::keyFrameFactor() const {
+    return m_keyframeFactor;
+}
+
+void AbstractClipItem::addKeyFrame(const GenTime pos, const double value) {
     QRectF br = rect();
     double maxh = 100.0 / br.height() / m_keyframeFactor;
     double newval = (br.bottom() - value) * maxh;
index fdb948b169eb9c9de7119c70c30d9ce5daa577b6..6e27d8ea644b1de4b5c03d4caa3203f1b8b7b9d3 100644 (file)
@@ -30,9 +30,12 @@ class AbstractClipItem : public QObject , public QGraphicsRectItem {
 public:
     AbstractClipItem(const ItemInfo info, const QRectF& rect, double fps);
     void updateSelectedKeyFrame();
-    void updateKeyFramePos(const GenTime pos, const int value);
-    void addKeyFrame(const GenTime pos, const int value);
+    void updateKeyFramePos(const GenTime pos, const double value);
+    void addKeyFrame(const GenTime pos, const double value);
     bool hasKeyFrames() const;
+    int selectedKeyFramePos() const;
+    double selectedKeyFrameValue() const;
+    double keyFrameFactor() const;
 
     virtual  OPERATIONTYPE operationMode(QPointF pos, double scale) = 0;
     virtual GenTime startPos() const ;
index b056260a561a020885647fc8d64e3ea2b62f5ee9..f47b5c2c410e94e4f44373df399db4eb5298e247 100644 (file)
@@ -55,6 +55,7 @@
 #include "renderer.h"
 #include "markerdialog.h"
 #include "mainwindow.h"
+#include "ui_keyframedialog_ui.h"
 
 
 //TODO:
@@ -200,7 +201,11 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event) {
                 ((ClipItem*) m_dragItem)->setFadeOut((int)(m_dragItem->endPos().frames(m_document->fps()) - pos), m_scale);
             } else if (m_operationMode == KEYFRAME) {
                 GenTime keyFramePos = GenTime((int)(mapToScene(event->pos()).x() / m_scale), m_document->fps()) - m_dragItem->startPos() + m_dragItem->cropStart();
-                m_dragItem->updateKeyFramePos(keyFramePos, mapToScene(event->pos()).toPoint().y());
+                double pos = mapToScene(event->pos()).toPoint().y();
+                QRectF br = m_dragItem->rect();
+                double maxh = 100.0 / br.height();
+                pos = (br.bottom() - pos) * maxh;
+                m_dragItem->updateKeyFramePos(keyFramePos, pos);
             }
 
             if (m_animation) delete m_animation;
@@ -539,6 +544,19 @@ void CustomTrackView::mouseDoubleClickEvent(QMouseEvent *event) {
     if (m_dragItem && m_dragItem->hasKeyFrames()) {
         if (m_moveOpMode == KEYFRAME) {
             // user double clicked on a keyframe, open edit dialog
+            QDialog d(parentWidget());
+            Ui::KeyFrameDialog_UI view;
+            view.setupUi(&d);
+            view.kfr_position->setText(m_document->timecode().getTimecode(GenTime(m_dragItem->selectedKeyFramePos(), m_document->fps()), m_document->fps()));
+            view.kfr_value->setValue(m_dragItem->selectedKeyFrameValue());
+            view.kfr_value->setFocus();
+            if (d.exec() == QDialog::Accepted) {
+                int pos = m_document->timecode().getFrameCount(view.kfr_position->text(), m_document->fps());
+                m_dragItem->updateKeyFramePos(GenTime(pos, m_document->fps()), (double) view.kfr_value->value() * m_dragItem->keyFrameFactor());
+                ClipItem *item = (ClipItem *)m_dragItem;
+                item->updateKeyframeEffect();
+                updateEffect(m_tracksList.count() - item->track(), item->startPos(), item->selectedEffect());
+            }
 
         } else  {
             // add keyframe
index 8b7516b7fddb5a45df8a15f3681d11ea221055d7..49adf09dbc38058fd9c4b69639b8ca7e0a402b77 100644 (file)
@@ -91,7 +91,6 @@ MarkerDialog::~MarkerDialog() {
 void MarkerDialog::slotUpdateThumb() {
     m_previewTimer->stop();
     int pos = m_tc.getFrameCount(m_view.marker_position->text(), m_fps);
-    kDebug() << "// getting thumb for: " << pos;
     QPixmap p = KThumb::getFrame(*m_producer, pos, (int)(100 * m_dar), 100);
     if (!p.isNull()) m_view.clip_thumb->setPixmap(p);
     else kDebug() << "!!!!!!!!!!!  ERROR CREATING THUMB";
diff --git a/src/widgets/keyframedialog_ui.ui b/src/widgets/keyframedialog_ui.ui
new file mode 100644 (file)
index 0000000..4967ef9
--- /dev/null
@@ -0,0 +1,112 @@
+<ui version="4.0" >
+ <class>KeyFrameDialog_UI</class>
+ <widget class="QDialog" name="KeyFrameDialog_UI" >
+  <property name="geometry" >
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>324</width>
+    <height>75</height>
+   </rect>
+  </property>
+  <property name="windowTitle" >
+   <string>Edit Keyframe</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout" >
+   <item row="0" column="0" >
+    <widget class="QLabel" name="clip_filesize_2" >
+     <property name="text" >
+      <string>Position</string>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="1" colspan="2" >
+    <widget class="KRestrictedLine" name="kfr_position" >
+     <property name="inputMask" >
+      <string>99:99:99:99; </string>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="3" >
+    <widget class="QLabel" name="clip_filesize_3" >
+     <property name="text" >
+      <string>Value</string>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="4" >
+    <widget class="KDoubleNumInput" name="kfr_value" />
+   </item>
+   <item rowspan="2" row="1" column="1" colspan="2" >
+    <spacer name="verticalSpacer" >
+     <property name="orientation" >
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0" >
+      <size>
+       <width>147</width>
+       <height>30</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item row="2" column="2" colspan="3" >
+    <widget class="QDialogButtonBox" name="buttonBox" >
+     <property name="orientation" >
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons" >
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>KDoubleNumInput</class>
+   <extends>QWidget</extends>
+   <header>knuminput.h</header>
+  </customwidget>
+  <customwidget>
+   <class>KRestrictedLine</class>
+   <extends>KLineEdit</extends>
+   <header>krestrictedline.h</header>
+  </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>KeyFrameDialog_UI</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel" >
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel" >
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>KeyFrameDialog_UI</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel" >
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel" >
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>