]> git.sesse.net Git - kdenlive/blob - src/clipmanager.h
Merge branch 'master' into stabilize
[kdenlive] / src / clipmanager.h
1 /***************************************************************************
2  *   Copyright (C) 2008 by Jean-Baptiste Mardelle (jb@kdenlive.org)        *
3  *                                                                         *
4  *   This program is free software; you can redistribute it and/or modify  *
5  *   it under the terms of the GNU General Public License as published by  *
6  *   the Free Software Foundation; either version 2 of the License, or     *
7  *   (at your option) any later version.                                   *
8  *                                                                         *
9  *   This program is distributed in the hope that it will be useful,       *
10  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
11  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
12  *   GNU General Public License for more details.                          *
13  *                                                                         *
14  *   You should have received a copy of the GNU General Public License     *
15  *   along with this program; if not, write to the                         *
16  *   Free Software Foundation, Inc.,                                       *
17  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA          *
18  ***************************************************************************/
19
20 /**
21  * @class ClipManager
22  * @brief Manages the list of clips in a document.
23  * @author Jean-Baptiste Mardelle
24  */
25
26 #ifndef CLIPMANAGER_H
27 #define CLIPMANAGER_H
28
29 #include <qdom.h>
30 #include <QPixmap>
31 #include <QObject>
32 #include <QTimer>
33 #include <QMutex>
34 #include <QFuture>
35
36 #include <KUrl>
37 #include <KUndoStack>
38 #include <KDirWatch>
39 #include <klocale.h>
40 #include <kdeversion.h>
41
42 #if KDE_IS_VERSION(4,5,0)
43 #include <KImageCache>
44 #endif
45
46
47 #include "gentime.h"
48 #include "definitions.h"
49
50
51 class KdenliveDoc;
52 class DocClipBase;
53 class AbstractGroupItem;
54
55 namespace Mlt
56 {
57 class Producer;
58 };
59
60 class ClipManager: public QObject
61 {
62 Q_OBJECT public:
63
64     ClipManager(KdenliveDoc *doc);
65     virtual ~ ClipManager();
66     void addClip(DocClipBase *clip);
67     DocClipBase *getClipAt(int pos);
68     void deleteClip(const QString &clipId);
69
70     /** @brief Add a file to the project.
71      * @ref slotAddClipList
72      * @param url file to add
73      * @param group name of the group to insert the file in (can be empty)
74      * @param groupId id of the group (if any) */
75     void slotAddClipFile(const KUrl &url, const QString &group, const QString &groupId);
76
77     /** @brief Adds a list of files to the project.
78      * @param urls files to add
79      * @param group name of the group to insert the files in (can be empty)
80      * @param groupId id of the group (if any)
81      * It checks for duplicated items and asks to the user for instructions. */
82     void slotAddClipList(const KUrl::List urls, const QString &group, const QString &groupId);
83     void slotAddTextClipFile(const QString &titleName, int out, const QString &xml, const QString &group, const QString &groupId);
84     void slotAddTextTemplateClip(QString titleName, const KUrl &path, const QString &group, const QString &groupId);
85     void slotAddXmlClipFile(const QString &name, const QDomElement &xml, const QString &group, const QString &groupId);
86     void slotAddColorClipFile(const QString &name, const QString &color, QString duration, const QString &group, const QString &groupId);
87     void slotAddSlideshowClipFile(const QString &name, const QString &path, int count, const QString &duration,
88                                   const bool loop, const bool crop,const bool fade,
89                                   const QString &luma_duration, const QString &luma_file, const int softness,
90                                   const QString &animation, const QString &group, const QString &groupId);
91     DocClipBase *getClipById(QString clipId);
92     const QList <DocClipBase *> getClipByResource(QString resource);
93     void slotDeleteClips(QStringList ids);
94     void setThumbsProgress(const QString &message, int progress);
95     void checkAudioThumbs();
96     QList <DocClipBase*> documentClipList() const;
97     QMap <QString, QString> documentFolderList() const;
98     int getFreeClipId();
99     int getFreeFolderId();
100     int lastClipId() const;
101     void askForAudioThumb(const QString &id);
102     QString projectFolder() const;
103     void clearUnusedProducers();
104     void resetProducersList(const QList <Mlt::Producer *> prods, bool displayRatioChanged, bool fpsChanged);
105     void addFolder(const QString&, const QString&);
106     void deleteFolder(const QString&);
107     void clear();
108     void clearCache();
109     AbstractGroupItem *createGroup();
110     void removeGroup(AbstractGroupItem *group);
111     QDomElement groupsXml() const;
112     int clipsCount() const;
113     /** @brief Request creation of a clip thumbnail for specified frames. */
114     void requestThumbs(const QString id, QList <int> frames);
115     /** @brief remove a clip id from the queue list. */
116     void stopThumbs(const QString &id);
117
118 #if KDE_IS_VERSION(4,5,0)
119     KImageCache* pixmapCache;
120 #endif
121
122 private slots:
123     /** A clip was externally modified, monitor for more changes and prepare for reload */
124     void slotClipModified(const QString &path);
125     void slotClipMissing(const QString &path);
126     void slotClipAvailable(const QString &path);
127     /** Check the list of externally modified clips, and process them if they were not modified in the last 1500 milliseconds */
128     void slotProcessModifiedClips();
129     void slotGetThumbs();
130     void slotGetAudioThumbs();
131
132 private:   // Private attributes
133     /** the list of clips in the document */
134     QList <DocClipBase*> m_clipList;
135     /** the list of groups in the document */
136     QList <AbstractGroupItem *> m_groupsList;
137     QMap <QString, QString> m_folderList;
138     QList <QString> m_audioThumbsQueue;
139     /** the document undo stack*/
140     KdenliveDoc *m_doc;
141     int m_clipIdCounter;
142     int m_folderIdCounter;
143     KDirWatch m_fileWatcher;
144     /** Timer used to reload clips when they have been externally modified */
145     QTimer m_modifiedTimer;
146     /** List of the clip IDs that need to be reloaded after being externally modified */
147     QMap <QString, QTime> m_modifiedClips;
148     /** Struct containing the list of clip thumbnails to request (clip id and frames) */
149     QMap <QString, int> m_requestedThumbs;
150     QMutex m_thumbsMutex;
151     QFuture<void> m_thumbsThread;
152     /** @brief The id of currently processed clip for thumbs creation. */
153     QString m_processingThumbId;
154     /** @brief If true, abort processing of clip thumbs before removing a clip. */
155     bool m_abortThumb;
156     /** @brief We are about to delete the clip producer, stop processing thumbs. */
157     bool m_closing;
158     QFuture<void> m_audioThumbsThread;
159     /** @brief If true, abort processing of audio thumbs. */
160     bool m_abortAudioThumb;
161     /** @brief The id of currently processed clip for audio thumbs creation. */
162     QString m_processingAudioThumbId;
163
164 signals:
165     void reloadClip(const QString &);
166     void modifiedClip(const QString &);
167     void missingClip(const QString &);
168     void availableClip(const QString &);
169     void checkAllClips(bool displayRatioChanged, bool fpsChanged, QStringList brokenClips);
170     void displayMessage(const QString &, int);
171 };
172
173 #endif