#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"));
}
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;
}
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();
int m_clipType;
QString m_clipName;
int m_clipProducer;
+ int m_maxDuration;
QRectF m_clipRect;
bool m_doIt;
};
#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);
return m_producer;
}
+int ClipItem::maxDuration()
+{
+ return m_maxDuration;
+}
+
// virtual
void ClipItem::paint(QPainter *painter,
const QStyleOptionGraphicsItem *option,
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) {
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;
}
{
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);
int clipProducer();
int clipType();
QString clipName();
+ int maxDuration();
protected:
virtual void mouseMoveEvent ( QGraphicsSceneMouseEvent * event );
int m_producer;
int m_clipType;
QString m_clipName;
+ int m_maxDuration;
+ int m_cropStart;
+ int m_cropDuration;
};
#endif
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);
}
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;
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);
}
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:
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;
void setRenderer(Render *render);
KUndoStack *commandStack();
QString producerName(int id);
+ void setProducerDuration(int id, int duration);
+ int getProducerDuration(int id);
private:
KUrl m_url;
else projectMonitorDock->raise();
}
+void MainWindow::slotSetClipDuration(int id, int duration)
+{
+ if (!m_activeDocument) return;
+ m_activeDocument->setProducerDuration(id, duration);
+}
+
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)));
void slotPreferences();
void slotConnectMonitors();
void slotRaiseMonitor(bool clipMonitor);
+ void slotSetClipDuration(int id, int duration);
};
#endif
return m_clipId;
}
+int ProjectItem::clipMaxDuration() const
+{
+ return m_element.attribute("duration").toInt();
+}
+
bool ProjectItem::isGroup() const
{
return m_isGroup;
bool isGroup() const;
const QString groupName() const;
const KUrl clipUrl() const;
+ int clipMaxDuration() const;
private:
QDomElement m_element;
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());
+ }
}
signals:
void clipSelected(const QDomElement &);
void getFileProperties(const QDomElement&, int);
+ void receivedClipDuration(int, int);
};
#endif
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;