X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmainwindow.cpp;h=18974fda3e6cbeaf4816b9bf5094564ae8330dd4;hb=5ea562ca661201728d482ed42a8455a453e81505;hp=8a94be75d58311c0c66955f102b6723bda8f20f3;hpb=487eaf2ce6ac64b17fb7db77721f08c87d7dda44;p=kdenlive diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 8a94be75..18974fda 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -50,6 +50,7 @@ #include "clipitem.h" #include "interfaces.h" #include "kdenlive-config.h" +#include "cliptranscode.h" #include #include @@ -226,11 +227,12 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent guiFactory()->addClient(sp);*/ loadPlugins(); + loadTranscoders(); //kDebug() << factory() << " " << factory()->container("video_effects_menu", this); m_projectMonitor->setupMenu(static_cast(factory()->container("monitor_go", this)), m_playZone, m_loopZone); m_clipMonitor->setupMenu(static_cast(factory()->container("monitor_go", this)), m_playZone, m_loopZone, static_cast(factory()->container("marker_menu", this))); - m_projectList->setupGeneratorMenu(static_cast(factory()->container("generators", this))); + m_projectList->setupGeneratorMenu(static_cast(factory()->container("generators", this)), static_cast(factory()->container("transcoders", this))); // build effects menus QAction *action; @@ -384,7 +386,7 @@ bool MainWindow::queryClose() saveOptions(); if (m_monitorManager) m_monitorManager->stopActiveMonitor(); if (m_activeDocument && m_activeDocument->isModified()) { - switch (KMessageBox::warningYesNoCancel(this, i18n("Save changes to document ?"))) { + switch (KMessageBox::warningYesNoCancel(this, i18n("Save changes to document?"))) { case KMessageBox::Yes : // save document here. If saving fails, return false; return saveFile(); @@ -593,7 +595,7 @@ void MainWindow::slotConnectMonitors() connect(m_projectMonitor->render, SIGNAL(replyGetImage(const QString &, const QPixmap &)), m_projectList, SLOT(slotReplyGetImage(const QString &, const QPixmap &))); connect(m_projectMonitor->render, SIGNAL(replyGetFileProperties(const QString &, Mlt::Producer*, const QMap < QString, QString > &, const QMap < QString, QString > &, bool)), m_projectList, SLOT(slotReplyGetFileProperties(const QString &, Mlt::Producer*, const QMap < QString, QString > &, const QMap < QString, QString > &, bool))); - connect(m_projectMonitor->render, SIGNAL(removeInvalidClip(const QString &)), m_projectList, SLOT(slotRemoveInvalidClip(const QString &))); + connect(m_projectMonitor->render, SIGNAL(removeInvalidClip(const QString &, bool)), m_projectList, SLOT(slotRemoveInvalidClip(const QString &, bool))); connect(m_clipMonitor, SIGNAL(refreshClipThumbnail(const QString &)), m_projectList, SLOT(slotRefreshClipThumbnail(const QString &))); @@ -799,7 +801,7 @@ void MainWindow::setupActions() collection->addAction("manage_profiles", profilesAction); connect(profilesAction, SIGNAL(triggered(bool)), this, SLOT(slotEditProfiles())); - KNS::standardAction(i18n("Download New Lumas..."), this, SLOT(slotGetNewLumaStuff()), actionCollection(), "get_new_lumas"); + KNS::standardAction(i18n("Download New Wipes..."), this, SLOT(slotGetNewLumaStuff()), actionCollection(), "get_new_lumas"); KNS::standardAction(i18n("Download New Render Profiles..."), this, SLOT(slotGetNewRenderStuff()), actionCollection(), "get_new_profiles"); @@ -840,6 +842,10 @@ void MainWindow::setupActions() collection->addAction("dvd_wizard", dvdWizard); connect(dvdWizard, SIGNAL(triggered(bool)), this, SLOT(slotDvdWizard())); + KAction *transcodeClip = new KAction(KIcon("edit-copy"), i18n("Transcode Clip"), this); + collection->addAction("transcode_clip", transcodeClip); + connect(transcodeClip, SIGNAL(triggered(bool)), this, SLOT(slotTranscodeClip())); + KAction *markIn = collection->addAction("mark_in"); markIn->setText(i18n("Set In Point")); markIn->setShortcut(Qt::Key_I); @@ -1163,7 +1169,7 @@ void MainWindow::readOptions() //Add new settings from 0.7.1 if (KdenliveSettings::defaultprojectfolder().isEmpty()) { QString path = QDir::homePath() + "/kdenlive"; - if (KStandardDirs::makeDir(path) == false) kDebug() << "/// ERROR CREATING PROJECT FOLDER: " << path; + if (KStandardDirs::makeDir(path) == false) kDebug() << "/// ERROR CREATING PROJECT FOLDER: " << path; KdenliveSettings::setDefaultprojectfolder(path); } } @@ -1204,6 +1210,7 @@ void MainWindow::newFile(bool showProjectSettings) if (!showProjectSettings && m_timelineArea->count() == 0) { if (!KdenliveSettings::activatetabs()) closeCurrentDocument(); profileName = KdenliveSettings::default_profile(); + projectFolder = KdenliveSettings::defaultprojectfolder(); } else { ProjectSettings *w = new ProjectSettings(projectTracks.x(), projectTracks.y(), KdenliveSettings::defaultprojectfolder(), false, this); if (w->exec() != QDialog::Accepted) return; @@ -1248,13 +1255,14 @@ void MainWindow::closeCurrentDocument() TrackView *tabToClose = (TrackView *) w; KdenliveDoc *docToClose = tabToClose->document(); if (docToClose && docToClose->isModified()) { - switch (KMessageBox::warningYesNoCancel(this, i18n("Save changes to document ?"))) { + switch (KMessageBox::warningYesNoCancel(this, i18n("Save changes to document?"))) { case KMessageBox::Yes : // save document here. If saving fails, return false; if (saveFile() == false) return; break; case KMessageBox::Cancel : return; + break; default: break; } @@ -1264,13 +1272,16 @@ void MainWindow::closeCurrentDocument() m_timelineArea->setTabBarHidden(true); m_closeAction->setEnabled(false); } - delete docToClose; - delete w; - if (m_timelineArea->count() == 0) { + if (docToClose == m_activeDocument) { + delete m_activeDocument; m_activeDocument = NULL; m_effectStack->clear(); - m_transitionConfig->slotTransitionItemSelected(NULL, false); - } + m_transitionConfig->slotTransitionItemSelected(NULL, QPoint(), false); + } else delete docToClose; + if (w == m_activeTimeline) { + delete m_activeTimeline; + m_activeTimeline = NULL; + } else delete w; } bool MainWindow::saveFileAs(const QString &outputFileName) @@ -1311,7 +1322,7 @@ bool MainWindow::saveFileAs() QString outputFile = KFileDialog::getSaveFileName(KUrl(), mimetype); if (outputFile.isEmpty()) return false; if (QFile::exists(outputFile)) { - if (KMessageBox::questionYesNo(this, i18n("File already exists.\nDo you want to overwrite it ?")) == KMessageBox::No) return false; + if (KMessageBox::questionYesNo(this, i18n("File already exists.\nDo you want to overwrite it?")) == KMessageBox::No) return false; } return saveFileAs(outputFile); } @@ -1345,7 +1356,7 @@ void MainWindow::openLastFile() { KSharedConfigPtr config = KGlobal::config(); KUrl::List urls = m_fileOpenRecent->urls(); - //WARNING: this is buggy, we get a random url, not the last one. Bug in KRecentFileAction ? + //WARNING: this is buggy, we get a random url, not the last one. Bug in KRecentFileAction? if (urls.isEmpty()) newFile(false); else openFile(urls.last()); } @@ -1392,7 +1403,7 @@ void MainWindow::openFile(const KUrl &url) void MainWindow::doOpenFile(const KUrl &url, KAutoSaveFile *stale) { - KdenliveDoc *doc = new KdenliveDoc(url, KUrl(), m_commandStack, QString(), QPoint(3, 2), m_projectMonitor->render, this); + KdenliveDoc *doc = new KdenliveDoc(url, KdenliveSettings::defaultprojectfolder(), m_commandStack, KdenliveSettings::default_profile(), QPoint(KdenliveSettings::videotracks(), KdenliveSettings::audiotracks()), m_projectMonitor->render, this); if (stale == NULL) { stale = new KAutoSaveFile(url, doc); doc->m_autosave = stale; @@ -1427,7 +1438,7 @@ void MainWindow::recoverFiles(QList staleFiles) continue; }*/ kDebug() << "// OPENING RECOVERY: " << stale->fileName() << "\nMANAGED: " << stale->managedFile().path(); - // the stalefiles also contain ".lock" files so we must ignore them... bug in KAutoSaveFile ? + // the stalefiles also contain ".lock" files so we must ignore them... bug in KAutoSaveFile? if (!stale->fileName().endsWith(".lock")) doOpenFile(KUrl(stale->fileName()), stale); else KIO::NetAccess::del(KUrl(stale->fileName()), this); } @@ -1436,29 +1447,29 @@ void MainWindow::recoverFiles(QList staleFiles) void MainWindow::parseProfiles(const QString &mltPath) { - //kdDebug()<<" + + YOUR MLT INSTALL WAS FOUND IN: "<< MLT_PREFIX <exec() == QDialog::Rejected) { ::exit(0); } @@ -1521,6 +1532,7 @@ void MainWindow::slotEditProjectSettings() if (m_renderWidget) m_renderWidget->setDocumentPath(w->selectedFolder().path()); if (m_activeDocument->profilePath() != profile) { // Profile was changed + double dar = m_activeDocument->dar(); m_activeDocument->setProfilePath(profile); KdenliveSettings::setCurrent_profile(profile); KdenliveSettings::setProject_fps(m_activeDocument->fps()); @@ -1529,7 +1541,7 @@ void MainWindow::slotEditProjectSettings() if (m_renderWidget) m_renderWidget->setProfile(m_activeDocument->mltProfile()); m_timelineArea->setTabText(m_timelineArea->currentIndex(), m_activeDocument->description()); m_activeDocument->clipManager()->resetProducersList(m_projectMonitor->render->producersList()); - + if (dar != m_activeDocument->dar()) m_projectList->reloadClipThumbnails(); // We need to desactivate & reactivate monitors to get a refresh m_monitorManager->switchMonitors(); } @@ -1542,7 +1554,7 @@ void MainWindow::slotRenderProject() if (!m_renderWidget) { QString projectfolder = m_activeDocument ? m_activeDocument->projectFolder().path() : KdenliveSettings::defaultprojectfolder(); m_renderWidget = new RenderWidget(projectfolder, this); - connect(m_renderWidget, SIGNAL(doRender(const QString&, const QString&, const QStringList &, const QStringList &, bool, bool, double, double, bool, const QString &)), this, SLOT(slotDoRender(const QString&, const QString&, const QStringList &, const QStringList &, bool, bool, double, double, bool, const QString &))); + connect(m_renderWidget, SIGNAL(doRender(const QStringList&, const QStringList&)), this, SLOT(slotDoRender(const QStringList&, const QStringList&))); connect(m_renderWidget, SIGNAL(abortProcess(const QString &)), this, SIGNAL(abortRenderJob(const QString &))); connect(m_renderWidget, SIGNAL(openDvdWizard(const QString &, const QString &)), this, SLOT(slotDvdWizard(const QString &, const QString &))); if (m_activeDocument) { @@ -1556,9 +1568,19 @@ void MainWindow::slotRenderProject() m_renderWidget->show(); } -void MainWindow::slotDoRender(const QString &dest, const QString &render, const QStringList &overlay_args, const QStringList &avformat_args, bool zoneOnly, bool playAfter, double guideStart, double guideEnd, bool resizeProfile, const QString &scriptExport) +void MainWindow::slotDoRender(const QStringList args, const QStringList overlay_args) { - kDebug() << "// SCRIPT EXPORT: " << scriptExport; + QString dest = args.at(0); + QString render = args.at(1); + QStringList avformat_args = args.at(2).split(' '); + bool zoneOnly = args.at(3).toInt(); + bool playAfter = args.at(4).toInt(); + double guideStart = args.at(5).toDouble(); + double guideEnd = args.at(6).toDouble(); + bool resizeProfile = args.at(7).toInt(); + QString scriptExport = args.at(8); + bool createChapterFile = args.at(9).toInt(); + if (dest.isEmpty()) return; int in = 0; int out = 0; @@ -1567,19 +1589,20 @@ void MainWindow::slotDoRender(const QString &dest, const QString &render, const in = m_activeTimeline->inPoint(); out = m_activeTimeline->outPoint(); } + KTemporaryFile temp; temp.setAutoRemove(false); - temp.setSuffix(".westley"); + temp.setSuffix(".mlt"); if (!scriptExport.isEmpty() || temp.open()) { if (KdenliveSettings::dropbframes()) { KdenliveSettings::setDropbframes(false); m_activeDocument->clipManager()->updatePreviewSettings(); - if (!scriptExport.isEmpty()) m_projectMonitor->saveSceneList(scriptExport + ".westley"); + if (!scriptExport.isEmpty()) m_projectMonitor->saveSceneList(scriptExport + ".mlt"); else m_projectMonitor->saveSceneList(temp.fileName()); KdenliveSettings::setDropbframes(true); m_activeDocument->clipManager()->updatePreviewSettings(); } else { - if (!scriptExport.isEmpty()) m_projectMonitor->saveSceneList(scriptExport + ".westley"); + if (!scriptExport.isEmpty()) m_projectMonitor->saveSceneList(scriptExport + ".mlt"); else m_projectMonitor->saveSceneList(temp.fileName()); } @@ -1597,7 +1620,7 @@ void MainWindow::slotDoRender(const QString &dest, const QString &render, const if (videoPlayer.isEmpty()) KMessageBox::sorry(this, i18n("Cannot play video after rendering because the default video player application is not set.\nPlease define it in Kdenlive settings dialog.")); } if (!QFile::exists(KdenliveSettings::rendererpath())) { - KMessageBox::sorry(this, i18n("Cannot find the inigo program required for rendering (part of Mlt)")); + KMessageBox::sorry(this, i18n("Cannot find the melt program required for rendering (part of Mlt)")); setRenderingProgress(dest, -3); return; } @@ -1634,11 +1657,11 @@ void MainWindow::slotDoRender(const QString &dest, const QString &render, const return; } - QTextStream out(&file); - out << "#! /bin/sh" << "\n" << "\n"; - out << "SOURCE=" << "\"" + scriptExport + ".westley\"" << "\n"; - out << "TARGET=" << "\"" + dest + "\"" << "\n"; - out << renderer << " " << args.join(" ") << "\n" << "\n"; + QTextStream outStream(&file); + outStream << "#! /bin/sh" << "\n" << "\n"; + outStream << "SOURCE=" << "\"" + scriptExport + ".mlt\"" << "\n"; + outStream << "TARGET=" << "\"" + dest + "\"" << "\n"; + outStream << renderer << " " << args.join(" ") << "\n" << "\n"; if (file.error() != QFile::NoError) { KMessageBox::error(this, i18n("Cannot write to file %1", scriptExport)); file.close(); @@ -1647,6 +1670,51 @@ void MainWindow::slotDoRender(const QString &dest, const QString &render, const file.close(); QFile::setPermissions(scriptExport, file.permissions() | QFile::ExeUser); } + + if (createChapterFile) { + QDomDocument doc; + QDomElement chapters = doc.createElement("chapters"); + chapters.setAttribute("fps", m_activeDocument->fps()); + doc.appendChild(chapters); + + QDomElement guidesxml = m_activeDocument->guidesXml(); + if (!zoneOnly) out = (int) GenTime(m_activeDocument->projectDuration()).frames(m_activeDocument->fps()); + + QDomNodeList nodes = guidesxml.elementsByTagName("guide"); + for (int i = 0; i < nodes.count(); i++) { + QDomElement e = nodes.item(i).toElement(); + if (!e.isNull()) { + QString comment = e.attribute("comment"); + int time = (int) GenTime(e.attribute("time").toDouble()).frames(m_activeDocument->fps()); + if (time >= in && time < out) { + if (zoneOnly) time = time - in; + QDomElement chapter = doc.createElement("chapter"); + chapters.appendChild(chapter); + chapter.setAttribute("title", comment); + chapter.setAttribute("time", time); + } + } + } + if (chapters.childNodes().count() > 0) { + if (m_activeTimeline->projectView()->hasGuide(out, 0) == -1) { + // Always insert a guide in pos 0 + QDomElement chapter = doc.createElement("chapter"); + chapters.insertBefore(chapter, QDomNode()); + chapter.setAttribute("title", i18n("Start")); + chapter.setAttribute("time", "0"); + } + // save chapters file + QFile file(dest + ".dvdchapter"); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + kWarning() << "////// ERROR writing DVD CHAPTER file: " << dest + ".dvdchapter"; + } else { + file.write(doc.toString().toUtf8()); + if (file.error() != QFile::NoError) + kWarning() << "////// ERROR writing DVD CHAPTER file: " << dest + ".dvdchapter"; + file.close(); + } + } + } } } @@ -1719,8 +1787,8 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha disconnect(m_activeDocument, SIGNAL(deleteTimelineClip(const QString &)), m_activeTimeline, SLOT(slotDeleteClip(const QString &))); disconnect(m_activeTimeline->projectView(), SIGNAL(clipItemSelected(ClipItem*, int)), m_effectStack, SLOT(slotClipItemSelected(ClipItem*, int))); disconnect(m_activeTimeline->projectView(), SIGNAL(clipItemSelected(ClipItem*, int)), this, SLOT(slotActivateEffectStackView())); - disconnect(m_activeTimeline, SIGNAL(transitionItemSelected(Transition*, bool)), m_transitionConfig, SLOT(slotTransitionItemSelected(Transition*, bool))); - disconnect(m_activeTimeline, SIGNAL(transitionItemSelected(Transition*, bool)), this, SLOT(slotActivateTransitionView(Transition *))); + disconnect(m_activeTimeline, SIGNAL(transitionItemSelected(Transition*, QPoint, bool)), m_transitionConfig, SLOT(slotTransitionItemSelected(Transition*, QPoint, bool))); + disconnect(m_activeTimeline, SIGNAL(transitionItemSelected(Transition*, QPoint, bool)), this, SLOT(slotActivateTransitionView(Transition *))); disconnect(m_zoomSlider, SIGNAL(valueChanged(int)), m_activeTimeline, SLOT(slotChangeZoom(int))); disconnect(m_activeTimeline->projectView(), SIGNAL(displayMessage(const QString&, MessageType)), m_messageLabel, SLOT(setMessage(const QString&, MessageType))); disconnect(m_activeTimeline->projectView(), SIGNAL(showClipFrame(DocClipBase *, const int)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *, const int))); @@ -1779,8 +1847,8 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha connect(trackView->projectView(), SIGNAL(clipItemSelected(ClipItem*, int)), m_effectStack, SLOT(slotClipItemSelected(ClipItem*, int))); connect(trackView->projectView(), SIGNAL(clipItemSelected(ClipItem*, int)), this, SLOT(slotActivateEffectStackView())); - connect(trackView, SIGNAL(transitionItemSelected(Transition*, bool)), m_transitionConfig, SLOT(slotTransitionItemSelected(Transition*, bool))); - connect(trackView, SIGNAL(transitionItemSelected(Transition*, bool)), this, SLOT(slotActivateTransitionView(Transition *))); + connect(trackView, SIGNAL(transitionItemSelected(Transition*, QPoint, bool)), m_transitionConfig, SLOT(slotTransitionItemSelected(Transition*, QPoint, bool))); + connect(trackView, SIGNAL(transitionItemSelected(Transition*, QPoint, bool)), this, SLOT(slotActivateTransitionView(Transition *))); m_zoomSlider->setValue(doc->zoom()); connect(m_zoomSlider, SIGNAL(valueChanged(int)), trackView, SLOT(slotChangeZoom(int))); connect(trackView->projectView(), SIGNAL(zoomIn()), this, SLOT(slotZoomIn())); @@ -1881,6 +1949,9 @@ void MainWindow::updateConfiguration() } m_buttonAudioThumbs->setChecked(KdenliveSettings::audiothumbnails()); m_buttonVideoThumbs->setChecked(KdenliveSettings::videothumbnails()); + + // Update list of transcoding profiles + loadTranscoders(); #ifndef NO_JOGSHUTTLE activateShuttleDevice(); #endif /* NO_JOGSHUTTLE */ @@ -2228,6 +2299,7 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip) //m_clipManager->slotEditTextClipFile(id, dia_ui->xml().toString()); QMap newprops; newprops.insert("xmldata", dia_ui->xml().toString()); + newprops.insert("frame_size", QString::number(pix.width()) + 'x' + QString::number(pix.height())); EditClipCommand *command = new EditClipCommand(m_projectList, clip->getId(), clip->properties(), newprops, true); m_activeDocument->commandStack()->push(command); m_clipMonitor->refreshMonitor(true); @@ -2256,7 +2328,7 @@ void MainWindow::customEvent(QEvent* e) { if (e->type() == QEvent::User) { // The timeline playing position changed... - kDebug() << "RECEIVED JOG EVEMNT!!!"; + kDebug() << "RECEIVED JOG EVEMNT!!!"; } } void MainWindow::slotActivateEffectStackView() @@ -2349,7 +2421,7 @@ void MainWindow::slotFind() void MainWindow::slotFindNext() { if (m_activeTimeline && m_activeTimeline->projectView()->findNextString(m_findString)) { - statusBar()->showMessage(i18n("Found : %1", m_findString)); + statusBar()->showMessage(i18n("Found: %1", m_findString)); } else { statusBar()->showMessage(i18n("Reached end of project")); } @@ -2360,10 +2432,10 @@ void MainWindow::findAhead() { if (m_activeTimeline && m_activeTimeline->projectView()->findString(m_findString)) { m_projectSearchNext->setEnabled(true); - statusBar()->showMessage(i18n("Found : %1", m_findString)); + statusBar()->showMessage(i18n("Found: %1", m_findString)); } else { m_projectSearchNext->setEnabled(false); - statusBar()->showMessage(i18n("Not found : %1", m_findString)); + statusBar()->showMessage(i18n("Not found: %1", m_findString)); } } @@ -2449,7 +2521,7 @@ void MainWindow::slotSaveZone(Render *render, QPoint zone) QLabel *label1 = new QLabel(i18n("Save clip zone as:"), this); QString path = m_activeDocument->projectFolder().path(); path.append("/"); - path.append("untitled.westley"); + path.append("untitled.mlt"); KUrlRequester *url = new KUrlRequester(KUrl(path), this); url->setFilter("video/mlt-playlist"); QLabel *label2 = new QLabel(i18n("Description:"), this); @@ -2492,6 +2564,7 @@ void MainWindow::slotGetNewLumaStuff() } qDeleteAll(entries); initEffects::refreshLumas(); + m_activeTimeline->projectView()->reloadTransitionLumas(); } void MainWindow::slotGetNewRenderStuff() @@ -2577,9 +2650,9 @@ void MainWindow::slotShowTimeline(bool show) } } -void MainWindow::slotMaximizeCurrent(bool show) +void MainWindow::slotMaximizeCurrent(bool /*show*/) { - //TODO: is there a way to maximize current widget? + //TODO: is there a way to maximize current widget? //if (show == true) { m_timelineState = saveState(); @@ -2595,4 +2668,44 @@ void MainWindow::slotMaximizeCurrent(bool show) }*/ } +void MainWindow::loadTranscoders() +{ + QMenu *transMenu = static_cast(factory()->container("transcoders", this)); + transMenu->clear(); + + KSharedConfigPtr config = KSharedConfig::openConfig("kdenlivetranscodingrc"); + KConfigGroup transConfig(config, "Transcoding"); + // read the entries + QMap< QString, QString > profiles = transConfig.entryMap(); + QMapIterator i(profiles); + while (i.hasNext()) { + i.next(); + QAction *a = transMenu->addAction(i.key()); + a->setData(i.value()); + connect(a, SIGNAL(triggered()), this, SLOT(slotTranscode())); + } +} + +void MainWindow::slotTranscode(KUrl::List urls) +{ + QString params; + if (urls.isEmpty()) { + urls.append(m_projectList->currentClipUrl()); + QAction *action = qobject_cast(sender()); + params = action->data().toString(); + } + if (urls.isEmpty()) return; + ClipTranscode *d = new ClipTranscode(urls, params); + connect(d, SIGNAL(addClip(KUrl)), this, SLOT(slotAddProjectClip(KUrl))); + d->show(); + //QProcess::startDetached("ffmpeg", parameters); +} + +void MainWindow::slotTranscodeClip() +{ + KUrl::List urls = KFileDialog::getOpenUrls(KUrl("kfiledialog:///projectfolder")); + if (urls.isEmpty()) return; + slotTranscode(urls); +} + #include "mainwindow.moc"