return;
}
}
- if (item->hasEffect(effect.attribute("tag"), effect.attribute("id")) != -1 && effect.attribute("unique", "0") != "0") {
+ if (effect.attribute("unique", "0") != "0" && item->hasEffect(effect.attribute("tag"), effect.attribute("id")) != -1) {
emit displayMessage(i18n("Effect already present in clip"), ErrorMessage);
return;
}
void CustomTrackView::slotAddTrackEffect(const QDomElement &effect, int ix)
{
- AddEffectCommand *command = new AddEffectCommand(this, m_document->tracksCount() - ix, GenTime(-1), effect, true);
- m_commandStack->push(command);
- setDocumentModified();
+
+ QUndoCommand *effectCommand = new QUndoCommand();
+ QString effectName;
+ if (effect.tagName() == "list") {
+ effectName = effect.attribute("name");
+ } else {
+ QDomElement namenode = effect.firstChildElement("name");
+ if (!namenode.isNull()) effectName = i18n(namenode.text().toUtf8().data());
+ else effectName = i18n("effect");
+ }
+ effectCommand->setText(i18n("Add %1", effectName));
+ if (effect.tagName() == "list") {
+ QDomNodeList effectlist = effect.elementsByTagName("effect");
+ for (int j = 0; j < effectlist.count(); j++) {
+ QDomElement trackeffect = effectlist.at(j).toElement();
+ if (trackeffect.attribute("unique", "0") != "0" && m_document->hasTrackEffect(m_document->tracksCount() - ix - 1, trackeffect.attribute("tag"), trackeffect.attribute("id")) != -1) {
+ emit displayMessage(i18n("Effect already present in track"), ErrorMessage);
+ continue;
+ }
+ new AddEffectCommand(this, m_document->tracksCount() - ix, GenTime(-1), trackeffect, true, effectCommand);
+ }
+ }
+ else {
+ if (effect.attribute("unique", "0") != "0" && m_document->hasTrackEffect(m_document->tracksCount() - ix - 1, effect.attribute("tag"), effect.attribute("id")) != -1) {
+ emit displayMessage(i18n("Effect already present in track"), ErrorMessage);
+ delete effectCommand;
+ return;
+ }
+ new AddEffectCommand(this, m_document->tracksCount() - ix, GenTime(-1), effect, true, effectCommand);
+ }
+
+ if (effectCommand->childCount() > 0) {
+ m_commandStack->push(effectCommand);
+ setDocumentModified();
+ }
+ else delete effectCommand;
}
emit parameterChanged(m_original_effect, m_effect, effectIndex());
}
-void CollapsibleEffect::updateGroupIndex(int groupIndex)
-{
- m_info.groupIndex = groupIndex;
- if (groupIndex == -1) m_info.groupName.clear();
- m_effect.setAttribute("kdenlive_info", m_info.toString());
- emit parameterChanged(m_original_effect, m_effect, effectIndex());
-}
-
void CollapsibleEffect::setGroupIndex(int ix)
{
m_info.groupIndex = ix;
return m_info.toString();
}
-void CollapsibleEffect::removeGroup(int ix, QVBoxLayout *layout)
+void CollapsibleEffect::removeFromGroup()
{
- QVBoxLayout *vbox = static_cast<QVBoxLayout *>(widgetFrame->layout());
- if (vbox == NULL) return;
-
- for (int j = vbox->count() - 1; j >= 0; j--) {
- QLayoutItem *child = vbox->takeAt(j);
- CollapsibleEffect *e = static_cast<CollapsibleEffect *>(child->widget());
- layout->insertWidget(ix, e);
- e->updateGroupIndex(-1);
- delete child;
- }
+ m_info.groupIndex = -1;
+ m_info.groupName.clear();
+ m_effect.setAttribute("kdenlive_info", m_info.toString());
+ emit parameterChanged(m_original_effect, m_effect, effectIndex());
}
int CollapsibleEffect::groupIndex() const
int effectIndex() const;
void setGroupIndex(int ix);
void setGroupName(const QString &groupName);
- void removeGroup(int ix, QVBoxLayout *layout);
+ /** @brief Remove this effect from its group. */
+ void removeFromGroup();
QString infoString() const;
bool isActive() const;
/** @brief Should the wheel event be sent to parent widget for scrolling. */
QPoint m_clickPoint;
EffectInfo m_info;
- void updateGroupIndex(int groupIndex);
-
protected:
virtual void mouseDoubleClickEvent ( QMouseEvent * event );
virtual void mousePressEvent ( QMouseEvent * event );
{
setReadOnly(false);
selectAll();
+ e->accept();
}
for (int i = m_subWidgets.count() - 1; i >= 0 ; i--) {
vbox->removeWidget(m_subWidgets.at(i));
layout->insertWidget(ix, m_subWidgets.at(i));
+ m_subWidgets.at(i)->removeFromGroup();
}
m_subWidgets.clear();
}
const QString effects = QString::fromUtf8(event->mimeData()->data("kdenlive/effectslist"));
QDomDocument doc;
doc.setContent(effects, true);
- const QDomElement e = doc.documentElement();
+ QDomElement e = doc.documentElement();
+ if (e.tagName() == "list") {
+ // dropped an effect group
+ QDomNodeList effectlist = e.elementsByTagName("effect");
+ for (int i = 0; i < effectlist.count(); i++) {
+ effectlist.at(i).toElement().removeAttribute("kdenlive_ix");
+ }
+ } else {
+ // single effect dropped
+ e.removeAttribute("kdenlive_ix");
+ }
emit selectTrack(m_index);
- emit addTrackInfo(e, m_index);
+ emit addTrackEffect(e, m_index);
/*if (scene() && !scene()->views().isEmpty()) {
event->accept();
CustomTrackView *view = (CustomTrackView *) scene()->views()[0];
void renameTrack(int, QString);
void selectTrack(int);
void configTrack(int);
- void addTrackInfo(const QDomElement, int);
+ void addTrackEffect(const QDomElement, int);
void showTrackEffects(int);
};
return list.itemFromIndex(effectIndex).cloneNode().toElement();
}
+int KdenliveDoc::hasTrackEffect(int trackIndex, const QString &tag, const QString &id) const
+{
+ if (trackIndex < 0 || trackIndex >= m_tracksList.count()) {
+ kWarning() << "Get Track effect outisde of range";
+ return -1;
+ }
+ EffectsList list = m_tracksList.at(trackIndex).effectsList;
+ return list.hasEffect(tag, id);
+}
+
bool KdenliveDoc::saveCustomEffects(QDomNodeList customeffects)
{
QDomElement e;
void setTrackEffect(int trackIndex, int effectIndex, QDomElement effect);
const EffectsList getTrackEffects(int ix);
QDomElement getTrackEffect(int trackIndex, int effectIndex) const;
+ /** @brief Check if a track already contains a specific effect. */
+ int hasTrackEffect(int trackIndex, const QString &tag, const QString &id) const;
/** @brief Get a list of folder id's that were opened on last save. */
QStringList getExpandedFolders();
/** @brief Read the display ratio from an xml project file. */
connect(header, SIGNAL(selectTrack(int)), m_trackview, SLOT(slotSelectTrack(int)));
connect(header, SIGNAL(renameTrack(int, QString)), this, SLOT(slotRenameTrack(int, QString)));
connect(header, SIGNAL(configTrack(int)), this, SIGNAL(configTrack(int)));
- connect(header, SIGNAL(addTrackInfo(const QDomElement, int)), m_trackview, SLOT(slotAddTrackEffect(const QDomElement, int)));
+ connect(header, SIGNAL(addTrackEffect(const QDomElement, int)), m_trackview, SLOT(slotAddTrackEffect(const QDomElement, int)));
connect(header, SIGNAL(showTrackEffects(int)), this, SLOT(slotShowTrackEffects(int)));
headers_container->layout()->addWidget(header);
}