X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Feffectslistview.cpp;h=7e10b3227fb88cdee0c7e74d3b12f274b901f0aa;hb=a5cf56c02b034c973cfaf0bc25c56b69a4d5b32b;hp=e9d9876a1d1700fc9343d68503e7da38d1c461d0;hpb=64249171ceee40978d91114997ef7c2e7a3779cc;p=kdenlive diff --git a/src/effectslistview.cpp b/src/effectslistview.cpp index e9d9876a..7e10b322 100644 --- a/src/effectslistview.cpp +++ b/src/effectslistview.cpp @@ -18,64 +18,176 @@ ***************************************************************************/ +#include "effectslistview.h" +#include "effectslistwidget.h" +#include "effectslist.h" +#include "kdenlivesettings.h" + #include #include +#include -#include "effectslistview.h" +#include +#include + +EffectsListView::EffectsListView(QWidget *parent) : + QWidget(parent) +{ + setupUi(this); + + QMenu *menu = new QMenu(this); + m_effectsList = new EffectsListWidget(menu); + QVBoxLayout *lyr = new QVBoxLayout(effectlistframe); + lyr->addWidget(m_effectsList); + lyr->setContentsMargins(0, 0, 0, 0); + search_effect->setTreeWidget(m_effectsList); + search_effect->setToolTip(i18n("Search in the effect list")); + buttonInfo->setIcon(KIcon("help-about")); + buttonInfo->setToolTip(i18n("Show/Hide the effect description")); + setFocusPolicy(Qt::StrongFocus); + setFocusProxy(search_effect); + m_effectsList->setFocusProxy(search_effect); -EffectsListView::EffectsListView(EffectsList *audioEffectList, EffectsList *videoEffectList, EffectsList *customEffectList, QWidget *parent) - : QWidget(parent), m_audioList(audioEffectList), m_videoList(videoEffectList), m_customList(customEffectList) + if (KdenliveSettings::showeffectinfo()) + buttonInfo->setDown(true); + else + infopanel->hide(); + + menu->addAction(KIcon("edit-delete"), i18n("Delete effect"), this, SLOT(slotRemoveEffect())); + + connect(type_combo, SIGNAL(currentIndexChanged(int)), this, SLOT(filterList(int))); + connect(buttonInfo, SIGNAL(clicked()), this, SLOT(showInfoPanel())); + connect(m_effectsList, SIGNAL(itemSelectionChanged()), this, SLOT(slotUpdateInfo())); + connect(m_effectsList, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this, SLOT(slotEffectSelected())); + connect(search_effect, SIGNAL(hiddenChanged(QTreeWidgetItem *, bool)), this, SLOT(slotUpdateSearch(QTreeWidgetItem *, bool))); + connect(search_effect, SIGNAL(textChanged(QString)), this, SLOT(slotAutoExpand(QString))); + //m_effectsList->setCurrentRow(0); +} + +void EffectsListView::filterList(int pos) { - ui.setupUi(this); - initList(0); - connect(ui.type_combo, SIGNAL(currentIndexChanged(int)), this, SLOT(initList(int))); - connect(ui.button_info, SIGNAL(stateChanged(int)), this, SLOT(showInfoPanel(int))); - connect(ui.effectlist, SIGNAL(itemSelectionChanged()), this, SLOT(slotUpdateInfo())); + for (int i = 0; i < m_effectsList->topLevelItemCount(); i++) { + QTreeWidgetItem *folder = m_effectsList->topLevelItem(i); + bool hideFolder = true; + for (int j = 0; j < folder->childCount(); j++) { + QTreeWidgetItem *item = folder->child(j); + if (pos == 0 || pos == item->data(0, Qt::UserRole).toInt()) { + item->setHidden(false); + hideFolder = false; + } else { + item->setHidden(true); + } + } + // do not hide the folder if it's empty but "All" is selected + if (pos == 0) + hideFolder = false; + folder->setHidden(hideFolder); + } + // make sure we don't show anything not matching the search expression + search_effect->updateSearch(); + + + /*item = m_effectsList->currentItem(); + if (item) { + if (item->isHidden()) { + int i; + for (i = 0; i < m_effectsList->count() && m_effectsList->item(i)->isHidden(); i++); //do nothing + m_effectsList->setCurrentRow(i); + } else m_effectsList->scrollToItem(item); + }*/ } -void EffectsListView::initList(int pos) +void EffectsListView::showInfoPanel() { - QStringList names; - switch (pos) - { - case 0: - names = m_videoList->effectNames(); - break; - case 1: - names = m_audioList->effectNames(); - break; - default: - names = m_customList->effectNames(); - break; - } - ui.effectlist->clear(); - ui.effectlist->addItems(names); + bool show = !infopanel->isVisible(); + infopanel->setVisible(show); + buttonInfo->setDown(show); + KdenliveSettings::setShoweffectinfo(show); } -void EffectsListView::showInfoPanel(int state) +void EffectsListView::slotEffectSelected() { - if (state == 0) ui.infopanel->hide(); - else ui.infopanel->show(); + QDomElement effect = m_effectsList->currentEffect(); + QTreeWidgetItem* item=m_effectsList->currentItem(); + if (item && m_effectsList->indexOfTopLevelItem(item)!=-1){ + item->setExpanded(!item->isExpanded()); + } + if (!effect.isNull()) + emit addEffect(effect); } void EffectsListView::slotUpdateInfo() { - QString info; - if (ui.type_combo->currentIndex() == 0) { - info = m_videoList->getInfo(ui.effectlist->currentItem()->text()); - } - else if (ui.type_combo->currentIndex() == 1) { - info = m_audioList->getInfo(ui.effectlist->currentItem()->text()); - } - if (ui.type_combo->currentIndex() == 2) { - info = m_customList->getInfo(ui.effectlist->currentItem()->text()); - } - ui.infopanel->setText(info); + infopanel->setText(m_effectsList->currentInfo()); } -KListWidget *EffectsListView::listView() +void EffectsListView::reloadEffectList() { - return ui.effectlist; + m_effectsList->initList(); +} + +void EffectsListView::slotRemoveEffect() +{ + QTreeWidgetItem *item = m_effectsList->currentItem(); + QString effectId = item->text(0); + QString path = KStandardDirs::locateLocal("appdata", "effects/", true); + + QDir directory = QDir(path); + QStringList filter; + filter << "*.xml"; + const QStringList fileList = directory.entryList(filter, QDir::Files); + QString itemName; + foreach(const QString &filename, fileList) { + itemName = KUrl(path + filename).path(); + QDomDocument doc; + QFile file(itemName); + doc.setContent(&file, false); + file.close(); + QDomNodeList effects = doc.elementsByTagName("effect"); + if (effects.count() != 1) { + kDebug() << "More than one effect in file " << itemName << ", NOT SUPPORTED YET"; + } else { + QDomElement e = effects.item(0).toElement(); + if (e.attribute("id") == effectId) { + QFile::remove(itemName); + break; + } + } + } + emit reloadEffects(); +} + +void EffectsListView::slotUpdateSearch(QTreeWidgetItem *item, bool hidden) +{ + if (!hidden) { + if (item->data(0, Qt::UserRole).toInt() == type_combo->currentIndex()) { + if (item->parent()) + item->parent()->setHidden(false); + } else { + if (type_combo->currentIndex() != 0) + item->setHidden(true); + } + } +} + +void EffectsListView::slotAutoExpand(QString text) +{ + search_effect->updateSearch(); + + for (int i = 0; i < m_effectsList->topLevelItemCount(); ++i) { + QTreeWidgetItem *folder = m_effectsList->topLevelItem(i); + bool expandFolder = false; + /*if (folder->isHidden()) + continue;*/ + if (!text.isEmpty()) { + for (int j = 0; j < folder->childCount(); j++) { + QTreeWidgetItem *item = folder->child(j); + if (!item->isHidden()) + expandFolder = true; + } + } + folder->setExpanded(expandFolder); + } } #include "effectslistview.moc"