#ifndef CLIPMANAGER_H
#define CLIPMANAGER_H
-#include <qdom.h>
+#include <QtXml/qdom.h>
#include <QPixmap>
#include <QObject>
#include <QTimer>
+#include <QMutex>
+#include <QFuture>
#include <KUrl>
#include <KUndoStack>
#include <KDirWatch>
#include <klocale.h>
+#include <kdeversion.h>
+#include <KIO/CopyJob>
+
+#if KDE_IS_VERSION(4,5,0)
+#include <KImageCache>
+#endif
+
#include "gentime.h"
#include "definitions.h"
class DocClipBase;
class AbstractGroupItem;
+
+class SolidVolumeInfo
+{
+
+public:
+ QString path; // mount path of volume, with trailing slash
+ QString uuid; // UUID as from Solid
+ QString label; // volume label (think of CDs)
+ bool isRemovable; // may be removed
+ bool isMounted;
+
+ bool isNull() const { return path.isNull(); }
+};
+
namespace Mlt
{
class Producer;
-};
+}
class ClipManager: public QObject
{
* @param url file to add
* @param group name of the group to insert the file in (can be empty)
* @param groupId id of the group (if any) */
- void slotAddClipFile(const KUrl url, const QString group, const QString &groupId);
+ void slotAddClipFile(const KUrl &url, const QMap<QString, QString> &data);
/** @brief Adds a list of files to the project.
* @param urls files to add
* @param group name of the group to insert the files in (can be empty)
* @param groupId id of the group (if any)
* It checks for duplicated items and asks to the user for instructions. */
- void slotAddClipList(const KUrl::List urls, const QString group, const QString &groupId);
- void slotAddTextClipFile(const QString titleName, int out, const QString xml, const QString group, const QString &groupId);
- void slotAddTextTemplateClip(QString titleName, const KUrl path, const QString group, const QString &groupId);
- void slotAddXmlClipFile(const QString name, const QDomElement xml, const QString group, const QString &groupId);
- void slotAddColorClipFile(const QString name, const QString color, QString duration, const QString group, const QString &groupId);
- void slotAddSlideshowClipFile(const QString name, const QString path, int count, const QString duration,
- const bool loop, const bool crop,const bool fade,
- const QString &luma_duration, const QString &luma_file, const int softness,
- const QString &animation, const QString group, const QString &groupId);
+ void slotAddClipList(const KUrl::List &urls, const QMap<QString, QString> &data);
+ void slotAddTextClipFile(const QString &titleName, int out, const QString &xml, const QString &group, const QString &groupId);
+ void slotAddTextTemplateClip(QString titleName, const KUrl &path, const QString &group, const QString &groupId);
+ void slotAddXmlClipFile(const QString &name, const QDomElement &xml, const QString &group, const QString &groupId);
+ void slotAddColorClipFile(const QString &name, const QString &color, const QString &duration, const QString &group, const QString &groupId);
+ void slotAddSlideshowClipFile(QMap <QString, QString> properties, const QString &group, const QString &groupId);
DocClipBase *getClipById(QString clipId);
- const QList <DocClipBase *> getClipByResource(QString resource);
+ const QList <DocClipBase *> getClipByResource(const QString &resource);
void slotDeleteClips(QStringList ids);
void setThumbsProgress(const QString &message, int progress);
void checkAudioThumbs();
int getFreeClipId();
int getFreeFolderId();
int lastClipId() const;
- void startAudioThumbsGeneration();
- void endAudioThumbsGeneration(const QString &requestedId);
void askForAudioThumb(const QString &id);
QString projectFolder() const;
void clearUnusedProducers();
- void resetProducersList(const QList <Mlt::Producer *> prods);
+ void resetProducersList(const QList <Mlt::Producer *> prods, bool displayRatioChanged, bool fpsChanged);
void addFolder(const QString&, const QString&);
void deleteFolder(const QString&);
void clear();
+ void clearCache();
AbstractGroupItem *createGroup();
void removeGroup(AbstractGroupItem *group);
QDomElement groupsXml() const;
int clipsCount() const;
+ /** @brief remove a clip id from the queue list. */
+ void stopThumbs(const QString &id);
+ void projectTreeThumbReady(const QString &id, int frame, const QImage &img, int type);
+
+#if KDE_IS_VERSION(4,5,0)
+ KImageCache* pixmapCache;
+#endif
+public slots:
+ /** @brief Request creation of a clip thumbnail for specified frames. */
+ void slotRequestThumbs(const QString &id, const QList<int> &frames);
+
private slots:
/** A clip was externally modified, monitor for more changes and prepare for reload */
void slotClipModified(const QString &path);
void slotClipAvailable(const QString &path);
/** Check the list of externally modified clips, and process them if they were not modified in the last 1500 milliseconds */
void slotProcessModifiedClips();
+ void slotGetThumbs();
+ void slotGetAudioThumbs();
+ /** @brief Clip has been copied, add it now. */
+ void slotAddClip(KIO::Job *job, const KUrl &, const KUrl &dst);
private: // Private attributes
/** the list of clips in the document */
KdenliveDoc *m_doc;
int m_clipIdCounter;
int m_folderIdCounter;
- QString m_generatingAudioId;
KDirWatch m_fileWatcher;
/** Timer used to reload clips when they have been externally modified */
QTimer m_modifiedTimer;
/** List of the clip IDs that need to be reloaded after being externally modified */
QMap <QString, QTime> m_modifiedClips;
+ /** Struct containing the list of clip thumbnails to request (clip id and frames) */
+ QMap <QString, int> m_requestedThumbs;
+ QMutex m_thumbsMutex;
+ QFuture<void> m_thumbsThread;
+ /** @brief The id of currently processed clip for thumbs creation. */
+ QString m_processingThumbId;
+ /** @brief If true, abort processing of clip thumbs before removing a clip. */
+ bool m_abortThumb;
+ /** @brief We are about to delete the clip producer, stop processing thumbs. */
+ bool m_closing;
+ QFuture<void> m_audioThumbsThread;
+ /** @brief If true, abort processing of audio thumbs. */
+ bool m_abortAudioThumb;
+ /** @brief The id of currently processed clip for audio thumbs creation. */
+ QString m_processingAudioThumbId;
+ /** @brief The list of removable drives. */
+ QList<SolidVolumeInfo> m_removableVolumes;
+
+ QPoint m_projectTreeThumbSize;
+
+ /** @brief Get a list of drives, to check if we have files on removable media. */
+ void listRemovableVolumes();
+ /** @brief Check if added file is on a removable drive. */
+ bool isOnRemovableDevice(const KUrl &url);
signals:
void reloadClip(const QString &);
void modifiedClip(const QString &);
void missingClip(const QString &);
void availableClip(const QString &);
- void checkAllClips();
+ void checkAllClips(bool displayRatioChanged, bool fpsChanged, const QStringList &brokenClips);
+ void displayMessage(const QString &, int);
+ void thumbReady(const QString &id, int, const QImage&);
+ void gotClipPropertyThumbnail(const QString &id, const QImage&);
};
#endif