]> git.sesse.net Git - kdenlive/commitdiff
Allow resize clips in timeline
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 17 Feb 2008 12:20:46 +0000 (12:20 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 17 Feb 2008 12:20:46 +0000 (12:20 +0000)
svn path=/branches/KDE4/; revision=1854

src/addtimelineclipcommand.cpp
src/addtimelineclipcommand.h
src/clipitem.cpp
src/clipitem.h
src/customtrackview.cpp
src/customtrackview.h
src/trackview.cpp

index a5c716440656a78e3ba17c5cb8b0c33e1218969e..079dcdfb326e3b94cebc4f116e00cfa48fe37550 100644 (file)
@@ -21,8 +21,8 @@
 
 #include "addtimelineclipcommand.h"
 
-AddTimelineClipCommand::AddTimelineClipCommand(CustomTrackView *view, QDomElement xml, int track, int startpos, QRectF rect, int duration, bool doIt)
-         : m_view(view), m_xml(xml), m_clipTrack(track), m_clipPos(startpos), m_clipRect(rect), m_clipDuration(duration), m_doIt(doIt) {
+AddTimelineClipCommand::AddTimelineClipCommand(CustomTrackView *view, QDomElement xml, int clipId, int track, int startpos, QRectF rect, int duration, bool doIt)
+         : m_view(view), m_xml(xml), m_clipId(clipId), m_clipTrack(track), m_clipPos(startpos), m_clipRect(rect), m_clipDuration(duration), m_doIt(doIt) {
            setText(i18n("Add timeline clip"));
         }
 
@@ -38,7 +38,7 @@ void AddTimelineClipCommand::undo()
 void AddTimelineClipCommand::redo()
 {
   //kDebug()<<"----  redoing action";
-  if (m_doIt) m_view->addClip(m_xml, m_clipTrack, m_clipPos, m_clipRect, m_clipDuration);
+  if (m_doIt) m_view->addClip(m_xml, m_clipId, m_clipTrack, m_clipPos, m_clipRect, m_clipDuration);
   m_doIt = true;
 }
 
index e163d810bf3644ba4923ba54067cde2c0553021d..98e0a87370f8d5ae5de9d3b4f6f8191c6b6c5ebb 100644 (file)
 class AddTimelineClipCommand : public QUndoCommand
  {
  public:
-     AddTimelineClipCommand(CustomTrackView *view, QDomElement xml, int track, int startpos, QRectF rect, int duration, bool doIt);
+     AddTimelineClipCommand(CustomTrackView *view, QDomElement xml, int clipId, int track, int startpos, QRectF rect, int duration, bool doIt);
     virtual void undo();
     virtual void redo();
 
  private:
      CustomTrackView *m_view;
      int m_clipDuration;
+     int m_clipId;
      QDomElement m_xml;
      int m_clipTrack;
      int m_clipPos;
index a09b3096082ffeaa84d0216d5ea032b50d10f5b0..580198fba72fe2af0218d8e3e72fce88bee47c63 100644 (file)
 #include "renderer.h"
 #include "kdenlivesettings.h"
 
-ClipItem::ClipItem(QDomElement xml, int track, int startpos, const QRectF & rect, int duration)
-    : QGraphicsRectItem(rect), m_xml(xml), m_resizeMode(NONE), m_grabPoint(0), m_maxTrack(0), m_track(track), m_startPos(startpos), m_hasThumbs(false), startThumbTimer(NULL), endThumbTimer(NULL), m_startFade(0), m_endFade(0)
-{
-  //setToolTip(name);
-
-  m_clipName = xml.attribute("name");
-  if (m_clipName.isEmpty()) m_clipName = KUrl(xml.attribute("resource")).fileName();
-
-  m_producer = xml.attribute("id").toInt();
-
-  m_clipType = (CLIPTYPE) xml.attribute("type").toInt();
-
-  m_cropStart = xml.attribute("in", 0).toInt();
-  m_maxDuration = xml.attribute("duration", 0).toInt();
-  if (m_maxDuration == 0) m_maxDuration = xml.attribute("out", 0).toInt() - m_cropStart;
-
-  if (duration != -1) m_cropDuration = duration;
-  else m_cropDuration = m_maxDuration;
-
-  setFlags(QGraphicsItem::ItemClipsToShape | QGraphicsItem::ItemClipsChildrenToShape | QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
-
-  setBrush(QColor(100, 100, 150));
-  if (m_clipType == VIDEO || m_clipType == AV) {
-    m_hasThumbs = true;
-    //connect(this, SIGNAL(getThumb(int, int)), clip->thumbProducer(), SLOT(extractImage(int, int)));
-    //connect(clip->thumbProducer(), SIGNAL(thumbReady(int, QPixmap)), this, SLOT(slotThumbReady(int, QPixmap)));
-    QTimer::singleShot(300, this, SLOT(slotFetchThumbs()));
-
-    startThumbTimer = new QTimer(this);
-    startThumbTimer->setSingleShot(true);
-    connect(startThumbTimer, SIGNAL(timeout()), this, SLOT(slotGetStartThumb()));
-    endThumbTimer = new QTimer(this);
-    endThumbTimer->setSingleShot(true);
-    connect(endThumbTimer, SIGNAL(timeout()), this, SLOT(slotGetEndThumb()));
-
-  }
-  else if (m_clipType == COLOR) {
-    QString colour = xml.attribute("colour");
-    colour = colour.replace(0, 2, "#");
-    setBrush(QColor(colour.left(7)));
-  }
-  else if (m_clipType == IMAGE) {
-    m_startPix = KThumb::getImage(KUrl(xml.attribute("resource")), 50 * KdenliveSettings::project_display_ratio(), 50);
-  }
-}
-
 ClipItem::ClipItem(DocClipBase *clip, int track, int startpos, const QRectF & rect, int duration)
     : QGraphicsRectItem(rect), m_clip(clip), m_resizeMode(NONE), m_grabPoint(0), m_maxTrack(0), m_track(track), m_startPos(startpos), m_hasThumbs(false), startThumbTimer(NULL), endThumbTimer(NULL), m_startFade(0), m_endFade(0)
 {
@@ -93,6 +47,15 @@ ClipItem::ClipItem(DocClipBase *clip, int track, int startpos, const QRectF & re
   if (duration != -1) m_cropDuration = duration;
   else m_cropDuration = m_maxDuration;
 
+/*
+  m_cropStart = xml.attribute("in", 0).toInt();
+  m_maxDuration = xml.attribute("duration", 0).toInt();
+  if (m_maxDuration == 0) m_maxDuration = xml.attribute("out", 0).toInt() - m_cropStart;
+
+  if (duration != -1) m_cropDuration = duration;
+  else m_cropDuration = m_maxDuration;*/
+
+
   setFlags(QGraphicsItem::ItemClipsToShape | QGraphicsItem::ItemClipsChildrenToShape | QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
 
   setBrush(QColor(100, 100, 150));
@@ -154,6 +117,11 @@ int ClipItem::type () const
   return 70000;
 }
 
+DocClipBase *ClipItem::baseClip()
+{
+  return m_clip;
+}
+
 QDomElement ClipItem::xml() const
 {
   return m_xml;
@@ -189,6 +157,11 @@ int ClipItem::startPos()
   return m_startPos;
 }
 
+int ClipItem::cropStart()
+{
+  return m_cropStart;
+}
+
 int ClipItem::endPos()
 {
   return m_startPos + m_cropDuration;
index 1278c6fb76158f70124102e2f38c754bbc64445b..7bb197e7d20c8dfba94faee9610bfed4a67328ef 100644 (file)
@@ -36,7 +36,6 @@ class ClipItem : public QObject, public QGraphicsRectItem
   Q_OBJECT
 
   public:
-    ClipItem(QDomElement xml, int track, int startpos, const QRectF & rect, int duration = -1);
     ClipItem(DocClipBase *clip, int track, int startpos, const QRectF & rect, int duration);
     virtual ~ ClipItem();
     virtual void paint(QPainter *painter,
@@ -49,11 +48,13 @@ class ClipItem : public QObject, public QGraphicsRectItem
     OPERATIONTYPE operationMode(QPointF pos, double scale);
     int clipProducer();
     int clipType();
+    DocClipBase *baseClip();
     QString clipName();
     int maxDuration();
     int track();
     void setTrack(int track);
     int startPos();
+    int cropStart();
     int endPos();
     int duration();
     QDomElement xml() const;
index d8439ed830432615ce26e6185abd88fbcf696228..d91288f82788ef6e91198ae155b7646f863d8b58 100644 (file)
@@ -326,21 +326,6 @@ void CustomTrackView::addItem(DocClipBase *clip, QPoint pos)
 }
 
 
-void CustomTrackView::addItem(QString producer, QPoint pos)
-{
-  QDomDocument doc;
-  doc.setContent(producer);
-  QDomElement elem = doc.documentElement();
-  int in = elem.attribute("in", 0).toInt();
-  int out = elem.attribute("out", 0).toInt() - in;
-  if (out == 0) out = elem.attribute("duration", 0).toInt();
-  kDebug()<<"ADDING CLIP: "<<producer<<", OUT: "<<out<<", POS: "<<mapToScene(pos);
-  int trackTop = ((int) mapToScene(pos).y()/50) * 50 + 1;
-  m_dropItem = new ClipItem(elem, ((int) mapToScene(pos).y()/50), in, QRectF(mapToScene(pos).x() * m_scale, trackTop, out * m_scale, 49), out);
-  scene()->addItem(m_dropItem);
-}
-
-
 void CustomTrackView::dragMoveEvent(QDragMoveEvent * event) {
   event->setDropAction(Qt::IgnoreAction);
   if (m_dropItem) {
@@ -365,7 +350,7 @@ void CustomTrackView::dragLeaveEvent ( QDragLeaveEvent * event ) {
 
 void CustomTrackView::dropEvent ( QDropEvent * event ) {
   if (m_dropItem) {
-    AddTimelineClipCommand *command = new AddTimelineClipCommand(this, m_dropItem->xml(), m_dropItem->track(), m_dropItem->startPos(), m_dropItem->rect(), m_dropItem->duration(), false);
+    AddTimelineClipCommand *command = new AddTimelineClipCommand(this, m_dropItem->xml(), m_dropItem->clipProducer(), m_dropItem->track(), m_dropItem->startPos(), m_dropItem->rect(), m_dropItem->duration(), false);
     m_commandStack->push(command);
     kDebug()<<"IIIIIIIIIIIIIIIIIIIIIIII TRAX CNT: "<<m_tracksCount<<", DROP: "<<m_dropItem->track();
     m_document->renderer()->mltInsertClip(m_tracksCount - m_dropItem->track(), GenTime(m_dropItem->startPos(), 25), m_dropItem->xml());
@@ -439,11 +424,15 @@ void CustomTrackView::mouseReleaseEvent ( QMouseEvent * event )
   else if (m_operationMode == RESIZESTART) {
     // resize start
     ResizeClipCommand *command = new ResizeClipCommand(this, m_startPos, QPointF(m_dragItem->startPos(), m_dragItem->track()), true, false);
+
+    m_document->renderer()->mltResizeClipStart(m_tracksCount - m_dragItem->track(), GenTime(m_dragItem->endPos(), 25), GenTime(m_dragItem->startPos(), 25), GenTime(m_startPos.x(), 25), GenTime(m_dragItem->cropStart(), 25), GenTime(m_dragItem->cropStart(), 25) + GenTime(m_dragItem->endPos(), 25) - GenTime(m_dragItem->startPos(), 25));
     m_commandStack->push(command);
   }
   else if (m_operationMode == RESIZEEND) {
     // resize end
     ResizeClipCommand *command = new ResizeClipCommand(this, m_startPos, QPointF(m_dragItem->endPos(), m_dragItem->track()), false, false);
+
+    m_document->renderer()->mltResizeClipEnd(m_tracksCount - m_dragItem->track(), GenTime(m_dragItem->startPos(), 25), GenTime(m_dragItem->cropStart(), 25), GenTime(m_dragItem->cropStart(), 25) + GenTime(m_dragItem->endPos(), 25) - GenTime(m_dragItem->startPos(), 25));
     m_commandStack->push(command);
   }
   m_operationMode = NONE;
@@ -461,10 +450,11 @@ void CustomTrackView::deleteClip (int track, int startpos, const QRectF &rect )
   m_document->renderer()->mltRemoveClip(m_tracksCount - track, GenTime(startpos, 25));
 }
 
-void CustomTrackView::addClip ( QDomElement xml, int track, int startpos, const QRectF &rect, int duration )
+void CustomTrackView::addClip ( QDomElement xml, int clipId, int track, int startpos, const QRectF &rect, int duration )
 {
   QRect r(startpos * m_scale, 50 * track, duration * m_scale, 49); 
-  ClipItem *item = new ClipItem(xml, track, startpos, r, duration);
+  DocClipBase *baseclip = m_document->clipManager()->getClipById(clipId);
+  ClipItem *item = new ClipItem(baseclip, track, startpos, r, duration);
   scene()->addItem(item);
   m_document->renderer()->mltInsertClip(m_tracksCount - track, GenTime(startpos, 25), xml);
 }
index 4952beae5fe2fe9c0f97639fcb2e4569908fd671..c8df2fb3abbc862c92a61e4421a534c2f47450d4 100644 (file)
@@ -45,7 +45,7 @@ class CustomTrackView : public QGraphicsView
     void initView();
     void moveClip ( const QPointF &startPos, const QPointF &endPos );
     void resizeClip ( const QPointF &startPos, const QPointF &endPos, bool resizeClipStart );
-    void addClip ( QDomElement xml, int track, int startpos, const QRectF &rect, int duration);
+    void addClip ( QDomElement xml, int clipId, int track, int startpos, const QRectF &rect, int duration);
     void deleteClip ( int track, int startpos, const QRectF &rect );
     void setDuration(int duration);
     void setScale(double scaleFactor);
@@ -71,7 +71,6 @@ class CustomTrackView : public QGraphicsView
     int m_cursorPos;
     ClipItem *m_dropItem;
     KdenliveDoc *m_document;
-    void addItem(QString producer, QPoint pos);
     void addItem(DocClipBase *clip, QPoint pos);
     QGraphicsLineItem *m_cursorLine;
     QPointF m_startPos;
index 20b4277c54a1890f61d7c3dc452cc6d0c77dea4d..c2183ebda37d6932e42cd13e3f50bd3877aefd85 100644 (file)
@@ -204,9 +204,11 @@ int TrackView::slotAddVideoTrack(int ix, QDomElement xml)
     }
     else if (elem.tagName() == "entry") {
     int in = elem.attribute("in", 0).toInt();
+    int id = elem.attribute("producer", 0).toInt();
+    DocClipBase *clip = m_doc->clipManager()->getClipById(id);
     int out = elem.attribute("out", 0).toInt() - in;
     //kDebug()<<"++++++++++++++\n\n / / /ADDING CLIP: "<<clip.cropTime<<", out: "<<clip.duration<<", Producer: "<<clip.producer<<"\n\n++++++++++++++++++++";
-    ClipItem *item = new ClipItem(elem, ix, position, QRectF(position * m_scale, trackTop + 1, out * m_scale, 49), out);
+    ClipItem *item = new ClipItem(clip, ix, position, QRectF(position * m_scale, trackTop + 1, out * m_scale, 49), out);
     m_scene->addItem(item);
     position += out;