#include "transition.h"
#include "kdenlivesettings.h"
#include "kthumb.h"
+#include "profilesdialog.h"
#include <KDebug>
#include <KIcon>
#include <QGraphicsScene>
#include <QMimeData>
-ClipItem::ClipItem(DocClipBase *clip, ItemInfo info, double fps, double speed, bool generateThumbs) :
+ClipItem::ClipItem(DocClipBase *clip, ItemInfo info, double fps, double speed, int strobe, bool generateThumbs) :
AbstractClipItem(info, QRectF(), fps),
m_clip(clip),
- m_resizeMode(NONE),
m_startFade(0),
m_endFade(0),
m_audioOnly(false),
m_startPix(QPixmap()),
m_endPix(QPixmap()),
m_hasThumbs(false),
- m_startThumbTimer(NULL),
- m_endThumbTimer(NULL),
m_selectedEffect(-1),
m_timeLine(0),
m_startThumbRequested(false),
m_endThumbRequested(false),
//m_hover(false),
m_speed(speed),
+ m_strobe(strobe),
m_framePixelWidth(0)
{
setZValue(2);
if (m_clipType == VIDEO || m_clipType == AV || m_clipType == SLIDESHOW || m_clipType == PLAYLIST) {
setBrush(QColor(141, 166, 215));
m_hasThumbs = true;
- m_startThumbTimer = new QTimer(this);
- m_startThumbTimer->setSingleShot(true);
- connect(m_startThumbTimer, SIGNAL(timeout()), this, SLOT(slotGetStartThumb()));
- m_endThumbTimer = new QTimer(this);
- m_endThumbTimer->setSingleShot(true);
- connect(m_endThumbTimer, SIGNAL(timeout()), this, SLOT(slotGetEndThumb()));
+ m_startThumbTimer.setSingleShot(true);
+ connect(&m_startThumbTimer, SIGNAL(timeout()), this, SLOT(slotGetStartThumb()));
+ m_endThumbTimer.setSingleShot(true);
+ connect(&m_endThumbTimer, SIGNAL(timeout()), this, SLOT(slotGetEndThumb()));
connect(this, SIGNAL(getThumb(int, int)), clip->thumbProducer(), SLOT(extractImage(int, int)));
//connect(this, SIGNAL(getThumb(int, int)), clip->thumbProducer(), SLOT(getVideoThumbs(int, int)));
disconnect(m_clip->thumbProducer(), SIGNAL(thumbReady(int, QPixmap)), this, SLOT(slotThumbReady(int, QPixmap)));
disconnect(m_clip, SIGNAL(gotAudioData()), this, SLOT(slotGotAudioData()));
}
- delete m_startThumbTimer;
- delete m_endThumbTimer;
delete m_timeLine;
}
ClipItem *ClipItem::clone(ItemInfo info) const
{
- ClipItem *duplicate = new ClipItem(m_clip, info, m_fps, m_speed);
+ ClipItem *duplicate = new ClipItem(m_clip, info, m_fps, m_speed, m_strobe);
if (m_clipType == IMAGE || m_clipType == TEXT) duplicate->slotSetStartThumb(m_startPix);
else {
if (info.cropStart == m_cropStart) duplicate->slotSetStartThumb(m_startPix);
{
m_effectList = effectList;
m_effectNames = m_effectList.effectNames().join(" / ");
+ if (!m_effectList.isEmpty()) setSelectedEffect(0);
}
const EffectsList ClipItem::effectList()
for (int i = 0; i < params.count(); i++) {
QDomElement e = params.item(i).toElement();
kDebug() << "// init eff: " << e.attribute("name");
+
+ // Check if this effect has a variable parameter
+ if (e.attribute("default").startsWith('%')) {
+ double evaluatedValue = ProfilesDialog::getStringEval(projectScene()->profile(), e.attribute("default"));
+ e.setAttribute("default", evaluatedValue);
+ if (e.hasAttribute("value") && e.attribute("value").startsWith('%')) {
+ e.setAttribute("value", evaluatedValue);
+ }
+ }
+
if (!e.isNull() && e.attribute("type") == "keyframe") {
QString def = e.attribute("default");
// Effect has a keyframe type parameter, we need to set the values
if (!e.isNull() && e.attribute("type") == "keyframe") {
QString keyframes;
if (m_keyframes.count() > 1) {
- QMap<int, double>::const_iterator i = m_keyframes.constBegin();
+ QMap<int, int>::const_iterator i = m_keyframes.constBegin();
while (i != m_keyframes.constEnd()) {
keyframes.append(QString::number(i.key()) + ':' + QString::number(i.value()) + ';');
++i;
{
QDomElement xml = m_clip->toXML();
if (m_speed != 1.0) xml.setAttribute("speed", m_speed);
+ if (m_strobe > 1) xml.setAttribute("strobe", m_strobe);
if (m_audioOnly) xml.setAttribute("audio_only", 1);
else if (m_videoOnly) xml.setAttribute("video_only", 1);
return xml;
}
-// virtual
-void ClipItem::mousePressEvent(QGraphicsSceneMouseEvent * event)
-{
- /*m_resizeMode = operationMode(event->pos());
- if (m_resizeMode == MOVE) {
- m_maxTrack = scene()->sceneRect().height();
- m_grabPoint = (int) (event->pos().x() - rect().x());
- }*/
- QGraphicsRectItem::mousePressEvent(event);
-}
-
-// virtual
-void ClipItem::mouseReleaseEvent(QGraphicsSceneMouseEvent * event)
-{
- m_resizeMode = NONE;
- QGraphicsRectItem::mouseReleaseEvent(event);
-}
-
/*
//virtual
void ClipItem::hoverEnterEvent(QGraphicsSceneHoverEvent *e)
checkEffectsKeyframesPos(previous, cropStart().frames(m_fps), true);
if (m_hasThumbs && KdenliveSettings::videothumbnails()) {
/*connect(m_clip->thumbProducer(), SIGNAL(thumbReady(int, QPixmap)), this, SLOT(slotThumbReady(int, QPixmap)));*/
- m_startThumbTimer->start(150);
+ m_startThumbTimer.start(150);
}
}
}
if (updateKeyFrames) checkEffectsKeyframesPos(previous, (cropStart() + cropDuration()).frames(m_fps), false);
if (m_hasThumbs && KdenliveSettings::videothumbnails()) {
/*connect(m_clip->thumbProducer(), SIGNAL(thumbReady(int, QPixmap)), this, SLOT(slotThumbReady(int, QPixmap)));*/
- m_endThumbTimer->start(150);
+ m_endThumbTimer.start(150);
}
}
}
kDebug() << "Invalid effect index: " << ix;
return;
}
- kDebug() << "CHange EFFECT AT: " << ix << ", CURR: " << m_effectList.at(ix).attribute("tag") << ", NEW: " << effect.attribute("tag");
+ //kDebug() << "CHange EFFECT AT: " << ix << ", CURR: " << m_effectList.at(ix).attribute("tag") << ", NEW: " << effect.attribute("tag");
effect.setAttribute("kdenlive_ix", ix + 1);
m_effectList.insert(ix, effect);
m_effectList.removeAt(ix + 1);
m_effectNames = m_effectList.effectNames().join(" / ");
QString id = effect.attribute("id");
if (id == "fadein" || id == "fadeout" || id == "fade_from_black" || id == "fade_to_black")
- update(boundingRect());
+ update();
else {
QRectF r = boundingRect();
r.setHeight(20);
parameters.addParam("endtag", e.attribute("endtag", "end"));
}
- double f = e.attribute("factor", "1").toDouble();
-
- if (f == 1) {
+ if (e.attribute("factor", "1") == "1") {
parameters.addParam(e.attribute("name"), e.attribute("value"));
// check if it is a fade effect
}
}
} else {
- parameters.addParam(e.attribute("name"), QString::number(e.attribute("value").toDouble() / f));
+ double fact;
+ if (e.attribute("factor").startsWith('%')) {
+ fact = ProfilesDialog::getStringEval(projectScene()->profile(), e.attribute("factor"));
+ } else fact = e.attribute("factor", "1").toDouble();
+ parameters.addParam(e.attribute("name"), QString::number(e.attribute("value").toDouble() / fact));
}
}
}
parameters.addParam("start", neu);
} else {
if (e.attribute("factor", "1") != "1") {
- parameters.addParam(e.attribute("name"), QString::number(e.attribute("value").toDouble() / e.attribute("factor").toDouble()));
+ double fact;
+ if (e.attribute("factor").startsWith('%')) {
+ fact = ProfilesDialog::getStringEval(projectScene()->profile(), e.attribute("factor"));
+ } else fact = e.attribute("factor", "1").toDouble();
+ parameters.addParam(e.attribute("name"), QString::number(e.attribute("value").toDouble() / fact));
} else {
parameters.addParam(e.attribute("name"), e.attribute("value"));
}
return m_speed;
}
-void ClipItem::setSpeed(const double speed)
+int ClipItem::strobe() const
+{
+ return m_strobe;
+}
+
+void ClipItem::setSpeed(const double speed, const int strobe)
{
m_speed = speed;
+ m_strobe = strobe;
if (m_speed == 1.0) m_clipName = baseClip()->name();
else m_clipName = baseClip()->name() + " - " + QString::number(speed * 100, 'f', 0) + '%';
//update();