]> git.sesse.net Git - kdenlive/commitdiff
clips now respect maximum length
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 21 Jan 2008 23:12:41 +0000 (23:12 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 21 Jan 2008 23:12:41 +0000 (23:12 +0000)
svn path=/branches/KDE4/; revision=1813

15 files changed:
src/addtimelineclipcommand.cpp
src/addtimelineclipcommand.h
src/clipitem.cpp
src/clipitem.h
src/customtrackview.cpp
src/customtrackview.h
src/kdenlivedoc.cpp
src/kdenlivedoc.h
src/mainwindow.cpp
src/mainwindow.h
src/projectitem.cpp
src/projectitem.h
src/projectlist.cpp
src/projectlist.h
src/trackview.cpp

index 250130ac9beb1639a4bb70547e374b3010560bda..b8ab71b0c18f6855d1f7714a9fc79b17a0de0418 100644 (file)
@@ -19,8 +19,8 @@
 
 #include "addtimelineclipcommand.h"
 
-AddTimelineClipCommand::AddTimelineClipCommand(CustomTrackView *view, int clipType, QString clipName, int clipProducer, QRectF rect, bool doIt)
-         : m_view(view), m_clipType(clipType), m_clipName(clipName), m_clipProducer(clipProducer), m_clipRect(rect), m_doIt(doIt) {
+AddTimelineClipCommand::AddTimelineClipCommand(CustomTrackView *view, int clipType, QString clipName, int clipProducer, int maxDuration, QRectF rect, bool doIt)
+         : m_view(view), m_clipType(clipType), m_clipName(clipName), m_clipProducer(clipProducer), m_maxDuration(maxDuration), m_clipRect(rect), m_doIt(doIt) {
            setText(i18n("Add timeline clip"));
         }
 
@@ -36,7 +36,7 @@ void AddTimelineClipCommand::undo()
 void AddTimelineClipCommand::redo()
 {
   //kDebug()<<"----  redoing action";
-  if (m_doIt) m_view->addClip(m_clipType, m_clipName, m_clipProducer, m_clipRect);
+  if (m_doIt) m_view->addClip(m_clipType, m_clipName, m_clipProducer, m_maxDuration, m_clipRect);
   m_doIt = true;
 }
 
index 38d245b5882544c1c49e188b7a9ee4448fb5f70e..ad907a0211d7aafa9fa132b26d69bbfe3ef7700f 100644 (file)
@@ -33,7 +33,7 @@
 class AddTimelineClipCommand : public QUndoCommand
  {
  public:
-     AddTimelineClipCommand(CustomTrackView *view, int clipType, QString clipName, int clipProducer, QRectF rect, bool doIt);
+     AddTimelineClipCommand(CustomTrackView *view, int clipType, QString clipName, int clipProducer, int maxDuration, QRectF rect, bool doIt);
     virtual void undo();
     virtual void redo();
 
@@ -42,6 +42,7 @@ class AddTimelineClipCommand : public QUndoCommand
      int m_clipType;
      QString m_clipName;
      int m_clipProducer;
+     int m_maxDuration;
      QRectF m_clipRect;
      bool m_doIt;
  };
index 28c8e9435fedf361c3d85860bafad53302b12ff5..ef36bd3ea862f59621ecf0b24e60a061924f42d9 100644 (file)
@@ -27,8 +27,8 @@
 
 #include "clipitem.h"
 
-ClipItem::ClipItem(int clipType, QString name, int producer, const QRectF & rect)
-    : QGraphicsRectItem(rect), m_resizeMode(0), m_grabPoint(0), m_clipType(clipType), m_clipName(name), m_producer(producer)
+ClipItem::ClipItem(int clipType, QString name, int producer, int maxDuration, const QRectF & rect)
+    : QGraphicsRectItem(rect), m_resizeMode(0), m_grabPoint(0), m_clipType(clipType), m_clipName(name), m_producer(producer), m_cropStart(0), m_cropDuration(maxDuration), m_maxDuration(maxDuration)
 {
   setToolTip(name);
   //setCursor(Qt::SizeHorCursor);
@@ -59,6 +59,11 @@ int ClipItem::clipProducer()
   return m_producer;
 }
 
+int ClipItem::maxDuration()
+{
+  return m_maxDuration;
+}
+
 // virtual 
  void ClipItem::paint(QPainter *painter,
                            const QStyleOptionGraphicsItem *option,
@@ -144,7 +149,10 @@ int ClipItem::operationMode(QPointF pos)
     double originalX = rect().x();
     double originalWidth = rect().width();
     if (m_resizeMode == 1) {
-      kDebug()<<"MOVE CLIP START TO: "<<event->scenePos();
+      if (m_cropStart - (originalX - moveX) < 0) moveX = originalX - m_cropStart;
+      if (originalX + rect().width() - moveX < 1) moveX = originalX + rect().width() + 2;
+      m_cropStart -= originalX - moveX;
+      kDebug()<<"MOVE CLIP START TO: "<<event->scenePos()<<", CROP: "<<m_cropStart;
       setRect(moveX, rect().y(), originalX + rect().width() - moveX, rect().height());
       QList <QGraphicsItem *> childrenList = children();
       for (int i = 0; i < childrenList.size(); ++i) {
@@ -153,10 +161,13 @@ int ClipItem::operationMode(QPointF pos)
       return;
     }
     if (m_resizeMode == 2) {
-      setRect(originalX, rect().y(), moveX - originalX, rect().height());
+      int newWidth = moveX - originalX;
+      if (newWidth < 1) newWidth = 2;
+      if (newWidth > m_maxDuration) newWidth = m_maxDuration;
+      setRect(originalX, rect().y(), newWidth, rect().height());
       QList <QGraphicsItem *> childrenList = children();
       for (int i = 0; i < childrenList.size(); ++i) {
-       childrenList.at(i)->moveBy((moveX - originalX - originalWidth) / 2 , 0);
+       childrenList.at(i)->moveBy((newWidth - originalWidth) / 2 , 0);
       }
       return;
     }
index 23375e390314863af7b36fed878c3d85df7212ec..3ac0983b3074f1c8fa4ba8759adf78b2ce7d5124 100644 (file)
@@ -30,7 +30,7 @@ class ClipItem : public QGraphicsRectItem
 {
   
   public:
-    ClipItem(int clipType, QString name, int producer, const QRectF & rect);
+    ClipItem(int clipType, QString name, int producer, int maxDuration, const QRectF & rect);
     virtual void paint(QPainter *painter,
                            const QStyleOptionGraphicsItem *option,
                            QWidget *widget);
@@ -40,6 +40,7 @@ class ClipItem : public QGraphicsRectItem
     int clipProducer();
     int clipType();
     QString clipName();
+    int maxDuration();
 
   protected:
     virtual void mouseMoveEvent ( QGraphicsSceneMouseEvent * event );
@@ -54,6 +55,9 @@ class ClipItem : public QGraphicsRectItem
     int m_producer;
     int m_clipType;
     QString m_clipName;
+    int m_maxDuration;
+    int m_cropStart;
+    int m_cropDuration;
 };
 
 #endif
index e00d45949135e8cbc5c85d989e2c413f5a31aecd..93aed657b763566a2a4b4c77155d1943977f67f2 100644 (file)
@@ -149,7 +149,7 @@ void CustomTrackView::addItem(QString producer, QPoint pos)
   int trackTop = ((int) mapToScene(pos).y()/50) * 50 + 1;
   QString clipName = elem.attribute("name");
   if (clipName.isEmpty()) clipName = KUrl(elem.attribute("resource")).fileName();
-  m_dropItem = new ClipItem(elem.attribute("type").toInt(), clipName, elem.attribute("id").toInt(), QRectF(mapToScene(pos).x(), trackTop, out, 49));
+  m_dropItem = new ClipItem(elem.attribute("type").toInt(), clipName, elem.attribute("id").toInt(), out, QRectF(mapToScene(pos).x(), trackTop, out, 49));
   scene()->addItem(m_dropItem);
 }
 
@@ -177,7 +177,7 @@ void CustomTrackView::dragLeaveEvent ( QDragLeaveEvent * event ) {
 
 void CustomTrackView::dropEvent ( QDropEvent * event ) {
   if (m_dropItem) {
-    AddTimelineClipCommand *command = new AddTimelineClipCommand(this, m_dropItem->clipType(), m_dropItem->clipName(), m_dropItem->clipProducer(), m_dropItem->rect(), false);
+    AddTimelineClipCommand *command = new AddTimelineClipCommand(this, m_dropItem->clipType(), m_dropItem->clipName(), m_dropItem->clipProducer(), m_dropItem->maxDuration(), m_dropItem->rect(), false);
     m_commandStack->push(command);
   }
   m_dropItem = NULL;
@@ -252,9 +252,9 @@ void CustomTrackView::deleteClip ( const QRectF &rect )
   delete item;
 }
 
-void CustomTrackView::addClip ( int clipType, QString clipName, int clipProducer, const QRectF &rect )
+void CustomTrackView::addClip ( int clipType, QString clipName, int clipProducer, int maxDuration, const QRectF &rect )
 {
-  ClipItem *item = new ClipItem(clipType, clipName, clipProducer, rect);
+  ClipItem *item = new ClipItem(clipType, clipName, clipProducer, maxDuration, rect);
   scene()->addItem(item);
 }
 
index 899f1544b368b17b732cbedb6a1905d3f07cb43d..cbea5571dec000851c12548a33ac3708b65a6533 100644 (file)
@@ -42,7 +42,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 ( int clipType, QString clipName, int clipProducer, const QRectF &rect );
+    void addClip ( int clipType, QString clipName, int clipProducer, int maxDuration, const QRectF &rect );
     void deleteClip ( const QRectF &rect );
 
   protected:
index b796a1006198a40565b65af00b9f75021e7fd33b..124783a5843827c1637eab7e818fa7cd14663ae2 100644 (file)
@@ -127,6 +127,37 @@ QString KdenliveDoc::producerName(int id)
   return result;
 }
 
+void KdenliveDoc::setProducerDuration(int id, int duration)
+{
+  QDomNodeList prods = producersList();
+  int ct = prods.count();
+  for (int i = 0; i <  ct ; i++)
+  {
+    QDomElement e = prods.item(i).toElement();
+    if (e.attribute("id") != "black" && e.attribute("id").toInt() == id) {
+      e.setAttribute("duration", QString::number(duration));
+      break;
+    }
+  }
+}
+
+int KdenliveDoc::getProducerDuration(int id)
+{
+  int result = 0;
+  QDomNodeList prods = producersList();
+  int ct = prods.count();
+  for (int i = 0; i <  ct ; i++)
+  {
+    QDomElement e = prods.item(i).toElement();
+    if (e.attribute("id") != "black" && e.attribute("id").toInt() == id) {
+      result = e.attribute("duration").toInt();
+      break;
+    }
+  }
+  return result;
+}
+
+
 QDomDocument KdenliveDoc::generateSceneList()
 {
     QDomDocument doc;
index b0a2c0ff96796d718645e0ccd55e5eba4283649b..7d7b6d115935540b5dc75cf108f3865b51ca125e 100644 (file)
@@ -51,6 +51,8 @@ class KdenliveDoc:public QObject {
     void setRenderer(Render *render);
     KUndoStack *commandStack();
     QString producerName(int id);
+    void setProducerDuration(int id, int duration);
+    int getProducerDuration(int id);
 
   private:
     KUrl m_url;
index 0a46691f6408c4e512c6432a604dae4469879458..c0aff81386d50ece1e120373c579814733fe3c4d 100644 (file)
@@ -147,6 +147,12 @@ void MainWindow::slotRaiseMonitor(bool clipMonitor)
   else projectMonitorDock->raise();
 }
 
+void MainWindow::slotSetClipDuration(int id, int duration)
+{
+  if (!m_activeDocument) return;
+  m_activeDocument->setProducerDuration(id, duration);
+}
+
 void MainWindow::slotConnectMonitors()
 {
 
@@ -154,6 +160,8 @@ void MainWindow::slotConnectMonitors()
 
   connect(m_projectList, SIGNAL(clipSelected(const QDomElement &)), m_clipMonitor, SLOT(slotSetXml(const QDomElement &)));
 
+  connect(m_projectList, SIGNAL(receivedClipDuration(int, int)), this, SLOT(slotSetClipDuration(int, int)));
+
   connect(m_projectList, SIGNAL(getFileProperties(const QDomElement &, int)), m_clipMonitor->render, SLOT(getFileProperties(const QDomElement &, int)));
 
   connect(m_clipMonitor->render, SIGNAL(replyGetImage(int, int, const QPixmap &, int, int)), m_projectList, SLOT(slotReplyGetImage(int, int, const QPixmap &, int, int)));
index d429199a6c7751d71557eef1e82e73dc5fabce82..388ea19430440689ec63a2662bba69b2d6ba9283 100644 (file)
@@ -102,6 +102,7 @@ class MainWindow : public KXmlGuiWindow
     void slotPreferences();
     void slotConnectMonitors();
     void slotRaiseMonitor(bool clipMonitor);
+    void slotSetClipDuration(int id, int duration);
 };
  
 #endif
index 909e7b86f0edd9334c710679a2bee4c4910040c7..3b4cdf40adf77c521998b980f4b6359cfa50c178 100644 (file)
@@ -85,6 +85,11 @@ int ProjectItem::clipId() const
   return m_clipId;
 }
 
+int ProjectItem::clipMaxDuration() const
+{
+  return m_element.attribute("duration").toInt();
+}
+
 bool ProjectItem::isGroup() const
 {
   return m_isGroup;
index 21b8b603842dc34705365509521294e6643dd0c5..692d4581a8d5ca0b5e40288e9914b6753795576e 100644 (file)
@@ -44,6 +44,7 @@ class ProjectItem : public QTreeWidgetItem
     bool isGroup() const;
     const QString groupName() const;
     const KUrl clipUrl() const;
+    int clipMaxDuration() const;
 
   private:
     QDomElement m_element;
index 3006b8fa9689b9d932db10e793a6d4b54ae0474b..ea66318916ce7a79b1c0fce46e1e5d1076c34e45 100644 (file)
@@ -408,7 +408,10 @@ QDomElement ProjectList::producersList()
 void ProjectList::slotReplyGetFileProperties(int clipId, const QMap < QString, QString > &properties, const QMap < QString, QString > &metadata)
 {
   ProjectItem *item = getItemById(clipId);
-  if (item) item->setProperties(properties, metadata);
+  if (item) {
+    item->setProperties(properties, metadata);
+    emit receivedClipDuration(clipId, item->clipMaxDuration());
+  }
 }
 
 
index fc59cd42d04ad54b75a256207b27bf8ce534e8fa..6495944a3f9f489b2dbface814d3f89086434eda 100644 (file)
@@ -88,6 +88,7 @@ class ProjectList : public QWidget
   signals:
     void clipSelected(const QDomElement &);
     void getFileProperties(const QDomElement&, int);
+    void receivedClipDuration(int, int);
 };
 
 #endif
index 411fd8d02a3ebebcd79d9820c43ed0d591164b12..3ad21237706db9804c2850f64ad6d400ead836af 100644 (file)
@@ -181,8 +181,9 @@ int TrackView::slotAddVideoTrack(int ix, QDomElement xml)
     int in = elem.attribute("in", 0).toInt();
     int out = elem.attribute("out", 0).toInt() - in;
     QString clipName = m_doc->producerName(elem.attribute("producer").toInt());
+    int clipMaxDuration = m_doc->getProducerDuration(elem.attribute("producer").toInt());
     //kDebug()<<"++++++++++++++\n\n / / /ADDING CLIP: "<<clip.cropTime<<", out: "<<clip.duration<<", Producer: "<<clip.producer<<"\n\n++++++++++++++++++++";
-    ClipItem *item = new ClipItem(elem.attribute("type").toInt(), clipName, elem.attribute("producer").toInt(), QRectF(position, trackTop + 1, out, 49));
+    ClipItem *item = new ClipItem(elem.attribute("type").toInt(), clipName, elem.attribute("producer").toInt(), clipMaxDuration, QRectF(position, trackTop + 1, out, 49));
     m_scene->addItem(item);
     position += out;