From: Jean-Baptiste Mardelle Date: Mon, 21 Jan 2008 23:12:41 +0000 (+0000) Subject: clips now respect maximum length X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=5ac61d0ef08900a046b8baaf8570ab016352766f;p=kdenlive clips now respect maximum length svn path=/branches/KDE4/; revision=1813 --- diff --git a/src/addtimelineclipcommand.cpp b/src/addtimelineclipcommand.cpp index 250130ac..b8ab71b0 100644 --- a/src/addtimelineclipcommand.cpp +++ b/src/addtimelineclipcommand.cpp @@ -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; } diff --git a/src/addtimelineclipcommand.h b/src/addtimelineclipcommand.h index 38d245b5..ad907a02 100644 --- a/src/addtimelineclipcommand.h +++ b/src/addtimelineclipcommand.h @@ -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; }; diff --git a/src/clipitem.cpp b/src/clipitem.cpp index 28c8e943..ef36bd3e 100644 --- a/src/clipitem.cpp +++ b/src/clipitem.cpp @@ -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: "<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: "<scenePos()<<", CROP: "< 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 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; } diff --git a/src/clipitem.h b/src/clipitem.h index 23375e39..3ac0983b 100644 --- a/src/clipitem.h +++ b/src/clipitem.h @@ -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 diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index e00d4594..93aed657 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -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); } diff --git a/src/customtrackview.h b/src/customtrackview.h index 899f1544..cbea5571 100644 --- a/src/customtrackview.h +++ b/src/customtrackview.h @@ -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: diff --git a/src/kdenlivedoc.cpp b/src/kdenlivedoc.cpp index b796a100..124783a5 100644 --- a/src/kdenlivedoc.cpp +++ b/src/kdenlivedoc.cpp @@ -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; diff --git a/src/kdenlivedoc.h b/src/kdenlivedoc.h index b0a2c0ff..7d7b6d11 100644 --- a/src/kdenlivedoc.h +++ b/src/kdenlivedoc.h @@ -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; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 0a46691f..c0aff813 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -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))); diff --git a/src/mainwindow.h b/src/mainwindow.h index d429199a..388ea194 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -102,6 +102,7 @@ class MainWindow : public KXmlGuiWindow void slotPreferences(); void slotConnectMonitors(); void slotRaiseMonitor(bool clipMonitor); + void slotSetClipDuration(int id, int duration); }; #endif diff --git a/src/projectitem.cpp b/src/projectitem.cpp index 909e7b86..3b4cdf40 100644 --- a/src/projectitem.cpp +++ b/src/projectitem.cpp @@ -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; diff --git a/src/projectitem.h b/src/projectitem.h index 21b8b603..692d4581 100644 --- a/src/projectitem.h +++ b/src/projectitem.h @@ -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; diff --git a/src/projectlist.cpp b/src/projectlist.cpp index 3006b8fa..ea663189 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -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()); + } } diff --git a/src/projectlist.h b/src/projectlist.h index fc59cd42..6495944a 100644 --- a/src/projectlist.h +++ b/src/projectlist.h @@ -88,6 +88,7 @@ class ProjectList : public QWidget signals: void clipSelected(const QDomElement &); void getFileProperties(const QDomElement&, int); + void receivedClipDuration(int, int); }; #endif diff --git a/src/trackview.cpp b/src/trackview.cpp index 411fd8d0..3ad21237 100644 --- a/src/trackview.cpp +++ b/src/trackview.cpp @@ -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: "<addItem(item); position += out;