X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Feffectslistwidget.cpp;h=96ea03270c5a9b59856663d5360dd05874d3f366;hb=591eb366710ee4c26456453c2b8a05185752a3d6;hp=e8cdfa6dcf508015ea0d1079d2b8d30870fef489;hpb=104b3b6ac0ccbdb94b3097c97cd01a7e31afbbbe;p=kdenlive diff --git a/src/effectslistwidget.cpp b/src/effectslistwidget.cpp index e8cdfa6d..96ea0327 100644 --- a/src/effectslistwidget.cpp +++ b/src/effectslistwidget.cpp @@ -17,60 +17,126 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ -#include "QApplication" -#include "QMouseEvent" -#include - -#include "KDebug" #include "effectslistwidget.h" #include "effectslist.h" #include "mainwindow.h" +#include "KDebug" + +#include "QApplication" +#include "QMouseEvent" +#include + + static const int EFFECT_VIDEO = 1; static const int EFFECT_AUDIO = 2; static const int EFFECT_CUSTOM = 3; +static const int EFFECT_FOLDER = 4; const int TypeRole = Qt::UserRole; const int IdRole = TypeRole + 1; -EffectsListWidget::EffectsListWidget(QMenu *menu, QWidget *parent) - : KListWidget(parent), m_menu(menu) { +EffectsListWidget::EffectsListWidget(QMenu *menu, QWidget *parent) : + QTreeWidget(parent), + m_menu(menu) +{ //setSelectionMode(QAbstractItemView::ExtendedSelection); //setDragDropMode(QAbstractItemView::DragDrop); + setColumnCount(1); setDropIndicatorShown(true); setAlternatingRowColors(true); - setSortingEnabled(true); setDragEnabled(true); setAcceptDrops(true); + setHeaderHidden(true); initList(); } -EffectsListWidget::~EffectsListWidget() { +EffectsListWidget::~EffectsListWidget() +{ } -void EffectsListWidget::initList() { +void EffectsListWidget::initList() +{ clear(); - QListWidgetItem *item; + QTreeWidgetItem *item; + QTreeWidgetItem *parentItem; QString effectName; QStringList effectInfo; + KIcon videoIcon("kdenlive-show-video"); + KIcon audioIcon("kdenlive-show-audio"); + KIcon customIcon("kdenlive-custom-effect"); + KIcon folderIcon("folder"); + + KSharedConfigPtr config = KSharedConfig::openConfig("kdenliveeffectscategoryrc"); + KConfigGroup transConfig(config, "Category"); + // read the entries + QMap< QString, QString > profiles = transConfig.entryMap(); + QMapIterator i(profiles); + QList folders; + while (i.hasNext()) { + i.next(); + item = new QTreeWidgetItem((QTreeWidget*)0, QStringList(i18n(i.key().toUtf8().data()))); + item->setIcon(0, folderIcon); + item->setData(0, TypeRole, QString::number((int) EFFECT_FOLDER)); + item->setData(0, IdRole, i.value()); + folders.append(item); + } + QTreeWidgetItem *misc = new QTreeWidgetItem((QTreeWidget*)0, QStringList(i18n("Misc"))); + misc->setIcon(0, folderIcon); + misc->setData(0, TypeRole, QString::number((int) EFFECT_FOLDER)); + + QTreeWidgetItem *audio = new QTreeWidgetItem((QTreeWidget*)0, QStringList(i18n("Audio"))); + audio->setIcon(0, folderIcon); + audio->setData(0, TypeRole, QString::number((int) EFFECT_FOLDER)); + + QTreeWidgetItem *custom = new QTreeWidgetItem((QTreeWidget*)0, QStringList(i18n("Custom"))); + custom->setIcon(0, folderIcon); + custom->setData(0, TypeRole, QString::number((int) EFFECT_FOLDER)); + + insertTopLevelItem(0, custom); + insertTopLevelItem(0, misc); + insertTopLevelItem(0, audio); + insertTopLevelItems(0, folders); + + int ct = MainWindow::videoEffects.count(); for (int ix = 0; ix < ct; ix ++) { effectInfo = MainWindow::videoEffects.effectIdInfo(ix); + parentItem = NULL; + for (int i = 0; i < folders.count(); i++) { + QStringList l = folders.at(i)->data(0, IdRole).toString().split(',', QString::SkipEmptyParts); + if (l.contains(effectInfo.at(2))) { + parentItem = folders.at(i); + break; + } + } + if (parentItem == NULL) parentItem = misc; if (!effectInfo.isEmpty()) { - item = new QListWidgetItem(effectInfo.takeFirst(), this); - item->setData(TypeRole, QString::number((int) EFFECT_VIDEO)); - item->setData(IdRole, effectInfo); + item = new QTreeWidgetItem(parentItem, QStringList(effectInfo.takeFirst())); + item->setIcon(0, videoIcon); + item->setData(0, TypeRole, QString::number((int) EFFECT_VIDEO)); + item->setData(0, IdRole, effectInfo); } } ct = MainWindow::audioEffects.count(); for (int ix = 0; ix < ct; ix ++) { effectInfo = MainWindow::audioEffects.effectIdInfo(ix); + parentItem = NULL; + for (int i = 0; i < folders.count(); i++) { + QStringList l = folders.at(i)->data(0, IdRole).toString().split(',', QString::SkipEmptyParts); + if (l.contains(effectInfo.at(2))) { + parentItem = folders.at(i); + break; + } + } + if (parentItem == NULL) parentItem = audio; if (!effectInfo.isEmpty()) { - item = new QListWidgetItem(effectInfo.takeFirst(), this); - item->setData(TypeRole, QString::number((int) EFFECT_AUDIO)); - item->setData(IdRole, effectInfo); + item = new QTreeWidgetItem(parentItem, QStringList(effectInfo.takeFirst())); + item->setIcon(0, audioIcon); + item->setData(0, TypeRole, QString::number((int) EFFECT_AUDIO)); + item->setData(0, IdRole, effectInfo); } } @@ -78,43 +144,49 @@ void EffectsListWidget::initList() { for (int ix = 0; ix < ct; ix ++) { effectInfo = MainWindow::customEffects.effectIdInfo(ix); if (!effectInfo.isEmpty()) { - item = new QListWidgetItem(effectInfo.takeFirst(), this); - item->setData(TypeRole, QString::number((int) EFFECT_CUSTOM)); - item->setData(IdRole, effectInfo); + item = new QTreeWidgetItem(custom, QStringList(effectInfo.takeFirst())); + item->setIcon(0, customIcon); + item->setData(0, TypeRole, QString::number((int) EFFECT_CUSTOM)); + item->setData(0, IdRole, effectInfo); } } + setSortingEnabled(true); + sortByColumn(0, Qt::AscendingOrder); } -QDomElement EffectsListWidget::currentEffect() { +const QDomElement EffectsListWidget::currentEffect() const +{ return itemEffect(currentItem()); } -QDomElement EffectsListWidget::itemEffect(QListWidgetItem *item) { +const QDomElement EffectsListWidget::itemEffect(QTreeWidgetItem *item) const +{ QDomElement effect; - if (!item) return effect; - QStringList effectInfo = item->data(IdRole).toStringList(); + if (!item || item->data(0, TypeRole).toInt() == (int)EFFECT_FOLDER) return effect; + QStringList effectInfo = item->data(0, IdRole).toStringList(); kDebug() << "// EFFECT SELECTED: " << effectInfo; - switch (item->data(TypeRole).toInt()) { + switch (item->data(0, TypeRole).toInt()) { case 1: - effect = MainWindow::videoEffects.getEffectByTag(effectInfo.at(0), effectInfo.at(1)); + effect = MainWindow::videoEffects.getEffectByTag(effectInfo.at(0), effectInfo.at(1)).cloneNode().toElement(); break; case 2: - effect = MainWindow::audioEffects.getEffectByTag(effectInfo.at(0), effectInfo.at(1)); + effect = MainWindow::audioEffects.getEffectByTag(effectInfo.at(0), effectInfo.at(1)).cloneNode().toElement(); break; default: - effect = MainWindow::customEffects.getEffectByTag(effectInfo.at(0), effectInfo.at(1)); + effect = MainWindow::customEffects.getEffectByTag(effectInfo.at(0), effectInfo.at(1)).cloneNode().toElement(); break; } return effect; } -QString EffectsListWidget::currentInfo() { - QListWidgetItem *item = currentItem(); - if (!item) return QString(); +QString EffectsListWidget::currentInfo() +{ + QTreeWidgetItem *item = currentItem(); + if (!item || item->data(0, TypeRole).toInt() == (int)EFFECT_FOLDER) return QString(); QString info; - QStringList effectInfo = item->data(IdRole).toStringList(); - switch (item->data(TypeRole).toInt()) { + QStringList effectInfo = item->data(0, IdRole).toStringList(); + switch (item->data(0, TypeRole).toInt()) { case 1: info = MainWindow::videoEffects.getInfo(effectInfo.at(0), effectInfo.at(1)); break; @@ -129,30 +201,32 @@ QString EffectsListWidget::currentInfo() { } // virtual -void EffectsListWidget::mousePressEvent(QMouseEvent *event) { +void EffectsListWidget::mousePressEvent(QMouseEvent *event) +{ if (event->button() == Qt::LeftButton) { - this->m_DragStartPosition = event->pos(); + m_DragStartPosition = event->pos(); m_dragStarted = true; } - KListWidget::mousePressEvent(event); + QTreeWidget::mousePressEvent(event); } // virtual -void EffectsListWidget::mouseMoveEvent(QMouseEvent *event) { +void EffectsListWidget::mouseMoveEvent(QMouseEvent *event) +{ if (!m_dragStarted) return; if ((event->pos() - m_DragStartPosition).manhattanLength() < QApplication::startDragDistance()) return; { - QListWidgetItem *clickItem = itemAt(event->pos()); - if (clickItem) { + QTreeWidgetItem *clickItem = itemAt(event->pos()); + if (clickItem && clickItem->data(0, TypeRole).toInt() != (int)EFFECT_FOLDER) { QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; - const QList list = selectedItems(); + const QList list = selectedItems(); QDomDocument doc; - foreach(QListWidgetItem *item, list) { - QDomElement e = itemEffect(item); + foreach(QTreeWidgetItem *item, list) { + const QDomElement e = itemEffect(item); if (!e.isNull()) doc.appendChild(doc.importNode(e, true)); } QByteArray data; @@ -162,16 +236,15 @@ void EffectsListWidget::mouseMoveEvent(QMouseEvent *event) { //QPixmap pix = qVariantValue(clickItem->data(Qt::DecorationRole)); //drag->setPixmap(pix); //drag->setHotSpot(QPoint(0, 50)); - drag->start(Qt::MoveAction); + drag->start(Qt::CopyAction); } - //event->accept(); + event->accept(); } } -void EffectsListWidget::dragMoveEvent(QDragMoveEvent * event) { - event->setDropAction(Qt::IgnoreAction); - //if (item) { - event->setDropAction(Qt::MoveAction); +void EffectsListWidget::dragMoveEvent(QDragMoveEvent * event) +{ + event->setDropAction(Qt::CopyAction); if (event->mimeData()->hasText()) { event->acceptProposedAction(); } @@ -179,9 +252,10 @@ void EffectsListWidget::dragMoveEvent(QDragMoveEvent * event) { } //virtual -void EffectsListWidget::contextMenuEvent(QContextMenuEvent * event) { - QListWidgetItem *item = itemAt(event->pos()); - if (item && item->data(TypeRole).toInt() == EFFECT_CUSTOM) m_menu->popup(event->globalPos()); +void EffectsListWidget::contextMenuEvent(QContextMenuEvent * event) +{ + QTreeWidgetItem *item = itemAt(event->pos()); + if (item && item->data(0, TypeRole).toInt() == EFFECT_CUSTOM) m_menu->popup(event->globalPos()); } #include "effectslistwidget.moc"