]> git.sesse.net Git - kdenlive/commitdiff
* Small cmake cleanup
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 3 Jan 2009 19:51:35 +0000 (19:51 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 3 Jan 2009 19:51:35 +0000 (19:51 +0000)
* Introduce Kdenlive plugins, first example is a countdown generator (currently requires MLT's pango producer)

svn path=/branches/KDE4/; revision=2866

15 files changed:
CMakeLists.txt
plugins/CMakeLists.txt [new file with mode: 0644]
plugins/sampleplugin/CMakeLists.txt [new file with mode: 0644]
plugins/sampleplugin/countdown_ui.ui [new file with mode: 0644]
plugins/sampleplugin/sampleplugin.cpp [new file with mode: 0644]
plugins/sampleplugin/sampleplugin.h [new file with mode: 0644]
renderer/CMakeLists.txt
src/CMakeLists.txt
src/kdenliveui.rc
src/mainwindow.cpp
src/mainwindow.h
src/projectlist.cpp
src/projectlist.h
src/projectlistview.cpp
thumbnailer/CMakeLists.txt

index 028c10488dc2371a7b559b9063d6889c94439f6f..995fb8014c02cc1573b53b6e34ffd7bf098d7ced 100644 (file)
@@ -11,8 +11,7 @@ INCLUDE(FindGettext)
 include(MacroOptionalAddSubdirectory)
 set(catalogname kdenlive)
 
-add_definitions (${QT_DEFINITIONS} ${KDE4_DEFINITIONS})
-include_directories (${QDBUS_INCLUDE_DIRS}  ${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR} ${KDE4_INCLUDES} ${CMAKE_SOURCE_DIR}/widgets)
+add_definitions (${QT_DEFINITIONS})
 
 FIND_PACKAGE(LIBMLT REQUIRED)
 FIND_PACKAGE(LIBMLTPLUS REQUIRED)
@@ -28,6 +27,7 @@ find_program(XGETTEXT_EXECUTABLE xgettext)
 add_subdirectory(src src/cmake_bindir)
 add_subdirectory(renderer renderer/cmake_bindir)
 add_subdirectory(thumbnailer thumbnailer/cmake_bindir)
+add_subdirectory(plugins)
 add_subdirectory(effects)
 add_subdirectory(export) 
 add_subdirectory(icons)
diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt
new file mode 100644 (file)
index 0000000..fee66b1
--- /dev/null
@@ -0,0 +1,7 @@
+
+    INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src
+                        ${KDE4_INCLUDES}
+                        ${QT4_INCLUDES}
+                       )
+
+    ADD_SUBDIRECTORY(sampleplugin)
\ No newline at end of file
diff --git a/plugins/sampleplugin/CMakeLists.txt b/plugins/sampleplugin/CMakeLists.txt
new file mode 100644 (file)
index 0000000..279aaec
--- /dev/null
@@ -0,0 +1,27 @@
+
+include_directories (
+    ${CMAKE_SOURCE_DIR} 
+    ${CMAKE_BINARY_DIR}
+    ${CMAKE_CURRENT_BINARY_DIR}
+    ${KDE4_INCLUDES}
+)
+
+add_definitions( ${KDE4_DEFINITIONS} )
+
+#add_definitions (${QT_DEFINITIONS})
+ADD_DEFINITIONS(-DQT_PLUGIN)
+#ADD_DEFINITIONS(-DQT_NO_DEBUG)
+ADD_DEFINITIONS(-DQT_SHARED)
+
+kde4_add_ui_files(plugin_UI countdown_ui.ui)
+
+SET(sampleplugindir_SRCS
+        sampleplugin.cpp)
+
+KDE4_ADD_PLUGIN(kdenlive_sampleplugin WITH_PREFIX ${sampleplugindir_SRCS} ${plugin_UI})
+#ADD_LIBRARY(kdenlive_sampleplugin SHARED ${sampleplugindir_SRCS})
+
+TARGET_LINK_LIBRARIES(kdenlive_sampleplugin ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${KDE4_KDEUI_LIBS} ${KDE4_KDECORE_LIBS} ${KDE4_KIO_LIBS})
+
+INSTALL(TARGETS kdenlive_sampleplugin DESTINATION ${PLUGIN_INSTALL_DIR})
+
diff --git a/plugins/sampleplugin/countdown_ui.ui b/plugins/sampleplugin/countdown_ui.ui
new file mode 100644 (file)
index 0000000..ce36054
--- /dev/null
@@ -0,0 +1,115 @@
+<ui version="4.0" >
+ <class>CountDown_UI</class>
+ <widget class="QDialog" name="CountDown_UI" >
+  <property name="geometry" >
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>288</width>
+    <height>98</height>
+   </rect>
+  </property>
+  <property name="windowTitle" >
+   <string>Dialog</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout" >
+   <item row="0" column="0" >
+    <widget class="QLabel" name="label" >
+     <property name="text" >
+      <string>Save to</string>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="2" >
+    <widget class="KUrlRequester" name="path" />
+   </item>
+   <item row="1" column="0" >
+    <widget class="QLabel" name="label_2" >
+     <property name="text" >
+      <string>Duration (seconds)</string>
+     </property>
+    </widget>
+   </item>
+   <item row="3" column="0" colspan="3" >
+    <widget class="QDialogButtonBox" name="buttonBox" >
+     <property name="orientation" >
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons" >
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="0" >
+    <spacer name="verticalSpacer" >
+     <property name="orientation" >
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0" >
+      <size>
+       <width>20</width>
+       <height>40</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item row="1" column="2" >
+    <widget class="KIntSpinBox" name="duration" >
+     <property name="maximum" >
+      <number>10000</number>
+     </property>
+     <property name="value" >
+      <number>10</number>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>KIntSpinBox</class>
+   <extends>QSpinBox</extends>
+   <header>knuminput.h</header>
+  </customwidget>
+  <customwidget>
+   <class>KUrlRequester</class>
+   <extends>QFrame</extends>
+   <header>kurlrequester.h</header>
+  </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>CountDown_UI</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel" >
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel" >
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>CountDown_UI</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel" >
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel" >
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/plugins/sampleplugin/sampleplugin.cpp b/plugins/sampleplugin/sampleplugin.cpp
new file mode 100644 (file)
index 0000000..a816322
--- /dev/null
@@ -0,0 +1,81 @@
+/***************************************************************************
+ *   Copyright (C) 2009 by Jean-Baptiste Mardelle (jb@kdenlive.org)        *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA          *
+ ***************************************************************************/ 
+
+#include <QtGui>
+#include <QDialog>
+#include <QDomDocument>
+
+#include <KUrlRequester>
+#include <KIntSpinBox>
+#include <KDebug>
+#include <KMessageBox>
+
+#include "sampleplugin.h"
+#include "ui_countdown_ui.h"
+
+ QStringList SamplePlugin::generators() const
+ {
+     return QStringList() << tr("Countdown");
+ }
+
+
+KUrl SamplePlugin::generatedClip(const QString &generator, const KUrl &projectFolder, const QStringList &lumaNames, const QStringList &lumaFiles, const double fps, const int width, const int height) {
+    int ct = 0;
+    QString counter = QString::number(ct).rightJustified(5, '0', false);
+    while (QFile::exists(projectFolder.path() + "/counter" + counter + ".westley")) {
+        ct++;
+        counter = QString::number(ct).rightJustified(5, '0', false);
+    }
+    QDialog d;
+    d.setWindowTitle(tr("Create Countdown Clip"));
+    Ui::CountDown_UI view;
+    view.setupUi(&d);
+    QString clipFile = projectFolder.path() + "/counter" + counter + ".westley";
+    view.path->setPath(clipFile);
+    if (d.exec() == QDialog::Accepted) {
+       QDomDocument doc;
+       QDomElement westley = doc.createElement("westley");
+       QDomElement playlist = doc.createElement("playlist");
+       for (int i = 0; i < view.duration->value(); i++) {
+           // Create the producers
+           QDomElement prod = doc.createElement("producer");
+           prod.setAttribute("mlt_service", "pango");
+           prod.setAttribute("in", "0");
+           prod.setAttribute("out", QString::number((int) fps));
+           prod.setAttribute("markup", QString::number(view.duration->value() - i));
+           playlist.appendChild(prod);
+       }
+       westley.appendChild(playlist);
+       doc.appendChild(westley);
+       QFile file(view.path->url().path());
+       if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
+           kWarning() << "//////  ERROR writing to file: " << view.path->url().path();
+           KMessageBox::error(0, i18n("Cannot write to file %1", view.path->url().path()));
+           return KUrl();
+       }
+       QTextStream out(&file);
+       out << doc.toString();
+       file.close();
+       return view.path->url();
+    }
+    return KUrl();
+}
+
+Q_EXPORT_PLUGIN2(kdenlive_sampleplugin, SamplePlugin)
diff --git a/plugins/sampleplugin/sampleplugin.h b/plugins/sampleplugin/sampleplugin.h
new file mode 100644 (file)
index 0000000..50abc9d
--- /dev/null
@@ -0,0 +1,42 @@
+/***************************************************************************
+ *   Copyright (C) 2009 by Jean-Baptiste Mardelle (jb@kdenlive.org)        *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA          *
+ ***************************************************************************/ 
+
+#ifndef SAMPLEPLUGIN_H
+#define SAMPLEPLUGIN_H
+
+#include <QObject>
+#include <QStringList>
+#include <KUrl>
+
+#include "interfaces.h"
+
+class SamplePlugin : public QObject, public ClipGenerator
+{
+    Q_OBJECT
+    Q_INTERFACES(ClipGenerator)
+
+ public:
+     QStringList generators() const;
+     KUrl generatedClip(const QString &generator, const KUrl &projectFolder, const QStringList &lumaNames, const QStringList &lumaFiles, const double fps, const int width, const int height);
+ };
+
+
+ #endif
\ No newline at end of file
index de832e1c456749a2928b7876546fc6b52d606ddd..c7e4a738f5908b520e1fda4523d9e933e6f597ca 100644 (file)
@@ -1,5 +1,18 @@
 
