X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmainwindow.cpp;h=76e8ba25a2cbefaf8406370e5f1bb28772ba26ae;hb=f6e2d5e00d13dbc8c511b127faa9f127a8decab1;hp=3ab21390f99072625473ba67d38983ac1355e68d;hpb=2a59df8d657168035e1bb5c8dd7bca728fd7d06f;p=kdenlive diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 3ab21390..76e8ba25 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -54,6 +54,7 @@ #include "interfaces.h" #include "config-kdenlive.h" #include "cliptranscode.h" +#include "clipstabilize.h" #include "ui_templateclip_ui.h" #include "colorscopes/vectorscope.h" #include "colorscopes/waveform.h" @@ -63,6 +64,7 @@ #include "audioscopes/spectrogram.h" #include "archivewidget.h" #include "databackup/backupwidget.h" +#include "utils/resourcewidget.h" #include @@ -231,6 +233,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & connect(m_projectList, SIGNAL(refreshClip(const QString &, bool)), m_monitorManager, SLOT(slotRefreshCurrentMonitor(const QString &))); connect(m_projectList, SIGNAL(findInTimeline(const QString&)), this, SLOT(slotClipInTimeline(const QString&))); connect(m_clipMonitor, SIGNAL(zoneUpdated(QPoint)), m_projectList, SLOT(slotUpdateClipCut(QPoint))); + connect(m_clipMonitor, SIGNAL(extractZone(const QString &, QPoint)), m_projectList, SLOT(slotCutClipJob(const QString &, QPoint))); m_projectMonitorDock = new QDockWidget(i18n("Project Monitor"), this); m_projectMonitorDock->setObjectName("project_monitor"); @@ -245,6 +248,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & connect(m_recMonitor, SIGNAL(addProjectClip(KUrl)), this, SLOT(slotAddProjectClip(KUrl))); connect(m_recMonitor, SIGNAL(addProjectClipList(KUrl::List)), this, SLOT(slotAddProjectClipList(KUrl::List))); connect(m_recMonitor, SIGNAL(showConfigDialog(int, int)), this, SLOT(slotPreferences(int, int))); + #endif /* ! Q_WS_MAC */ m_monitorManager->initMonitors(m_clipMonitor, m_projectMonitor, m_recMonitor); @@ -266,6 +270,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & m_effectStack = new EffectStackView(m_projectMonitor); m_effectStackDock->setWidget(m_effectStack); addDockWidget(Qt::TopDockWidgetArea, m_effectStackDock); + connect(m_effectStack, SIGNAL(startFilterJob(ItemInfo, const QString&,const QString&,const QString&,const QString&,const QString&,const QString&,const QString&)), m_projectList, SLOT(slotStartFilterJob(ItemInfo, const QString&,const QString&,const QString&,const QString&,const QString&,const QString&,const QString&))); m_transitionConfigDock = new QDockWidget(i18n("Transition"), this); m_transitionConfigDock->setObjectName("transition"); @@ -494,6 +499,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & clipInTimeline->setIcon(KIcon("go-jump")); QHash menus; menus.insert("addMenu",static_cast(factory()->container("generators", this))); + menus.insert("extractAudioMenu",static_cast(factory()->container("extract_audio", this))); menus.insert("transcodeMenu",static_cast(factory()->container("transcoders", this))); menus.insert("stabilizeMenu",static_cast(factory()->container("stabilize", this))); menus.insert("inTimelineMenu",clipInTimeline); @@ -1633,6 +1639,10 @@ void MainWindow::setupActions() QAction *addFolderButton = new KAction(KIcon("folder-new"), i18n("Create Folder"), this); collection.addAction("add_folder", addFolderButton); connect(addFolderButton , SIGNAL(triggered()), m_projectList, SLOT(slotAddFolder())); + + QAction *downloadResources = new KAction(KIcon("download"), i18n("Online Resources"), this); + collection.addAction("download_resource", downloadResources); + connect(downloadResources , SIGNAL(triggered()), this, SLOT(slotDownloadResources())); QAction *clipProperties = new KAction(KIcon("document-edit"), i18n("Clip Properties"), this); collection.addAction("clip_properties", clipProperties); @@ -1676,6 +1686,7 @@ void MainWindow::setupActions() addClips->addAction(addTitleClip); addClips->addAction(addTitleTemplateClip); addClips->addAction(addFolderButton); + addClips->addAction(downloadResources); addClips->addAction(reloadClip); addClips->addAction(proxyClip); @@ -1836,13 +1847,14 @@ void MainWindow::newFile(bool showProjectSettings, bool force) QString profileName = KdenliveSettings::default_profile(); KUrl projectFolder = KdenliveSettings::defaultprojectfolder(); QMap documentProperties; + QMap documentMetadata; QPoint projectTracks(KdenliveSettings::videotracks(), KdenliveSettings::audiotracks()); if (!showProjectSettings) { if (!KdenliveSettings::activatetabs()) if (!closeCurrentDocument()) return; } else { - ProjectSettings *w = new ProjectSettings(NULL, QStringList(), projectTracks.x(), projectTracks.y(), KdenliveSettings::defaultprojectfolder(), false, true, this); + ProjectSettings *w = new ProjectSettings(NULL, QMap (), QStringList(), projectTracks.x(), projectTracks.y(), KdenliveSettings::defaultprojectfolder(), false, true, this); if (w->exec() != QDialog::Accepted) return; if (!KdenliveSettings::activatetabs()) @@ -1862,12 +1874,13 @@ void MainWindow::newFile(bool showProjectSettings, bool force) documentProperties.insert("proxyextension", w->proxyExtension()); documentProperties.insert("generateimageproxy", QString::number((int) w->generateImageProxy())); documentProperties.insert("proxyimageminsize", QString::number(w->proxyImageMinSize())); + documentMetadata = w->metadata(); delete w; } m_timelineArea->setEnabled(true); m_projectList->setEnabled(true); bool openBackup; - KdenliveDoc *doc = new KdenliveDoc(KUrl(), projectFolder, m_commandStack, profileName, documentProperties, projectTracks, m_projectMonitor->render, m_notesWidget, &openBackup, this); + KdenliveDoc *doc = new KdenliveDoc(KUrl(), projectFolder, m_commandStack, profileName, documentProperties, documentMetadata, projectTracks, m_projectMonitor->render, m_notesWidget, &openBackup, this); doc->m_autosave = new KAutoSaveFile(KUrl(), doc); bool ok; TrackView *trackView = new TrackView(doc, &ok, this); @@ -2100,7 +2113,7 @@ void MainWindow::doOpenFile(const KUrl &url, KAutoSaveFile *stale) qApp->processEvents(); bool openBackup; - KdenliveDoc *doc = new KdenliveDoc(url, KdenliveSettings::defaultprojectfolder(), m_commandStack, KdenliveSettings::default_profile(), QMap (), QPoint(KdenliveSettings::videotracks(), KdenliveSettings::audiotracks()), m_projectMonitor->render, m_notesWidget, &openBackup, this, &progressDialog); + KdenliveDoc *doc = new KdenliveDoc(url, KdenliveSettings::defaultprojectfolder(), m_commandStack, KdenliveSettings::default_profile(), QMap (), QMap (), QPoint(KdenliveSettings::videotracks(), KdenliveSettings::audiotracks()), m_projectMonitor->render, m_notesWidget, &openBackup, this, &progressDialog); progressDialog.progressBar()->setValue(1); progressDialog.progressBar()->setMaximum(4); @@ -2268,7 +2281,7 @@ void MainWindow::slotDetectAudioDriver() void MainWindow::slotEditProjectSettings() { QPoint p = m_activeDocument->getTracksCount(); - ProjectSettings *w = new ProjectSettings(m_projectList, m_activeTimeline->projectView()->extractTransitionsLumas(), p.x(), p.y(), m_activeDocument->projectFolder().path(), true, !m_activeDocument->isModified(), this); + ProjectSettings *w = new ProjectSettings(m_projectList, m_activeDocument->metadata(), m_activeTimeline->projectView()->extractTransitionsLumas(), p.x(), p.y(), m_activeDocument->projectFolder().path(), true, !m_activeDocument->isModified(), this); connect(w, SIGNAL(disableProxies()), this, SLOT(slotDisableProxies())); if (w->exec() == QDialog::Accepted) { @@ -2314,6 +2327,7 @@ void MainWindow::slotEditProjectSettings() m_activeDocument->setModified(); slotUpdateProxySettings(); } + m_activeDocument->setMetadata(w->metadata()); } delete w; } @@ -2483,6 +2497,8 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha disconnect(m_activeTimeline->projectView(), SIGNAL(playMonitor()), m_projectMonitor, SLOT(slotPlay())); disconnect(m_activeTimeline->projectView(), SIGNAL(displayMessage(const QString&, MessageType)), m_messageLabel, SLOT(setMessage(const QString&, MessageType))); disconnect(m_activeTimeline->projectView(), SIGNAL(showClipFrame(DocClipBase *, QPoint, bool, const int)), m_clipMonitor, SLOT(slotSetClipProducer(DocClipBase *, QPoint, bool, const int))); + disconnect(m_projectList, SIGNAL(gotFilterJobResults(const QString &, int, int, const QString &, stringMap)), m_activeTimeline->projectView(), SLOT(slotGotFilterJobResults(const QString &, int, int, const QString &, stringMap))); + disconnect(m_activeTimeline, SIGNAL(cursorMoved()), m_projectMonitor, SLOT(activateMonitor())); disconnect(m_activeTimeline, SIGNAL(insertTrack(int)), this, SLOT(slotInsertTrack(int))); disconnect(m_activeTimeline, SIGNAL(deleteTrack(int)), this, SLOT(slotDeleteTrack(int))); @@ -2563,6 +2579,8 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha connect(trackView->projectView(), SIGNAL(clipItemSelected(ClipItem*, int, bool)), m_projectMonitor, SLOT(slotSetSelectedClip(ClipItem*))); connect(trackView->projectView(), SIGNAL(transitionItemSelected(Transition*, int, QPoint, bool)), m_projectMonitor, SLOT(slotSetSelectedClip(Transition*))); + + connect(m_projectList, SIGNAL(gotFilterJobResults(const QString &, int, int, const QString &, stringMap)), trackView->projectView(), SLOT(slotGotFilterJobResults(const QString &, int, int, const QString &, stringMap))); connect(m_effectStack, SIGNAL(updateEffect(ClipItem*, int, QDomElement, QDomElement, int)), trackView->projectView(), SLOT(slotUpdateClipEffect(ClipItem*, int, QDomElement, QDomElement, int))); connect(m_effectStack, SIGNAL(updateClipRegion(ClipItem*, int, QString)), trackView->projectView(), SLOT(slotUpdateClipRegion(ClipItem*, int, QString))); @@ -2695,7 +2713,7 @@ void MainWindow::updateConfiguration() // Update list of transcoding profiles loadTranscoders(); - loadStabilize(); + loadStabilize(); #ifdef USE_JOGSHUTTLE activateShuttleDevice(); #endif @@ -3041,10 +3059,10 @@ void MainWindow::slotEditItemDuration() m_activeTimeline->projectView()->editItemDuration(); } -void MainWindow::slotAddProjectClip(KUrl url) +void MainWindow::slotAddProjectClip(KUrl url, const QString &comment) { if (m_activeDocument) - m_activeDocument->slotAddClipFile(url, QString()); + m_activeDocument->slotAddClipFile(url, QString(), QString(), comment); } void MainWindow::slotAddProjectClipList(KUrl::List urls) @@ -3793,17 +3811,19 @@ void MainWindow::slotMaximizeCurrent(bool) void MainWindow::loadStabilize() { QMenu* stabMenu= static_cast(factory()->container("stabilize", this)); - stabMenu->clear(); - Mlt::Profile profile; - if (Mlt::Factory::filter(profile,(char*)"videostab")){ - QAction *action=stabMenu->addAction("Videostab (vstab)"); - action->setData("videostab"); - connect(action,SIGNAL(triggered()), this, SLOT(slotStabilize())); - } - if (Mlt::Factory::filter(profile,(char*)"videostab2")){ - QAction *action=stabMenu->addAction("Videostab (transcode)"); - action->setData("videostab2"); - connect(action,SIGNAL(triggered()), this, SLOT(slotStabilize())); + if (stabMenu){ + stabMenu->clear(); + Mlt::Profile profile; + if (Mlt::Factory::filter(profile,(char*)"videostab")){ + QAction *action=stabMenu->addAction("Videostab (vstab)"); + action->setData("videostab"); + connect(action,SIGNAL(triggered()), this, SLOT(slotStabilize())); + } + if (Mlt::Factory::filter(profile,(char*)"videostab2")){ + QAction *action=stabMenu->addAction("Videostab (transcode)"); + action->setData("videostab2"); + connect(action,SIGNAL(triggered()), this, SLOT(slotStabilize())); + } } @@ -3813,6 +3833,9 @@ void MainWindow::loadTranscoders() { QMenu *transMenu = static_cast(factory()->container("transcoders", this)); transMenu->clear(); + + QMenu *extractAudioMenu = static_cast(factory()->container("extract_audio", this)); + extractAudioMenu->clear(); KSharedConfigPtr config = KSharedConfig::openConfig("kdenlivetranscodingrc"); KConfigGroup transConfig(config, "Transcoding"); @@ -3821,25 +3844,42 @@ void MainWindow::loadTranscoders() QMapIterator i(profiles); while (i.hasNext()) { i.next(); - QStringList data = i.value().split(";", QString::SkipEmptyParts); - QAction *a = transMenu->addAction(i.key()); + QStringList data = i.value().split(";"); + QAction *a; + // separate audio transcoding in a separate menu + if (data.count() > 2 && data.at(2) == "audio") { + a = extractAudioMenu->addAction(i.key()); + } + else { + a = transMenu->addAction(i.key()); + } a->setData(data); - if (data.count() > 1) - a->setToolTip(data.at(1)); + if (data.count() > 1) a->setToolTip(data.at(1)); connect(a, SIGNAL(triggered()), this, SLOT(slotTranscode())); } } void MainWindow::slotStabilize(KUrl::List urls) { - QString condition; - if (urls.isEmpty()) { + QString condition,filtername; + + if (urls.isEmpty()) { QAction *action = qobject_cast(sender()); - if (action){ - QString filtername=action->data().toString(); - urls = m_projectList->getConditionalUrls(condition); - } + if (action){ + filtername=action->data().toString(); + urls = m_projectList->getConditionalUrls(condition); + } } + if (urls.isEmpty()) { + m_messageLabel->setMessage(i18n("No clip to transcode"), ErrorMessage); + return; + } + Mlt::Profile profile; + Mlt::Filter filter(profile,filtername.toUtf8().data()); + ClipStabilize *d=new ClipStabilize(urls,filtername,&filter); + connect(d, SIGNAL(addClip(KUrl)), this, SLOT(slotAddProjectClip(KUrl))); + d->show(); + } void MainWindow::slotTranscode(KUrl::List urls) @@ -3852,9 +3892,10 @@ void MainWindow::slotTranscode(KUrl::List urls) QStringList data = action->data().toStringList(); params = data.at(0); if (data.count() > 1) desc = data.at(1); - if (data.count() > 2) condition = data.at(2); - urls << m_projectList->getConditionalUrls(condition); - urls.removeAll(KUrl()); + if (data.count() > 3) condition = data.at(3); + QStringList ids = m_projectList->getConditionalIds(condition); + m_projectList->slotTranscodeClipJob(ids, params, desc); + return; } if (urls.isEmpty()) { m_messageLabel->setMessage(i18n("No clip to transcode"), ErrorMessage); @@ -3863,7 +3904,6 @@ void MainWindow::slotTranscode(KUrl::List urls) ClipTranscode *d = new ClipTranscode(urls, params, desc); connect(d, SIGNAL(addClip(KUrl)), this, SLOT(slotAddProjectClip(KUrl))); d->show(); - //QProcess::startDetached("ffmpeg", parameters); } void MainWindow::slotTranscodeClip() @@ -4042,7 +4082,7 @@ void MainWindow::slotPrepareRendering(bool scriptExport, bool zoneOnly, const QS return; } file.close(); - m_renderWidget->slotExport(scriptExport, m_activeTimeline->inPoint(), m_activeTimeline->outPoint(), playlistPath, scriptPath, exportAudio); + m_renderWidget->slotExport(scriptExport, m_activeTimeline->inPoint(), m_activeTimeline->outPoint(), m_activeDocument->metadata(), playlistPath, scriptPath, exportAudio); } void MainWindow::slotUpdateTimecodeFormat(int ix) @@ -4362,7 +4402,6 @@ void MainWindow::slotDoUpdateAudioScopeFrameRequest() void MainWindow::slotUpdateColorScopes() { bool request = false; - kDebug()<<"// UPDATE SCOPES"; for (int i = 0; i < m_gfxScopesList.count(); i++) { // Check if we need the renderer to send a new frame for update if (!m_gfxScopesList.at(i)->widget()->visibleRegion().isEmpty() && !(static_cast(m_gfxScopesList.at(i)->widget())->autoRefreshEnabled())) request = true; @@ -4371,6 +4410,9 @@ void MainWindow::slotUpdateColorScopes() if (request && m_monitorManager->activeRenderer()) { m_monitorManager->activeRenderer()->sendFrameUpdate(); } + if (m_audiosignal->isVisible() && m_recMonitor->abstractRender()) { + connect(m_recMonitor->abstractRender(), SIGNAL(audioSamplesSignal(const QVector&, const int&, const int&, const int&)), m_audiosignal, SLOT(slotReceiveAudio(const QVector&, const int&, const int&, const int&))); + } } void MainWindow::slotClearColorScopes() @@ -4463,6 +4505,17 @@ void MainWindow::slotElapsedTime() kDebug()<<"-----------------------------------------\n"<<"Time elapsed: "<projectFolder().path(); + else currentFolder = KdenliveSettings::defaultprojectfolder(); + ResourceWidget *d = new ResourceWidget(currentFolder); + connect(d, SIGNAL(addClip(KUrl, const QString &)), this, SLOT(slotAddProjectClip(KUrl, const QString &))); + d->show(); +} + #include "mainwindow.moc" #ifdef DEBUG_MAINW