#include <QMenu>
#include <QProcess>
#include <QHeaderView>
+#include <QInputDialog>
ProjectList::ProjectList(QWidget *parent) :
QWidget(parent),
{
ProjectItem *item = getItemById(id);
if (item) {
- item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
+ item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDropEnabled);
if (item->referencedClip()) {
item->referencedClip()->setPlaceHolder(true);
if (m_render == NULL) kDebug() << "********* ERROR, NULL RENDR";
ProjectItem *item = getItemById(id);
if (item == NULL)
return;
- item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsEditable);
+ item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsDropEnabled);
if (item->referencedClip()) { // && item->referencedClip()->checkHash() == false) {
item->setProperty("file_hash", QString());
slotReloadClip(id);
} else {
ProjectItem *item = static_cast <ProjectItem *>(selected.at(i));
ids << item->clipId();
- if (item->numReferences() > 0 &&KMessageBox::questionYesNo(this, i18np("Delete clip <b>%2</b>?<br />This will also remove the clip in timeline", "Delete clip <b>%2</b>?<br />This will also remove its %1 clips in timeline", item->numReferences(), item->names().at(1)), i18n("Delete Clip")) != KMessageBox::Yes)
+ if (item->numReferences() > 0 && KMessageBox::questionYesNo(this, i18np("Delete clip <b>%2</b>?<br />This will also remove the clip in timeline", "Delete clip <b>%2</b>?<br />This will also remove its %1 clips in timeline", item->numReferences(), item->names().at(1)), i18n("Delete Clip")) != KMessageBox::Yes)
return;
}
}
m_listView->blockSignals(false);
}
if (getProperties && !m_queueTimer.isActive())
- m_queueTimer.start();
+ slotProcessNextClipInQueue();
}
void ProjectList::slotResetProjectList()
m_infoQueue.remove(j.key());
emit getFileProperties(dom, id, m_listView->iconSize().height(), false);
}
+ if (!m_infoQueue.isEmpty()) m_queueTimer.start();
}
void ProjectList::slotUpdateClip(const QString &id)
if (clip->isPlaceHolder() == false)
requestClipInfo(clip->toXML(), clip->getId());
else if (!clip->isPlaceHolder())
- item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
+ item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDropEnabled);
} else {
if (item->data(0, Qt::DecorationRole).isNull())
requestClipThumbnail(clip->getId());
{
// Build list of mime types
QStringList mimeTypes = QStringList() << "application/x-kdenlive" << "application/x-kdenlivetitle" << "video/mlt-playlist" << "text/plain"
- << "video/x-flv" << "application/vnd.rn-realmedia" << "video/x-dv" << "video/dv" << "video/x-msvideo" << "video/x-matroska" << "video/mpeg" << "video/ogg" << "video/x-ms-wmv" << "video/mp4" << "video/quicktime"
- << "audio/x-flac" << "audio/x-matroska" << "audio/mp4" << "audio/mpeg" << "audio/x-mp3" << "audio/ogg" << "audio/x-wav" << "application/ogg"
- << "image/gif" << "image/jpeg" << "image/png" << "image/x-tga" << "image/x-bmp" << "image/svg+xml" << "image/tiff" << "image/x-xcf" << "image/x-xcf-gimp" << "image/x-vnd.adobe.photoshop" << "image/x-pcx" << "image/x-exr";
+ << "video/x-flv" << "application/vnd.rn-realmedia" << "video/x-dv" << "video/dv" << "video/x-msvideo" << "video/x-matroska" << "video/mpeg" << "video/ogg" << "video/x-ms-wmv" << "video/mp4" << "video/quicktime"
+ << "audio/x-flac" << "audio/x-matroska" << "audio/mp4" << "audio/mpeg" << "audio/x-mp3" << "audio/ogg" << "audio/x-wav" << "application/ogg"
+ << "image/gif" << "image/jpeg" << "image/png" << "image/x-tga" << "image/x-bmp" << "image/svg+xml" << "image/tiff" << "image/x-xcf" << "image/x-xcf-gimp" << "image/x-vnd.adobe.photoshop" << "image/x-pcx" << "image/x-exr";
QString allExtensions;
foreach(const QString& mimeType, mimeTypes) {
if (givenList.isEmpty()) {
QString allExtensions = getExtensions();
const QString dialogFilter = allExtensions + ' ' + QLatin1Char('|') + i18n("All Supported Files") + "\n* " + QLatin1Char('|') + i18n("All Files");
- list = KFileDialog::getOpenUrls(KUrl("kfiledialog:///clipfolder"), dialogFilter, this);
-
+ QCheckBox *b = new QCheckBox(i18n("Import image sequence"));
+ b->setChecked(KdenliveSettings::autoimagesequence());
+ KFileDialog *d = new KFileDialog(KUrl("kfiledialog:///clipfolder"), dialogFilter, this, b);
+ d->setOperationMode(KFileDialog::Opening);
+ d->setMode(KFile::Files);
+ d->exec();
+ 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")) {
+ int count = SlideshowClip::sequenceCount(url);
+ // import as sequence if we found at least 5 images in the sequence
+ if (count > 4) {
+ delete d;
+ QStringList groupInfo = getGroup();
+
+ // get image sequence base name
+ while (fileName.at(fileName.size() - 1).isDigit()) {
+ fileName.chop(1);
+ }
+ QString folder = url.directory(KUrl::AppendTrailingSlash);
+ QString ext = url.path().section('.', -1);
+ folder.append(fileName + "%d." + ext);
+
+ m_doc->slotCreateSlideshowClipFile(fileName, folder, count, m_timecode.reformatSeparators(KdenliveSettings::sequence_duration()), false, false, m_timecode.getTimecodeFromFrames(int(ceil(m_timecode.fps()))), QString(), 0, groupInfo.at(0), groupInfo.at(1));
+ return;
+ }
+ }
+ }
+ }
+ delete d;
} else {
for (int i = 0; i < givenList.count(); i++)
list << givenList.at(i);
item->setProperties(properties, metadata);
if (item->referencedClip()->isPlaceHolder() && producer->is_valid()) {
item->referencedClip()->setValid();
- item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsEditable);
+ item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsDropEnabled);
toReload = clipId;
}
//Q_ASSERT_X(item->referencedClip(), "void ProjectList::slotReplyGetFileProperties", QString("Item with groupName %1 does not have a clip associated").arg(item->groupName()).toLatin1());
int max = m_doc->clipManager()->clipsCount();
if (item && m_infoQueue.isEmpty() && m_thumbnailQueue.isEmpty()) {
m_listView->setCurrentItem(item);
+ if (item->parent()) {
+ if (item->parent()->type() == PROJECTFOLDERTYPE)
+ static_cast <FolderProjectItem *>(item->parent())->switchIcon();
+ }
emit clipSelected(item->referencedClip());
} else {
emit displayMessage(i18n("Loading clips"), (int)(100 *(max - m_infoQueue.count()) / max));
emit projectModified();
}
+void ProjectList::slotForceProcessing(const QString &id)
+{
+ while (m_infoQueue.contains(id)) {
+ slotProcessNextClipInQueue();
+ }
+}
+
#include "projectlist.moc"