+
+include_directories (
+    ${QDBUS_INCLUDE_DIRS}
+    ${KDE4_INCLUDES}
+    ${CMAKE_SOURCE_DIR} 
+    ${CMAKE_BINARY_DIR} 
+)
+
+LINK_LIBRARIES(
+${LIBMLT_LIBRARY}
+${LIBMLTPLUS_LIBRARY}
+${NEPOMUK_LIBRARIES}
+)
+
 set(kdenlive_render_SRCS 
   kdenlive_render.cpp
   renderjob.cpp
@@ -11,6 +24,6 @@ target_link_libraries(kdenlive_render
   ${QT_QTCORE_LIBRARY}
   ${QT_QTDBUS_LIBRARY}
 )
+
 install(TARGETS kdenlive_render DESTINATION ${BIN_INSTALL_DIR})
 
index 717781c51ef3a543aafef53622905211dde395c5..47516e016429858da56bf32b60a8cac2c92968e5 100644 (file)
@@ -4,7 +4,12 @@ add_subdirectory( mimetypes )
 
 find_package(Nepomuk REQUIRED)
 
-include_directories(
+include_directories (
+    ${QDBUS_INCLUDE_DIRS} 
+    ${CMAKE_SOURCE_DIR} 
+    ${CMAKE_BINARY_DIR} 
+    ${KDE4_INCLUDES}
+
     ${CMAKE_SOURCE_DIR}/src/widgets
     ${LIBMLT_INCLUDE_DIR}
     ${LIBMLTPLUS_INCLUDE_DIR}
@@ -139,6 +144,8 @@ set(kdenlive_SRCS
   movegroupcommand.cpp
 )
 
+add_definitions( ${KDE4_DEFINITIONS} )
+
 if(NO_JOGSHUTTLE)
   add_definitions(-DNO_JOGSHUTTLE)
 else(NO_JOGSHUTTLE)
index 070744a7b0454e8b0f2b8001149e86f17a2dcaa6..605ace0946b834e789208e238d6321354b5e967e 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
-<gui name="kdenlive" version="29">
+<gui name="kdenlive" version="30">
   <ToolBar name="extraToolBar" >
     <text>Extra Toolbar</text>
        <Action name="project_render" />
     </Menu>
     
     <Menu name="project" ><text>Project</text>
+      <Action name="add_clip" />
+      <Action name="add_color_clip" />
+      <Action name="add_slide_clip" />
+      <Action name="add_text_clip" />
+      <Action name="add_folder" /> 
+      <Menu name="generators" ><text>Generators</text>
+      </Menu>
+      <Separator />
       <Action name="project_render" />
       <Action name="project_settings" />
     </Menu>
index a206254548b28e9adc9279624b70d902d2326b55..dbae087ff82fe28b2520ab6136da12534a0a3f2b 100644 (file)
@@ -84,6 +84,8 @@
 #include "markerdialog.h"
 #include "clipitem.h"
 
+#include "interfaces.h"
+
 static const int ID_STATUS_MSG = 1;
 static const int ID_EDITMODE_MSG = 2;
 static const int ID_TIMELINE_MSG = 3;
@@ -211,10 +213,12 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent
     setCentralWidget(m_timelineArea);
 
     setupGUI();
+    loadPlugins();
     //kDebug() << factory() << " " << factory()->container("video_effects_menu", this);
 
     m_projectMonitor->setupMenu(static_cast<QMenu*>(factory()->container("monitor_go", this)), m_playZone, m_loopZone);
     m_clipMonitor->setupMenu(static_cast<QMenu*>(factory()->container("monitor_go", this)), m_playZone, m_loopZone, static_cast<QMenu*>(factory()->container("marker_menu", this)));
+    m_projectList->setupGeneratorMenu(static_cast<QMenu*>(factory()->container("generators", this)));
 
     // build effects menus
     QAction *action;
@@ -376,6 +380,78 @@ bool MainWindow::queryClose() {
     return true;
 }
 
+
+void MainWindow::loadPlugins() {
+    foreach (QObject *plugin, QPluginLoader::staticInstances())
+         populateMenus(plugin);
+
+    QStringList directories = KGlobal::dirs()->findDirs("module", QString());
+    QStringList filters;
+    filters << "libkdenlive*";
+    foreach(const QString &folder, directories) {
+       kDebug()<<"// PARSING FIOLER: "<<folder;
+       QDir pluginsDir(folder);
+       foreach (QString fileName, pluginsDir.entryList(filters, QDir::Files)) {
+           kDebug()<<"// FOUND PLUGIN: "<<fileName<<"= "<<pluginsDir.absoluteFilePath(fileName);
+           QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));
+           QObject *plugin = loader.instance();
+           if (plugin) {
+               populateMenus(plugin);
+               m_pluginFileNames += fileName;
+           }
+           else kDebug()<<"// ERROR LOADING PLUGIN: "<<fileName<<", "<<loader.errorString ();
+       }
+    }
+    //exit(1);
+}
+
+void MainWindow::populateMenus(QObject *plugin)
+{
+    kDebug()<<"// POP MENU";
+    QMenu *addMenu = static_cast<QMenu*>(factory()->container("generators", this));
+    ClipGenerator *iGenerator = qobject_cast<ClipGenerator *>(plugin);
+    kDebug()<<"// POP MENU 2";
+    if (addMenu) kDebug()<<"// POP MENU 3";
+    if (iGenerator)
+        addToMenu(plugin, iGenerator->generators(), addMenu, SLOT(generateClip()),
+                   NULL);
+}
+
+void MainWindow::addToMenu(QObject *plugin, const QStringList &texts,
+                            QMenu *menu, const char *member,
+                            QActionGroup *actionGroup)
+{
+    kDebug()<<"// ADD to MENU"<<texts;
+    foreach (QString text, texts) {
+        QAction *action = new QAction(text, plugin);
+        connect(action, SIGNAL(triggered()), this, member);
+        menu->addAction(action);
+
+        if (actionGroup) {
+            action->setCheckable(true);
+            actionGroup->addAction(action);
+        }
+    }
+}
+
+void MainWindow::aboutPlugins()
+{
+    //PluginDialog dialog(pluginsDir.path(), m_pluginFileNames, this);
+    //dialog.exec();
+}
+
+
+void MainWindow::generateClip()
+{
+    QAction *action = qobject_cast<QAction *>(sender());
+    ClipGenerator *iGenerator = qobject_cast<ClipGenerator *>(action->parent());
+
+    KUrl clipUrl = iGenerator->generatedClip(action->text(), m_activeDocument->projectFolder(), QStringList(), QStringList(), 25, 720, 576);
+    if (!clipUrl.isEmpty()) {
+       m_projectList->slotAddClip(clipUrl);
+    }
+}
+
 void MainWindow::saveProperties(KConfig*) {
     // save properties here,used by session management
     saveFile();
@@ -904,6 +980,36 @@ void MainWindow::setupActions() {
 
     connect(collection, SIGNAL(actionHovered(QAction*)),
             this, SLOT(slotDisplayActionMessage(QAction*)));
+
+
+    QAction *addClip = new KAction(KIcon("kdenlive-add-clip"), i18n("Add Clip"), this);
+    collection->addAction("add_clip", addClip);
+    connect(addClip , SIGNAL(triggered()), m_projectList, SLOT(slotAddClip()));
+
+    QAction *addColorClip = new KAction(KIcon("kdenlive-add-color-clip"), i18n("Add Color Clip"), this);
+    collection->addAction("add_color_clip", addColorClip);
+    connect(addColorClip , SIGNAL(triggered()), m_projectList, SLOT(slotAddColorClip()));
+
+    QAction *addSlideClip = new KAction(KIcon("kdenlive-add-slide-clip"), i18n("Add Slideshow Clip"), this);
+    collection->addAction("add_slide_clip", addSlideClip);
+    connect(addSlideClip , SIGNAL(triggered()), m_projectList, SLOT(slotAddSlideshowClip()));
+
+    QAction *addTitleClip = new KAction(KIcon("kdenlive-add-text-clip"), i18n("Add Title Clip"), this);
+    collection->addAction("add_text_clip", addTitleClip);
+    connect(addTitleClip , SIGNAL(triggered()), m_projectList, SLOT(slotAddTitleClip()));
+
+    QAction *addFolderButton = new KAction(KIcon("folder-new"), i18n("Create Folder"), this);
+    collection->addAction("add_folder", addFolderButton);
+    connect(addFolderButton , SIGNAL(triggered()), m_projectList, SLOT(slotAddFolder()));
+
+    QMenu *addClips = new QMenu();
+    addClips->addAction(addClip);
+    addClips->addAction(addColorClip);
+    addClips->addAction(addSlideClip);
+    addClips->addAction(addTitleClip);
+    addClips->addAction(addFolderButton);
+    m_projectList->setupMenu(addClips, addClip);
+
     //connect(collection, SIGNAL( clearStatusText() ),
     //statusBar(), SLOT( clear() ) );
 }
index 7788f4b6b1a8ba09864ae089226170d1c4ce61cb..7b886f46704ebc4becb04b94bfc48179d5148aa6 100644 (file)
@@ -183,6 +183,13 @@ private:
     void findAhead();
     void doOpenFile(const KUrl &url, KAutoSaveFile *stale);
     void recoverFiles(QList<KAutoSaveFile *> staleFiles);
+    void loadPlugins();
+    void populateMenus(QObject *plugin);
+    void addToMenu(QObject *plugin, const QStringList &texts,
+                            QMenu *menu, const char *member,
+                            QActionGroup *actionGroup);
+    void aboutPlugins();
+    QStringList m_pluginFileNames;
 
 public slots:
     void openFile(const KUrl &url);
@@ -274,6 +281,7 @@ private slots:
     void slotGetNewStuff();
     void slotAutoTransition();
     void slotRunWizard();
+    void generateClip();
 };
 
 
index 0e58a44791e169726f0aa1c98cc06a36f7604332..c54f52ec61b7d9a07bf332959a2ebcde6e6c4491 100644 (file)
@@ -65,23 +65,9 @@ ProjectList::ProjectList(QWidget *parent)
     m_toolbar = new QToolBar("projectToolBar", this);
     m_toolbar->addWidget(searchView);
 
-    QToolButton *addButton = new QToolButton(m_toolbar);
-    QMenu *addMenu = new QMenu(this);
-    addButton->setMenu(addMenu);
-    addButton->setPopupMode(QToolButton::MenuButtonPopup);
-    m_toolbar->addWidget(addButton);
-
-    QAction *addClipButton = addMenu->addAction(KIcon("kdenlive-add-clip"), i18n("Add Clip"));
-    connect(addClipButton, SIGNAL(triggered()), this, SLOT(slotAddClip()));
-
-    QAction *addColorClip = addMenu->addAction(KIcon("kdenlive-add-color-clip"), i18n("Add Color Clip"));
-    connect(addColorClip, SIGNAL(triggered()), this, SLOT(slotAddColorClip()));
-
-    QAction *addSlideClip = addMenu->addAction(KIcon("kdenlive-add-slide-clip"), i18n("Add Slideshow Clip"));
-    connect(addSlideClip, SIGNAL(triggered()), this, SLOT(slotAddSlideshowClip()));
-
-    QAction *addTitleClip = addMenu->addAction(KIcon("kdenlive-add-text-clip"), i18n("Add Title Clip"));
-    connect(addTitleClip, SIGNAL(triggered()), this, SLOT(slotAddTitleClip()));
+    m_addButton = new QToolButton(m_toolbar);
+    m_addButton->setPopupMode(QToolButton::MenuButtonPopup);
+    m_toolbar->addWidget(m_addButton);
 
     m_deleteAction = m_toolbar->addAction(KIcon("edit-delete"), i18n("Delete Clip"));
     connect(m_deleteAction, SIGNAL(triggered()), this, SLOT(slotRemoveClip()));
@@ -89,11 +75,6 @@ ProjectList::ProjectList(QWidget *parent)
     m_editAction = m_toolbar->addAction(KIcon("document-properties"), i18n("Edit Clip"));
     connect(m_editAction, SIGNAL(triggered()), this, SLOT(slotEditClip()));
 
-    QAction *addFolderButton = addMenu->addAction(KIcon("folder-new"), i18n("Create Folder"));
-    connect(addFolderButton, SIGNAL(triggered()), this, SLOT(slotAddFolder()));
-
-    addButton->setDefaultAction(addClipButton);
-
     layout->addWidget(m_toolbar);
     layout->addWidget(listView);
     setLayout(layout);
@@ -101,22 +82,12 @@ ProjectList::ProjectList(QWidget *parent)
 
     searchView->setTreeWidget(listView);
 
-    m_menu = new QMenu();
-    m_menu->addAction(addClipButton);
-    m_menu->addAction(addColorClip);
-    m_menu->addAction(addSlideClip);
-    m_menu->addAction(addTitleClip);
-    m_menu->addAction(m_editAction);
-    m_menu->addAction(m_deleteAction);
-    m_menu->addAction(addFolderButton);
-    m_menu->insertSeparator(m_deleteAction);
-
     connect(listView, SIGNAL(itemSelectionChanged()), this, SLOT(slotClipSelected()));
     connect(listView, SIGNAL(focusMonitor()), this, SLOT(slotClipSelected()));
     connect(listView, SIGNAL(pauseMonitor()), this, SLOT(slotPauseMonitor()));
     connect(listView, SIGNAL(requestMenu(const QPoint &, QTreeWidgetItem *)), this, SLOT(slotContextMenu(const QPoint &, QTreeWidgetItem *)));
     connect(listView, SIGNAL(addClip()), this, SLOT(slotAddClip()));
-    connect(listView, SIGNAL(addClip(QUrl, const QString &)), this, SLOT(slotAddClip(QUrl, const QString &)));
+    connect(listView, SIGNAL(addClip(KUrl, const QString &)), this, SLOT(slotAddClip(KUrl, const QString &)));
     connect(listView, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(slotItemEdited(QTreeWidgetItem *, int)));
     connect(listView, SIGNAL(showProperties(DocClipBase *)), this, SIGNAL(showClipProperties(DocClipBase *)));
 
@@ -129,6 +100,29 @@ ProjectList::~ProjectList() {
     delete m_toolbar;
 }
 
+void ProjectList::setupMenu(QMenu *addMenu, QAction *defaultAction)
+{
+    m_addButton->setMenu(addMenu);
+    m_addButton->setDefaultAction(defaultAction);
+    m_menu = new QMenu();
+    m_menu->addActions(addMenu->actions());
+}
+
+void ProjectList::setupGeneratorMenu(QMenu *addMenu)
+{
+
+  QMenu *menu = m_addButton->menu();
+  menu->addMenu(addMenu);  
+  m_addButton->setMenu(menu);
+
+  m_menu->addMenu(addMenu);
+  if (addMenu->isEmpty()) addMenu->setEnabled(false);
+  m_menu->addAction(m_editAction);
+  m_menu->addAction(m_deleteAction);
+  m_menu->insertSeparator(m_deleteAction);
+}
+
+
 QByteArray ProjectList::headerInfo() {
     return listView->header()->saveState();
 }
@@ -367,7 +361,7 @@ void ProjectList::requestClipInfo(const QDomElement xml, const QString id) {
 }
 
 void ProjectList::slotProcessNextClipInQueue() {
-    if (m_infoQueue.isEmpty()) {
+    if (m_infoQueue.isEmpty()) {       
         listView->setEnabled(true);
         return;
     }
@@ -420,7 +414,7 @@ void ProjectList::updateAllClips() {
     QTimer::singleShot(500, this, SLOT(slotCheckForEmptyQueue()));
 }
 
-void ProjectList::slotAddClip(QUrl givenUrl, QString group) {
+void ProjectList::slotAddClip(KUrl givenUrl, QString group) {
     if (!m_commandStack) kDebug() << "!!!!!!!!!!!!!!!! NO CMD STK";
     KUrl::List list;
     if (givenUrl.isEmpty()) {
index 33a0a597c18b965d4c873e0a6143f2467b10c43f..8be45a43d5d91379c27ebd36c39e1de97fab5cef 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <QDomNodeList>
 #include <QToolBar>
+#include <QToolButton>
 #include <QTreeWidget>
 #include <QPainter>
 #include <QItemDelegate>
@@ -112,6 +113,8 @@ public:
     void updateAllClips();
     QByteArray headerInfo();
     void setHeaderInfo(const QByteArray &state);
+    void setupMenu(QMenu *addMenu, QAction *defaultAction);
+    void setupGeneratorMenu(QMenu *addMenu);
 
 public slots:
     void setDocument(KdenliveDoc *doc);
@@ -125,6 +128,7 @@ public slots:
     void slotRemoveInvalidClip(const QString &id);
     void slotSelectClip(const QString &ix);
     void slotRemoveClip();
+    void slotAddClip(KUrl givenUrl = KUrl(), QString group = QString());
 
 private:
     ProjectListView *listView;
@@ -143,13 +147,13 @@ private:
     KdenliveDoc *m_doc;
     ProjectItem *m_selectedItem;
     bool m_refreshed;
+    QToolButton *m_addButton;
     QMap <QString, QDomElement> m_infoQueue;
     void requestClipInfo(const QDomElement xml, const QString id);
     QList <QString> m_thumbnailQueue;
     void requestClipThumbnail(const QString &id);
 
 private slots:
-    void slotAddClip(QUrl givenUrl = QUrl(), QString group = QString());
     void slotEditClip();
     void slotClipSelected();
     void slotAddColorClip();
index 08bc3d654f40a387403f7330485e4ecdc424f783..74cafd6cb8b6c537fb00443290c5bd572ced7ae2 100644 (file)
@@ -141,7 +141,7 @@ void ProjectListView::dropEvent(QDropEvent *event) {
         }
         const QList <QUrl> list = event->mimeData()->urls();
         foreach(const QUrl &url, list) {
-            emit addClip(url, groupName);
+            emit addClip(KUrl(url), groupName);
         }
 
     } else if (event->mimeData()->hasFormat("kdenlive/producerslist")) {
index a56b83915407fa8c2955e0e26e9c536350adf948..64c6d1ae89aa64654a1fc544d44d5453913cea84 100644 (file)
@@ -1,6 +1,12 @@
 
 
 ########### next target ###############
+include_directories (
+    ${KDE4_INCLUDES}
+    ${CMAKE_SOURCE_DIR} 
+    ${CMAKE_BINARY_DIR} 
+)
+
 
 set(westleypreview_PART_SRCS westleypreview.cpp)