]> git.sesse.net Git - kdenlive/commitdiff
Effects context menu: use submenu structure similar to effects list widget folders
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 21 Feb 2011 23:04:43 +0000 (23:04 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 21 Feb 2011 23:04:43 +0000 (23:04 +0000)
svn path=/trunk/kdenlive/; revision=5448

src/effectslistview.cpp
src/effectslistview.h
src/effectslistwidget.cpp
src/effectslistwidget.h
src/kdenliveui.rc
src/mainwindow.cpp
src/mainwindow.h

index 7e10b3227fb88cdee0c7e74d3b12f274b901f0aa..9935394c1b445ba3c5db0a10fc2a6292e3766b48 100644 (file)
@@ -35,8 +35,8 @@ EffectsListView::EffectsListView(QWidget *parent) :
 {
     setupUi(this);
 
-    QMenu *menu = new QMenu(this);
-    m_effectsList = new EffectsListWidget(menu);
+    QMenu *contextMenu = new QMenu(this);
+    m_effectsList = new EffectsListWidget(contextMenu);
     QVBoxLayout *lyr = new QVBoxLayout(effectlistframe);
     lyr->addWidget(m_effectsList);
     lyr->setContentsMargins(0, 0, 0, 0);
@@ -53,7 +53,7 @@ EffectsListView::EffectsListView(QWidget *parent) :
     else
         infopanel->hide();
 
-    menu->addAction(KIcon("edit-delete"), i18n("Delete effect"), this, SLOT(slotRemoveEffect()));
+    contextMenu->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()));
@@ -121,9 +121,9 @@ void EffectsListView::slotUpdateInfo()
     infopanel->setText(m_effectsList->currentInfo());
 }
 
-void EffectsListView::reloadEffectList()
+void EffectsListView::reloadEffectList(QMenu *effectsMenu, KActionCategory *effectActions)
 {
-    m_effectsList->initList();
+    m_effectsList->initList(effectsMenu, effectActions);
 }
 
 void EffectsListView::slotRemoveEffect()
index 4970bb164d63fbac19820b78f10ea44619e9b383..3fd0f89f277095ca55c94014cf5ad53ff1c245ac 100644 (file)
@@ -32,6 +32,7 @@
 class EffectsList;
 class EffectsListWidget;
 class QTreeWidget;
+class KActionCategory;
 
 /**
  * @class EffectsListView
@@ -47,7 +48,8 @@ public:
     EffectsListView(QWidget *parent = 0);
 
     /** @brief Re-initializes the list of effects. */
-    void reloadEffectList();
+    void reloadEffectList(QMenu *effectsMenu, KActionCategory *effectActions);
+    QMenu* getEffectsMenu();
     //void slotAddEffect(GenTime pos, int track, QString name);
 
 private:
index 10c0d315194287cb2761a9bdfc9a8a75111f212e..350d0851f2b8e73570a1ab2490f49f5b14076fc9 100644 (file)
@@ -24,6 +24,7 @@
 
 #include <KDebug>
 #include <KStandardDirs>
+#include <KAction>
 
 #include <QApplication>
 #include <QMouseEvent>
@@ -39,9 +40,9 @@ const int TypeRole = Qt::UserRole;
 const int IdRole = TypeRole + 1;
 
 
-EffectsListWidget::EffectsListWidget(QMenu *menu, QWidget *parent) :
+EffectsListWidget::EffectsListWidget(QMenu *contextMenu, QWidget *parent) :
         QTreeWidget(parent),
-        m_menu(menu)
+        m_menu(contextMenu)
 {
     setColumnCount(1);
     setDragEnabled(true);
@@ -55,7 +56,6 @@ EffectsListWidget::EffectsListWidget(QMenu *menu, QWidget *parent) :
     QPalette p = palette();
     p.setBrush(QPalette::Base, Qt::NoBrush);
     setPalette(p);
-    initList();
     connect(this, SIGNAL(activated(const QModelIndex &)), this, SLOT(slotExpandItem(const QModelIndex &)));
 }
 
@@ -68,13 +68,14 @@ void EffectsListWidget::slotExpandItem(const QModelIndex & index)
     setExpanded(index, !isExpanded(index));
 }
 
