transition.cpp
renderjob.cpp
renderwidget.cpp
+ abstractclipitem.cpp
)
kde4_add_kcfg_files(kdenlive_SRCS GENERATE_MOC kdenlivesettings.kcfgc )
--- /dev/null
+#include "abstractclipitem.h"
+#include <KDebug>
+
+AbstractClipItem::AbstractClipItem(const QRectF& rect): QGraphicsRectItem(rect), m_startFade(0), m_endFade(0) {
+ setFlags(QGraphicsItem::ItemClipsToShape | QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
+}
+void AbstractClipItem::moveTo(int x, double scale, double offset, int newTrack) {
+ double origX = rect().x();
+ double origY = rect().y();
+ bool success = true;
+ if (x < 0) return;
+ setRect(x * scale, origY + offset, rect().width(), rect().height());
+ QList <QGraphicsItem *> collisionList = collidingItems(Qt::IntersectsItemBoundingRect);
+ if (collisionList.size() == 0) m_track = newTrack;
+ for (int i = 0; i < collisionList.size(); ++i) {
+ QGraphicsItem *item = collisionList.at(i);
+ if (item->type() == 70000 || item->type() == 70001) {
+ if (offset == 0) {
+ QRectF other = ((QGraphicsRectItem *)item)->rect();
+ if (x < m_startPos.frames(m_fps)) {
+ kDebug() << "COLLISION, MOVING TO------";
+ m_startPos = ((AbstractClipItem *)item)->endPos() + GenTime(1, m_fps);
+ origX = m_startPos.frames(m_fps) * scale;
+ } else {
+ kDebug() << "COLLISION, MOVING TO+++";
+ m_startPos = ((AbstractClipItem *)item)->startPos() - m_cropDuration;
+ origX = m_startPos.frames(m_fps) * scale;
+ }
+ }
+ setRect(origX, origY, rect().width(), rect().height());
+ offset = 0;
+ origX = rect().x();
+ success = false;
+ break;
+ }
+ }
+ if (success) {
+ m_track = newTrack;
+ m_startPos = GenTime(x, m_fps);
+ }
+ /* QList <QGraphicsItem *> childrenList = QGraphicsItem::children();
+ for (int i = 0; i < childrenList.size(); ++i) {
+ childrenList.at(i)->moveBy(rect().x() - origX , offset);
+ }*/
+}
+
+GenTime AbstractClipItem::endPos() const {
+ return m_startPos + m_cropDuration;
+}
+
+int AbstractClipItem::track() const {
+ return m_track;
+}
+
+GenTime AbstractClipItem::cropStart() const {
+ return m_cropStart;
+}
+
+void AbstractClipItem::resizeStart(int posx, double scale) {
+
+}
+
+void AbstractClipItem::resizeEnd(int posx, double scale) {
+
+}
+
+void AbstractClipItem::setFadeOut(int pos, double scale) {
+
+}
+
+void AbstractClipItem::setFadeIn(int pos, double scale) {
+
+}
+
+GenTime AbstractClipItem::duration() const {
+ return m_cropDuration;
+}
+
+GenTime AbstractClipItem::startPos() const {
+ return m_startPos;
+}
+
+void AbstractClipItem::setTrack(int track) {
+ m_track = track;
+}
+
+double AbstractClipItem::fps() const {
+ return m_fps;
+}
+
+int AbstractClipItem::fadeIn() const {
+ return m_startFade;
+}
+
+int AbstractClipItem::fadeOut() const {
+ return m_endFade;
+}
--- /dev/null
+#ifndef ABSTRACTCLIPITEM
+#define ABSTRACTCLIPITEM
+
+#include <QGraphicsRectItem>
+#include "definitions.h"
+#include "gentime.h"
+
+class AbstractClipItem : public QObject , public QGraphicsRectItem {
+ Q_OBJECT
+public:
+ AbstractClipItem(const QRectF& rect);
+ virtual OPERATIONTYPE operationMode(QPointF pos, double scale) = 0;
+ virtual GenTime startPos() const ;
+ virtual void setTrack(int track);
+ virtual GenTime endPos() const ;
+ virtual int track() const ;
+ virtual void moveTo(int x, double scale, double offset, int newTrack);
+ virtual GenTime cropStart() const ;
+ virtual void resizeStart(int posx, double scale);
+ virtual void resizeEnd(int posx, double scale);
+ virtual void setFadeOut(int pos, double scale);
+ virtual void setFadeIn(int pos, double scale);
+ virtual GenTime duration() const;
+ virtual double fps() const;
+ virtual int fadeIn() const;
+ virtual int fadeOut() const;
+protected:
+ int m_track;
+ GenTime m_cropStart;
+ GenTime m_cropDuration;
+ GenTime m_startPos;
+ double m_fps;
+ uint m_startFade;
+ uint m_endFade;
+
+};
+
+#endif
#include "kdenlivesettings.h"
ClipItem::ClipItem(DocClipBase *clip, int track, GenTime startpos, const QRectF & rect, GenTime duration, double fps)
- : 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), m_effectsCounter(1), audioThumbWasDrawn(false), m_opacity(1.0), m_timeLine(0), m_thumbsRequested(0), m_fps(fps), m_hover(false) {
+ : AbstractClipItem(rect), m_clip(clip), m_resizeMode(NONE), m_grabPoint(0), m_maxTrack(0), m_hasThumbs(false), startThumbTimer(NULL), endThumbTimer(NULL), m_effectsCounter(1), audioThumbWasDrawn(false), m_opacity(1.0), m_timeLine(0), m_thumbsRequested(0), m_hover(false) {
//setToolTip(name);
// kDebug() << "******* CREATING NEW TML CLIP, DUR: " << duration;
+ m_fps = fps;
+ m_startPos = startpos;
+ m_track = track;
m_xml = clip->toXML();
m_clipName = clip->name();
m_producer = clip->getId();
return m_maxDuration;
}
-GenTime ClipItem::duration() const {
- return m_cropDuration;
-}
-
-GenTime ClipItem::startPos() const {
- return m_startPos;
-}
-
GenTime ClipItem::cropStart() const {
return m_cropStart;
}
-GenTime ClipItem::endPos() const {
- return m_startPos + m_cropDuration;
-}
-
-double ClipItem::fps() const {
- return m_fps;
-}
-
void ClipItem::flashClip() {
if (m_timeLine == 0) {
m_timeLine = new QTimeLine(750, this);
right_lower = 40;
}
- // draw transitions
- QList<QPainterPath> transitionPath;
- foreach(Transition transition, m_transitionsList) {
- QPainterPath t;
- //t.addRect(br_startx,br.y()+br.height()/2,br.x() + /*t->transitionDuration().frames(m_fps) *pixelForOneFrame*/5 ,br.y()+br.height()*2);
- int twidth = br_startx + transition.transitionDuration().frames(m_fps) * scale;
- t.moveTo(twidth , br_endy);
- t.lineTo(twidth , br_halfy + roundingY);
-
- t.arcTo(twidth - roundingX , br_halfy , roundingX, roundingY, 0.0, 90.0);
- t.lineTo(br_startx + roundingX , br_halfy);
- t.arcTo(br_startx , br_halfy, roundingX , roundingY, 90.0, 90.0);
- t.lineTo(br_startx , br_endy);
- //t.closeSubpath();
- transitionPath.append(t);
- }
-
// build path around clip
roundRectPathUpper.moveTo(br_endx - right_upper , br_halfy);
roundRectPathUpper.arcTo(br_endx - roundingX - right_upper , br_starty , roundingX, roundingY, 0.0, 90.0);
roundRectPathLower.lineTo(br_endx - right_lower , br_halfy);
QPainterPath resultClipPath = roundRectPathUpper.united(roundRectPathLower);
- foreach(QPainterPath p, transitionPath) {
- resultClipPath = resultClipPath.united(p);
- }
+
painter->setClipPath(resultClipPath.intersected(clippath), Qt::IntersectClip);
//painter->fillPath(roundRectPath, brush()); //, QBrush(QColor(Qt::red)));
painter->fillRect(br.intersected(rectInView), paintColor);
if (isSelected()) painter->setPen(pen);
painter->setClipRect(option->exposedRect);
painter->drawPath(resultClipPath.intersected(clippath));
- foreach(QPainterPath p, transitionPath) {
-
- painter->fillPath(p, QBrush(QColor(255, 255, 0, 100)));
- painter->drawPath(p);
- }
//painter->fillRect(startpixel,0,startpixel+endpixel,(int)br.height(), QBrush(QColor(255,255,255,150)));
//painter->fillRect(QRect(br.x(), br.y(), roundingX, roundingY), QBrush(QColor(Qt::green)));
else if (abs((int)(pos.x() - (rect().x() + rect().width()))) < 6) return RESIZEEND;
else if (abs((int)(pos.x() - (rect().x() + 10))) < 6 && abs((int)(pos.y() - (rect().y() + rect().height() / 2 - 5))) < 6) return TRANSITIONSTART;
else if (abs((int)(pos.x() - (rect().x() + rect().width() - 20))) < 6 && abs((int)(pos.y() - (rect().y() + rect().height() / 2 - 5))) < 6) return TRANSITIONEND;
+
return MOVE;
}
//}
}
-int ClipItem::fadeIn() const {
- return m_startFade;
-}
-int ClipItem::fadeOut() const {
- return m_endFade;
-}
void ClipItem::setFadeIn(int pos, double scale) {
int oldIn = m_startFade;
void ClipItem::mouseMoveEvent(QGraphicsSceneMouseEvent * event) {
}
-int ClipItem::track() const {
- return m_track;
-}
-
-void ClipItem::setTrack(int track) {
- m_track = track;
-}
-
int ClipItem::effectsCounter() {
return m_effectsCounter++;
}
update(boundingRect());
}
-void ClipItem::addTransition(Transition tr) {
- m_transitionsList.append(tr);
- update();
-}
-
//virtual
void ClipItem::dropEvent(QGraphicsSceneDragDropEvent * event) {
QString effects = QString(event->mimeData()->data("kdenlive/effectslist"));
#include "docclipbase.h"
#include "kthumb.h"
#include "transition.h"
+#include "abstractclipitem.h"
-
-class ClipItem : public QObject, public QGraphicsRectItem {
+class ClipItem : public AbstractClipItem {
Q_OBJECT
public:
DocClipBase *baseClip();
QString clipName();
GenTime maxDuration() const;
- int track() const;
- void setTrack(int track);
- GenTime startPos() const;
GenTime cropStart() const;
- GenTime endPos() const;
- GenTime duration() const;
- double fps() const;
QDomElement xml() const;
- int fadeIn() const;
- int fadeOut() const;
+
void setFadeOut(int pos, double scale);
void setFadeIn(int pos, double scale);
/** Give a string list of the clip's effect names */
/** Replace effect at pos ix with given value */
void setEffectAt(int ix, QDomElement effect);
void flashClip();
- void addTransition(Transition tr);
protected:
virtual void mouseMoveEvent(QGraphicsSceneMouseEvent * event);
CLIPTYPE m_clipType;
QString m_clipName;
GenTime m_maxDuration;
- GenTime m_cropStart;
- GenTime m_cropDuration;
+
int m_maxTrack;
- int m_track;
- GenTime m_startPos;
+
+
QPixmap m_startPix;
QPixmap m_endPix;
bool m_hasThumbs;
QTimer *startThumbTimer;
QTimer *endThumbTimer;
- uint m_startFade;
- uint m_endFade;
+
/** counter used to provide a unique id to each effect */
int m_effectsCounter;
double m_opacity;
QTimeLine *m_timeLine;
uint m_thumbsRequested;
- double m_fps;
bool m_hover;
EffectsList m_effectList;
// a button was pressed, delete visual tips
if (m_operationMode == MOVE) {
double snappedPos = getSnapPointForPos(mapToScene(event->pos()).x() - m_clickPoint);
- //kDebug()<<"/////// MOVE CLIP, EVENT Y: "<<event->scenePos().y()<<", SCENE HEIGHT: "<<scene()->sceneRect().height();
+ kDebug() << "/////// MOVE CLIP, EVENT Y: ";//<<event->scenePos().y()<<", SCENE HEIGHT: "<<scene()->sceneRect().height();
int moveTrack = (int) mapToScene(event->pos()).y() / 50;
int currentTrack = m_dragItem->track();
QList<QGraphicsItem *> itemList = items(event->pos());
int i = 0;
- QGraphicsItem *item = NULL;
+ QGraphicsRectItem *item = NULL;
for (int i = 0; i < itemList.count(); i++) {
- if (itemList.at(i)->type() == 70000) {
- item = itemList.at(i);
+ if (itemList.at(i)->type() == 70000 || itemList.at(i)->type() == 70001) {
+ item = (QGraphicsRectItem*) itemList.at(i);
break;
}
}
if (item && event->buttons() == Qt::NoButton) {
- ClipItem *clip = (ClipItem*) item;
+ AbstractClipItem *clip = (AbstractClipItem*) item;
+ OPERATIONTYPE opMode = opMode = clip->operationMode(mapToScene(event->pos()), m_scale);
double size = 8;
- OPERATIONTYPE opMode = clip->operationMode(mapToScene(event->pos()), m_scale);
+
if (opMode == m_moveOpMode) {
QGraphicsView::mouseMoveEvent(event);
return;
QList<QGraphicsItem *> collisionList = items(event->pos());
for (int i = 0; i < collisionList.size(); ++i) {
QGraphicsItem *item = collisionList.at(i);
- if (item->type() == 70000) {
+ if (item->type() == 70000 || item->type() == 70001) {
// select item
if (!item->isSelected()) {
QList<QGraphicsItem *> itemList = items();
item->setSelected(true);
update();
}
- m_dragItem = (ClipItem *) item;
- emit clipItemSelected(m_dragItem);
+
+ m_dragItem = (AbstractClipItem *) item;
+ if (item->type() == 70000) {
+ emit clipItemSelected((ClipItem*) m_dragItem);
+ }
m_clickPoint = mapToScene(event->pos()).x() - m_dragItem->startPos().frames(m_document->fps()) * m_scale;
m_operationMode = m_dragItem->operationMode(item->mapFromScene(mapToScene(event->pos())), m_scale);
if (m_operationMode == MOVE) setCursor(Qt::ClosedHandCursor);
else if (m_operationMode == RESIZEEND)
m_startPos = QPointF(m_dragItem->endPos().frames(m_document->fps()), m_dragItem->track());
else if (m_operationMode == TRANSITIONSTART) {
- Transition tra(m_dragItem, LUMA_TRANSITION, m_dragItem->startPos(), m_dragItem->startPos() + GenTime(2.5));
- m_dragItem->addTransition(tra);
+ Transition *tr = new Transition(QRect(10 , 10, 20, 20), (ClipItem*)m_dragItem, LUMA_TRANSITION, m_dragItem->startPos(), m_dragItem->startPos() + GenTime(2.5), m_document->fps());
+ scene()->addItem(tr);
+ //m_dragItem->addTransition(tra);
}
+
kDebug() << "//////// ITEM CLICKED: " << m_startPos;
collision = true;
break;
return pos;
}
-void CustomTrackView::updateSnapPoints(ClipItem *selected) {
+void CustomTrackView::updateSnapPoints(AbstractClipItem *selected) {
m_snapPoints.clear();
GenTime offset;
if (selected) offset = selected->duration();
QPointF m_startPos;
OPERATIONTYPE m_operationMode;
OPERATIONTYPE m_moveOpMode;
- ClipItem *m_dragItem;
+ AbstractClipItem *m_dragItem;
KUndoStack *m_commandStack;
QGraphicsItem *m_visualTip;
QGraphicsItemAnimation *m_animation;
double m_scale;
int m_clickPoint;
QList <GenTime> m_snapPoints;
- void updateSnapPoints(ClipItem *selected);
+ void updateSnapPoints(AbstractClipItem *selected);
double getSnapPointForPos(double pos);
ClipItem *getClipItemAt(int pos, int track);
ClipItem *getClipItemAt(GenTime pos, int track);
m_profile = new Mlt::Profile((char*) KdenliveSettings::current_profile().data());
QCryptographicHash context(QCryptographicHash::Sha1);
context.addData((KFileItem(m_url, "text/plain", S_IFREG).timeString() + m_url.fileName()).toAscii().data());
- m_thumbFile = KGlobal::dirs()->saveLocation("tmp" , "kdenlive" ) + context.result().toHex() + ".thumb";
+ m_thumbFile = KGlobal::dirs()->saveLocation("tmp" , "kdenlive") + context.result().toHex() + ".thumb";
kDebug() << "thumbfile=" << m_thumbFile;
}
#include <QBrush>
#include <qdom.h>
+#include <QPainter>
#include <kdebug.h>
#include <KIcon>
#include "kdenlivesettings.h"
-Transition::Transition(ClipItem * clipa, const TRANSITIONTYPE & type, const GenTime &startTime, const GenTime &endTime, bool inverted) {
+Transition::Transition(const QRectF& rect , ClipItem * clipa, const TRANSITIONTYPE & type, const GenTime &startTime, const GenTime &endTime, double fps, bool inverted) : AbstractClipItem(rect) {
m_invertTransition = inverted;
m_singleClip = true;
m_transitionTrack = 0;
m_secondClip = NULL;
m_transitionType = type;
m_transitionName = getTransitionName(m_transitionType);
-
+ m_fps = fps;
GenTime duration = endTime - startTime;
// Default duration = 2.5 seconds
m_transitionDuration = m_referenceClip->duration() - m_transitionStart;
else m_transitionDuration = duration;
m_secondClip = 0;
+ setFlags(QGraphicsItem::ItemClipsToShape | QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
}
// create a transition from XML
-Transition::Transition(ClipItem * clip, QDomElement transitionElement, GenTime offset) {
+Transition::Transition(const QRectF& rect , ClipItem * clip, QDomElement transitionElement, double fps, GenTime offset) : AbstractClipItem(rect) {
if (offset == GenTime()) offset = clip->startPos();
m_referenceClip = clip;
m_singleClip = true;
// Check if transition is valid (not outside of clip)
if (m_transitionStart > clip->duration())
m_transitionDuration = GenTime();
+
}
Transition::~Transition() {
return m_referenceClip->startPos() + m_transitionStart + m_transitionDuration;
}
}
+void Transition::paint(QPainter *painter,
+ const QStyleOptionGraphicsItem *option,
+ QWidget *widget) {
+ painter->fillRect(rect(), QBrush(Qt::green));
+}
-
+int Transition::type() const {
+ return 70001;
+}
+OPERATIONTYPE Transition::operationMode(QPointF pos, double scale) {
+ return MOVE;
+}
void Transition::resizeTransitionStart(GenTime time) {
if (!m_singleClip) return; //cannot resize automatic transitions
if (time < m_referenceClip->startPos()) time = m_referenceClip->startPos();
}
Transition *Transition::clone() {
- return new Transition::Transition(m_referenceClip, this->toXML());
+ return new Transition::Transition(rect(), m_referenceClip, this->toXML() , m_fps);
/*if (m_singleClip || m_secondClip == 0)
return new Transition::Transition(m_referenceClip);
else
}
Transition *Transition::reparent(ClipItem * clip) {
- return new Transition::Transition(clip, this->toXML(), m_referenceClip->startPos());
+ return new Transition::Transition(rect(), clip, this->toXML(), m_fps, m_referenceClip->startPos());
}
bool Transition::isValid() const {
return effect;
}
+GenTime Transition::startPos() const {
+ return GenTime();
+}
+
+GenTime Transition::endPos() const {
+ return GenTime();
+}
+
+int Transition::track() const {
+ return 0;
+}
+
+GenTime Transition::duration() const {
+ return GenTime();
+}
#include <QString>
#include <QGraphicsRectItem>
-#include <qpixmap.h>
+#include <QPixmap>
#include <qdom.h>
-#include <qmap.h>
+#include <QMap>
#include "gentime.h"
#include "definitions.h"
-
+#include "abstractclipitem.h"
/**Describes a Transition, with a name, parameters keyframes, etc.
*@author Jean-Baptiste Mardelle
class ClipItem;
-class Transition {
+class Transition : public AbstractClipItem {
+ Q_OBJECT
public:
- Transition(ClipItem * clipa, const TRANSITIONTYPE & type, const GenTime &startTime, const GenTime &endTime, bool inverted = false);
- Transition(ClipItem * clip, QDomElement transitionElement, GenTime offset = GenTime());
- ~Transition();
-
+ Transition(const QRectF&, ClipItem * clipa, const TRANSITIONTYPE & type, const GenTime &startTime, const GenTime &endTime, double fps, bool inverted = false);
+ Transition(const QRectF&, ClipItem * clip, QDomElement transitionElement, double fps, GenTime offset = GenTime());
+ virtual ~Transition();
+ virtual void paint(QPainter *painter,
+ const QStyleOptionGraphicsItem *option,
+ QWidget *widget);
+ virtual int type() const;
/** Returns an XML representation of this transition. */
QDomElement toXML();
void moveTransition(GenTime time);
bool invertTransition() const;
TRANSITIONTYPE transitionType() const;
+ OPERATIONTYPE operationMode(QPointF pos, double scale);
QString transitionTag() const;
QString transitionName() const;
void setTransitionType(TRANSITIONTYPE newType);
bool isValid() const;
GenTime transitionDuration() const;
const ClipItem *referencedClip() const;
-
+ GenTime startPos() const;
+ GenTime endPos() const;
+ int track() const;
+ GenTime duration() const;
private:
GenTime m_transitionStart;