svn path=/trunk/kdenlive/; revision=4456
{
m_clipIdCounter = 1;
m_folderIdCounter = 1;
{
m_clipIdCounter = 1;
m_folderIdCounter = 1;
+ m_modifiedTimer.setInterval(1500);
connect(&m_fileWatcher, SIGNAL(dirty(const QString &)), this, SLOT(slotClipModified(const QString &)));
connect(&m_fileWatcher, SIGNAL(deleted(const QString &)), this, SLOT(slotClipMissing(const QString &)));
connect(&m_fileWatcher, SIGNAL(created(const QString &)), this, SLOT(slotClipAvailable(const QString &)));
connect(&m_fileWatcher, SIGNAL(dirty(const QString &)), this, SLOT(slotClipModified(const QString &)));
connect(&m_fileWatcher, SIGNAL(deleted(const QString &)), this, SLOT(slotClipMissing(const QString &)));
connect(&m_fileWatcher, SIGNAL(created(const QString &)), this, SLOT(slotClipAvailable(const QString &)));
+ connect(&m_modifiedTimer, SIGNAL(timeout()), this, SLOT(slotProcessModifiedClips()));
}
ClipManager::~ClipManager()
}
ClipManager::~ClipManager()
m_folderIdCounter = 1;
m_folderList.clear();
m_audioThumbsQueue.clear();
m_folderIdCounter = 1;
m_folderList.clear();
m_audioThumbsQueue.clear();
+ m_modifiedClips.clear();
}
void ClipManager::checkAudioThumbs()
{
if (!KdenliveSettings::audiothumbnails()) {
}
void ClipManager::checkAudioThumbs()
{
if (!KdenliveSettings::audiothumbnails()) {
- if (!m_generatingAudioId.isEmpty()) {
- DocClipBase *clip = getClipById(m_generatingAudioId);
- if (clip) clip->slotClearAudioCache();
- }
+ if (!m_generatingAudioId.isEmpty()) {
+ DocClipBase *clip = getClipById(m_generatingAudioId);
+ if (clip) clip->slotClearAudioCache();
+ }
m_audioThumbsQueue.clear();
m_generatingAudioId.clear();
m_audioThumbsQueue.clear();
m_generatingAudioId.clear();
for (int i = 0; i < m_clipList.count(); i++) {
m_audioThumbsQueue.append(m_clipList.at(i)->getId());
}
for (int i = 0; i < m_clipList.count(); i++) {
m_audioThumbsQueue.append(m_clipList.at(i)->getId());
}
void ClipManager::slotClipModified(const QString &path)
{
void ClipManager::slotClipModified(const QString &path)
{
- // kDebug() << "// CLIP: " << path << " WAS MODIFIED";
+ //kDebug() << "// CLIP: " << path << " WAS MODIFIED";
const QList <DocClipBase *> list = getClipByResource(path);
for (int i = 0; i < list.count(); i++) {
DocClipBase *clip = list.at(i);
const QList <DocClipBase *> list = getClipByResource(path);
for (int i = 0; i < list.count(); i++) {
DocClipBase *clip = list.at(i);
- if (clip != NULL) emit reloadClip(clip->getId());
+ if (clip != NULL) {
+ QString id = clip->getId();
+ if (!m_modifiedClips.contains(id))
+ emit modifiedClip(id);
+ m_modifiedClips[id] = QTime::currentTime();
+ }
+ }
+ if (!m_modifiedTimer.isActive()) m_modifiedTimer.start();
+}
+
+void ClipManager::slotProcessModifiedClips()
+{
+ if (!m_modifiedClips.isEmpty()) {
+ QMapIterator<QString, QTime> i(m_modifiedClips);
+ while (i.hasNext()) {
+ i.next();
+ if (QTime::currentTime().msecsTo(i.value()) <= -1500) {
+ emit reloadClip(i.key());
+ m_modifiedClips.remove(i.key());
+ break;
+ }
+ }
+ if (m_modifiedClips.isEmpty()) m_modifiedTimer.stop();
}
void ClipManager::slotClipMissing(const QString &path)
}
void ClipManager::slotClipMissing(const QString &path)
#include <qdom.h>
#include <QPixmap>
#include <QObject>
#include <qdom.h>
#include <QPixmap>
#include <QObject>
#include <KUrl>
#include <KUndoStack>
#include <KUrl>
#include <KUndoStack>
void updatePreviewSettings();
private slots:
void updatePreviewSettings();
private slots:
+ /** A clip was externally modified, monitor for more changes and prepare for reload */
void slotClipModified(const QString &path);
void slotClipMissing(const QString &path);
void slotClipAvailable(const QString &path);
void slotClipModified(const QString &path);
void slotClipMissing(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();
private: // Private attributes
/** the list of clips in the document */
private: // Private attributes
/** the list of clips in the document */
int m_folderIdCounter;
QString m_generatingAudioId;
KDirWatch m_fileWatcher;
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;
signals:
void reloadClip(const QString &);
signals:
void reloadClip(const QString &);
+ void modifiedClip(const QString &);
void missingClip(const QString &);
void availableClip(const QString &);
void checkAllClips();
void missingClip(const QString &);
void availableClip(const QString &);
void checkAllClips();
for (int i = 0; i < trans.count(); i++) {
QString luma = getProperty(trans.at(i).toElement(), "luma");
if (!luma.isEmpty()) {
for (int i = 0; i < trans.count(); i++) {
QString luma = getProperty(trans.at(i).toElement(), "luma");
if (!luma.isEmpty()) {
- if (!luma.startsWith('/')) luma.prepend(root);
- if (!QFile::exists(luma) && !missingLumas.contains(luma)) {
+ if (!luma.startsWith('/')) luma.prepend(root);
+ if (!QFile::exists(luma) && !missingLumas.contains(luma)) {
missingLumas.append(luma);
}
}
missingLumas.append(luma);
}
}
+void ProjectList::slotModifiedClip(const QString &id)
+{
+ ProjectItem *item = getItemById(id);
+ if (item) {
+ item->setData(0, Qt::DecorationRole, KIcon("view-refresh").pixmap(m_listView->iconSize()));
+ }
+}
+
void ProjectList::slotMissingClip(const QString &id)
{
ProjectItem *item = getItemById(id);
void ProjectList::slotMissingClip(const QString &id)
{
ProjectItem *item = getItemById(id);
m_listView->blockSignals(false);
m_toolbar->setEnabled(true);
connect(m_doc->clipManager(), SIGNAL(reloadClip(const QString &)), this, SLOT(slotReloadClip(const QString &)));
m_listView->blockSignals(false);
m_toolbar->setEnabled(true);
connect(m_doc->clipManager(), SIGNAL(reloadClip(const QString &)), this, SLOT(slotReloadClip(const QString &)));
+ connect(m_doc->clipManager(), SIGNAL(modifiedClip(const QString &)), this, SLOT(slotModifiedClip(const QString &)));
connect(m_doc->clipManager(), SIGNAL(missingClip(const QString &)), this, SLOT(slotMissingClip(const QString &)));
connect(m_doc->clipManager(), SIGNAL(availableClip(const QString &)), this, SLOT(slotAvailableClip(const QString &)));
connect(m_doc->clipManager(), SIGNAL(checkAllClips()), this, SLOT(updateAllClips()));
connect(m_doc->clipManager(), SIGNAL(missingClip(const QString &)), this, SLOT(slotMissingClip(const QString &)));
connect(m_doc->clipManager(), SIGNAL(availableClip(const QString &)), this, SLOT(slotAvailableClip(const QString &)));
connect(m_doc->clipManager(), SIGNAL(checkAllClips()), this, SLOT(updateAllClips()));
void slotProcessNextThumbnail();
void slotCheckForEmptyQueue();
void slotPauseMonitor();
void slotProcessNextThumbnail();
void slotCheckForEmptyQueue();
void slotPauseMonitor();
+ /** A clip was modified externally, change icon so that user knows it */
+ void slotModifiedClip(const QString &id);
void slotMissingClip(const QString &id);
void slotAvailableClip(const QString &id);
//void slotShowMenu(const QPoint &pos);
void slotMissingClip(const QString &id);
void slotAvailableClip(const QString &id);
//void slotShowMenu(const QPoint &pos);