+ QTreeWidgetItem *audio = findFolder(i18n("Audio"));
+ if (audio == NULL) {
+ audio = new QTreeWidgetItem((QTreeWidget*)0, QStringList(i18n("Audio")));
+ audio->setData(0, TypeRole, QString::number((int) EFFECT_FOLDER));
+ audio->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
+ insertTopLevelItem(0, audio);
+ }
+
+ QTreeWidgetItem *custom = findFolder(i18nc("Folder Name", "Custom"));
+ if (custom == NULL) {
+ custom = new QTreeWidgetItem((QTreeWidget*)0, QStringList(i18nc("Folder Name", "Custom")));
+ custom->setData(0, TypeRole, QString::number((int) EFFECT_FOLDER));
+ custom->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
+ insertTopLevelItem(0, custom);
+ }
+
+ //insertTopLevelItems(0, folders);
+
+ loadEffects(&MainWindow::videoEffects, KIcon("kdenlive-show-video"), misc, &folders, EFFECT_VIDEO, current, &found);
+ loadEffects(&MainWindow::audioEffects, KIcon("kdenlive-show-audio"), audio, &folders, EFFECT_AUDIO, current, &found);
+ loadEffects(&MainWindow::customEffects, KIcon("kdenlive-custom-effect"), custom, static_cast<QList<QTreeWidgetItem *> *>(0), EFFECT_CUSTOM, current, &found);
+
+ if (!found && !currentFolder.isEmpty()) {
+ // previously selected effect was removed, focus on its parent folder
+ for (int i = 0; i < topLevelItemCount(); ++i) {
+ if (topLevelItem(i)->text(0) == currentFolder) {
+ setCurrentItem(topLevelItem(i));
+ break;
+ }
+ }
+
+ }
+ setSortingEnabled(true);
+ sortByColumn(0, Qt::AscendingOrder);
+
+ // populate effects menu
+ QMenu *sub1 = NULL;
+ QMenu *sub2 = NULL;
+ QMenu *sub3 = NULL;
+ QMenu *sub4 = NULL;
+ for (int i = 0; i < topLevelItemCount(); ++i) {
+ if (!topLevelItem(i)->childCount())
+ continue;
+ QMenu *sub = new QMenu(topLevelItem(i)->text(0), effectsMenu);
+ effectsMenu->addMenu(sub);
+ int effectsInCategory = topLevelItem(i)->childCount();
+ bool hasSubCategories = false;
+ if (effectsInCategory > 60) {
+ // create subcategories if there are too many effects
+ hasSubCategories = true;
+ sub1 = new QMenu(i18nc("menu name for effects names between these 2 letters", "0 - F"), sub);
+ sub->addMenu(sub1);
+ sub2 = new QMenu(i18nc("menu name for effects names between these 2 letters", "G - L"), sub);
+ sub->addMenu(sub2);
+ sub3 = new QMenu(i18nc("menu name for effects names between these 2 letters", "M - R"), sub);
+ sub->addMenu(sub3);
+ sub4 = new QMenu(i18nc("menu name for effects names between these 2 letters", "S - Z"), sub);
+ sub->addMenu(sub4);
+ }
+ for (int j = 0; j < effectsInCategory; j++) {
+ QTreeWidgetItem *item = topLevelItem(i)->child(j);
+ KAction *a = new KAction(KIcon(item->icon(0)), item->text(0), sub);
+ QStringList data = item->data(0, IdRole).toStringList();
+ QString id = data.at(1);
+ if (id.isEmpty()) id = data.at(0);
+ a->setData(data);
+ a->setIconVisibleInMenu(false);
+ if (hasSubCategories) {
+ // put action in sub category
+ QRegExp rx("^[s-z].+");
+ if (rx.exactMatch(item->text(0).toLower())) {
+ sub4->addAction(a);
+ } else {
+ rx.setPattern("^[m-r].+");
+ if (rx.exactMatch(item->text(0).toLower())) {
+ sub3->addAction(a);
+ }
+ else {
+ rx.setPattern("^[g-l].+");
+ if (rx.exactMatch(item->text(0).toLower())) {
+ sub2->addAction(a);
+ }
+ else sub1->addAction(a);
+ }
+ }
+ }
+ else sub->addAction(a);
+ effectActions->addAction("video_effect_" + id, a);
+ }
+ }
+}
+
+void EffectsListWidget::loadEffects(const EffectsList *effectlist, KIcon icon, QTreeWidgetItem *defaultFolder, const QList<QTreeWidgetItem *> *folders, int type, const QString ¤t, bool *found)
+{
+ QStringList effectInfo, l;
+ QTreeWidgetItem *parentItem;
+ QTreeWidgetItem *item;
+ int ct = effectlist->count();
+
+
+ for (int ix = 0; ix < ct; ++ix) {
+ effectInfo = effectlist->effectIdInfo(ix);
+ effectInfo.append(QString::number(type));
+ parentItem = NULL;
+
+ if (folders) {
+ for (int i = 0; i < folders->count(); ++i) {
+ l = folders->at(i)->data(0, IdRole).toString().split(QLatin1Char(','), QString::SkipEmptyParts);
+ if (l.contains(effectInfo.at(2))) {
+ parentItem = folders->at(i);
+ break;
+ }
+ }
+ }
+ if (parentItem == NULL)
+ parentItem = defaultFolder;
+