diff --git a/src/bin/bin.h b/src/bin/bin.h --- a/src/bin/bin.h +++ b/src/bin/bin.h @@ -610,6 +610,7 @@ void slotLoadClipMarkers(const QString &id); void slotSaveClipMarkers(const QString &id); void slotDuplicateClip(); + void slotLocateClip(); void slotDeleteEffect(const QString &id, QDomElement effect); /** @brief Request audio thumbnail for clip with id */ void slotCreateAudioThumb(const QString &id); @@ -675,6 +676,7 @@ QAction *m_openAction; QAction *m_reloadAction; QAction *m_duplicateAction; + QAction *m_locateAction; QAction *m_proxyAction; QAction *m_editAction; QAction *m_deleteAction; diff --git a/src/bin/bin.cpp b/src/bin/bin.cpp --- a/src/bin/bin.cpp +++ b/src/bin/bin.cpp @@ -52,6 +52,8 @@ #include #include +#include +#include #include #include #include @@ -828,6 +830,48 @@ } } +void Bin::slotLocateClip() +{ + QModelIndexList indexes = m_proxyModel->selectionModel()->selectedIndexes(); + foreach (const QModelIndex &ix, indexes) { + if (!ix.isValid() || ix.column() != 0) { + continue; + } + AbstractProjectItem *item = static_cast(m_proxyModel->mapToSource(ix).internalPointer()); + ProjectClip *currentItem = qobject_cast(item); + if (currentItem) { + QStringList folderInfo = getFolderInfo(ix); + QDomDocument doc; + QDomElement xml = currentItem->toXml(doc); + if (!xml.isNull()) { + QUrl url = QUrl::fromLocalFile(EffectsList::property(xml, "resource")); + if (url.isValid()) { + qDebug()<<" / / "+url.toString(); + QString directoryURL = url.toString(); + directoryURL = directoryURL.mid(0,directoryURL.lastIndexOf('/')+1); + qDebug()<<" / / "+directoryURL; + //#ifdef Q_WS_MAC + // QStringList args; + // args << "-e"; + // args << "tell application \"Finder\""; + // args << "-e"; + // args << "activate"; + // args << "-e"; + // args << "select POSIX file \""+url.toDisplayString()+"\""; + // args << "-e"; + // args << "end tell"; + // QProcess::startDetached("osascript", args); + //#endif + QDesktopServices::openUrl(QUrl(directoryURL)); + } else { + emitMessage(i18n("Couldn't locate ") + QString(" ("+url.toString()+")"), ErrorMessage); + return; + } + } + } + } +} + void Bin::slotDuplicateClip() { QModelIndexList indexes = m_proxyModel->selectionModel()->selectedIndexes(); @@ -850,7 +894,7 @@ } } if (!currentName.isEmpty()) { - currentName.append(i18nc("append to clip name to indicate a copied idem", " (copy)")); + currentName.append(i18nc("append to clip name to indicate a copied item", " (copy)")); EffectsList::setProperty(xml, "kdenlive:clipname", currentName); } ClipCreationDialog::createClipFromXml(m_doc, xml, folderInfo, this); @@ -1254,6 +1298,9 @@ currentItem->setCurrent(true); if (currentItem->itemType() == AbstractProjectItem::ClipItem) { m_reloadAction->setEnabled(true); + #ifdef __linux__ + m_locateAction->setEnabled(true); + #endif m_duplicateAction->setEnabled(true); ClipType type = static_cast(currentItem)->clipType(); m_openAction->setEnabled(type == Image || type == Audio); @@ -1265,6 +1312,7 @@ // A folder was selected, disable editing clip m_openAction->setEnabled(false); m_reloadAction->setEnabled(false); + m_locateAction->setEnabled(false); m_duplicateAction->setEnabled(false); m_deleteAction->setText(i18n("Delete Folder")); m_proxyAction->setText(i18n("Proxy Folder")); @@ -1272,6 +1320,7 @@ showClipProperties(static_cast(currentItem->parent()), false); m_openAction->setEnabled(false); m_reloadAction->setEnabled(false); + m_locateAction->setEnabled(false); m_duplicateAction->setEnabled(false); m_deleteAction->setText(i18n("Delete Clip")); m_proxyAction->setText(i18n("Proxy Clip")); @@ -1280,6 +1329,7 @@ } else { emit findInTimeline(QString()); m_reloadAction->setEnabled(false); + m_locateAction->setEnabled(false); m_duplicateAction->setEnabled(false); m_openAction->setEnabled(false); m_deleteAction->setEnabled(false); @@ -1506,12 +1556,14 @@ m_proxyAction->setEnabled(m_doc->getDocumentProperty("enableproxy").toInt() && enableClipActions); m_openAction->setEnabled(type == Image || type == Audio); m_reloadAction->setEnabled(enableClipActions); + m_locateAction->setEnabled(enableClipActions); m_duplicateAction->setEnabled(enableClipActions); m_clipsActionsMenu->setEnabled(enableClipActions); m_extractAudioAction->setEnabled(enableClipActions); m_renameFolderAction->setVisible(isFolder); m_openAction->setVisible(!isFolder); m_reloadAction->setVisible(!isFolder); + m_locateAction->setVisible(!isFolder); m_duplicateAction->setVisible(!isFolder); m_editAction->setVisible(!isFolder); m_inTimelineAction->setVisible(!isFolder); @@ -1895,6 +1947,7 @@ m_inTimelineAction->setEnabled(!addMenu->isEmpty()); } + if (m_locateAction) m_menu->addAction(m_locateAction); if (m_reloadAction) m_menu->addAction(m_reloadAction); if (m_duplicateAction) m_menu->addAction(m_duplicateAction); if (m_proxyAction) m_menu->addAction(m_proxyAction); @@ -1927,6 +1980,7 @@ m_openAction = actions.value(QStringLiteral("open")); m_reloadAction = actions.value(QStringLiteral("reload")); m_duplicateAction = actions.value(QStringLiteral("duplicate")); + m_locateAction = actions.value(QStringLiteral("locate")); m_proxyAction = actions.value(QStringLiteral("proxy")); QMenu *m = new QMenu(this); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1317,6 +1317,10 @@ disableEffects->setData("disable_timeline_effects"); disableEffects->setCheckable(true); disableEffects->setChecked(false); + + QAction *locateClip = addAction(QStringLiteral("locate_clip"), i18n("Locate Clip..."), pCore->bin(), SLOT(slotLocateClip()), KoIconUtils::themedIcon(QStringLiteral("edit-file"))); + locateClip->setData("locate_clip"); + locateClip->setEnabled(false); QAction *duplicateClip = addAction(QStringLiteral("duplicate_clip"), i18n("Duplicate Clip"), pCore->bin(), SLOT(slotDuplicateClip()), KoIconUtils::themedIcon(QStringLiteral("edit-copy"))); duplicateClip->setData("duplicate_clip"); @@ -1335,6 +1339,7 @@ addAction(QStringLiteral("switch_track_target"), i18n("Toggle Track Target"), pCore->projectManager(), SLOT(slotSwitchTrackTarget()), QIcon(), Qt::SHIFT + Qt::Key_T); QHash actions; + actions.insert(QStringLiteral("locate"), locateClip); actions.insert(QStringLiteral("reload"), reloadClip); actions.insert(QStringLiteral("duplicate"), duplicateClip); actions.insert(QStringLiteral("proxy"), proxyClip);