#include "kdenlivesettings.h"
#include "slideshowclip.h"
#include "ui_colorclip_ui.h"
-#include "titlewidget.h"
+#include "widgets/titlewidget.h"
#include "definitions.h"
#include "clipmanager.h"
#include "docclipbase.h"
#include <KDebug>
#include <KAction>
-#include <KLocale>
+#include <KLocalizedString>
#include <KFileDialog>
#include <KInputDialog>
#include <KMessageBox>
//#include <nepomuk/tag.h>
#endif
+#ifdef USE_NEPOMUKCORE
+#include <nepomuk2/resourcemanager.h>
+#include <Nepomuk2/Resource>
+#endif
+
#include <QMouseEvent>
#include <QStylePainter>
#include <QPixmap>
}
-
-InvalidDialog::InvalidDialog(const QString &caption, const QString &message, bool infoOnly, QWidget *parent) : KDialog(parent)
-{
- setCaption(caption);
- if (infoOnly) setButtons(KDialog::Ok);
- else setButtons(KDialog::Yes | KDialog::No);
- QWidget *w = new QWidget(this);
- QVBoxLayout *l = new QVBoxLayout;
- l->addWidget(new QLabel(message));
- m_clipList = new QListWidget;
- l->addWidget(m_clipList);
- w->setLayout(l);
- setMainWidget(w);
-}
-
-InvalidDialog::~InvalidDialog()
-{
- delete m_clipList;
-}
-
-
-void InvalidDialog::addClip(const QString &id, const QString &path)
-{
- QListWidgetItem *item = new QListWidgetItem(path);
- item->setData(Qt::UserRole, id);
- m_clipList->addItem(item);
-}
-
-QStringList InvalidDialog::getIds() const
-{
- QStringList ids;
- for (int i = 0; i < m_clipList->count(); i++) {
- ids << m_clipList->item(i)->data(Qt::UserRole).toString();
- }
- return ids;
-}
-
-
ProjectList::ProjectList(QWidget *parent) :
QWidget(parent)
- , m_render(NULL)
- , m_fps(-1)
- , m_menu(NULL)
- , m_commandStack(NULL)
- , m_openAction(NULL)
- , m_reloadAction(NULL)
- , m_extractAudioAction(NULL)
- , m_transcodeAction(NULL)
- , m_clipsActionsMenu(NULL)
- , m_doc(NULL)
- , m_refreshed(false)
- , m_allClipsProcessed(false)
- , m_thumbnailQueue()
- , m_proxyAction(NULL)
- , m_abortAllJobs(false)
- , m_closing(false)
- , m_invalidClipDialog(NULL)
+ , m_render(NULL)
+ , m_fps(-1)
+ , m_menu(NULL)
+ , m_commandStack(NULL)
+ , m_openAction(NULL)
+ , m_reloadAction(NULL)
+ , m_extractAudioAction(NULL)
+ , m_transcodeAction(NULL)
+ , m_clipsActionsMenu(NULL)
+ , m_doc(NULL)
+ , m_refreshed(false)
+ , m_allClipsProcessed(false)
+ , m_thumbnailQueue()
+ , m_proxyAction(NULL)
+ , m_abortAllJobs(false)
+ , m_closing(false)
+ , m_invalidClipDialog(NULL)
{
qRegisterMetaType<stringMap> ("stringMap");
QVBoxLayout *layout = new QVBoxLayout;
m_jobsMenu->addAction(m_discardCurrentClipJobs);
m_infoLabel->setMenu(m_jobsMenu);
box->addWidget(m_infoLabel);
-
+
int size = style()->pixelMetric(QStyle::PM_SmallIconSize);
QSize iconSize(size, size);
connect(m_listView, SIGNAL(itemSelectionChanged()), this, SLOT(slotClipSelected()));
connect(m_listView, SIGNAL(focusMonitor(bool)), this, SIGNAL(raiseClipMonitor(bool)));
connect(m_listView, SIGNAL(pauseMonitor()), this, SIGNAL(pauseMonitor()));
- connect(m_listView, SIGNAL(requestMenu(const QPoint &, QTreeWidgetItem *)), this, SLOT(slotContextMenu(const QPoint &, QTreeWidgetItem *)));
+ connect(m_listView, SIGNAL(requestMenu(QPoint,QTreeWidgetItem*)), this, SLOT(slotContextMenu(QPoint,QTreeWidgetItem*)));
connect(m_listView, SIGNAL(addClip()), this, SIGNAL(pauseMonitor()));
connect(m_listView, SIGNAL(addClip()), this, SLOT(slotAddClip()));
- connect(m_listView, SIGNAL(addClip(const QList <QUrl>, const QString &, const QString &)), this, SLOT(slotAddClip(const QList <QUrl>, const QString &, const QString &)));
- connect(this, SIGNAL(addClip(const QString, const QString &, const QString &)), this, SLOT(slotAddClip(const QString, const QString &, const QString &)));
- connect(m_listView, SIGNAL(addClipCut(const QString &, int, int)), this, SLOT(slotAddClipCut(const QString &, int, int)));
- connect(m_listView, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(slotItemEdited(QTreeWidgetItem *, int)));
- connect(m_listView, SIGNAL(showProperties(DocClipBase *)), this, SIGNAL(showClipProperties(DocClipBase *)));
+ connect(m_listView, SIGNAL(addClip(QList<QUrl>,QString,QString)), this, SLOT(slotAddClip(QList<QUrl>,QString,QString)));
+ connect(this, SIGNAL(addClip(QString,QString,QString)), this, SLOT(slotAddClip(QString,QString,QString)));
+ connect(m_listView, SIGNAL(addClipCut(QString,int,int)), this, SLOT(slotAddClipCut(QString,int,int)));
+ connect(m_listView, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(slotItemEdited(QTreeWidgetItem*,int)));
+ connect(m_listView, SIGNAL(showProperties(DocClipBase*)), this, SIGNAL(showClipProperties(DocClipBase*)));
- connect(this, SIGNAL(cancelRunningJob(const QString, stringMap )), this, SLOT(slotCancelRunningJob(const QString, stringMap)));
- connect(this, SIGNAL(processLog(const QString, int , int, const QString)), this, SLOT(slotProcessLog(const QString, int , int, const QString)));
+ connect(this, SIGNAL(cancelRunningJob(QString,stringMap)), this, SLOT(slotCancelRunningJob(QString,stringMap)));
+ connect(this, SIGNAL(processLog(QString,int,int,QString)), this, SLOT(slotProcessLog(QString,int,int,QString)));
- connect(this, SIGNAL(updateJobStatus(const QString, int, int, const QString, const QString, const QString)), this, SLOT(slotUpdateJobStatus(const QString, int, int, const QString, const QString, const QString)));
+ connect(this, SIGNAL(updateJobStatus(QString,int,int,QString,QString,QString)), this, SLOT(slotUpdateJobStatus(QString,int,int,QString,QString,QString)));
- connect(this, SIGNAL(gotProxy(const QString)), this, SLOT(slotGotProxyForId(const QString)));
+ connect(this, SIGNAL(gotProxy(QString)), this, SLOT(slotGotProxyForId(QString)));
m_listViewDelegate = new ItemDelegate(m_listView);
m_listView->setItemDelegate(m_listViewDelegate);
}
}
#endif
+#ifdef USE_NEPOMUKCORE
+ if (KdenliveSettings::activate_nepomuk()) {
+ Nepomuk2::ResourceManager::instance()->init();
+ if (!Nepomuk2::ResourceManager::instance()->initialized()) {
+ kDebug() << "Cannot communicate with Nepomuk, DISABLING it";
+ KdenliveSettings::setActivate_nepomuk(false);
+ }
+ }
+#endif
+
}
ProjectList::~ProjectList()
{
m_abortAllJobs = true;
- for (int i = 0; i < m_jobList.count(); i++) {
- m_jobList.at(i)->setStatus(JOBABORTED);
+ for (int i = 0; i < m_jobList.count(); ++i) {
+ m_jobList.at(i)->setStatus(JobAborted);
}
m_closing = true;
m_thumbnailQueue.clear();
void ProjectList::setupMenu(QMenu *addMenu, QAction *defaultAction)
{
QList <QAction *> actions = addMenu->actions();
- for (int i = 0; i < actions.count(); i++) {
+ for (int i = 0; i < actions.count(); ++i) {
if (actions.at(i)->data().toString() == "clip_properties") {
m_editButton->setDefaultAction(actions.at(i));
actions.removeAt(i);
- i--;
+ --i;
} else if (actions.at(i)->data().toString() == "delete_clip") {
m_deleteButton->setDefaultAction(actions.at(i));
actions.removeAt(i);
- i--;
+ --i;
} else if (actions.at(i)->data().toString() == "edit_clip") {
m_openAction = actions.at(i);
actions.removeAt(i);
- i--;
+ --i;
} else if (actions.at(i)->data().toString() == "reload_clip") {
m_reloadAction = actions.at(i);
actions.removeAt(i);
- i--;
+ --i;
} else if (actions.at(i)->data().toString() == "proxy_clip") {
m_proxyAction = actions.at(i);
actions.removeAt(i);
- i--;
+ --i;
}
}
void ProjectList::setupGeneratorMenu(const QHash<QString,QMenu*>& menus)
{
if (!m_menu) {
- kDebug()<<"Warning, menu was not created, something is wrong";
- return;
+ kDebug()<<"Warning, menu was not created, something is wrong";
+ return;
}
if (!menus.contains("addMenu") && ! menus.value("addMenu") )
return;
QMenu *menu = m_addButton->menu();
- if (menus.contains("addMenu") && menus.value("addMenu")){
- QMenu* addMenu=menus.value("addMenu");
- menu->addMenu(addMenu);
- m_addButton->setMenu(menu);
- if (addMenu->isEmpty())
- addMenu->setEnabled(false);
- }
- if (menus.contains("extractAudioMenu") && menus.value("extractAudioMenu") ){
- QMenu* extractAudioMenu = menus.value("extractAudioMenu");
- m_menu->addMenu(extractAudioMenu);
- m_extractAudioAction = extractAudioMenu;
- }
- if (menus.contains("transcodeMenu") && menus.value("transcodeMenu") ){
- QMenu* transcodeMenu = menus.value("transcodeMenu");
- m_menu->addMenu(transcodeMenu);
- if (transcodeMenu->isEmpty())
- transcodeMenu->setEnabled(false);
- m_transcodeAction = transcodeMenu;
- }
- if (menus.contains("clipActionsMenu") && menus.value("clipActionsMenu") ){
- QMenu* stabilizeMenu=menus.value("clipActionsMenu");
- m_menu->addMenu(stabilizeMenu);
- if (stabilizeMenu->isEmpty())
- stabilizeMenu->setEnabled(false);
- m_clipsActionsMenu = stabilizeMenu;
-
- }
+ if (menus.contains("addMenu") && menus.value("addMenu")){
+ QMenu* addMenu=menus.value("addMenu");
+ menu->addMenu(addMenu);
+ m_addButton->setMenu(menu);
+ if (addMenu->isEmpty())
+ addMenu->setEnabled(false);
+ }
+ if (menus.contains("extractAudioMenu") && menus.value("extractAudioMenu") ){
+ QMenu* extractAudioMenu = menus.value("extractAudioMenu");
+ m_menu->addMenu(extractAudioMenu);
+ m_extractAudioAction = extractAudioMenu;
+ }
+ if (menus.contains("transcodeMenu") && menus.value("transcodeMenu") ){
+ QMenu* transcodeMenu = menus.value("transcodeMenu");
+ m_menu->addMenu(transcodeMenu);
+ if (transcodeMenu->isEmpty())
+ transcodeMenu->setEnabled(false);
+ m_transcodeAction = transcodeMenu;
+ }
+ if (menus.contains("clipActionsMenu") && menus.value("clipActionsMenu") ){
+ QMenu* stabilizeMenu=menus.value("clipActionsMenu");
+ m_menu->addMenu(stabilizeMenu);
+ if (stabilizeMenu->isEmpty())
+ stabilizeMenu->setEnabled(false);
+ m_clipsActionsMenu = stabilizeMenu;
+
+ }
if (m_reloadAction) m_menu->addAction(m_reloadAction);
if (m_proxyAction) m_menu->addAction(m_proxyAction);
- if (menus.contains("inTimelineMenu") && menus.value("inTimelineMenu")){
- QMenu* inTimelineMenu=menus.value("inTimelineMenu");
- m_menu->addMenu(inTimelineMenu);
- inTimelineMenu->setEnabled(false);
- }
+ if (menus.contains("inTimelineMenu") && menus.value("inTimelineMenu")){
+ QMenu* inTimelineMenu=menus.value("inTimelineMenu");
+ m_menu->addMenu(inTimelineMenu);
+ inTimelineMenu->setEnabled(false);
+ }
m_menu->addAction(m_editButton->defaultAction());
m_menu->addAction(m_openAction);
m_menu->addAction(m_deleteButton->defaultAction());
{
QList<QTreeWidgetItem *> list = m_listView->selectedItems();
if (list.isEmpty()) return;
- if (list.count() > 1 || list.at(0)->type() == PROJECTFOLDERTYPE) {
+ if (list.count() > 1 || list.at(0)->type() == ProjectFoldeType) {
editClipSelection(list);
return;
}
ProjectItem *item;
- if (!m_listView->currentItem() || m_listView->currentItem()->type() == PROJECTFOLDERTYPE)
+ if (!m_listView->currentItem() || m_listView->currentItem()->type() == ProjectFoldeType)
return;
- if (m_listView->currentItem()->type() == PROJECTSUBCLIPTYPE)
+ if (m_listView->currentItem()->type() == ProjectSubclipType)
item = static_cast <ProjectItem*>(m_listView->currentItem()->parent());
else
item = static_cast <ProjectItem*>(m_listView->currentItem());
int commonDuration = -1;
bool hasImages = false;;
ProjectItem *item;
- for (int i = 0; i < list.count(); i++) {
+ for (int i = 0; i < list.count(); ++i) {
item = NULL;
- if (list.at(i)->type() == PROJECTFOLDERTYPE) {
+ if (list.at(i)->type() == ProjectFoldeType) {
// Add folder items to the list
int ct = list.at(i)->childCount();
for (int j = 0; j < ct; j++) {
}
continue;
}
- else if (list.at(i)->type() == PROJECTSUBCLIPTYPE)
+ else if (list.at(i)->type() == ProjectSubclipType)
item = static_cast <ProjectItem*>(list.at(i)->parent());
else
item = static_cast <ProjectItem*>(list.at(i));
// check properties
DocClipBase *clip = item->referencedClip();
if (clipList.contains(clip)) continue;
- if (clip->clipType() == IMAGE) {
+ if (clip->clipType() == Image) {
hasImages = true;
if (clip->getProperty("transparency").isEmpty() || clip->getProperty("transparency").toInt() == 0) {
if (transparency == "-") {
}
}
}
- if (clip->clipType() != COLOR && clip->clipType() != IMAGE && clip->clipType() != TEXT)
+ if (clip->clipType() != Color && clip->clipType() != Image && clip->clipType() != Text)
allowDurationChange = false;
if (allowDurationChange && commonDuration != 0) {
if (commonDuration == -1)
void ProjectList::slotOpenClip()
{
ProjectItem *item;
- if (!m_listView->currentItem() || m_listView->currentItem()->type() == PROJECTFOLDERTYPE)
+ if (!m_listView->currentItem() || m_listView->currentItem()->type() == ProjectFoldeType)
return;
if (m_listView->currentItem()->type() == QTreeWidgetItem::UserType + 1)
item = static_cast <ProjectItem*>(m_listView->currentItem()->parent());
else
item = static_cast <ProjectItem*>(m_listView->currentItem());
if (item) {
- if (item->clipType() == IMAGE) {
+ if (item->clipType() == Image) {
if (KdenliveSettings::defaultimageapp().isEmpty())
KMessageBox::sorry(kapp->activeWindow(), i18n("Please set a default application to open images in the Settings dialog"));
else
QProcess::startDetached(KdenliveSettings::defaultimageapp(), QStringList() << item->clipUrl().path());
}
- if (item->clipType() == AUDIO) {
+ if (item->clipType() == Audio) {
if (KdenliveSettings::defaultaudioapp().isEmpty())
KMessageBox::sorry(kapp->activeWindow(), i18n("Please set a default application to open audio files in the Settings dialog"));
else
QTreeWidgetItemIterator it(m_listView);
ProjectItem *item;
while (*it) {
- if ((*it)->type() != PROJECTCLIPTYPE) {
+ if ((*it)->type() != ProjectClipType) {
it++;
continue;
}
QStringList ids;
QStringList urls;
while (*it) {
- if ((*it)->type() != PROJECTCLIPTYPE) {
+ if ((*it)->type() != ProjectClipType) {
it++;
continue;
}
// Check that we don't use the URL in another clip
QTreeWidgetItemIterator it2(m_listView);
while (*it2) {
- if ((*it2)->type() != PROJECTCLIPTYPE) {
+ if ((*it2)->type() != ProjectClipType) {
it2++;
continue;
}
}
emit deleteProjectClips(ids, QMap <QString, QString>());
- for (int i = 0; i < urls.count(); i++)
+ for (int i = 0; i < urls.count(); ++i)
KIO::NetAccess::del(KUrl(urls.at(i)), this);
}
if (itemToReLoad) selected.append(itemToReLoad);
}
ProjectItem *item;
- for (int i = 0; i < selected.count(); i++) {
- if (selected.at(i)->type() != PROJECTCLIPTYPE) {
- if (selected.at(i)->type() == PROJECTFOLDERTYPE) {
+ for (int i = 0; i < selected.count(); ++i) {
+ if (selected.at(i)->type() != ProjectClipType) {
+ if (selected.at(i)->type() == ProjectFoldeType) {
for (int j = 0; j < selected.at(i)->childCount(); j++)
selected.append(selected.at(i)->child(j));
}
kDebug()<<"//// TRYING TO RELOAD: "<<item->clipId()<<", but it is busy";
continue;
}
- CLIPTYPE t = item->clipType();
- if (t == TEXT) {
+ ClipType t = item->clipType();
+ if (t == Text) {
if (clip && !clip->getProperty("xmltemplate").isEmpty())
regenerateTemplate(item);
- } else if (t != COLOR && t != SLIDESHOW && clip && clip->checkHash() == false) {
+ } else if (t != Color && t != SlideShow && clip && clip->checkHash() == false) {
item->referencedClip()->setPlaceHolder(true);
item->setProperty("file_hash", QString());
- } else if (t == IMAGE) {
+ } else if (t == Image) {
//clip->getProducer() clip->getProducer()->set("force_reload", 1);
}
QDomElement e = item->toXml();
// Make sure we get the correct producer length if it was adjusted in timeline
- if (t == COLOR || t == IMAGE || t == SLIDESHOW || t == TEXT) {
- int length = QString(clip->producerProperty("length")).toInt();
- if (length > 0 && !e.hasAttribute("length")) {
- e.setAttribute("length", length);
- }
- e.setAttribute("duration", clip->getProperty("duration"));
+ if (t == Color || t == Image || t == SlideShow || t == Text) {
+ int length = QString(clip->producerProperty("length")).toInt();
+ if (length > 0 && !e.hasAttribute("length")) {
+ e.setAttribute("length", length);
+ }
+ e.setAttribute("duration", clip->getProperty("duration"));
}
resetThumbsProducer(clip);
m_render->getFileProperties(e, item->clipId(), m_listView->iconSize().height(), true);
bool missing = false;
QTreeWidgetItemIterator it(m_listView);
while (*it) {
- if ((*it)->type() == PROJECTCLIPTYPE && !((*it)->flags() & Qt::ItemIsDragEnabled)) {
+ if ((*it)->type() == ProjectClipType && !((*it)->flags() & Qt::ItemIsDragEnabled)) {
missing = true;
break;
}
QTreeWidgetItem *item = m_listView->currentItem();
ProjectItem *clip = NULL;
if (item) {
- if (item->type() == PROJECTFOLDERTYPE) {
+ if (item->type() == ProjectFoldeType) {
emit clipSelected(NULL);
m_editButton->defaultAction()->setEnabled(item->childCount() > 0);
m_deleteButton->defaultAction()->setEnabled(true);
m_transcodeAction->setEnabled(false);
m_clipsActionsMenu->setEnabled(false);
} else {
- if (item->type() == PROJECTSUBCLIPTYPE) {
+ if (item->type() == ProjectSubclipType) {
// this is a sub item, use base clip
m_deleteButton->defaultAction()->setEnabled(true);
clip = static_cast <ProjectItem*>(item->parent());
- if (clip == NULL) kDebug() << "-----------ERROR";
+ if (clip == NULL) {
+ kDebug() << "-----------ERROR";
+ return;
+ }
SubProjectItem *sub = static_cast <SubProjectItem*>(item);
- if (clip->referencedClip()->getProducer() == NULL) m_render->getFileProperties(clip->referencedClip()->toXML(), clip->clipId(), m_listView->iconSize().height(), true);
+ if (clip->referencedClip()->getProducer() == NULL) m_render->getFileProperties(clip->referencedClip()->toXML(), clip->clipId(), m_listView->iconSize().height(), true);
emit clipSelected(clip->referencedClip(), sub->zone());
m_extractAudioAction->setEnabled(false);
m_transcodeAction->setEnabled(false);
clip = static_cast <ProjectItem*>(item);
if (clip && clip->referencedClip())
emit clipSelected(clip->referencedClip());
- if (clip->referencedClip()->getProducer() == NULL) m_render->getFileProperties(clip->referencedClip()->toXML(), clip->clipId(), m_listView->iconSize().height(), true);
+ if (clip->referencedClip()->getProducer() == NULL) m_render->getFileProperties(clip->referencedClip()->toXML(), clip->clipId(), m_listView->iconSize().height(), true);
m_editButton->defaultAction()->setEnabled(true);
m_deleteButton->defaultAction()->setEnabled(true);
m_reloadAction->setEnabled(true);
m_extractAudioAction->setEnabled(true);
m_transcodeAction->setEnabled(true);
m_clipsActionsMenu->setEnabled(true);
- if (clip && clip->clipType() == IMAGE && !KdenliveSettings::defaultimageapp().isEmpty()) {
+ if (clip && clip->clipType() == Image && !KdenliveSettings::defaultimageapp().isEmpty()) {
m_openAction->setIcon(KIcon(KdenliveSettings::defaultimageapp()));
m_openAction->setEnabled(true);
- } else if (clip && clip->clipType() == AUDIO && !KdenliveSettings::defaultaudioapp().isEmpty()) {
+ } else if (clip && clip->clipType() == Audio && !KdenliveSettings::defaultaudioapp().isEmpty()) {
m_openAction->setIcon(KIcon(KdenliveSettings::defaultaudioapp()));
m_openAction->setEnabled(true);
} else {
void ProjectList::adjustProxyActions(ProjectItem *clip) const
{
if (!m_proxyAction) return;
- if (clip == NULL || clip->type() != PROJECTCLIPTYPE || clip->clipType() == COLOR || clip->clipType() == TEXT || clip->clipType() == SLIDESHOW || clip->clipType() == AUDIO) {
+ if (clip == NULL || clip->type() != ProjectClipType || clip->clipType() == Color || clip->clipType() == Text || clip->clipType() == SlideShow || clip->clipType() == Audio) {
m_proxyAction->setEnabled(false);
return;
}
void ProjectList::adjustStabilizeActions(ProjectItem *clip) const
{
- if (clip == NULL || clip->type() != PROJECTCLIPTYPE || clip->clipType() == COLOR || clip->clipType() == TEXT || clip->clipType() == SLIDESHOW) {
+ if (clip == NULL || clip->type() != ProjectClipType || clip->clipType() == Color || clip->clipType() == Text || clip->clipType() == SlideShow) {
m_clipsActionsMenu->setEnabled(false);
return;
}
- m_clipsActionsMenu->setEnabled(true);
+ m_clipsActionsMenu->setEnabled(true);
}
void ProjectList::adjustTranscodeActions(ProjectItem *clip) const
{
- if (clip == NULL || clip->type() != PROJECTCLIPTYPE || clip->clipType() == COLOR || clip->clipType() == TEXT || clip->clipType() == PLAYLIST || clip->clipType() == SLIDESHOW) {
+ if (clip == NULL || clip->type() != ProjectClipType || clip->clipType() == Color || clip->clipType() == Text || clip->clipType() == Playlist || clip->clipType() == SlideShow) {
m_transcodeAction->setEnabled(false);
m_extractAudioAction->setEnabled(false);
return;
QList<QAction *> transcodeActions = m_transcodeAction->actions();
QStringList data;
QString condition;
- for (int i = 0; i < transcodeActions.count(); i++) {
+ for (int i = 0; i < transcodeActions.count(); ++i) {
data = transcodeActions.at(i)->data().toStringList();
if (data.count() > 2) {
condition = data.at(2);
if (properties.contains("proxy")) {
if (properties.value("proxy") == "-" || properties.value("proxy").isEmpty())
// this should only apply to proxy jobs
- clip->setConditionalJobStatus(NOJOB, PROXYJOB);
+ clip->setConditionalJobStatus(NoJob, PROXYJOB);
}
if (properties.contains("name")) {
monitorItemEditing(false);
emit clipNameChanged(clip->clipId(), properties.value("name"));
}
if (properties.contains("description")) {
- CLIPTYPE type = clip->clipType();
+ ClipType type = clip->clipType();
monitorItemEditing(false);
clip->setText(1, properties.value("description"));
monitorItemEditing(true);
#ifdef USE_NEPOMUK
- if (KdenliveSettings::activate_nepomuk() && (type == AUDIO || type == VIDEO || type == AV || type == IMAGE || type == PLAYLIST)) {
+ if (KdenliveSettings::activate_nepomuk() && (type == Audio || type == Video || type == AV || type == Image || type == Playlist)) {
// Use Nepomuk system to store clip description
Nepomuk::Resource f(clip->clipUrl().path());
f.setDescription(properties.value("description"));
void ProjectList::slotItemEdited(QTreeWidgetItem *item, int column)
{
- if (item->type() == PROJECTSUBCLIPTYPE) {
+ if (item->type() == ProjectSubclipType) {
// this is a sub-item
if (column == 1) {
// user edited description
}
return;
}
- if (item->type() == PROJECTFOLDERTYPE) {
+ if (item->type() == ProjectFoldeType) {
if (column == 0) {
FolderProjectItem *folder = static_cast <FolderProjectItem*>(item);
- if (item->text(0) == folder->groupName()) return;
+ if (item->text(0) == folder->groupName()) return;
editFolder(item->text(0), folder->groupName(), folder->clipId());
folder->setGroupName(item->text(0));
m_doc->clipManager()->addFolder(folder->clipId(), item->text(0));
const int children = item->childCount();
- for (int i = 0; i < children; i++) {
+ for (int i = 0; i < children; ++i) {
ProjectItem *child = static_cast <ProjectItem *>(item->child(i));
child->setProperty("groupname", item->text(0));
}
oldprops["description"] = clip->referencedClip()->getProperty("description");
newprops["description"] = item->text(1);
- if (clip->clipType() == TEXT) {
+ if (clip->clipType() == Text) {
// This is a text template clip, update the image
/*oldprops.insert("xmldata", clip->referencedClip()->getProperty("xmldata"));
newprops.insert("xmldata", generateTemplateXml(clip->referencedClip()->getProperty("xmltemplate"), item->text(2)).toString());*/
emit projectModified();
EditClipCommand *command = new EditClipCommand(this, clip->clipId(), oldprops, newprops, false);
m_commandStack->push(command);
- QTimer::singleShot(100, this, SLOT(slotCheckScrolling()));
+ QTimer::singleShot(100, this, SLOT(slotCheckScrolling()));
}
}
}
void ProjectList::slotContextMenu(const QPoint &pos, QTreeWidgetItem *item)
{
if (!m_menu) {
- kDebug()<<"Warning, menu was not created, something is wrong";
- return;
+ kDebug()<<"Warning, menu was not created, something is wrong";
+ return;
}
bool enable = item ? true : false;
m_editButton->defaultAction()->setEnabled(enable);
m_clipsActionsMenu->setEnabled(enable);
if (enable) {
ProjectItem *clip = NULL;
- if (m_listView->currentItem()->type() == PROJECTSUBCLIPTYPE) {
+ if (m_listView->currentItem()->type() == ProjectSubclipType) {
clip = static_cast <ProjectItem*>(item->parent());
m_extractAudioAction->setEnabled(false);
m_transcodeAction->setEnabled(false);
m_clipsActionsMenu->setEnabled(false);
adjustProxyActions(clip);
- } else if (m_listView->currentItem()->type() == PROJECTCLIPTYPE) {
+ } else if (m_listView->currentItem()->type() == ProjectClipType) {
clip = static_cast <ProjectItem*>(item);
// Display relevant transcoding actions only
adjustTranscodeActions(clip);
m_transcodeAction->setEnabled(false);
m_clipsActionsMenu->setEnabled(false);
}
- if (clip && clip->clipType() == IMAGE && !KdenliveSettings::defaultimageapp().isEmpty()) {
+ if (clip && clip->clipType() == Image && !KdenliveSettings::defaultimageapp().isEmpty()) {
m_openAction->setIcon(KIcon(KdenliveSettings::defaultimageapp()));
m_openAction->setEnabled(true);
- } else if (clip && clip->clipType() == AUDIO && !KdenliveSettings::defaultaudioapp().isEmpty()) {
+ } else if (clip && clip->clipType() == Audio && !KdenliveSettings::defaultaudioapp().isEmpty()) {
m_openAction->setIcon(KIcon(KdenliveSettings::defaultaudioapp()));
m_openAction->setEnabled(true);
} else {
QUndoCommand *delCommand = new QUndoCommand();
delCommand->setText(i18n("Delete Clip Zone"));
- for (int i = 0; i < selected.count(); i++) {
- if (selected.at(i)->type() == PROJECTSUBCLIPTYPE) {
+ for (int i = 0; i < selected.count(); ++i) {
+ if (selected.at(i)->type() == ProjectSubclipType) {
// subitem
SubProjectItem *sub = static_cast <SubProjectItem *>(selected.at(i));
ProjectItem *item = static_cast <ProjectItem *>(sub->parent());
new AddClipCutCommand(this, item->clipId(), sub->zone().x(), sub->zone().y(), sub->description(), false, true, delCommand);
- } else if (selected.at(i)->type() == PROJECTFOLDERTYPE) {
+ } else if (selected.at(i)->type() == ProjectFoldeType) {
// folder
FolderProjectItem *folder = static_cast <FolderProjectItem *>(selected.at(i));
folderids[folder->groupName()] = folder->clipId();
if (!m_listView->currentItem())
m_listView->setCurrentItem(m_listView->topLevelItem(0));
QTreeWidgetItem *item = m_listView->currentItem();
- if (item && item->type() == PROJECTCLIPTYPE) {
+ if (item && item->type() == ProjectClipType) {
m_editButton->defaultAction()->setEnabled(true);
m_openAction->setEnabled(true);
m_reloadAction->setEnabled(true);
m_clipsActionsMenu->setEnabled(true);
return;
}
- else if (item && item->type() == PROJECTFOLDERTYPE && item->childCount() > 0) {
+ else if (item && item->type() == ProjectFoldeType && item->childCount() > 0) {
m_editButton->defaultAction()->setEnabled(true);
}
else m_editButton->defaultAction()->setEnabled(false);
m_commandStack->push(command);
}
-void ProjectList::slotAddFolder(const QString foldername, const QString &clipId, bool remove, bool edit)
+void ProjectList::slotAddFolder(const QString &foldername, const QString &clipId, bool remove, bool edit)
{
if (remove) {
FolderProjectItem *item = getFolderItemById(clipId);
m_listView->blockSignals(false);
m_doc->clipManager()->addFolder(clipId, foldername);
const int children = item->childCount();
- for (int i = 0; i < children; i++) {
+ for (int i = 0; i < children; ++i) {
ProjectItem *child = static_cast <ProjectItem *>(item->child(i));
child->setProperty("groupname", foldername);
}
if (item == NULL) {
item = new ProjectItem(m_listView, clip, pixelSize);
}
- if (item->data(0, DurationRole).isNull()) item->setData(0, DurationRole, i18n("Loading"));
- connect(clip, SIGNAL(createProxy(const QString &)), this, SLOT(slotCreateProxy(const QString &)));
- connect(clip, SIGNAL(abortProxy(const QString &, const QString &)), this, SLOT(slotAbortProxy(const QString, const QString)));
-
+ if (item->data(0, ItemDelegate::DurationRole).isNull()) item->setData(0, ItemDelegate::DurationRole, i18n("Loading"));
+ connect(clip, SIGNAL(createProxy(QString)), this, SLOT(slotCreateProxy(QString)));
+ connect(clip, SIGNAL(abortProxy(QString,QString)), this, SLOT(slotAbortProxy(QString,QString)));
+
if (getProperties) {
//item->setFlags(Qt::ItemIsSelectable);
m_listView->processLayout();
QDomElement e = clip->toXML().cloneNode().toElement();
- if (!groupName.isEmpty()) {
- e.setAttribute("groupId", parent);
- e.setAttribute("group", groupName);
- }
+ if (!groupName.isEmpty()) {
+ e.setAttribute("groupId", parent);
+ e.setAttribute("group", groupName);
+ }
e.removeAttribute("file_hash");
resetThumbsProducer(clip);
m_render->getFileProperties(e, clip->getId(), m_listView->iconSize().height(), true);
// Add info to date column
QFileInfo fileInfo(url.path());
if (fileInfo.exists()) {
- item->setText(3, fileInfo.lastModified().toString(QString("yyyy/MM/dd hh:mm:ss")));
+ item->setText(3, fileInfo.lastModified().toString(QString("yyyy/MM/dd hh:mm:ss")));
}
// Add cut zones
QList <CutZoneInfo> cuts = clip->cutZones();
if (!cuts.isEmpty()) {
- for (int i = 0; i < cuts.count(); i++) {
+ for (int i = 0; i < cuts.count(); ++i) {
SubProjectItem *sub = new SubProjectItem(m_render->dar(), item, cuts.at(i).zone.x(), cuts.at(i).zone.y(), cuts.at(i).description);
if (!clip->getClipHash().isEmpty()) {
QString cachedPixmap = m_doc->projectFolder().path(KUrl::AddTrailingSlash) + "thumbs/" + clip->getClipHash() + '#' + QString::number(cuts.at(i).zone.x()) + ".png";
ProjectItem *item;
while (*it && !m_closing) {
- if ((*it)->type() == PROJECTCLIPTYPE) {
+ if ((*it)->type() == ProjectClipType) {
item = static_cast <ProjectItem *>(*it);
if (item->referencedClip()->getProperty("proxy") == proxyPath)
slotGotProxy(item);
QDomElement e = clip->toXML().cloneNode().toElement();
// Make sure we get the correct producer length if it was adjusted in timeline
- CLIPTYPE t = item->clipType();
- if (t == COLOR || t == IMAGE || t == SLIDESHOW || t == TEXT) {
+ ClipType t = item->clipType();
+ if (t == Color || t == Image || t == SlideShow || t == Text) {
int length = QString(clip->producerProperty("length")).toInt();
if (length > 0 && !e.hasAttribute("length")) {
e.setAttribute("length", length);
{
m_listView->blockSignals(true);
m_abortAllJobs = true;
- for (int i = 0; i < m_jobList.count(); i++) {
- m_jobList.at(i)->setStatus(JOBABORTED);
+ for (int i = 0; i < m_jobList.count(); ++i) {
+ m_jobList.at(i)->setStatus(JobAborted);
}
m_closing = true;
m_jobThreads.waitForFinished();
{
ProjectItem *item = getItemById(id);
monitorItemEditing(false);
- if (item) item->setData(0, UsageRole, QString::number(item->numReferences()));
+ if (item){
+ item->setData(0, ItemDelegate::UsageRole, QString::number(item->numReferences()));
+ }
monitorItemEditing(true);
}
if (!item) return;
DocClipBase *clip = item->referencedClip();
if (!clip) {
- return;
+ return;
}
QString cachedPixmap = m_doc->projectFolder().path(KUrl::AddTrailingSlash) + "thumbs/" + clip->getClipHash() + ".png";
if (QFile::exists(cachedPixmap)) {
requestClipThumbnail(item->clipId());
}
else {
- QPixmap result = roundedPixmap(pix);
+ QPixmap result = roundedPixmap(pix);
processThumbOverlays(item, result);
item->setPixmap(result);
}
}
}
-QPixmap ProjectList::roundedPixmap(QImage img)
+QPixmap ProjectList::roundedPixmap(const QImage &img)
{
QPixmap pix(img.width(), img.height());
pix.fill(Qt::transparent);
return pix;
}
-QPixmap ProjectList::roundedPixmap(QPixmap source)
+QPixmap ProjectList::roundedPixmap(const QPixmap &source)
{
QPixmap pix(source.width(), source.height());
pix.fill(Qt::transparent);
else requestClipThumbnail(parentItem->clipId() + '#' + QString::number(pos));
}
-void ProjectList::updateAllClips(bool displayRatioChanged, bool fpsChanged, QStringList brokenClips)
+void ProjectList::updateAllClips(bool displayRatioChanged, bool fpsChanged, const QStringList &brokenClips)
{
if (!m_allClipsProcessed) m_listView->setEnabled(false);
m_listView->setSortingEnabled(false);
while (*it) {
emit displayMessage(i18n("Loading thumbnails"), (int)(100 *(max - ct++) / max));
- if ((*it)->type() == PROJECTSUBCLIPTYPE) {
+ if ((*it)->type() == ProjectSubclipType) {
// subitem
SubProjectItem *sub = static_cast <SubProjectItem *>(*it);
if (displayRatioChanged) {
}
++it;
continue;
- } else if ((*it)->type() == PROJECTFOLDERTYPE) {
+ } else if ((*it)->type() == ProjectFoldeType) {
// folder
++it;
continue;
bool replace = false;
if (brokenClips.contains(item->clipId())) {
// if this is a proxy clip, disable proxy
- item->setConditionalJobStatus(NOJOB, PROXYJOB);
+ item->setConditionalJobStatus(NoJob, PROXYJOB);
discardJobs(item->clipId(), PROXYJOB);
clip->setProperty("proxy", "-");
replace = true;
}
if (clip->isPlaceHolder() == false && !hasPendingJob(item, PROXYJOB)) {
QDomElement xml = clip->toXML();
- getCachedThumbnail(item);
+ getCachedThumbnail(item);
if (fpsChanged) {
xml.removeAttribute("out");
xml.removeAttribute("file_hash");
xml.removeAttribute("_replaceproxy");
if (replace) {
resetThumbsProducer(clip);
- m_render->getFileProperties(xml, clip->getId(), m_listView->iconSize().height(), replace);
+ m_render->getFileProperties(xml, clip->getId(), m_listView->iconSize().height(), replace);
}
else if (item->numReferences() > 0) {
- // In some cases, like slowmotion clips, the producer is not loaded automatically be MLT
- m_render->getFileProperties(xml, clip->getId(), m_listView->iconSize().height(), replace);
- }
+ // In some cases, like slowmotion clips, the producer is not loaded automatically be MLT
+ m_render->getFileProperties(xml, clip->getId(), m_listView->iconSize().height(), replace);
+ }
}
else if (clip->isPlaceHolder()) {
item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDropEnabled);
item->setPixmap(pixmap);
}
}
- } else {
+ } else {
if (displayRatioChanged) {
requestClipThumbnail(clip->getId());
}
else if (!item->hasPixmap()) {
getCachedThumbnail(item);
}
- if (item->data(0, DurationRole).toString().isEmpty()) {
+ if (item->data(0, ItemDelegate::DurationRole).toString().isEmpty()) {
item->changeDuration(clip->getProducer()->get_playtime());
}
if (clip->isPlaceHolder()) {
slotCreateProxy(clip->getId());
}
}
- item->setData(0, UsageRole, QString::number(item->numReferences()));
+ item->setData(0, ItemDelegate::UsageRole, QString::number(item->numReferences()));
}
++it;
}
m_listView->setSortingEnabled(true);
m_allClipsProcessed = true;
if (m_render->processingItems() == 0) {
- monitorItemEditing(true);
- slotProcessNextThumbnail();
+ monitorItemEditing(true);
+ slotProcessNextThumbnail();
}
}
return allExtensions.simplified();
}
-void ProjectList::slotAddClip(const QString url, const QString &groupName, const QString &groupId)
+void ProjectList::slotAddClip(const QString &url, const QString &groupName, const QString &groupId)
{
kDebug()<<"// Adding clip: "<<url;
QList <QUrl> list;
slotAddClip(list, groupName, groupId);
}
-void ProjectList::slotAddClip(const QList <QUrl> givenList, const QString &groupName, const QString &groupId)
+void ProjectList::slotAddClip(const QList <QUrl> &givenList, const QString &groupName, const QString &groupId)
{
if (!m_commandStack)
kDebug() << "!!!!!!!!!!!!!!!! NO CMD STK";
l->addWidget(c);
l->addStretch(5);
f->setLayout(l);
+
QPointer<KFileDialog> d = new KFileDialog(KUrl("kfiledialog:///clipfolder"), dialogFilter, kapp->activeWindow(), f);
d->setOperationMode(KFileDialog::Opening);
d->setMode(KFile::Files);
if (d->exec() == QDialog::Accepted) {
KdenliveSettings::setAutoimagetransparency(c->isChecked());
- }
- list = d->selectedUrls();
- if (b->isChecked() && list.count() == 1) {
- // Check for image sequence
- KUrl url = list.at(0);
- QString fileName = url.fileName().section('.', 0, -2);
- if (fileName.at(fileName.size() - 1).isDigit()) {
- KFileItem item(KFileItem::Unknown, KFileItem::Unknown, url);
- if (item.mimetype().startsWith("image")) {
- // import as sequence if we found more than one image in the sequence
- QStringList list;
- QString pattern = SlideshowClip::selectedPath(url.path(), false, QString(), &list);
- int count = list.count();
- if (count > 1) {
- delete d;
- QStringList groupInfo = getGroup();
-
- // get image sequence base name
- while (fileName.at(fileName.size() - 1).isDigit()) {
- fileName.chop(1);
+ list = d->selectedUrls();
+ if (b->isChecked() && list.count() == 1) {
+ // Check for image sequence
+ KUrl url = list.at(0);
+ QString fileName = url.fileName().section('.', 0, -2);
+ if (fileName.at(fileName.size() - 1).isDigit()) {
+ KFileItem item(KFileItem::Unknown, KFileItem::Unknown, url);
+ if (item.mimetype().startsWith("image")) {
+ // import as sequence if we found more than one image in the sequence
+ QStringList list;
+ QString pattern = SlideshowClip::selectedPath(url.path(), false, QString(), &list);
+ int count = list.count();
+ if (count > 1) {
+ delete d;
+ QStringList groupInfo = getGroup();
+
+ // get image sequence base name
+ while (fileName.at(fileName.size() - 1).isDigit()) {
+ fileName.chop(1);
+ }
+ QMap <QString, QString> properties;
+ properties.insert("name", fileName);
+ properties.insert("resource", pattern);
+ properties.insert("in", "0");
+ QString duration = m_timecode.reformatSeparators(KdenliveSettings::sequence_duration());
+ properties.insert("out", QString::number(m_doc->getFramePos(duration) * count));
+ properties.insert("ttl", QString::number(m_doc->getFramePos(duration)));
+ properties.insert("loop", QString::number(false));
+ properties.insert("crop", QString::number(false));
+ properties.insert("fade", QString::number(false));
+ properties.insert("luma_duration", QString::number(m_doc->getFramePos(m_timecode.getTimecodeFromFrames(int(ceil(m_timecode.fps()))))));
+ m_doc->slotCreateSlideshowClipFile(properties, groupInfo.at(0), groupInfo.at(1));
+ return;
}
- QMap <QString, QString> properties;
- properties.insert("name", fileName);
- properties.insert("resource", pattern);
- properties.insert("in", "0");
- QString duration = m_timecode.reformatSeparators(KdenliveSettings::sequence_duration());
- properties.insert("out", QString::number(m_doc->getFramePos(duration) * count));
- properties.insert("ttl", QString::number(m_doc->getFramePos(duration)));
- properties.insert("loop", QString::number(false));
- properties.insert("crop", QString::number(false));
- properties.insert("fade", QString::number(false));
- properties.insert("luma_duration", QString::number(m_doc->getFramePos(m_timecode.getTimecodeFromFrames(int(ceil(m_timecode.fps()))))));
- m_doc->slotCreateSlideshowClipFile(properties, groupInfo.at(0), groupInfo.at(1));
- return;
}
}
}
}
delete d;
} else {
- for (int i = 0; i < givenList.count(); i++)
+ for (int i = 0; i < givenList.count(); ++i)
list << givenList.at(i);
}
QList <KUrl::List> foldersList;
if (givenList.isEmpty() && !list.isEmpty()) {
QStringList groupInfo = getGroup();
- QMap <QString, QString> data;
- data.insert("group", groupInfo.at(0));
- data.insert("groupId", groupInfo.at(1));
+ QMap <QString, QString> data;
+ data.insert("group", groupInfo.at(0));
+ data.insert("groupId", groupInfo.at(1));
m_doc->slotAddClipList(list, data);
} else if (!list.isEmpty()) {
- QMap <QString, QString> data;
- data.insert("group", groupName);
- data.insert("groupId", groupId);
+ QMap <QString, QString> data;
+ data.insert("group", groupName);
+ data.insert("groupId", groupId);
m_doc->slotAddClipList(list, data);
}
if (!foldersList.isEmpty()) {
- // create folders
- for (int i = 0; i < foldersList.count(); i++) {
+ // create folders
+ for (int i = 0; i < foldersList.count(); ++i) {
KUrl::List urls = foldersList.at(i);
KUrl folderUrl = urls.takeFirst();
QString folderName = folderUrl.fileName();
}
}
if (folder) {
- QMap <QString, QString> data;
- data.insert("group", folder->groupName());
- data.insert("groupId", folder->clipId());
+ QMap <QString, QString> data;
+ data.insert("group", folder->groupName());
+ data.insert("groupId", folder->clipId());
m_doc->slotAddClipList(urls, data);
- }
+ }
else m_doc->slotAddClipList(urls);
}
}
}
else {
if (replace)
- m_invalidClipDialog = new InvalidDialog(i18n("Invalid clip"), i18n("Clip <b>%1</b><br />is invalid, will be removed from project.", QString()), replace, kapp->activeWindow());
+ m_invalidClipDialog = new InvalidDialog(i18n("Invalid clip"), i18n("Clip is invalid, will be removed from project."), replace, kapp->activeWindow());
else {
- m_invalidClipDialog = new InvalidDialog(i18n("Invalid clip"), i18n("Clip <b>%1</b><br />is missing or invalid. Remove it from project?", QString()), replace, kapp->activeWindow());
+ m_invalidClipDialog = new InvalidDialog(i18n("Invalid clip"), i18n("Clip is missing or invalid. Remove it from project?"), replace, kapp->activeWindow());
}
m_invalidClipDialog->addClip(id, path);
int result = m_invalidClipDialog->exec();
kDebug() << "Proxy duration is wrong, try changing transcoding parameters.";
emit displayMessage(i18n("Proxy clip unusable (duration is different from original)."), -2, ErrorMessage);
}
- slotUpdateJobStatus(item, PROXYJOB, JOBCRASHED, i18n("Failed to create proxy for %1. check parameters", item->text(0)), "project_settings");
+ slotUpdateJobStatus(item, PROXYJOB, JobCrashed, i18n("Failed to create proxy for %1. check parameters", item->text(0)), "project_settings");
QString path = item->referencedClip()->getProperty("proxy");
KUrl proxyFolder(m_doc->projectFolder().path( KUrl::AddTrailingSlash) + "proxy/");
{
QStringList result;
QTreeWidgetItem *item = m_listView->currentItem();
- while (item && item->type() != PROJECTFOLDERTYPE)
+ while (item && item->type() != ProjectFoldeType)
item = item->parent();
if (item) {
{
m_listView->blockSignals(true);
m_abortAllJobs = true;
- for (int i = 0; i < m_jobList.count(); i++) {
- m_jobList.at(i)->setStatus(JOBABORTED);
+ for (int i = 0; i < m_jobList.count(); ++i) {
+ m_jobList.at(i)->setStatus(JobAborted);
}
m_closing = true;
m_jobThreads.waitForFinished();
m_refreshed = true;
m_allClipsProcessed = true;
}
- for (int i = 0; i < list.count(); i++)
+ for (int i = 0; i < list.count(); ++i)
slotAddClip(list.at(i), false);
m_listView->blockSignals(false);
- 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(bool, bool, QStringList)), this, SLOT(updateAllClips(bool, bool, QStringList)));
- connect(m_doc->clipManager(), SIGNAL(thumbReady(const QString &, int, QImage)), this, SLOT(slotSetThumbnail(const QString &, int, QImage)));
+ connect(m_doc->clipManager(), SIGNAL(reloadClip(QString)), this, SLOT(slotReloadClip(QString)));
+ connect(m_doc->clipManager(), SIGNAL(modifiedClip(QString)), this, SLOT(slotModifiedClip(QString)));
+ connect(m_doc->clipManager(), SIGNAL(missingClip(QString)), this, SLOT(slotMissingClip(QString)));
+ connect(m_doc->clipManager(), SIGNAL(availableClip(QString)), this, SLOT(slotAvailableClip(QString)));
+ connect(m_doc->clipManager(), SIGNAL(checkAllClips(bool,bool,QStringList)), this, SLOT(updateAllClips(bool,bool,QStringList)));
+ connect(m_doc->clipManager(), SIGNAL(thumbReady(QString,int,QImage)), this, SLOT(slotSetThumbnail(QString,int,QImage)));
}
void ProjectList::slotSetThumbnail(const QString &id, int framePos, QImage img)
if (!item && framePos == 0) pItem = getItemById(id);
if (!item && !pItem) return;
if (item) {
- if (item->type() == PROJECTCLIPTYPE) static_cast<ProjectItem*>(item)->setPixmap(QPixmap::fromImage(img));
- else item->setData(0, Qt::DecorationRole, QPixmap::fromImage(img));
+ if (item->type() == ProjectClipType) static_cast<ProjectItem*>(item)->setPixmap(QPixmap::fromImage(img));
+ else item->setData(0, Qt::DecorationRole, QPixmap::fromImage(img));
}
else if (pItem) pItem->setPixmap(QPixmap::fromImage(img));
if (pItem) {
- QString hash = pItem->getClipHash();
- if (!hash.isEmpty()) m_doc->cacheImage(hash + '#' + QString::number(framePos), img);
+ QString hash = pItem->getClipHash();
+ if (!hash.isEmpty()) m_doc->cacheImage(hash + '#' + QString::number(framePos), img);
}
}
doc.appendChild(prods);
QTreeWidgetItemIterator it(m_listView);
while (*it) {
- if ((*it)->type() != PROJECTCLIPTYPE) {
+ if ((*it)->type() != ProjectClipType) {
// subitem
++it;
continue;
}
-void ProjectList::requestClipThumbnail(const QString id)
+void ProjectList::requestClipThumbnail(const QString &id)
{
if (!m_thumbnailQueue.contains(id)) m_thumbnailQueue.append(id);
slotProcessNextThumbnail();
ProjectItem *item = NULL;
bool isSubItem = false;
int frame;
- if (it->type() == PROJECTFOLDERTYPE) return;
- if (it->type() == PROJECTSUBCLIPTYPE) {
+ if (it->type() == ProjectFoldeType) return;
+ if (it->type() == ProjectSubclipType) {
item = static_cast <ProjectItem *>(it->parent());
frame = static_cast <SubProjectItem *>(it)->zone().x();
isSubItem = true;
int height = m_listView->iconSize().height();
int swidth = (int)(height * m_render->frameRenderWidth() / m_render->renderHeight()+ 0.5);
int dwidth = (int)(height * m_render->dar() + 0.5);
- if (clip->clipType() == IMAGE) {
+ if (clip->clipType() == Image) {
img = KThumb::getFrame(item->referencedClip()->getProducer(), 0, swidth, dwidth, height);
- }
- else if (clip->clipType() != AUDIO) {
+ }
+ else if (clip->clipType() != Audio) {
img = item->referencedClip()->extractImage(frame, dwidth, height);
}
if (!img.isNull()) {
monitorItemEditing(false);
- QPixmap pix = roundedPixmap(img);
- processThumbOverlays(item, pix);
+ QPixmap pix = roundedPixmap(img);
+ processThumbOverlays(item, pix);
if (isSubItem) it->setData(0, Qt::DecorationRole, pix);
- else item->setPixmap(pix);
+ else item->setPixmap(pix);
monitorItemEditing(true);
QString hash = item->getClipHash();
void ProjectList::extractMetadata(DocClipBase *clip)
{
- CLIPTYPE t = clip->clipType();
- if (t != AV && t != VIDEO) {
- // Currently, we only use exiftool on video files
- return;
+ ClipType t = clip->clipType();
+ if (t != AV && t != Video) {
+ // Currently, we only use exiftool on video files
+ return;
}
QMap <QString, QString> props = clip->properties();
if (KdenliveSettings::use_exiftool() && !props.contains("exiftool")) {
- QMap <QString, QString> meta;
- QString url = clip->fileURL().path();
- //Check for Canon THM file
- url = url.section('.', 0, -2) + ".THM";
- if (QFile::exists(url)) {
- // Read the exif metadata embeded in the THM file
- QProcess p;
- QStringList args;
- args << "-g" << "-args" << url;
- p.start("exiftool", args);
- p.waitForFinished();
- QString res = p.readAllStandardOutput();
- QStringList list = res.split("\n");
- foreach(QString tagline, list) {
- if (tagline.startsWith("-File") || tagline.startsWith("-ExifTool")) continue;
- QString tag = tagline.section(':', 1).simplified();
- if (tag.startsWith("ImageWidth") || tag.startsWith("ImageHeight")) continue;
- if (!tag.section('=', 0, 0).isEmpty() && !tag.section('=', 1).simplified().isEmpty())
- meta.insert(tag.section('=', 0, 0), tag.section('=', 1).simplified());
- }
- } else {
- QString codecid = props.value("videocodecid").simplified();
- if (codecid == "h264") {
- QProcess p;
- QStringList args;
- args << "-g" << "-args" << clip->fileURL().encodedPathAndQuery();
- p.start("exiftool", args);
- p.waitForFinished();
- QString res = p.readAllStandardOutput();
- QStringList list = res.split("\n");
- foreach(QString tagline, list) {
- if (!tagline.startsWith("-H264")) continue;
- QString tag = tagline.section(':', 1);
- if (tag.startsWith("ImageWidth") || tag.startsWith("ImageHeight")) continue;
- meta.insert(tag.section('=', 0, 0), tag.section('=', 1));
- }
- }
- }
- clip->setProperty("exiftool", "1");
- if (!meta.isEmpty()) {
- clip->setMetadata(meta, "ExifTool");
- //checkCamcorderFilters(clip, meta);
- }
+ QMap <QString, QString> meta;
+ QString url = clip->fileURL().path();
+ //Check for Canon THM file
+ url = url.section('.', 0, -2) + ".THM";
+ if (QFile::exists(url)) {
+ // Read the exif metadata embeded in the THM file
+ QProcess p;
+ QStringList args;
+ args << "-g" << "-args" << url;
+ p.start("exiftool", args);
+ p.waitForFinished();
+ QString res = p.readAllStandardOutput();
+ QStringList list = res.split("\n");
+ foreach(QString tagline, list) {
+ if (tagline.startsWith("-File") || tagline.startsWith("-ExifTool")) continue;
+ QString tag = tagline.section(':', 1).simplified();
+ if (tag.startsWith("ImageWidth") || tag.startsWith("ImageHeight")) continue;
+ if (!tag.section('=', 0, 0).isEmpty() && !tag.section('=', 1).simplified().isEmpty())
+ meta.insert(tag.section('=', 0, 0), tag.section('=', 1).simplified());
+ }
+ } else {
+ QString codecid = props.value("videocodecid").simplified();
+ if (codecid == "h264") {
+ QProcess p;
+ QStringList args;
+ args << "-g" << "-args" << clip->fileURL().encodedPathAndQuery();
+ p.start("exiftool", args);
+ p.waitForFinished();
+ QString res = p.readAllStandardOutput();
+ QStringList list = res.split("\n");
+ foreach(QString tagline, list) {
+ if (!tagline.startsWith("-H264")) continue;
+ QString tag = tagline.section(':', 1);
+ if (tag.startsWith("ImageWidth") || tag.startsWith("ImageHeight")) continue;
+ meta.insert(tag.section('=', 0, 0), tag.section('=', 1));
+ }
+ }
+ }
+ clip->setProperty("exiftool", "1");
+ if (!meta.isEmpty()) {
+ clip->setMetadata(meta, "ExifTool");
+ //checkCamcorderFilters(clip, meta);
+ }
}
if (KdenliveSettings::use_magicLantern() && !props.contains("magiclantern")) {
- QMap <QString, QString> meta;
- QString url = clip->fileURL().path();
- url = url.section('.', 0, -2) + ".LOG";
- if (QFile::exists(url)) {
- QFile file(url);
- if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
- while (!file.atEnd()) {
- QString line = file.readLine().simplified();
- if (line.startsWith('#') || line.isEmpty() || !line.contains(':')) continue;
- if (line.startsWith("CSV data")) break;
- meta.insert(line.section(':', 0, 0).simplified(), line.section(':', 1).simplified());
- }
- }
- }
-
- if (!meta.isEmpty())
- clip->setMetadata(meta, "Magic Lantern");
- clip->setProperty("magiclantern", "1");
+ QMap <QString, QString> meta;
+ QString url = clip->fileURL().path();
+ url = url.section('.', 0, -2) + ".LOG";
+ if (QFile::exists(url)) {
+ QFile file(url);
+ if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ while (!file.atEnd()) {
+ QString line = file.readLine().simplified();
+ if (line.startsWith('#') || line.isEmpty() || !line.contains(':')) continue;
+ if (line.startsWith("CSV data")) break;
+ meta.insert(line.section(':', 0, 0).simplified(), line.section(':', 1).simplified());
+ }
+ }
+ }
+
+ if (!meta.isEmpty())
+ clip->setMetadata(meta, "Magic Lantern");
+ clip->setProperty("magiclantern", "1");
}
}
}
item->setProperties(properties, metadata);
clip->setProducer(producer, replace);
- extractMetadata(clip);
- m_render->processingDone(clipId);
+ extractMetadata(clip);
+ m_render->processingDone(clipId);
// Proxy stuff
QString size = properties.value("frame_size");
if (!useProxy() && clip->getProperty("proxy").isEmpty()) {
- item->setConditionalJobStatus(NOJOB, PROXYJOB);
+ item->setConditionalJobStatus(NoJob, PROXYJOB);
discardJobs(clipId, PROXYJOB);
}
if (useProxy() && generateProxy() && clip->getProperty("proxy") == "-") {
- item->setConditionalJobStatus(NOJOB, PROXYJOB);
+ item->setConditionalJobStatus(NoJob, PROXYJOB);
discardJobs(clipId, PROXYJOB);
}
else if (useProxy() && !item->hasProxy() && !hasPendingJob(item, PROXYJOB)) {
// proxy video and image clips
int maxSize;
- CLIPTYPE t = item->clipType();
- if (t == IMAGE) maxSize = m_doc->getDocumentProperty("proxyimageminsize").toInt();
+ ClipType t = item->clipType();
+ if (t == Image) maxSize = m_doc->getDocumentProperty("proxyimageminsize").toInt();
else maxSize = m_doc->getDocumentProperty("proxyminsize").toInt();
- if ((((t == AV || t == VIDEO || t == PLAYLIST) && generateProxy()) || (t == IMAGE && generateImageProxy())) && (size.section('x', 0, 0).toInt() > maxSize || size.section('x', 1, 1).toInt() > maxSize)) {
+ if ((((t == AV || t == Video || t == Playlist) && generateProxy()) || (t == Image && generateImageProxy())) && (size.section('x', 0, 0).toInt() > maxSize || size.section('x', 1, 1).toInt() > maxSize)) {
if (clip->getProperty("proxy").isEmpty()) {
KUrl proxyPath = m_doc->projectFolder();
proxyPath.addPath("proxy/");
- proxyPath.addPath(clip->getClipHash() + '.' + (t == IMAGE ? "png" : m_doc->getDocumentProperty("proxyextension")));
+ proxyPath.addPath(clip->getClipHash() + '.' + (t == Image ? "png" : m_doc->getDocumentProperty("proxyextension")));
QMap <QString, QString> newProps;
// insert required duration for proxy
- if (t != IMAGE) newProps.insert("proxy_out", clip->producerProperty("out"));
+ if (t != Image) newProps.insert("proxy_out", clip->producerProperty("out"));
newProps.insert("proxy", proxyPath.path());
QMap <QString, QString> oldProps = clip->properties();
oldProps.insert("proxy", QString());
if (!toReload.isEmpty())
item->slotSetToolTip();
} else {
- kDebug() << "//////// COULD NOT FIND CLIP TO UPDATE PRPS...";
- m_render->processingDone(clipId);
+ kDebug() << "//////// COULD NOT FIND CLIP TO UPDATE PRPS...";
+ m_render->processingDone(clipId);
}
int queue = m_render->processingItems();
if (queue == 0) {
m_listView->setCurrentItem(item);
bool updatedProfile = false;
if (item->parent()) {
- if (item->parent()->type() == PROJECTFOLDERTYPE)
+ if (item->parent()->type() == ProjectFoldeType)
static_cast <FolderProjectItem *>(item->parent())->switchIcon();
} else if (KdenliveSettings::checkfirstprojectclip() && m_listView->topLevelItemCount() == 1 && m_refreshed && m_allClipsProcessed) {
// this is the first clip loaded in project, check if we want to adjust project settings to the clip
updatedProfile = adjustProjectProfileToItem(item);
- if (updatedProfile == false) {
- emit clipSelected(item->referencedClip());
- }
+ if (updatedProfile == false) {
+ emit clipSelected(item->referencedClip());
+ }
}
if (updatedProfile == false) {
//emit clipSelected(item->referencedClip());
return;
}
if (replace) toReload = clipId;
- if (!toReload.isEmpty())
+ if (!toReload.isEmpty()) {
emit clipNeedsReload(toReload);
+ }
}
bool ProjectList::adjustProjectProfileToItem(ProjectItem *item)
{
if (item == NULL) {
- if (m_listView->currentItem() && m_listView->currentItem()->type() != PROJECTFOLDERTYPE)
+ if (m_listView->currentItem() && m_listView->currentItem()->type() != ProjectFoldeType)
item = static_cast <ProjectItem*>(m_listView->currentItem());
}
if (item == NULL || item->referencedClip() == NULL) {
if (height == 1088) height = 1080;
double fps = item->referencedClip()->getProperty("fps").toDouble();
double par = item->referencedClip()->getProperty("aspect_ratio").toDouble();
- if (item->clipType() == IMAGE || item->clipType() == AV || item->clipType() == VIDEO) {
- if (ProfilesDialog::matchProfile(width, height, fps, par, item->clipType() == IMAGE, m_doc->mltProfile()) == false) {
+ if (item->clipType() == Image || item->clipType() == AV || item->clipType() == Video) {
+ if (ProfilesDialog::matchProfile(width, height, fps, par, item->clipType() == Image, m_doc->mltProfile()) == false) {
// get a list of compatible profiles
- QMap <QString, QString> suggestedProfiles = ProfilesDialog::getProfilesFromProperties(width, height, fps, par, item->clipType() == IMAGE);
+ QMap <QString, QString> suggestedProfiles = ProfilesDialog::getProfilesFromProperties(width, height, fps, par, item->clipType() == Image);
if (!suggestedProfiles.isEmpty()) {
KDialog *dialog = new KDialog(this);
dialog->setCaption(i18n("Change project profile"));
{
ProjectItem *item = getItemById(clipId);
if (item && !img.isNull()) {
- QPixmap pix = roundedPixmap(img);
+ QPixmap pix = roundedPixmap(img);
processThumbOverlays(item, pix);
monitorItemEditing(false);
item->setPixmap(pix);
ProjectItem *result = NULL;
while (*it) {
- if ((*it)->type() != PROJECTCLIPTYPE) {
+ if ((*it)->type() != ProjectClipType) {
// subitem
++it;
continue;
if (result == NULL || !id.contains('#')) {
return result;
} else {
- for (int i = 0; i < result->childCount(); i++) {
+ for (int i = 0; i < result->childCount(); ++i) {
SubProjectItem *sub = static_cast <SubProjectItem *>(result->child(i));
if (sub && sub->zone().x() == id.section('#', 1, 1).toInt())
return sub;
ProjectItem *item;
QTreeWidgetItemIterator it(m_listView);
while (*it) {
- if ((*it)->type() != PROJECTCLIPTYPE) {
+ if ((*it)->type() != ProjectClipType) {
// subitem or folder
++it;
continue;
{
FolderProjectItem *item = NULL;
QList <QTreeWidgetItem *> hits = m_listView->findItems(name, Qt::MatchExactly, 0);
- for (int i = 0; i < hits.count(); i++) {
- if (hits.at(i)->type() == PROJECTFOLDERTYPE) {
+ for (int i = 0; i < hits.count(); ++i) {
+ if (hits.at(i)->type() == ProjectFoldeType) {
item = static_cast<FolderProjectItem *>(hits.at(i));
break;
}
FolderProjectItem *item;
QTreeWidgetItemIterator it(m_listView);
while (*it) {
- if ((*it)->type() == PROJECTFOLDERTYPE) {
+ if ((*it)->type() == ProjectFoldeType) {
item = static_cast<FolderProjectItem *>(*it);
if (item->clipId() == id)
return item;
m_extractAudioAction->setEnabled(true);
m_transcodeAction->setEnabled(true);
m_clipsActionsMenu->setEnabled(true);
- if (clip->clipType() == IMAGE && !KdenliveSettings::defaultimageapp().isEmpty()) {
+ if (clip->clipType() == Image && !KdenliveSettings::defaultimageapp().isEmpty()) {
m_openAction->setIcon(KIcon(KdenliveSettings::defaultimageapp()));
m_openAction->setEnabled(true);
- } else if (clip->clipType() == AUDIO && !KdenliveSettings::defaultaudioapp().isEmpty()) {
+ } else if (clip->clipType() == Audio && !KdenliveSettings::defaultaudioapp().isEmpty()) {
m_openAction->setIcon(KIcon(KdenliveSettings::defaultaudioapp()));
m_openAction->setEnabled(true);
} else {
QString ProjectList::currentClipUrl() const
{
ProjectItem *item;
- if (!m_listView->currentItem() || m_listView->currentItem()->type() == PROJECTFOLDERTYPE) return QString();
- if (m_listView->currentItem()->type() == PROJECTSUBCLIPTYPE) {
+ if (!m_listView->currentItem() || m_listView->currentItem()->type() == ProjectFoldeType) return QString();
+ if (m_listView->currentItem()->type() == ProjectSubclipType) {
// subitem
item = static_cast <ProjectItem*>(m_listView->currentItem()->parent());
} else {
KUrl::List result;
ProjectItem *item;
QList<QTreeWidgetItem *> list = m_listView->selectedItems();
- for (int i = 0; i < list.count(); i++) {
- if (list.at(i)->type() == PROJECTFOLDERTYPE)
+ for (int i = 0; i < list.count(); ++i) {
+ if (list.at(i)->type() == ProjectFoldeType)
continue;
- if (list.at(i)->type() == PROJECTSUBCLIPTYPE) {
+ if (list.at(i)->type() == ProjectSubclipType) {
// subitem
item = static_cast <ProjectItem*>(list.at(i)->parent());
} else {
item = static_cast <ProjectItem*>(list.at(i));
}
- if (item == NULL || item->type() == COLOR || item->type() == SLIDESHOW || item->type() == TEXT)
+ if (item == NULL || item->type() == Color || item->type() == SlideShow || item->type() == Text)
continue;
DocClipBase *clip = item->referencedClip();
if (!condition.isEmpty()) {
return result;
}
-QStringList ProjectList::getConditionalIds(const QString &condition) const
+QMap <QString, QString> ProjectList::getConditionalIds(const QString &condition) const
{
- QStringList result;
+ QMap <QString, QString> result;
ProjectItem *item;
QList<QTreeWidgetItem *> list = m_listView->selectedItems();
- for (int i = 0; i < list.count(); i++) {
- if (list.at(i)->type() == PROJECTFOLDERTYPE)
+ for (int i = 0; i < list.count(); ++i) {
+ if (list.at(i)->type() == ProjectFoldeType)
continue;
- if (list.at(i)->type() == PROJECTSUBCLIPTYPE) {
+ if (list.at(i)->type() == ProjectSubclipType) {
// subitem
item = static_cast <ProjectItem*>(list.at(i)->parent());
} else {
item = static_cast <ProjectItem*>(list.at(i));
}
- if (item == NULL || item->type() == COLOR || item->type() == SLIDESHOW || item->type() == TEXT)
+ if (item == NULL || item->type() == Color || item->type() == SlideShow || item->type() == Text)
continue;
DocClipBase *clip = item->referencedClip();
if (!condition.isEmpty()) {
else if (condition.startsWith("acodec") && !clip->hasAudioCodec(condition.section('=', 1, 1)))
continue;
}
- result.append(item->clipId());
+ result.insert(item->clipId(), item->clipUrl().path());
}
return result;
}
}
file.close();
QDomNodeList texts = doc.elementsByTagName("content");
- for (int i = 0; i < texts.count(); i++) {
+ for (int i = 0; i < texts.count(); ++i) {
QString data = texts.item(i).firstChild().nodeValue();
data.replace("%s", replaceString);
texts.item(i).firstChild().setNodeValue(data);
m_listView->scrollToItem(sub);
m_listView->editItem(sub, 1);
}
- m_doc->clipManager()->slotRequestThumbs(QString('#' + id), QList <int>() << in);
+ m_doc->clipManager()->slotRequestThumbs(QString('#' + id), QList <int>() << in);
monitorItemEditing(true);
}
emit projectModified();
emit projectModified();
}
-SubProjectItem *ProjectList::getSubItem(ProjectItem *clip, QPoint zone)
+SubProjectItem *ProjectList::getSubItem(ProjectItem *clip, const QPoint &zone)
{
SubProjectItem *sub = NULL;
if (clip) {
- for (int i = 0; i < clip->childCount(); i++) {
+ for (int i = 0; i < clip->childCount(); ++i) {
QTreeWidgetItem *it = clip->child(i);
- if (it->type() == PROJECTSUBCLIPTYPE) {
+ if (it->type() == ProjectSubclipType) {
sub = static_cast <SubProjectItem*>(it);
if (sub->zone() == zone)
break;
void ProjectList::slotUpdateClipCut(QPoint p)
{
- if (!m_listView->currentItem() || m_listView->currentItem()->type() != PROJECTSUBCLIPTYPE)
+ if (!m_listView->currentItem() || m_listView->currentItem()->type() != ProjectSubclipType)
return;
SubProjectItem *sub = static_cast <SubProjectItem*>(m_listView->currentItem());
ProjectItem *item = static_cast <ProjectItem *>(sub->parent());
m_commandStack->push(command);
}
-void ProjectList::doUpdateClipCut(const QString &id, const QPoint oldzone, const QPoint zone, const QString &comment)
+void ProjectList::doUpdateClipCut(const QString &id, const QPoint &oldzone, const QPoint &zone, const QString &comment)
{
ProjectItem *clip = getItemById(id);
SubProjectItem *sub = getSubItem(clip, oldzone);
m_render->forceProcessing(id);
}
-void ProjectList::slotAddOrUpdateSequence(const QString frameName)
+void ProjectList::slotAddOrUpdateSequence(const QString &frameName)
{
QString fileName = KUrl(frameName).fileName().section('_', 0, -2);
QStringList list;
properties.insert("crop", QString::number(false));
properties.insert("fade", QString::number(false));
properties.insert("luma_duration", m_timecode.getTimecodeFromFrames(int(ceil(m_timecode.fps()))));
-
+
m_doc->slotCreateSlideshowClipFile(properties, groupInfo.at(0), groupInfo.at(1));
}
} else emit displayMessage(i18n("Sequence not found"), -2, ErrorMessage);
ProjectItem *item;
QTreeWidgetItemIterator it(m_listView);
while (*it) {
- if ((*it)->type() != PROJECTCLIPTYPE) {
+ if ((*it)->type() != ProjectClipType) {
++it;
continue;
}
return list;
}
-void ProjectList::slotCreateProxy(const QString id)
+void ProjectList::slotCreateProxy(const QString &id)
{
ProjectItem *item = getItemById(id);
if (!item || hasPendingJob(item, PROXYJOB) || item->referencedClip()->isPlaceHolder()) return;
QString path = item->referencedClip()->getProperty("proxy");
if (path.isEmpty()) {
- slotUpdateJobStatus(item, PROXYJOB, JOBCRASHED, i18n("Failed to create proxy, empty path."));
+ slotUpdateJobStatus(item, PROXYJOB, JobCrashed, i18n("Failed to create proxy, empty path."));
return;
}
if (QFileInfo(path).size() > 0) {
// Proxy already created
- setJobStatus(item, PROXYJOB, JOBDONE);
+ setJobStatus(item, PROXYJOB, JobDone);
slotGotProxy(path);
return;
}
QString sourcePath = item->clipUrl().path();
- if (item->clipType() == PLAYLIST) {
- // Special case: playlists use the special 'consumer' producer to support resizing
- sourcePath.prepend("consumer:");
+ if (item->clipType() == Playlist) {
+ // Special case: playlists use the special 'consumer' producer to support resizing
+ sourcePath.prepend("consumer:");
}
ProxyJob *job = new ProxyJob(item->clipType(), id, QStringList() << path << sourcePath << item->referencedClip()->producerProperty("_exif_orientation") << m_doc->getDocumentProperty("proxyparams").simplified() << QString::number(m_render->frameRenderWidth()) << QString::number(m_render->renderHeight()));
if (job->isExclusive() && hasPendingJob(item, job->jobType)) {
}
m_jobList.append(job);
- setJobStatus(item, job->jobType, JOBWAITING, 0, job->statusMessage());
+ setJobStatus(item, job->jobType, JobWaiting, 0, job->statusMessage());
slotCheckJobProcess();
}
return;
}
m_jobList.append(job);
- setJobStatus(item, job->jobType, JOBWAITING, 0, job->statusMessage());
+ setJobStatus(item, job->jobType, JobWaiting, 0, job->statusMessage());
slotCheckJobProcess();
}
void ProjectList::slotTranscodeClipJob(const QString &condition, QString params, QString desc)
{
QStringList existingFiles;
- QStringList ids = getConditionalIds(condition);
+ QMap <QString, QString> ids = getConditionalIds(condition);
+ QMap<QString, QString>::const_iterator i = ids.constBegin();
QStringList destinations;
- foreach(const QString &id, ids) {
- ProjectItem *item = getItemById(id);
- if (!item) continue;
- QString newFile = params.section(' ', -1).replace("%1", item->clipUrl().path());
+ while (i != ids.constEnd()) {
+ QString newFile = params.section(' ', -1).replace("%1", i.value());
destinations << newFile;
if (QFile::exists(newFile)) existingFiles << newFile;
+ ++i;
}
if (!existingFiles.isEmpty()) {
if (KMessageBox::warningContinueCancelList(this, i18n("The transcoding job will overwrite the following files:"), existingFiles) == KMessageBox::Cancel) return;
params = ui.extra_params->toPlainText().simplified();
KdenliveSettings::setAdd_new_clip(ui.add_clip->isChecked());
int index = 0;
- foreach(const QString &id, ids) {
- ProjectItem *item = getItemById(id);
+ i = ids.constBegin();
+ while (i != ids.constEnd()) {
+ ProjectItem *item = getItemById(i.key());
if (!item || !item->referencedClip()) continue;
- QString src = item->clipUrl().path();
+ QString src = i.value();
QString dest;
if (ids.count() > 1) {
- dest = destinations.at(index);
- index++;
- }
+ dest = destinations.at(index);
+ index++;
+ }
else dest = ui.file_url->url().path();
QStringList jobParams;
jobParams << dest << src << QString() << QString();
jobParams << duration;
jobParams << QString::number(KdenliveSettings::add_new_clip());
jobParams << params;
- CutClipJob *job = new CutClipJob(item->clipType(), id, jobParams);
+ CutClipJob *job = new CutClipJob(item->clipType(), i.key(), jobParams);
if (job->isExclusive() && hasPendingJob(item, job->jobType)) {
delete job;
continue;
}
m_jobList.append(job);
- setJobStatus(item, job->jobType, JOBWAITING, 0, job->statusMessage());
+ setJobStatus(item, job->jobType, JobWaiting, 0, job->statusMessage());
+ ++i;
}
delete d;
slotCheckJobProcess();
// Remove inactive threads
QList <QFuture<void> > futures = m_jobThreads.futures();
m_jobThreads.clearFutures();
- for (int i = 0; i < futures.count(); i++)
+ for (int i = 0; i < futures.count(); ++i)
if (!futures.at(i).isFinished()) {
m_jobThreads.addFuture(futures.at(i));
}
m_jobMutex.lock();
int count = 0;
- for (int i = 0; i < m_jobList.count(); i++) {
- if (m_jobList.at(i)->status() == JOBWORKING || m_jobList.at(i)->status() == JOBWAITING)
+ for (int i = 0; i < m_jobList.count(); ++i) {
+ if (m_jobList.at(i)->status() == JobWorking || m_jobList.at(i)->status() == JobWaiting)
count ++;
else {
// remove finished jobs
AbstractClipJob *job = m_jobList.takeAt(i);
job->deleteLater();
- i--;
+ --i;
}
}
- emit jobCount(count);
+ emit jobCount(count);
m_jobMutex.unlock();
if (m_jobThreads.futures().isEmpty() || m_jobThreads.futures().count() < KdenliveSettings::proxythreads()) m_jobThreads.addFuture(QtConcurrent::run(this, &ProjectList::slotProcessJobs));
}
-void ProjectList::slotAbortProxy(const QString id, const QString path)
+void ProjectList::slotAbortProxy(const QString &id, const QString &path)
{
Q_UNUSED(path)
ProjectItem *item = getItemById(id);
if (!item) return;
if (!item->isProxyRunning()) slotGotProxy(item);
- item->setConditionalJobStatus(NOJOB, PROXYJOB);
+ item->setConditionalJobStatus(NoJob, PROXYJOB);
discardJobs(id, PROXYJOB);
}
AbstractClipJob *job = NULL;
int count = 0;
m_jobMutex.lock();
- for (int i = 0; i < m_jobList.count(); i++) {
- if (m_jobList.at(i)->status() == JOBWAITING) {
+ for (int i = 0; i < m_jobList.count(); ++i) {
+ if (m_jobList.at(i)->status() == JobWaiting) {
if (job == NULL) {
- m_jobList.at(i)->setStatus(JOBWORKING);
+ m_jobList.at(i)->setStatus(JobWorking);
job = m_jobList.at(i);
}
count++;
}
- else if (m_jobList.at(i)->status() == JOBWORKING)
+ else if (m_jobList.at(i)->status() == JobWorking)
count ++;
}
// Set jobs count
DocClipBase *currentClip = m_doc->clipManager()->getClipById(job->clipId());
//ProjectItem *processingItem = getItemById(job->clipId());
if (currentClip == NULL) {
- job->setStatus(JOBDONE);
+ job->setStatus(JobDone);
continue;
}
// Set clip status to started
- emit processLog(job->clipId(), 0, job->jobType, job->statusMessage());
+ emit processLog(job->clipId(), 0, job->jobType, job->statusMessage());
// Make sure destination path is writable
if (!destination.isEmpty()) {
QFile file(destination);
if (!file.open(QIODevice::WriteOnly)) {
- emit updateJobStatus(job->clipId(), job->jobType, JOBCRASHED, i18n("Cannot write to path: %1", destination));
- job->setStatus(JOBCRASHED);
+ emit updateJobStatus(job->clipId(), job->jobType, JobCrashed, i18n("Cannot write to path: %1", destination));
+ job->setStatus(JobCrashed);
continue;
}
file.close();
QFile::remove(destination);
}
- connect(job, SIGNAL(jobProgress(QString, int, int)), this, SIGNAL(processLog(QString, int, int)));
- connect(job, SIGNAL(cancelRunningJob(const QString, stringMap)), this, SIGNAL(cancelRunningJob(const QString, stringMap)));
+ connect(job, SIGNAL(jobProgress(QString,int,int)), this, SIGNAL(processLog(QString,int,int)));
+ connect(job, SIGNAL(cancelRunningJob(QString,stringMap)), this, SIGNAL(cancelRunningJob(QString,stringMap)));
if (job->jobType == MLTJOB) {
MeltJob *jb = static_cast<MeltJob *> (job);
jb->setProducer(currentClip->getProducer(), currentClip->fileURL());
- if (jb->isProjectFilter())
- connect(job, SIGNAL(gotFilterJobResults(QString,int, int, stringMap,stringMap)), this, SLOT(slotGotFilterJobResults(QString,int, int,stringMap,stringMap)));
- else
- connect(job, SIGNAL(gotFilterJobResults(QString,int, int, stringMap,stringMap)), this, SIGNAL(gotFilterJobResults(QString,int, int,stringMap,stringMap)));
+ if (jb->isProjectFilter())
+ connect(job, SIGNAL(gotFilterJobResults(QString,int,int,stringMap,stringMap)), this, SLOT(slotGotFilterJobResults(QString,int,int,stringMap,stringMap)));
+ else
+ connect(job, SIGNAL(gotFilterJobResults(QString,int,int,stringMap,stringMap)), this, SIGNAL(gotFilterJobResults(QString,int,int,stringMap,stringMap)));
}
job->startJob();
- if (job->status() == JOBDONE) {
- emit updateJobStatus(job->clipId(), job->jobType, JOBDONE);
+ if (job->status() == JobDone) {
+ emit updateJobStatus(job->clipId(), job->jobType, JobDone);
//TODO: replace with more generic clip replacement framework
if (job->jobType == PROXYJOB) emit gotProxy(job->clipId());
if (job->addClipToProject()) {
emit addClip(destination, QString(), QString());
}
- } else if (job->status() == JOBCRASHED || job->status() == JOBABORTED) {
+ } else if (job->status() == JobCrashed || job->status() == JobAborted) {
emit updateJobStatus(job->clipId(), job->jobType, job->status(), job->errorMessage(), QString(), job->logDetails());
}
}
command->setText(i18n("Update proxy settings"));
QString proxydir = m_doc->projectFolder().path( KUrl::AddTrailingSlash) + "proxy/";
while (*it) {
- if ((*it)->type() != PROJECTCLIPTYPE) {
+ if ((*it)->type() != ProjectClipType) {
++it;
continue;
}
++it;
continue;
}
- CLIPTYPE t = item->clipType();
- if ((t == VIDEO || t == AV || t == UNKNOWN) && item->referencedClip() != NULL) {
+ ClipType t = item->clipType();
+ if ((t == Video || t == AV || t == Unknown) && item->referencedClip() != NULL) {
if (generateProxy() && useProxy() && !hasPendingJob(item, PROXYJOB)) {
DocClipBase *clip = item->referencedClip();
if (clip->getProperty("frame_size").section('x', 0, 0).toInt() > m_doc->getDocumentProperty("proxyminsize").toInt()) {
new EditClipCommand(this, item->clipId(), item->referencedClip()->currentProperties(newProps), newProps, true, command);
}
}
- else if (t == IMAGE && item->referencedClip() != NULL) {
+ else if (t == Image && item->referencedClip() != NULL) {
if (generateImageProxy() && useProxy()) {
DocClipBase *clip = item->referencedClip();
int maxImageSize = m_doc->getDocumentProperty("proxyimageminsize").toInt();
else delete command;
}
-void ProjectList::slotProcessLog(const QString id, int progress, int type, const QString message)
+void ProjectList::slotProcessLog(const QString &id, int progress, int type, const QString &message)
{
ProjectItem *item = getItemById(id);
- setJobStatus(item, (JOBTYPE) type, JOBWORKING, progress, message);
+ setJobStatus(item, (JOBTYPE) type, JobWorking, progress, message);
}
void ProjectList::slotProxyCurrentItem(bool doProxy, ProjectItem *itemToProxy)
// expand list (folders, subclips) to get real clips
QTreeWidgetItem *listItem;
QList<ProjectItem *> clipList;
- for (int i = 0; i < list.count(); i++) {
+ for (int i = 0; i < list.count(); ++i) {
listItem = list.at(i);
- if (listItem->type() == PROJECTFOLDERTYPE) {
+ if (listItem->type() == ProjectFoldeType) {
for (int j = 0; j < listItem->childCount(); j++) {
QTreeWidgetItem *sub = listItem->child(j);
- if (sub->type() == PROJECTCLIPTYPE) {
+ if (sub->type() == ProjectClipType) {
ProjectItem *item = static_cast <ProjectItem*>(sub);
if (!clipList.contains(item)) clipList.append(item);
}
}
}
- else if (listItem->type() == PROJECTSUBCLIPTYPE) {
+ else if (listItem->type() == ProjectSubclipType) {
QTreeWidgetItem *sub = listItem->parent();
ProjectItem *item = static_cast <ProjectItem*>(sub);
if (!clipList.contains(item)) clipList.append(item);
}
- else if (listItem->type() == PROJECTCLIPTYPE) {
+ else if (listItem->type() == ProjectClipType) {
ProjectItem *item = static_cast <ProjectItem*>(listItem);
if (!clipList.contains(item)) clipList.append(item);
}
// Make sure the proxy folder exists
QString proxydir = m_doc->projectFolder().path( KUrl::AddTrailingSlash) + "proxy/";
KStandardDirs::makeDir(proxydir);
-
+
QMap <QString, QString> newProps;
QMap <QString, QString> oldProps;
if (!doProxy) newProps.insert("proxy", "-");
- for (int i = 0; i < clipList.count(); i++) {
+ for (int i = 0; i < clipList.count(); ++i) {
ProjectItem *item = clipList.at(i);
- CLIPTYPE t = item->clipType();
- if ((t == VIDEO || t == AV || t == UNKNOWN || t == IMAGE || t == PLAYLIST) && item->referencedClip()) {
+ ClipType t = item->clipType();
+ if ((t == Video || t == AV || t == Unknown || t == Image || t == Playlist) && item->referencedClip()) {
if ((doProxy && item->hasProxy()) || (!doProxy && !item->hasProxy() && item->referencedClip()->getProducer() != NULL)) continue;
DocClipBase *clip = item->referencedClip();
if (!clip || !clip->isClean() || m_render->isProcessing(item->clipId())) {
kDebug()<<"//// TRYING TO PROXY: "<<item->clipId()<<", but it is busy";
continue;
}
-
+
//oldProps = clip->properties();
if (doProxy) {
newProps.clear();
- QString path = proxydir + clip->getClipHash() + '.' + (t == IMAGE ? "png" : m_doc->getDocumentProperty("proxyextension"));
+ QString path = proxydir + clip->getClipHash() + '.' + (t == Image ? "png" : m_doc->getDocumentProperty("proxyextension"));
// insert required duration for proxy
newProps.insert("proxy_out", clip->producerProperty("out"));
newProps.insert("proxy", path);
QTreeWidgetItemIterator it(m_listView);
ProjectItem *item;
while (*it) {
- if ((*it)->type() == PROJECTCLIPTYPE) {
+ if ((*it)->type() == ProjectClipType) {
item = static_cast <ProjectItem *>(*it);
if (item->referencedClip()->getProperty("proxy") == proxyPath) {
QMap <QString, QString> props;
props.insert("proxy", QString());
new EditClipCommand(this, item->clipId(), item->referencedClip()->currentProperties(props), props, true, proxyCommand);
-
+
}
}
++it;
QFile::remove(proxyPath);
}
-void ProjectList::setJobStatus(ProjectItem *item, JOBTYPE jobType, CLIPJOBSTATUS status, int progress, const QString &statusMessage)
+void ProjectList::setJobStatus(ProjectItem *item, JOBTYPE jobType, ClipJobStatus status, int progress, const QString &statusMessage)
{
if (item == NULL || (m_abortAllJobs && m_closing)) return;
monitorItemEditing(false);
item->setJobStatus(jobType, status, progress, statusMessage);
- if (status == JOBCRASHED) {
+ if (status == JobCrashed) {
DocClipBase *clip = item->referencedClip();
if (!clip) {
kDebug()<<"// PROXY CRASHED";
void ProjectList::monitorItemEditing(bool enable)
{
- if (enable) connect(m_listView, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(slotItemEdited(QTreeWidgetItem *, int)));
- else disconnect(m_listView, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(slotItemEdited(QTreeWidgetItem *, int)));
+ if (enable) connect(m_listView, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(slotItemEdited(QTreeWidgetItem*,int)));
+ else disconnect(m_listView, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(slotItemEdited(QTreeWidgetItem*,int)));
}
QStringList ProjectList::expandedFolders() const
FolderProjectItem *item;
QTreeWidgetItemIterator it(m_listView);
while (*it) {
- if ((*it)->type() != PROJECTFOLDERTYPE) {
+ if ((*it)->type() != ProjectFoldeType) {
++it;
continue;
}
void ProjectList::slotCancelJobs()
{
m_abortAllJobs = true;
- for (int i = 0; i < m_jobList.count(); i++) {
- m_jobList.at(i)->setStatus(JOBABORTED);
+ for (int i = 0; i < m_jobList.count(); ++i) {
+ m_jobList.at(i)->setStatus(JobAborted);
}
m_jobThreads.waitForFinished();
m_jobThreads.clearFutures();
QUndoCommand *command = new QUndoCommand();
command->setText(i18np("Cancel job", "Cancel jobs", m_jobList.count()));
m_jobMutex.lock();
- for (int i = 0; i < m_jobList.count(); i++) {
+ for (int i = 0; i < m_jobList.count(); ++i) {
DocClipBase *currentClip = m_doc->clipManager()->getClipById(m_jobList.at(i)->clipId());
if (!currentClip) continue;
QMap <QString, QString> newProps = m_jobList.at(i)->cancelProperties();
if (!m_jobList.isEmpty()) qDeleteAll(m_jobList);
m_jobList.clear();
m_abortAllJobs = false;
- m_infoLabel->slotSetJobCount(0);
+ m_infoLabel->slotSetJobCount(0);
}
void ProjectList::slotCancelRunningJob(const QString id, stringMap newProps)
if (newProps == oldProps) return;
QMapIterator<QString, QString> i(oldProps);
EditClipCommand *command = new EditClipCommand(this, id, oldProps, newProps, true);
- m_commandStack->push(command);
+ m_commandStack->push(command);
}
bool ProjectList::hasPendingJob(ProjectItem *item, JOBTYPE type)
if (!item || !item->referencedClip() || m_abortAllJobs) return false;
AbstractClipJob *job;
QMutexLocker lock(&m_jobMutex);
- for (int i = 0; i < m_jobList.count(); i++) {
+ for (int i = 0; i < m_jobList.count(); ++i) {
if (m_abortAllJobs) break;
job = m_jobList.at(i);
- if (job->clipId() == item->clipId() && job->jobType == type && (job->status() == JOBWAITING || job->status() == JOBWORKING)) return true;
+ if (job->clipId() == item->clipId() && job->jobType == type && (job->status() == JobWaiting || job->status() == JobWorking)) return true;
}
return false;
void ProjectList::deleteJobsForClip(const QString &clipId)
{
QMutexLocker lock(&m_jobMutex);
- for (int i = 0; i < m_jobList.count(); i++) {
+ for (int i = 0; i < m_jobList.count(); ++i) {
if (m_jobList.at(i)->clipId() == clipId) {
- m_jobList.at(i)->setStatus(JOBABORTED);
+ m_jobList.at(i)->setStatus(JobAborted);
}
}
}
void ProjectList::slotUpdateJobStatus(ProjectItem *item, int type, int status, const QString &label, const QString &actionName, const QString details)
{
- item->setJobStatus((JOBTYPE) type, (CLIPJOBSTATUS) status);
- if (status != JOBCRASHED) return;
+ item->setJobStatus((JOBTYPE) type, (ClipJobStatus) status);
+ if (status != JobCrashed) return;
#if KDE_IS_VERSION(4,7,0)
QList<QAction *> actions = m_infoMessage->actions();
if (m_infoMessage->isHidden()) {
- m_infoMessage->setText(label);
- m_infoMessage->setWordWrap(m_infoMessage->text().length() > 35);
- m_infoMessage->setMessageType(KMessageWidget::Warning);
+ m_infoMessage->setText(label);
+ m_infoMessage->setWordWrap(m_infoMessage->text().length() > 35);
+ m_infoMessage->setMessageType(KMessageWidget::Warning);
}
if (!actionName.isEmpty()) {
QAction *action = NULL;
QList< KActionCollection * > collections = KActionCollection::allCollections();
- for (int i = 0; i < collections.count(); i++) {
+ for (int i = 0; i < collections.count(); ++i) {
KActionCollection *coll = collections.at(i);
action = coll->action(actionName);
if (action) break;
KDialog d(this);
d.setButtons(KDialog::Close);
QTextEdit t(&d);
- for (int i = 0; i < m_errorLog.count(); i++) {
- if (i > 0) t.insertHtml("<br><hr /><br>");
- t.insertPlainText(m_errorLog.at(i));
+ for (int i = 0; i < m_errorLog.count(); ++i) {
+ if (i > 0) t.insertHtml("<br><hr /><br>");
+ t.insertPlainText(m_errorLog.at(i));
}
t.setReadOnly(true);
d.setMainWidget(&t);
{
QStringList result;
QMutexLocker lock(&m_jobMutex);
- for (int i = 0; i < m_jobList.count(); i++) {
- if (m_jobList.at(i)->clipId() == id && (m_jobList.at(i)->status() == JOBWAITING || m_jobList.at(i)->status() == JOBWORKING)) {
+ for (int i = 0; i < m_jobList.count(); ++i) {
+ if (m_jobList.at(i)->clipId() == id && (m_jobList.at(i)->status() == JobWaiting || m_jobList.at(i)->status() == JobWorking)) {
// discard this job
result << m_jobList.at(i)->description;
}
- }
+ }
return result;
}
void ProjectList::discardJobs(const QString &id, JOBTYPE type) {
QMutexLocker lock(&m_jobMutex);
- for (int i = 0; i < m_jobList.count(); i++) {
+ for (int i = 0; i < m_jobList.count(); ++i) {
if (m_jobList.at(i)->clipId() == id && (m_jobList.at(i)->jobType == type || type == NOJOBTYPE)) {
// discard this job
- m_jobList.at(i)->setStatus(JOBABORTED);
+ m_jobList.at(i)->setStatus(JobAborted);
}
}
}
ProjectItem *item = getItemById(id);
if (!item) return;
QStringList jobParams;
- jobParams << QString::number(info.cropStart.frames(m_fps)) << QString::number((info.cropStart + info.cropDuration).frames(m_fps));
- jobParams << QString() << filterName << filterParams << consumer << consumerParams << QString::number(info.startPos.frames(m_fps)) << QString::number(info.track);
+ jobParams << QString::number((int) info.cropStart.frames(m_fps)) << QString::number((int) (info.cropStart + info.cropDuration).frames(m_fps));
+ jobParams << QString() << filterName << filterParams << consumer << consumerParams << QString::number((int) info.startPos.frames(m_fps)) << QString::number(info.track);
MeltJob *job = new MeltJob(item->clipType(), id, jobParams, extraParams);
if (job->isExclusive() && hasPendingJob(item, job->jobType)) {
delete job;
}
job->description = i18n("Filter %1", extraParams.value("finalfilter"));
m_jobList.append(job);
- setJobStatus(item, job->jobType, JOBWAITING, 0, job->statusMessage());
+ setJobStatus(item, job->jobType, JobWaiting, 0, job->statusMessage());
slotCheckJobProcess();
}
void ProjectList::startClipFilterJob(const QString &filterName, const QString &condition)
{
- QStringList ids = getConditionalIds(condition);
- QString destination;
- ProjectItem *item = getItemById(ids.at(0));
+ QMap <QString, QString> ids = getConditionalIds(condition);
+ QStringList destination;
+ QMap<QString, QString>::const_iterator first = ids.constBegin();
+ if (first == ids.constEnd()) {
+ emit displayMessage(i18n("Cannot find clip to process filter %1", filterName), -2, ErrorMessage);
+ return;
+ }
+ ProjectItem *item = getItemById(first.key());
if (!item) {
emit displayMessage(i18n("Cannot find clip to process filter %1", filterName), -2, ErrorMessage);
return;
}
if (ids.count() == 1) {
- destination = item->clipUrl().path();
+ destination << item->clipUrl().path();
}
else {
- destination = item->clipUrl().directory();
+ destination = ids.values();
+ }
+ if (filterName == "framebuffer") {
+ Mlt::Profile profile;
+ QStringList keys = ids.keys();
+ int ix = 0;
+ foreach(const QString &url, destination) {
+ QString prodstring = QString("framebuffer:" + url + "?-1");
+ Mlt::Producer *reversed = new Mlt::Producer(profile, prodstring.toUtf8().constData());
+ if (!reversed || !reversed->is_valid()) {
+ emit displayMessage(i18n("Cannot reverse clip"), -2, ErrorMessage);
+ continue;
+ }
+ QString dest = url + ".mlt";
+ if (QFile::exists(dest)) {
+ if (KMessageBox::questionYesNo(this, i18n("File %1 already exists.\nDo you want to overwrite it?", dest)) == KMessageBox::No) continue;
+ }
+ Mlt::Consumer *cons = new Mlt::Consumer(profile, "xml", dest.toUtf8().constData());
+ if (cons == NULL || !cons->is_valid()) {
+ emit displayMessage(i18n("Cannot render reversed clip"), -2, ErrorMessage);
+ continue;
+ }
+ Mlt::Playlist list;
+ list.insert_at(0, reversed, 0);
+ delete reversed;
+ cons->connect(list);
+ cons->run();
+ delete cons;
+ QString groupId;
+ QString groupName;
+ DocClipBase *base = m_doc->clipManager()->getClipById(keys.at(ix));
+ if (base) {
+ groupId = base->getProperty("groupid");
+ groupName = base->getProperty("groupname");
+ }
+ emit addClip(dest, groupId, groupName);
+ ix++;
+ }
+ return;
}
+
if (filterName == "motion_est") {
- // Show config dialog
- QPointer<QDialog> d = new QDialog(this);
- Ui::SceneCutDialog_UI ui;
- ui.setupUi(d);
- // Set up categories
- for (int i = 0; i < 5; ++i) {
- ui.marker_type->insertItem(i, i18n("Category %1", i));
- ui.marker_type->setItemData(i, CommentedTime::markerColor(i), Qt::DecorationRole);
- }
- ui.marker_type->setCurrentIndex(KdenliveSettings::default_marker_type());
- if (d->exec() != QDialog::Accepted) {
- delete d;
- return;
- }
- // Autosplit filter
- QStringList jobParams;
- // Producer params
- jobParams << QString();
- // Filter params, use a smaller region of the image to speed up operation
- // In fact, it's faster to rescale whole image than using part of it (bounding=\"25%x25%:15%x15\")
- jobParams << filterName << "shot_change_list=0 denoise=0";
- // Consumer
- jobParams << "null" << "all=1 terminate_on_pause=1 real_time=-1 rescale=nearest deinterlace_method=onefield top_field_first=-1";
- QMap <QString, QString> extraParams;
- extraParams.insert("key", "shot_change_list");
- extraParams.insert("projecttreefilter", "1");
- QString keyword("%count");
- extraParams.insert("resultmessage", i18n("Found %1 scenes.", keyword));
- extraParams.insert("resize_profile", "160");
- if (ui.store_data->isChecked()) {
- // We want to save result as clip metadata
- extraParams.insert("storedata", "1");
- }
- if (ui.zone_only->isChecked()) {
- // We want to analyze only clip zone
- extraParams.insert("zoneonly", "1");
- }
- if (ui.add_markers->isChecked()) {
- // We want to create markers
- extraParams.insert("addmarkers", QString::number(ui.marker_type->currentIndex()));
- }
- if (ui.cut_scenes->isChecked()) {
- // We want to cut scenes
- extraParams.insert("cutscenes", "1");
- }
- delete d;
- processClipJob(ids, QString(), false, jobParams, i18n("Auto split"), extraParams);
+ // Show config dialog
+ QPointer<QDialog> d = new QDialog(this);
+ Ui::SceneCutDialog_UI ui;
+ ui.setupUi(d);
+ // Set up categories
+ for (int i = 0; i < 5; ++i) {
+ ui.marker_type->insertItem(i, i18n("Category %1", i));
+ ui.marker_type->setItemData(i, CommentedTime::markerColor(i), Qt::DecorationRole);
+ }
+ ui.marker_type->setCurrentIndex(KdenliveSettings::default_marker_type());
+ if (d->exec() != QDialog::Accepted) {
+ delete d;
+ return;
+ }
+ // Autosplit filter
+ QStringList jobParams;
+ // Producer params
+ jobParams << QString();
+ // Filter params, use a smaller region of the image to speed up operation
+ // In fact, it's faster to rescale whole image than using part of it (bounding=\"25%x25%:15%x15\")
+ jobParams << filterName << "shot_change_list=0 denoise=0";
+ // Consumer
+ jobParams << "null" << "all=1 terminate_on_pause=1 real_time=-1 rescale=nearest deinterlace_method=onefield top_field_first=-1";
+ QMap <QString, QString> extraParams;
+ extraParams.insert("key", "shot_change_list");
+ extraParams.insert("projecttreefilter", "1");
+ QString keyword("%count");
+ extraParams.insert("resultmessage", i18n("Found %1 scenes.", keyword));
+ extraParams.insert("resize_profile", "160");
+ if (ui.store_data->isChecked()) {
+ // We want to save result as clip metadata
+ extraParams.insert("storedata", "1");
+ }
+ if (ui.zone_only->isChecked()) {
+ // We want to analyze only clip zone
+ extraParams.insert("zoneonly", "1");
+ }
+ if (ui.add_markers->isChecked()) {
+ // We want to create markers
+ extraParams.insert("addmarkers", QString::number(ui.marker_type->currentIndex()));
+ }
+ if (ui.cut_scenes->isChecked()) {
+ // We want to cut scenes
+ extraParams.insert("cutscenes", "1");
+ }
+ delete d;
+ processClipJob(ids.keys(), QString(), false, jobParams, i18n("Auto split"), extraParams);
}
else {
- QPointer<ClipStabilize> d = new ClipStabilize(destination, ids.count(), filterName);
- if (d->exec() == QDialog::Accepted) {
- QMap <QString, QString> extraParams;
- extraParams.insert("producer_profile", "1");
- processClipJob(ids, d->destination(), d->autoAddClip(), d->params(), d->desc(), extraParams);
- }
- delete d;
+ QPointer<ClipStabilize> d = new ClipStabilize(destination, filterName);
+ if (d->exec() == QDialog::Accepted) {
+ QMap <QString, QString> extraParams;
+ extraParams.insert("producer_profile", "1");
+ processClipJob(ids.keys(), d->destination(), d->autoAddClip(), d->params(), d->desc(), extraParams);
+ }
+ delete d;
}
}
foreach(const QString&id, ids) {
ProjectItem *item = getItemById(id);
if (!item) continue;
- QStringList jobArgs;
- if (extraParams.contains("zoneonly")) {
- // Analyse clip zone only, remove in / out and replace with zone
- preParams.takeFirst();
- preParams.takeFirst();
- QPoint zone = item->referencedClip()->zone();
- jobArgs << QString::number(zone.x()) << QString::number(zone.y());
- }
- jobArgs << preParams;
+ QStringList jobArgs;
+ if (extraParams.contains("zoneonly")) {
+ // Analyse clip zone only, remove in / out and replace with zone
+ preParams.takeFirst();
+ preParams.takeFirst();
+ QPoint zone = item->referencedClip()->zone();
+ jobArgs << QString::number(zone.x()) << QString::number(zone.y());
+ }
+ jobArgs << preParams;
if (ids.count() == 1) {
jobArgs << consumer + ':' + destination;
}
kDebug()<<"// ADDING TRUE";
}
else kDebug()<<"// ADDING FALSE!!!";
-
+
if (job->isExclusive() && hasPendingJob(item, job->jobType)) {
delete job;
return;
}
job->description = description;
m_jobList.append(job);
- setJobStatus(item, job->jobType, JOBWAITING, 0, job->statusMessage());
- slotCheckJobProcess();
+ setJobStatus(item, job->jobType, JobWaiting, 0, job->statusMessage());
+ slotCheckJobProcess();
}
}
-
+
void ProjectList::slotPrepareJobsMenu()
{
ProjectItem *item;
- if (!m_listView->currentItem() || m_listView->currentItem()->type() == PROJECTFOLDERTYPE)
+ if (!m_listView->currentItem() || m_listView->currentItem()->type() == ProjectFoldeType)
return;
- if (m_listView->currentItem()->type() == PROJECTSUBCLIPTYPE)
+ if (m_listView->currentItem()->type() == ProjectSubclipType)
item = static_cast <ProjectItem*>(m_listView->currentItem()->parent());
else
item = static_cast <ProjectItem*>(m_listView->currentItem());
#if KDE_IS_VERSION(4,7,0)
m_errorLog.clear();
QList<QAction *> actions = m_infoMessage->actions();
- for (int i = 0; i < actions.count(); i++) {
- m_infoMessage->removeAction(actions.at(i));
+ for (int i = 0; i < actions.count(); ++i) {
+ m_infoMessage->removeAction(actions.at(i));
}
#endif
}
int markersType = -1;
if (filterInfo.contains("addmarkers")) markersType = filterInfo.value("addmarkers").toInt();
if (results.isEmpty()) {
- emit displayMessage(i18n("No data returned from clip analysis"), 0, ErrorMessage);
- return;
+ emit displayMessage(i18n("No data returned from clip analysis"), 0, ErrorMessage);
+ return;
}
bool dataProcessed = false;
QString key = filterInfo.value("key");
QStringList value = results.value(key).split(';', QString::SkipEmptyParts);
kDebug()<<"// RESULT; "<<key<<" = "<<value;
if (filterInfo.contains("resultmessage")) {
- QString mess = filterInfo.value("resultmessage");
- mess.replace("%count", QString::number(value.count()));
- emit displayMessage(mess, 0, InformationMessage);
+ QString mess = filterInfo.value("resultmessage");
+ mess.replace("%count", QString::number(value.count()));
+ emit displayMessage(mess, 0, InformationMessage);
}
else emit displayMessage(i18n("Processing data analysis"), 0, InformationMessage);
if (filterInfo.contains("cutscenes")) {
- // Check if we want to cut scenes from returned data
- dataProcessed = true;
- int cutPos = 0;
- QUndoCommand *command = new QUndoCommand();
- command->setText(i18n("Auto Split Clip"));
- foreach (QString pos, value) {
- if (!pos.contains("=")) continue;
- int newPos = pos.section("=", 0, 0).toInt();
- // Don't use scenes shorter than 1 second
- if (newPos - cutPos < 24) continue;
- (void) new AddClipCutCommand(this, id, cutPos + offset, newPos + offset, QString(), true, false, command);
- cutPos = newPos;
- }
- if (command->childCount() == 0)
- delete command;
- else m_commandStack->push(command);
+ // Check if we want to cut scenes from returned data
+ dataProcessed = true;
+ int cutPos = 0;
+ QUndoCommand *command = new QUndoCommand();
+ command->setText(i18n("Auto Split Clip"));
+ foreach (QString pos, value) {
+ if (!pos.contains("=")) continue;
+ int newPos = pos.section("=", 0, 0).toInt();
+ // Don't use scenes shorter than 1 second
+ if (newPos - cutPos < 24) continue;
+ (void) new AddClipCutCommand(this, id, cutPos + offset, newPos + offset, QString(), true, false, command);
+ cutPos = newPos;
+ }
+ if (command->childCount() == 0)
+ delete command;
+ else m_commandStack->push(command);
}
if (markersType >= 0) {
- // Add markers from returned data
- dataProcessed = true;
- int cutPos = 0;
- QUndoCommand *command = new QUndoCommand();
- command->setText(i18n("Add Markers"));
- QList <CommentedTime> markersList;
- int index = 1;
- foreach (QString pos, value) {
- if (!pos.contains("=")) continue;
- int newPos = pos.section("=", 0, 0).toInt();
- // Don't use scenes shorter than 1 second
- if (newPos - cutPos < 24) continue;
- CommentedTime m(GenTime(newPos + offset, m_fps), QString::number(index), markersType);
- markersList << m;
- index++;
- cutPos = newPos;
- }
- emit addMarkers(id, markersList);
+ // Add markers from returned data
+ dataProcessed = true;
+ int cutPos = 0;
+ QUndoCommand *command = new QUndoCommand();
+ command->setText(i18n("Add Markers"));
+ QList <CommentedTime> markersList;
+ int index = 1;
+ foreach (QString pos, value) {
+ if (!pos.contains("=")) continue;
+ int newPos = pos.section("=", 0, 0).toInt();
+ // Don't use scenes shorter than 1 second
+ if (newPos - cutPos < 24) continue;
+ CommentedTime m(GenTime(newPos + offset, m_fps), QString::number(index), markersType);
+ markersList << m;
+ index++;
+ cutPos = newPos;
+ }
+ emit addMarkers(id, markersList);
}
if (!dataProcessed || filterInfo.contains("storedata")) {
- // Store returned data as clip extra data
- clip->referencedClip()->setAnalysisData(filterInfo.contains("displaydataname") ? filterInfo.value("displaydataname") : key, results.value(key), filterInfo.value("offset").toInt());
- emit updateAnalysisData(clip->referencedClip());
+ // Store returned data as clip extra data
+ clip->referencedClip()->setAnalysisData(filterInfo.contains("displaydataname") ? filterInfo.value("displaydataname") : key, results.value(key), filterInfo.value("offset").toInt());
+ emit updateAnalysisData(clip->referencedClip());
}
}
KConfig conf("camcorderfilters.rc", KConfig::CascadeConfig, "appdata");
QStringList groups = conf.groupList();
foreach(QString grp, groups) {
- if (!meta.contains(grp)) continue;
- KConfigGroup group(&conf, grp);
- QString value = group.readEntry(meta.value(grp));
- if (value.isEmpty()) continue;
- clip->setProperty(value.section(' ', 0, 0), value.section(' ', 1));
- break;
+ if (!meta.contains(grp)) continue;
+ KConfigGroup group(&conf, grp);
+ QString value = group.readEntry(meta.value(grp));
+ if (value.isEmpty()) continue;
+ clip->setProperty(value.section(' ', 0, 0), value.section(' ', 1));
+ break;
}
}*/