+#include <QTextStream>
+#include <QFile>
+#include <QInputDialog>
+
+
+EffectStackView::EffectStackView(Monitor *monitor, QWidget *parent) :
+ QWidget(parent),
+ m_monitor(monitor),
+ m_clipref(NULL),
+ m_trackMode(false),
+ m_trackindex(-1)
+{
+ m_ui.setupUi(this);
+ QVBoxLayout *vbox1 = new QVBoxLayout(m_ui.frame);
+ m_effectedit = new EffectStackEdit(monitor, m_ui.frame);
+ m_ui.frame->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred);
+ vbox1->setContentsMargins(2, 0, 2, 0);
+ vbox1->setSpacing(0);
+ vbox1->addWidget(m_effectedit);
+ m_ui.splitter->setStretchFactor(0, 1);
+ m_ui.splitter->setStretchFactor(1, 20);
+
+ //m_ui.region_url->fileDialog()->setFilter(ProjectList::getExtensions());
+ //m_ui.effectlist->horizontalHeader()->setVisible(false);
+ //m_ui.effectlist->verticalHeader()->setVisible(false);
+
+ m_ui.buttonNew->setIcon(KIcon("document-new"));
+ m_ui.buttonNew->setToolTip(i18n("Add new effect"));
+ m_ui.buttonUp->setIcon(KIcon("go-up"));
+ m_ui.buttonUp->setToolTip(i18n("Move effect up"));
+ m_ui.buttonDown->setIcon(KIcon("go-down"));
+ m_ui.buttonDown->setToolTip(i18n("Move effect down"));
+ m_ui.buttonDel->setIcon(KIcon("edit-delete"));
+ m_ui.buttonDel->setToolTip(i18n("Delete effect"));
+ m_ui.buttonSave->setIcon(KIcon("document-save"));
+ m_ui.buttonSave->setToolTip(i18n("Save effect"));
+ m_ui.buttonReset->setIcon(KIcon("view-refresh"));
+ m_ui.buttonReset->setToolTip(i18n("Reset effect"));
+ m_ui.checkAll->setToolTip(i18n("Enable/Disable all effects"));
+ m_ui.buttonShowComments->setIcon(KIcon("help-about"));
+ m_ui.buttonShowComments->setToolTip(i18n("Show additional information for the parameters"));
+
+ m_ui.effectlist->setDragDropMode(QAbstractItemView::NoDragDrop); //use internal if drop is recognised right
+
+ m_ui.labelComment->setHidden(true);
+
+ //connect(m_ui.region_url, SIGNAL(urlSelected(const KUrl &)), this , SLOT(slotRegionChanged()));
+ //connect(m_ui.region_url, SIGNAL(returnPressed()), this , SLOT(slotRegionChanged()));
+ connect(m_ui.effectlist, SIGNAL(itemSelectionChanged()), this , SLOT(slotItemSelectionChanged()));
+ connect(m_ui.effectlist, SIGNAL(itemChanged(QListWidgetItem *)), this , SLOT(slotItemChanged(QListWidgetItem *)));
+ connect(m_ui.buttonUp, SIGNAL(clicked()), this, SLOT(slotItemUp()));
+ connect(m_ui.buttonDown, SIGNAL(clicked()), this, SLOT(slotItemDown()));
+ connect(m_ui.buttonDel, SIGNAL(clicked()), this, SLOT(slotItemDel()));
+ connect(m_ui.buttonSave, SIGNAL(clicked()), this, SLOT(slotSaveEffect()));
+ connect(m_ui.buttonReset, SIGNAL(clicked()), this, SLOT(slotResetEffect()));
+ connect(m_ui.checkAll, SIGNAL(stateChanged(int)), this, SLOT(slotCheckAll(int)));
+ connect(m_ui.buttonShowComments, SIGNAL(clicked()), this, SLOT(slotShowComments()));
+ connect(m_effectedit, SIGNAL(parameterChanged(const QDomElement &, const QDomElement &)), this , SLOT(slotUpdateEffectParams(const QDomElement &, const QDomElement &)));
+ connect(m_effectedit, SIGNAL(seekTimeline(int)), this , SLOT(slotSeekTimeline(int)));
+ connect(m_effectedit, SIGNAL(displayMessage(const QString&, int)), this, SIGNAL(displayMessage(const QString&, int)));
+ connect(m_effectedit, SIGNAL(checkMonitorPosition(int)), this, SLOT(slotCheckMonitorPosition(int)));
+ connect(monitor, SIGNAL(renderPosition(int)), this, SLOT(slotRenderPos(int)));
+ connect(this, SIGNAL(showComments(bool)), m_effectedit, SIGNAL(showComments(bool)));
+ m_effectLists["audio"] = &MainWindow::audioEffects;
+ m_effectLists["video"] = &MainWindow::videoEffects;
+ m_effectLists["custom"] = &MainWindow::customEffects;
+ setEnabled(false);
+}
+
+EffectStackView::~EffectStackView()
+{
+ m_effectLists.clear();
+ delete m_effectedit;
+}
+
+void EffectStackView::updateTimecodeFormat()
+{
+ m_effectedit->updateTimecodeFormat();
+}
+
+void EffectStackView::setMenu(QMenu *menu)
+{
+ m_ui.buttonNew->setMenu(menu);
+}
+
+void EffectStackView::updateProjectFormat(MltVideoProfile profile, Timecode t)
+{
+ m_effectedit->updateProjectFormat(profile, t);
+}
+
+void EffectStackView::slotSaveEffect()
+{
+ QString name = QInputDialog::getText(this, i18n("Save Effect"), i18n("Name for saved effect: "));
+ if (name.isEmpty()) return;
+ QString path = KStandardDirs::locateLocal("appdata", "effects/", true);
+ path = path + name + ".xml";
+ if (QFile::exists(path)) if (KMessageBox::questionYesNo(this, i18n("File %1 already exists.\nDo you want to overwrite it?", path)) == KMessageBox::No) return;
+
+ int i = m_ui.effectlist->currentRow();
+ QDomDocument doc;
+ QDomElement effect = m_currentEffectList.at(i).cloneNode().toElement();
+ doc.appendChild(doc.importNode(effect, true));
+ effect = doc.firstChild().toElement();
+ effect.removeAttribute("kdenlive_ix");
+ effect.setAttribute("id", name);
+ effect.setAttribute("type", "custom");
+ QDomElement effectname = effect.firstChildElement("name");
+ effect.removeChild(effectname);
+ effectname = doc.createElement("name");
+ QDomText nametext = doc.createTextNode(name);
+ effectname.appendChild(nametext);
+ effect.insertBefore(effectname, QDomNode());
+ QDomElement effectprops = effect.firstChildElement("properties");
+ effectprops.setAttribute("id", name);
+ effectprops.setAttribute("type", "custom");
+
+ QFile file(path);
+ if (file.open(QFile::WriteOnly | QFile::Truncate)) {
+ QTextStream out(&file);
+ out << doc.toString();
+ }
+ file.close();
+ emit reloadEffects();
+}
+
+void EffectStackView::slotUpdateEffectParams(const QDomElement &old, const QDomElement &e)
+{
+ if (m_trackMode)
+ emit updateEffect(NULL, m_trackindex, old, e, m_ui.effectlist->currentRow());
+ else if (m_clipref)
+ emit updateEffect(m_clipref, -1, old, e, m_ui.effectlist->currentRow());
+}