1 /***************************************************************************
2 * Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org) *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, write to the *
16 * Free Software Foundation, Inc., *
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
18 ***************************************************************************/
21 #include "effectslistview.h"
22 #include "effectslistwidget.h"
23 #include "effectslist.h"
24 #include "kdenlivesettings.h"
28 #include <KStandardDirs>
33 EffectsListView::EffectsListView(QWidget *parent) :
38 QString styleSheet = "QTreeView::branch:has-siblings:!adjoins-item{border-image:none;border:0px} \
39 QTreeView::branch:has-siblings:adjoins-item {border-image: none;border:0px} \
40 QTreeView::branch:!has-children:!has-siblings:adjoins-item {border-image: none;border:0px} \
41 QTreeView::branch:has-children:!has-siblings:closed,QTreeView::branch:closed:has-children:has-siblings { \
42 border-image: none;image: url(:/images/stylesheet-branch-closed.png);} \
43 QTreeView::branch:open:has-children:!has-siblings,QTreeView::branch:open:has-children:has-siblings { \
44 border-image: none;image: url(:/images/stylesheet-branch-open.png);}";
46 QMenu *contextMenu = new QMenu(this);
47 m_effectsList = new EffectsListWidget(contextMenu);
48 m_effectsList->setStyleSheet(styleSheet);
49 QVBoxLayout *lyr = new QVBoxLayout(effectlistframe);
50 lyr->addWidget(m_effectsList);
51 lyr->setContentsMargins(0, 0, 0, 0);
52 search_effect->setTreeWidget(m_effectsList);
53 search_effect->setToolTip(i18n("Search in the effect list"));
55 int size = style()->pixelMetric(QStyle::PM_SmallIconSize);
56 QSize iconSize(size, size);
57 buttonInfo->setIcon(KIcon("help-about"));
58 buttonInfo->setToolTip(i18n("Show/Hide the effect description"));
59 buttonInfo->setIconSize(iconSize);
60 setFocusPolicy(Qt::StrongFocus);
61 setFocusProxy(search_effect);
62 m_effectsList->setFocusProxy(search_effect);
64 if (KdenliveSettings::showeffectinfo())
65 buttonInfo->setDown(true);
69 contextMenu->addAction(KIcon("edit-delete"), i18n("Delete effect"), this, SLOT(slotRemoveEffect()));
71 connect(type_combo, SIGNAL(currentIndexChanged(int)), this, SLOT(filterList(int)));
72 connect(buttonInfo, SIGNAL(clicked()), this, SLOT(showInfoPanel()));
73 connect(m_effectsList, SIGNAL(itemSelectionChanged()), this, SLOT(slotUpdateInfo()));
74 connect(m_effectsList, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this, SLOT(slotEffectSelected()));
75 connect(search_effect, SIGNAL(hiddenChanged(QTreeWidgetItem *, bool)), this, SLOT(slotUpdateSearch(QTreeWidgetItem *, bool)));
76 connect(search_effect, SIGNAL(textChanged(QString)), this, SLOT(slotAutoExpand(QString)));
77 //m_effectsList->setCurrentRow(0);
80 void EffectsListView::filterList(int pos)
82 for (int i = 0; i < m_effectsList->topLevelItemCount(); i++) {
83 QTreeWidgetItem *folder = m_effectsList->topLevelItem(i);
84 bool hideFolder = true;
85 for (int j = 0; j < folder->childCount(); j++) {
86 QTreeWidgetItem *item = folder->child(j);
87 if (pos == 0 || pos == item->data(0, Qt::UserRole).toInt()) {
88 item->setHidden(false);
91 item->setHidden(true);
94 // do not hide the folder if it's empty but "All" is selected
97 folder->setHidden(hideFolder);
99 // make sure we don't show anything not matching the search expression
100 search_effect->updateSearch();
103 /*item = m_effectsList->currentItem();
105 if (item->isHidden()) {
107 for (i = 0; i < m_effectsList->count() && m_effectsList->item(i)->isHidden(); i++); //do nothing
108 m_effectsList->setCurrentRow(i);
109 } else m_effectsList->scrollToItem(item);
113 void EffectsListView::showInfoPanel()
115 bool show = !infopanel->isVisible();
116 infopanel->setVisible(show);
117 buttonInfo->setDown(show);
118 KdenliveSettings::setShoweffectinfo(show);
121 void EffectsListView::slotEffectSelected()
123 QDomElement effect = m_effectsList->currentEffect();
124 QTreeWidgetItem* item=m_effectsList->currentItem();
125 if (item && m_effectsList->indexOfTopLevelItem(item)!=-1){
126 item->setExpanded(!item->isExpanded());
128 if (!effect.isNull())
129 emit addEffect(effect);
132 void EffectsListView::slotUpdateInfo()
134 infopanel->setText(m_effectsList->currentInfo());
137 void EffectsListView::reloadEffectList(QMenu *effectsMenu, KActionCategory *effectActions)
139 m_effectsList->initList(effectsMenu, effectActions);
142 void EffectsListView::slotRemoveEffect()
144 QTreeWidgetItem *item = m_effectsList->currentItem();
145 QString effectId = item->text(0);
146 QString path = KStandardDirs::locateLocal("appdata", "effects/", true);
148 QDir directory = QDir(path);
151 const QStringList fileList = directory.entryList(filter, QDir::Files);
153 foreach(const QString &filename, fileList) {
154 itemName = KUrl(path + filename).path();
156 QFile file(itemName);
157 doc.setContent(&file, false);
159 QDomNodeList effects = doc.elementsByTagName("effect");
160 if (effects.count() != 1) {
161 kDebug() << "More than one effect in file " << itemName << ", NOT SUPPORTED YET";
163 QDomElement e = effects.item(0).toElement();
164 if (e.attribute("id") == effectId) {
165 QFile::remove(itemName);
170 emit reloadEffects();
173 void EffectsListView::slotUpdateSearch(QTreeWidgetItem *item, bool hidden)
176 if (item->data(0, Qt::UserRole).toInt() == type_combo->currentIndex()) {
178 item->parent()->setHidden(false);
180 if (type_combo->currentIndex() != 0)
181 item->setHidden(true);
186 void EffectsListView::slotAutoExpand(QString text)
188 search_effect->updateSearch();
190 for (int i = 0; i < m_effectsList->topLevelItemCount(); ++i) {
191 QTreeWidgetItem *folder = m_effectsList->topLevelItem(i);
192 bool expandFolder = false;
193 /*if (folder->isHidden())
195 if (!text.isEmpty()) {
196 for (int j = 0; j < folder->childCount(); j++) {
197 QTreeWidgetItem *item = folder->child(j);
198 if (!item->isHidden())
202 folder->setExpanded(expandFolder);
206 #include "effectslistview.moc"