#include "addeffectcommand.h"
-AddEffectCommand::AddEffectCommand(CustomTrackView *view, const int track, GenTime pos, const QString &tag, QMap <QString, QString> args, bool doIt)
- : m_view(view), m_track(track), m_pos(pos), m_tag(tag), m_args(args), m_doIt(doIt) {
+AddEffectCommand::AddEffectCommand(CustomTrackView *view, const int track, GenTime pos, QDomElement effect, bool doIt)
+ : m_view(view), m_track(track), m_pos(pos), m_effect(effect), m_doIt(doIt) {
if (doIt) setText(i18n("Add effect"));
else setText(i18n("Delete effect"));
}
void AddEffectCommand::undo()
{
kDebug()<<"---- undoing action";
- if (m_doIt) m_view->deleteEffect(m_track, m_pos, m_tag);
- else m_view->addEffect(m_track, m_pos, m_tag, m_args);
+ if (m_doIt) m_view->deleteEffect(m_track, m_pos, m_effect);
+ else m_view->addEffect(m_track, m_pos, m_effect);
}
// virtual
void AddEffectCommand::redo()
{
kDebug()<<"---- redoing action";
- if (m_doIt) m_view->addEffect(m_track, m_pos, m_tag, m_args);
- else m_view->deleteEffect(m_track, m_pos, m_tag);
+ if (m_doIt) m_view->addEffect(m_track, m_pos, m_effect);
+ else m_view->deleteEffect(m_track, m_pos, m_effect);
}
#include "addeffectcommand.moc"
class AddEffectCommand : public QUndoCommand
{
public:
- AddEffectCommand(CustomTrackView *view, const int track, GenTime pos, const QString &tag, QMap <QString, QString> args, bool doIt);
+ AddEffectCommand(CustomTrackView *view, const int track, GenTime pos, QDomElement effect, bool doIt);
virtual void undo();
virtual void redo();
private:
CustomTrackView *m_view;
int m_track;
- QString m_tag;
+ QDomElement m_effect;
GenTime m_pos;
- QMap <QString, QString> m_args;
bool m_doIt;
};
m_track = track;
}
+int ClipItem::effectsCount()
+{
+ return m_effectList.size();
+}
+
QStringList ClipItem::effectNames()
{
QStringList result;
for (int i = 0; i < m_effectList.size(); ++i) {
- result.append(m_effectList.at(i).value("name"));
+ QDomNode namenode = m_effectList.at(i).elementsByTagName("name").item(0);
+ if (!namenode.isNull()) result.append(namenode.toElement().text());
}
kDebug()<<"/// EFFECT LIST FOR CLIP IS: "<<result;
return result;
}
-void ClipItem::addEffect(QMap <QString, QString> args)
+QDomElement ClipItem::effectAt(int ix)
{
- m_effectList.append(args);
+ return m_effectList.at(ix);
+}
+
+QMap <QString, QString> ClipItem::addEffect(QDomElement effect)
+{
+ QMap <QString, QString> effectParams;
+ effectParams["kdenlive_ix"] = QString::number(m_effectList.size());
+ m_effectList.append(effect);
+ effectParams["tag"] = effect.attribute("tag");
+ QDomNodeList params = effect.elementsByTagName("parameter");
+ for (int i = 0; i < params.count(); i++) {
+ QDomElement e = params.item(i).toElement();
+ if (!e.isNull())
+ effectParams[e.attribute("name")] = e.attribute("value");
+ }
update(boundingRect());
+ return effectParams;
}
void ClipItem::deleteEffect(QString tag)
{
for (int i = 0; i < m_effectList.size(); ++i) {
- if (m_effectList.at(i).value("mlt_service") == tag) {
+ if (m_effectList.at(i).attribute("kdenlive_ix") == tag) {
m_effectList.removeAt(i);
break;
}
void setFadeOut(int pos, double scale);
void setFadeIn(int pos, double scale);
QStringList effectNames();
- void addEffect(QMap <QString, QString> args);
+ QMap <QString, QString> addEffect(QDomElement effect);
void deleteEffect(QString tag);
+ int effectsCount();
+ QDomElement effectAt(int ix);
protected:
virtual void mouseMoveEvent ( QGraphicsSceneMouseEvent * event );
uint m_startFade;
uint m_endFade;
- QList< QMap<QString, QString> > m_effectList;
+ QList< QDomElement > m_effectList;
private slots:
void slotThumbReady(int frame, QPixmap pix);
kDebug()<<"//////// NO ITEM FOUND ON CLICK";
m_dragItem = NULL;
setCursor(Qt::ArrowCursor);
+ QList<QGraphicsItem *> itemList = items();
+ for (int i = 0; i < itemList.count(); i++)
+ itemList.at(i)->setSelected(false);
+ emit clipItemSelected(NULL);
setCursorPos((int) mapToScene(event->x(), 0).x());
emit cursorMoved(cursorPos());
}
}
}
-void CustomTrackView::addEffect(int track, GenTime pos, QString tag, QMap <QString, QString> args)
+void CustomTrackView::addEffect(int track, GenTime pos, QDomElement effect)
{
- m_document->renderer()->mltAddEffect(track, pos, tag, args);
ClipItem *clip = getClipItemAt(pos.frames(m_document->fps()) + 1, m_tracksCount - track);
- if (clip){
- clip->addEffect(args);
- emit clipItemSelected(clip);
- }
+ if (clip){
+ QMap <QString, QString> effectParams = clip->addEffect(effect);
+ m_document->renderer()->mltAddEffect(track, pos, effectParams);
+ emit clipItemSelected(clip);
+ }
}
-void CustomTrackView::deleteEffect(int track, GenTime pos, QString tag)
+void CustomTrackView::deleteEffect(int track, GenTime pos, QDomElement effect)
{
- m_document->renderer()->mltRemoveEffect(track, pos, tag, -1);
+ QString index = effect.attribute("kdenlive_ix");
+ m_document->renderer()->mltRemoveEffect(track, pos, index);
ClipItem *clip = getClipItemAt(pos.frames(m_document->fps()) + 1, m_tracksCount - track);
if (clip){
- clip->deleteEffect(tag);
+ clip->deleteEffect(index);
emit clipItemSelected(clip);
}
}
-void CustomTrackView::slotAddEffect(QMap <QString, QString> filter)
+void CustomTrackView::slotAddEffect(QDomElement effect)
{
QList<QGraphicsItem *> itemList = items();
for (int i = 0; i < itemList.count(); i++) {
if (itemList.at(i)->type() == 70000 && itemList.at(i)->isSelected()) {
ClipItem *item = (ClipItem *)itemList.at(i);
- QString tag = filter.value("mlt_service");
- AddEffectCommand *command = new AddEffectCommand(this, m_tracksCount - item->track(),GenTime(item->startPos(), m_document->fps()), tag, filter, true);
+ // the kdenlive_ix int is used to identify an effect in the stack and in mlt's playlist
+ effect.setAttribute("kdenlive_ix", QString::number(item->effectsCount()));
+ AddEffectCommand *command = new AddEffectCommand(this, m_tracksCount - item->track(),GenTime(item->startPos(), m_document->fps()), effect, true);
m_commandStack->push(command);
}
}
void setDuration(int duration);
void setScale(double scaleFactor);
void deleteClip(int clipId);
- void slotAddEffect(QMap <QString, QString> filter);
- void addEffect(int track, GenTime pos, QString tag, QMap <QString, QString> args);
- void deleteEffect(int track, GenTime pos, QString tag);
+ void slotAddEffect(QDomElement effect);
+ void addEffect(int track, GenTime pos, QDomElement effect);
+ void deleteEffect(int track, GenTime pos, QDomElement effect);
public slots:
void setCursorPos(int pos, bool seek = true);
QDomElement effect = this->at(i);
QDomNode namenode = effect.elementsByTagName("name").item(0);
if (!namenode.isNull()) effectName = i18n(qstrdup(namenode.toElement().text().toUtf8()));
- if (name == effectName) return effect;
+ if (name == effectName) {
+ QDomNodeList params = effect.elementsByTagName("parameter");
+ for (int i = 0; i < params.count(); i++) {
+ QDomElement e = params.item(i).toElement();
+ e.setAttribute("value", e.attribute("default"));
+ }
+ return effect;
+ }
}
return QDomElement();
void EffectsListView::slotEffectSelected()
{
- emit addEffect(ui.type_combo->currentIndex(), ui.effectlist->currentItem()->text());
+ QDomElement effect;
+ switch (ui.type_combo->currentIndex())
+ {
+ case 0:
+ effect = m_videoList->getEffectByName(ui.effectlist->currentItem()->text());
+ break;
+ case 1:
+ effect = m_audioList->getEffectByName(ui.effectlist->currentItem()->text());
+ break;
+ default:
+ effect = m_customList->getEffectByName(ui.effectlist->currentItem()->text());
+ break;
+ }
+ emit addEffect(effect);
}
void EffectsListView::slotUpdateInfo()
else if (ui.type_combo->currentIndex() == 1) {
info = m_audioList->getInfo(ui.effectlist->currentItem()->text());
}
- if (ui.type_combo->currentIndex() == 2) {
+ else if (ui.type_combo->currentIndex() == 2) {
info = m_customList->getInfo(ui.effectlist->currentItem()->text());
}
ui.infopanel->setText(info);
public slots:
signals:
- void addEffect(int, QString);
+ void addEffect(QDomElement);
};
clipref=NULL;
ui.buttonNew->setIcon(KIcon("document-new"));
+ ui.buttonNew->setToolTip(i18n("Add new effect"));
ui.buttonUp->setIcon(KIcon("go-up"));
+ ui.buttonUp->setToolTip(i18n("Move effect up"));
ui.buttonDown->setIcon(KIcon("go-down"));
+ ui.buttonDown->setToolTip(i18n("Move effect down"));
ui.buttonDel->setIcon(KIcon("trash-empty"));
+ ui.buttonDel->setToolTip(i18n("Delete effect"));
ui.buttonLeftRight->setIcon(KIcon("go-next"));//better icons needed
+ ui.buttonLeftRight->setToolTip(i18n("Allow horizontal moves"));
ui.buttonUpDown->setIcon(KIcon("go-up"));
+ ui.buttonUpDown->setToolTip(i18n("Allow vertical moves"));
ui.buttonShowInTimeline->setIcon(KIcon("kmplayer"));
+ ui.buttonShowInTimeline->setToolTip(i18n("Show keyframes in timeline"));
ui.buttonHelp->setIcon(KIcon("help-about"));
+ ui.buttonHelp->setToolTip(i18n("Parameter info"));
ui.buttonNewPoints->setIcon(KIcon("xedit"));
+ ui.buttonNewPoints->setToolTip(i18n("Add keyframe"));
ui.effectlist->setDragDropMode(QAbstractItemView::NoDragDrop);//use internal if drop is recognised right
void EffectStackView::slotClipItemSelected(ClipItem* c)
{
clipref=c;
- if (clipref==NULL)
+ if (clipref==NULL) {
+ setEnabled(false);
return;
+ }
+ setEnabled(true);
effects=clipref->effectNames();
setupListView(effects);
connect(clipMonitorDock, SIGNAL(visibilityChanged (bool)), m_clipMonitor, SLOT(refreshMonitor(bool)));
connect(m_monitorManager, SIGNAL(connectMonitors ()), this, SLOT(slotConnectMonitors()));
connect(m_monitorManager, SIGNAL(raiseClipMonitor (bool)), this, SLOT(slotRaiseMonitor(bool)));
- connect(m_effectList, SIGNAL(addEffect(int, const QString&)), this, SLOT(slotAddEffect(int, const QString &)));
+ connect(m_effectList, SIGNAL(addEffect(QDomElement)), this, SLOT(slotAddEffect(QDomElement)));
m_monitorManager->initMonitors(m_clipMonitor, m_projectMonitor);
setAutoSaveSettings();
}
}
-void MainWindow::slotAddEffect(int effectType, const QString &effectName)
+void MainWindow::slotAddEffect(QDomElement effect)
{
if (!m_activeDocument) return;
- QMap <QString, QString> filter;
+ /*QMap <QString, QString> filter;
if (effectType == 0)
filter = m_videoEffects.effect(effectName);
else if (effectType == 1)
filter = m_audioEffects.effect(effectName);
else
- filter = m_customEffects.effect(effectName);
+ filter = m_customEffects.effect(effectName);*/
TrackView *currentTimeLine = (TrackView *) m_timelineArea->currentWidget();
- currentTimeLine->projectView()->slotAddEffect(filter);
+ currentTimeLine->projectView()->slotAddEffect(effect);
}
void MainWindow::slotRaiseMonitor(bool clipMonitor)
connect(doc, SIGNAL(signalDeleteProjectClip(int)), m_projectList, SLOT(slotDeleteClip(int)));
connect(doc, SIGNAL(updateClipDisplay(int)), m_projectList, SLOT(slotUpdateClip(int)));
connect(doc, SIGNAL(deletTimelineClip(int)), trackView, SLOT(slotDeleteClip(int)));
- connect(trackView, SIGNAL(clipItemSelected(ClipItem*)), effectStack, SLOT(slotClipItemSelected(ClipItem*)));
+ connect(trackView, SIGNAL(clipItemSelected(ClipItem*)), effectStack, SLOT(slotClipItemSelected(ClipItem*)));
m_projectList->setDocument(doc);
m_monitorManager->setTimecode(doc->timecode());
doc->setRenderer(m_projectMonitor->render);
void slotRaiseMonitor(bool clipMonitor);
void slotSetClipDuration(int id, int duration);
void slotUpdateMousePosition(int pos);
- void slotAddEffect(int effectType, const QString &effectName);
+ void slotAddEffect(QDomElement effect);
void slotEditProfiles();
void slotEditProjectSettings();
};
m_isBlocked = false;
}
-void Render::mltRemoveEffect(int track, GenTime position, QString tag, int index)
+void Render::mltRemoveEffect(int track, GenTime position, QString index)
{
Mlt::Service service(m_mltProducer->parent().get_service());
m_isBlocked = true;
Mlt::Service clipService(clip->get_service());
- if (tag.startsWith("ladspa")) tag = "ladspa";
+// if (tag.startsWith("ladspa")) tag = "ladspa";
- if (index == -1) {
- int ct = 0;
+ int ct = 0;
Mlt::Filter *filter = clipService.filter( ct );
while (filter) {
- if (filter->get("mlt_service") == tag) {// && filter->get("kdenlive_id") == id) {
+ if (filter->get("kdenlive_ix") == index) {// && filter->get("kdenlive_id") == id) {
clipService.detach(*filter);
kDebug()<<" / / / DLEETED EFFECT: "<<ct;
}
else ct++;
filter = clipService.filter( ct );
}
- }
- else {
- Mlt::Filter *filter = clipService.filter( index );
- if (filter && filter->get("mlt_service") == tag /*&& filter->get("kdenlive_id") == id*/) clipService.detach(*filter);
- else {
- kDebug()<<"WARINIG, FILTER "<<tag<<" NOT FOUND!!!!!";
- }
- }
m_isBlocked = false;
refresh();
}
-void Render::mltAddEffect(int track, GenTime position, QString tag, QMap <QString, QString> args)
+void Render::mltAddEffect(int track, GenTime position, QMap <QString, QString> args)
{
Mlt::Service service(m_mltProducer->parent().get_service());
Mlt::Tractor tractor(service);
Mlt::Service clipService(clip->get_service());
m_isBlocked = true;
// create filter
+ QString tag = args.value("tag");
//kDebug()<<" / / INSERTING EFFECT: "<<id;
if (tag.startsWith("ladspa")) tag = "ladspa";
char *filterId = decodedString(tag);
Mlt::Filter *filter = new Mlt::Filter(*m_mltProfile, filterId);
- if (filter && filter->is_valid())
- filter->set("kdenlive_id", filterId);
- else {
- kDebug() << "filter is NULL";
- return;
- }
+ if (filter && filter->is_valid())
+ filter->set("kdenlive_id", filterId);
+ else {
+ kDebug() << "filter is NULL";
+ return;
+ }
QMap<QString, QString>::Iterator it;
QString keyFrameNumber = "#0";
QMap<QString, QString>::Iterator it = args.begin();
if (it.key().startsWith("#") || tag.startsWith("ladspa") || tag == "sox" || tag == "autotrack_rectangle") {
// This is a keyframe effect, to edit it, we remove it and re-add it.
- mltRemoveEffect(track, position, tag, -1);
- mltAddEffect(track, position, tag, args);
+ //mltRemoveEffect(track, position, tag, -1);
+ //mltAddEffect(track, position, tag, args);
return;
}
m_isBlocked = true;
void mltMoveClip(int startTrack, int endTrack, GenTime pos, GenTime moveStart);
void mltMoveClip(int startTrack, int endTrack, int pos, int moveStart);
void mltRemoveClip(int track, GenTime position);
- void mltRemoveEffect(int track, GenTime position, QString tag, int index);
- void mltAddEffect(int track, GenTime position, QString tag, QMap <QString, QString> args);
+ void mltRemoveEffect(int track, GenTime position, QString index);
+ void mltAddEffect(int track, GenTime position, QMap <QString, QString> args);
void mltEditEffect(int track, GenTime position, int index, QString id, QString tag, QMap <QString, QString> args);
void mltChangeTrackState(int track, bool mute, bool blind);
void mltMoveTransition(QString type, int startTrack, int trackOffset, GenTime oldIn, GenTime oldOut, GenTime newIn, GenTime newOut);