-void EffectsListWidget::initList()
+void EffectsListWidget::initList(QMenu *effectsMenu, KActionCategory *effectActions)
 {
     QString current;
     QString currentFolder;
     QTreeWidgetItem *item = NULL;
     bool found = false;
-
+    effectsMenu->clear();
+    
     if (currentItem()) {
         current = currentItem()->text(0);
         if (currentItem()->parent())
@@ -94,7 +95,7 @@ void EffectsListWidget::initList()
     QStringList folderNames;
     QDomNodeList groups = doc.documentElement().elementsByTagName("group");
     for (int i = 0; i < groups.count(); i++) {
-        folderNames << groups.at(i).firstChild().firstChild().nodeValue();
+        folderNames << i18n(groups.at(i).firstChild().firstChild().nodeValue().toUtf8().constData());
     }
     for (int i = 0; i < topLevelItemCount(); i++) {
         topLevelItem(i)->takeChildren();
@@ -165,6 +166,20 @@ void EffectsListWidget::initList()
     }
     setSortingEnabled(true);
     sortByColumn(0, Qt::AscendingOrder);
+
+    // populate effects menu
+    for (int i = 0; i < topLevelItemCount(); i++) {
+        QMenu *sub = new QMenu(topLevelItem(i)->text(0), effectsMenu);
+        effectsMenu->addMenu(sub);
+        for (int j = 0; j < topLevelItem(i)->childCount(); j++) {
+                QTreeWidgetItem *item = topLevelItem(i)->child(j);
+                KAction *a = new KAction(KIcon(item->icon(0)), item->text(0), sub);
+                a->setData(item->data(0, IdRole));
+                a->setIconVisibleInMenu(false);
+                sub->addAction(a);
+                effectActions->addAction("video_effect_" + item->text(0), a);
+        }
+    }
 }
 
 void EffectsListWidget::loadEffects(const EffectsList *effectlist, KIcon icon, QTreeWidgetItem *defaultFolder, const QList<QTreeWidgetItem *> *folders, const QString type, const QString current, bool *found)
@@ -176,6 +191,7 @@ void EffectsListWidget::loadEffects(const EffectsList *effectlist, KIcon icon, Q
 
     for (int ix = 0; ix < ct; ix ++) {
         effectInfo = effectlist->effectIdInfo(ix);
+        effectInfo.append(type);
         parentItem = NULL;
 
         if (folders) {
index 04ee8544612f86866097c1fff271de5842499431..9f8ac428186dc9340217e76bec6d1c7adc945d4d 100644 (file)
@@ -24,6 +24,8 @@
 #include <QTreeWidget>
 #include <QDomElement>
 
+#include <KActionCategory>
+
 class EffectsList;
 class KIcon;
 
@@ -32,12 +34,12 @@ class EffectsListWidget : public QTreeWidget
     Q_OBJECT
 
 public:
-    explicit EffectsListWidget(QMenu *menu, QWidget *parent = 0);
+    explicit EffectsListWidget(QMenu *contextMenu, QWidget *parent = 0);
     virtual ~EffectsListWidget();
     const QDomElement currentEffect() const;
     QString currentInfo();
     const QDomElement itemEffect(QTreeWidgetItem *item) const;
-    void initList();
+    void initList(QMenu *effectsMenu, KActionCategory *effectActions);
 
 protected:
     virtual void dragMoveEvent(QDragMoveEvent *event);
index d173667c9987aa359e0c20d80103bdf7ad5865be..c0fb9ba2959ba9439be17a6439e21cc3507bba90 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
-<gui name="kdenlive" version="59">
+<gui name="kdenlive" version="60">
   <ToolBar name="extraToolBar" >
     <text>Extra Toolbar</text>
        <Action name="project_render" />
       <Action name="group_clip" />
       <Action name="ungroup_clip" />
       <Separator />
-      <Menu name="video_effects_menu" ><text>Add Video Effect</text>
-      </Menu>
-      <Menu name="audio_effects_menu" ><text>Add Audio Effect</text>
-      </Menu>
-      <Menu name="custom_effects_menu" ><text>Add Custom Effect</text>
+      <Menu name="video_effects_menu" ><text>Add Effect</text>
       </Menu>
          <Separator />
                <Action name="show_video_thumbs" />
index 5c36eb9ada3da9d9fc16bd7253f33cbc0cbf6e54..1b3ffe253a6d9607550dbee84feba00c0c522f43 100644 (file)
@@ -485,33 +485,18 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString &
     connect(themesMenu, SIGNAL(triggered(QAction *)), this, SLOT(slotChangePalette(QAction*)));
 
     // Setup and fill effects and transitions menus.
-    m_videoEffectsMenu = static_cast<QMenu*>(factory()->container("video_effects_menu", this));
-    for (int i = 0; i < videoEffects.count(); ++i)
-        m_videoEffectsMenu->addAction(m_videoEffects[i]);
-    m_audioEffectsMenu = static_cast<QMenu*>(factory()->container("audio_effects_menu", this));
-    for (int i = 0; i < audioEffects.count(); ++i)
-        m_audioEffectsMenu->addAction(m_audioEffects[i]);
-    m_customEffectsMenu = static_cast<QMenu*>(factory()->container("custom_effects_menu", this));
-    if (customEffects.isEmpty())
-        m_customEffectsMenu->setEnabled(false);
-    else
-        m_customEffectsMenu->setEnabled(true);
-    for (int i = 0; i < customEffects.count(); ++i)
-        m_customEffectsMenu->addAction(m_customEffects[i]);
+    m_effectsMenu = static_cast<QMenu*>(factory()->container("video_effects_menu", this));
+    m_effectActions = new KActionCategory(i18n("Effects"), actionCollection());
+    m_effectList->reloadEffectList(m_effectsMenu, m_effectActions);
+
     m_transitionsMenu = new QMenu(i18n("Add Transition"), this);
     for (int i = 0; i < transitions.count(); ++i)
         m_transitionsMenu->addAction(m_transitions[i]);
 
-    connect(m_videoEffectsMenu, SIGNAL(triggered(QAction *)), this, SLOT(slotAddVideoEffect(QAction *)));
-    connect(m_audioEffectsMenu, SIGNAL(triggered(QAction *)), this, SLOT(slotAddAudioEffect(QAction *)));
-    connect(m_customEffectsMenu, SIGNAL(triggered(QAction *)), this, SLOT(slotAddCustomEffect(QAction *)));
+    connect(m_effectsMenu, SIGNAL(triggered(QAction *)), this, SLOT(slotAddVideoEffect(QAction *)));
     connect(m_transitionsMenu, SIGNAL(triggered(QAction *)), this, SLOT(slotAddTransition(QAction *)));
 
-    QMenu *newEffect = new QMenu(this);
-    newEffect->addMenu(m_videoEffectsMenu);
-    newEffect->addMenu(m_audioEffectsMenu);
-    newEffect->addMenu(m_customEffectsMenu);
-    m_effectStack->setMenu(newEffect);
+    m_effectStack->setMenu(m_effectsMenu);
 
     QMenu *viewMenu = static_cast<QMenu*>(factory()->container("dockwindows", this));
     const QList<QAction *> viewActions = createPopupMenu()->actions();
@@ -543,9 +528,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString &
     m_timelineContextClipMenu->addMenu(markersMenu);
     m_timelineContextClipMenu->addSeparator();
     m_timelineContextClipMenu->addMenu(m_transitionsMenu);
-    m_timelineContextClipMenu->addMenu(m_videoEffectsMenu);
-    m_timelineContextClipMenu->addMenu(m_audioEffectsMenu);
-    m_timelineContextClipMenu->addMenu(m_customEffectsMenu);
+    m_timelineContextClipMenu->addMenu(m_effectsMenu);
 
     m_timelineContextTransitionMenu->addAction(actionCollection()->action("edit_item_duration"));
     m_timelineContextTransitionMenu->addAction(actionCollection()->action("delete_item"));
@@ -760,26 +743,8 @@ void MainWindow::readProperties(const KConfigGroup &config)
 
 void MainWindow::slotReloadEffects()
 {
-    m_customEffectsMenu->clear();
     initEffects::parseCustomEffectsFile();
-    QAction *action;
-    QStringList effectInfo;
-    QMap<QString, QStringList> effectsList;
-    for (int ix = 0; ix < customEffects.count(); ix++) {
-        effectInfo = customEffects.effectIdInfo(ix);
-        effectsList.insert(effectInfo.at(0).toLower(), effectInfo);
-    }
-    if (effectsList.isEmpty())
-        m_customEffectsMenu->setEnabled(false);
-    else
-        m_customEffectsMenu->setEnabled(true);
-
-    foreach(const QStringList & value, effectsList) {
-        action = new QAction(value.at(0), this);
-        action->setData(value);
-        m_customEffectsMenu->addAction(action);
-    }
-    m_effectList->reloadEffectList();
+    m_effectList->reloadEffectList(m_effectsMenu, m_effectActions);
 }
 
 #ifndef NO_JOGSHUTTLE
@@ -1616,36 +1581,6 @@ void MainWindow::setupActions()
 
     // Setup effects and transitions actions.
     m_effectsActionCollection = new KActionCollection(this, KGlobal::mainComponent());
-    //KActionCategory *videoEffectActions = new KActionCategory(i18n("Video Effects"), m_effectsActionCollection);
-    KActionCategory *videoEffectActions = new KActionCategory(i18n("Video Effects"), collection);
-    m_videoEffects = new KAction*[videoEffects.count()];
-    for (int i = 0; i < videoEffects.count(); ++i) {
-        QStringList effectInfo = videoEffects.effectIdInfo(i);
-        m_videoEffects[i] = new KAction(KIcon("kdenlive-show-video"), effectInfo.at(0), this);
-        m_videoEffects[i]->setData(effectInfo);
-        m_videoEffects[i]->setIconVisibleInMenu(false);
-        videoEffectActions->addAction("video_effect_" + effectInfo.at(0), m_videoEffects[i]);
-    }
-    //KActionCategory *audioEffectActions = new KActionCategory(i18n("Audio Effects"), m_effectsActionCollection);
-    KActionCategory *audioEffectActions = new KActionCategory(i18n("Audio Effects"), collection);
-    m_audioEffects = new KAction*[audioEffects.count()];
-    for (int i = 0; i < audioEffects.count(); ++i) {
-        QStringList effectInfo = audioEffects.effectIdInfo(i);
-        m_audioEffects[i] = new KAction(KIcon("kdenlive-show-audio"), effectInfo.at(0), this);
-        m_audioEffects[i]->setData(effectInfo);
-        m_audioEffects[i]->setIconVisibleInMenu(false);
-        audioEffectActions->addAction("audio_effect_" + effectInfo.at(0), m_audioEffects[i]);
-    }
-    //KActionCategory *customEffectActions = new KActionCategory(i18n("Custom Effects"), m_effectsActionCollection);
-    KActionCategory *customEffectActions = new KActionCategory(i18n("Custom Effects"), collection);
-    m_customEffects = new KAction*[customEffects.count()];
-    for (int i = 0; i < customEffects.count(); ++i) {
-        QStringList effectInfo = customEffects.effectIdInfo(i);
-        m_customEffects[i] = new KAction(KIcon("kdenlive-custom-effect"), effectInfo.at(0), this);
-        m_customEffects[i]->setData(effectInfo);
-        m_customEffects[i]->setIconVisibleInMenu(false);
-        customEffectActions->addAction("custom_effect_" + effectInfo.at(0), m_customEffects[i]);
-    }
     //KActionCategory *transitionActions = new KActionCategory(i18n("Transitions"), m_effectsActionCollection);
     KActionCategory *transitionActions = new KActionCategory(i18n("Transitions"), collection);
     m_transitions = new KAction*[transitions.count()];
@@ -3017,10 +2952,19 @@ void MainWindow::slotAddTransition(QAction *result)
 void MainWindow::slotAddVideoEffect(QAction *result)
 {
     if (!result) return;
+    const int EFFECT_VIDEO = 1;
+    const int EFFECT_AUDIO = 2;
     QStringList info = result->data().toStringList();
-    if (info.isEmpty()) return;
-    QDomElement effect = videoEffects.getEffectByTag(info.at(1), info.at(2));
-    slotAddEffect(effect);
+    if (info.isEmpty() || info.size() < 3) return;
+    QDomElement effect ;
+    if (info.at(2) == QString::number((int) EFFECT_VIDEO))
+            effect = videoEffects.getEffectByTag(info.at(0), info.at(1));
+    else if (info.at(2) == QString::number((int) EFFECT_AUDIO))
+            effect = audioEffects.getEffectByTag(info.at(0), info.at(1));
+    else
+            effect = customEffects.getEffectByTag(info.at(0), info.at(1));
+    if (!effect.isNull()) slotAddEffect(effect);
+    else m_messageLabel->setMessage(i18n("Cannot find effect %1 / %2").arg(info.at(0)).arg(info.at(1)), ErrorMessage);
 }
 
 void MainWindow::slotAddAudioEffect(QAction *result)
index 6b6983285fefe72cdbb0768b71a02eac64cf2335..7b4e2e2f5d988352719235d218457f99ce229d66 100644 (file)
@@ -197,9 +197,8 @@ private:
     QList <QDockWidget *> m_gfxScopesList;
     QList <AbstractAudioScopeWidget *> m_audioScopesList;
 
-    QMenu *m_videoEffectsMenu;
-    QMenu *m_audioEffectsMenu;
-    QMenu *m_customEffectsMenu;
+    KActionCategory *m_effectActions;
+    QMenu *m_effectsMenu;
     QMenu *m_transitionsMenu;
     QMenu *m_timelineContextMenu;
     QMenu *m_timelineContextClipMenu;