X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmainwindow.cpp;h=c6ab8d379657c031f8df1a1832352bdf1afdcfdb;hb=6828103776153039ddde62f54b5879a12c426da5;hp=ad1cf6e886cf29a2fb428feefa8460e63e9820a7;hpb=f555964fc8fd3452f2aa6d8217d20e2aa4013334;p=kdenlive diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index ad1cf6e8..c6ab8d37 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -158,7 +158,8 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & m_jogShuttle(NULL), #endif m_findActivated(false), - m_stopmotion(NULL) + m_stopmotion(NULL), + m_mainClip(NULL) { qRegisterMetaType > (); qRegisterMetaType ("stringMap"); @@ -279,7 +280,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & m_effectStack = new EffectStackView2(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&))); + connect(m_effectStack, SIGNAL(startFilterJob(ItemInfo, const QString&,const QString&,const QString&,const QString&,const QString&,const QString&,const QStringList&)), m_projectList, SLOT(slotStartFilterJob(ItemInfo, const QString&,const QString&,const QString&,const QString&,const QString&,const QString&,const QStringList&))); m_transitionConfigDock = new QDockWidget(i18n("Transition"), this); m_transitionConfigDock->setObjectName("transition"); @@ -459,7 +460,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & loadPlugins(); loadTranscoders(); - loadStabilize(); + loadClipActions(); m_projectMonitor->setupMenu(static_cast(factory()->container("monitor_go", this)), m_playZone, m_loopZone, NULL, m_loopClip); m_clipMonitor->setupMenu(static_cast(factory()->container("monitor_go", this)), m_playZone, m_loopZone, static_cast(factory()->container("marker_menu", this))); @@ -470,7 +471,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & 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("clipActionsMenu",static_cast(factory()->container("clip_actions", this))); menus.insert("inTimelineMenu",clipInTimeline); m_projectList->setupGeneratorMenu(menus); @@ -812,7 +813,7 @@ void MainWindow::generateClip() QAction *action = qobject_cast(sender()); ClipGenerator *iGenerator = qobject_cast(action->parent()); - KUrl clipUrl = iGenerator->generatedClip(action->data().toString(), m_activeDocument->projectFolder(), + KUrl clipUrl = iGenerator->generatedClip(KdenliveSettings::rendererpath(), action->data().toString(), m_activeDocument->projectFolder(), QStringList(), QStringList(), m_activeDocument->fps(), m_activeDocument->width(), m_activeDocument->height()); if (!clipUrl.isEmpty()) { m_projectList->slotAddClip(QList () << clipUrl); @@ -911,6 +912,7 @@ void MainWindow::slotUpdateClip(const QString &id) void MainWindow::slotConnectMonitors() { m_projectList->setRenderer(m_projectMonitor->render); + connect(m_projectList, SIGNAL(pauseMonitor()), m_monitorManager, SLOT(slotPause())); connect(m_projectList, SIGNAL(deleteProjectClips(QStringList, QMap)), this, SLOT(slotDeleteProjectClips(QStringList, QMap))); connect(m_projectList, SIGNAL(showClipProperties(DocClipBase *)), this, SLOT(slotShowClipProperties(DocClipBase *))); connect(m_projectList, SIGNAL(showClipProperties(QList , QMap)), this, SLOT(slotShowClipProperties(QList , QMap))); @@ -1400,6 +1402,11 @@ void MainWindow::setupActions() collection.addAction("delete_timeline_clip", deleteItem); connect(deleteItem, SIGNAL(triggered(bool)), this, SLOT(slotDeleteItem())); + KAction* alignPlayhead = new KAction(i18n("Align Playhead to Mouse Position"), this); + alignPlayhead->setShortcut(Qt::Key_P); + collection.addAction("align_playhead", alignPlayhead); + connect(alignPlayhead, SIGNAL(triggered(bool)), this, SLOT(slotAlignPlayheadToMousePos())); + /*KAction* editTimelineClipSpeed = new KAction(i18n("Change Clip Speed"), this); collection.addAction("change_clip_speed", editTimelineClipSpeed); editTimelineClipSpeed->setData("change_speed"); @@ -1829,7 +1836,7 @@ void MainWindow::readOptions() } } - + if (KdenliveSettings::ffmpegpath().isEmpty() || KdenliveSettings::ffplaypath().isEmpty()) upgrade = true; if (!initialGroup.exists() || upgrade) { // this is our first run, show Wizard QPointer w = new Wizard(upgrade, this); @@ -2521,7 +2528,7 @@ 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_projectList, SIGNAL(gotFilterJobResults(const QString &, int, int, const QString &, stringMap,QStringList)), m_activeTimeline->projectView(), SLOT(slotGotFilterJobResults(const QString &, int, int, const QString &, stringMap,QStringList))); disconnect(m_activeTimeline, SIGNAL(cursorMoved()), m_projectMonitor, SLOT(slotActivateMonitor())); disconnect(m_activeTimeline, SIGNAL(configTrack(int)), this, SLOT(slotConfigTrack(int))); @@ -2536,10 +2543,13 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha disconnect(m_effectStack, SIGNAL(displayMessage(const QString&, int)), this, SLOT(slotGotProgressInfo(const QString&, int))); disconnect(m_transitionConfig, SIGNAL(transitionUpdated(Transition *, QDomElement)), m_activeTimeline->projectView() , SLOT(slotTransitionUpdated(Transition *, QDomElement))); disconnect(m_transitionConfig, SIGNAL(seekTimeline(int)), m_activeTimeline->projectView() , SLOT(setCursorPos(int))); + disconnect(m_transitionConfig, SIGNAL(importClipKeyframes(GRAPHICSRECTITEM)), m_activeTimeline->projectView() , SLOT(slotImportClipKeyframes(GRAPHICSRECTITEM))); + disconnect(m_activeTimeline->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(slotActivateMonitor())); disconnect(m_activeTimeline, SIGNAL(zoneMoved(int, int)), this, SLOT(slotZoneMoved(int, int))); disconnect(m_projectList, SIGNAL(loadingIsOver()), m_activeTimeline->projectView(), SLOT(slotUpdateAllThumbs())); disconnect(m_projectList, SIGNAL(refreshClip(const QString &)), m_activeTimeline->projectView(), SLOT(slotRefreshThumbs(const QString &))); + disconnect(m_projectList, SIGNAL(addMarkers(const QString &, QList )), m_activeTimeline->projectView(), SLOT(slotAddClipMarker(const QString &, QList ))); m_effectStack->clear(); } //m_activeDocument->setRenderer(NULL); @@ -2561,6 +2571,9 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha connect(trackView, SIGNAL(updateTracksInfo()), this, SLOT(slotUpdateTrackInfo())); connect(trackView, SIGNAL(mousePosition(int)), this, SLOT(slotUpdateMousePosition(int))); connect(trackView->projectView(), SIGNAL(forceClipProcessing(const QString &)), m_projectList, SLOT(slotForceProcessing(const QString &))); + + connect(trackView->projectView(), SIGNAL(importKeyframes(GRAPHICSRECTITEM, const QString&)), this, SLOT(slotProcessImportKeyframes(GRAPHICSRECTITEM, const QString&))); + connect(m_projectMonitor, SIGNAL(renderPosition(int)), trackView, SLOT(moveCursorPos(int))); connect(m_projectMonitor, SIGNAL(zoneUpdated(QPoint)), trackView, SLOT(slotSetZone(QPoint))); connect(m_projectMonitor, SIGNAL(zoneUpdated(QPoint)), doc, SLOT(setModified())); @@ -2597,7 +2610,9 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha 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_projectList, SIGNAL(gotFilterJobResults(const QString &, int, int, const QString &, stringMap,QStringList)), trackView->projectView(), SLOT(slotGotFilterJobResults(const QString &, int, int, const QString &, stringMap,QStringList))); + + connect(m_projectList, SIGNAL(addMarkers(const QString &, QList )), trackView->projectView(), SLOT(slotAddClipMarker(const QString &, QList ))); // Effect stack signals connect(m_effectStack, SIGNAL(updateEffect(ClipItem*, int, QDomElement, QDomElement, int,bool)), trackView->projectView(), SLOT(slotUpdateClipEffect(ClipItem*, int, QDomElement, QDomElement, int,bool))); @@ -2606,13 +2621,16 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha connect(m_effectStack, SIGNAL(addEffect(ClipItem*, QDomElement)), trackView->projectView(), SLOT(slotAddEffect(ClipItem*, QDomElement))); connect(m_effectStack, SIGNAL(changeEffectState(ClipItem*, int, QList , bool)), trackView->projectView(), SLOT(slotChangeEffectState(ClipItem*, int, QList , bool))); connect(m_effectStack, SIGNAL(changeEffectPosition(ClipItem*, int, QList , int)), trackView->projectView(), SLOT(slotChangeEffectPosition(ClipItem*, int, QList , int))); + connect(m_effectStack, SIGNAL(refreshEffectStack(ClipItem*)), trackView->projectView(), SLOT(slotRefreshEffects(ClipItem*))); - connect(m_effectStack, SIGNAL(seekTimeline(int)), trackView->projectView() , SLOT(seekCursorPos(int))); + connect(m_effectStack, SIGNAL(seekTimeline(int)), trackView->projectView(), SLOT(seekCursorPos(int))); + connect(m_effectStack, SIGNAL(importClipKeyframes(GRAPHICSRECTITEM)), trackView->projectView(), SLOT(slotImportClipKeyframes(GRAPHICSRECTITEM))); connect(m_effectStack, SIGNAL(reloadEffects()), this, SLOT(slotReloadEffects())); connect(m_effectStack, SIGNAL(displayMessage(const QString&, int)), this, SLOT(slotGotProgressInfo(const QString&, int))); // Transition config signals connect(m_transitionConfig, SIGNAL(transitionUpdated(Transition *, QDomElement)), trackView->projectView() , SLOT(slotTransitionUpdated(Transition *, QDomElement))); + connect(m_transitionConfig, SIGNAL(importClipKeyframes(GRAPHICSRECTITEM)), trackView->projectView() , SLOT(slotImportClipKeyframes(GRAPHICSRECTITEM))); connect(m_transitionConfig, SIGNAL(seekTimeline(int)), trackView->projectView() , SLOT(seekCursorPos(int))); connect(trackView->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(slotActivateMonitor())); @@ -2733,7 +2751,7 @@ void MainWindow::updateConfiguration() // Update list of transcoding profiles loadTranscoders(); - loadStabilize(); + loadClipActions(); #ifdef USE_JOGSHUTTLE activateShuttleDevice(); #endif @@ -2833,11 +2851,11 @@ void MainWindow::slotAddClipMarker() return; } QString id = clip->getId(); - CommentedTime marker(pos, i18n("Marker")); + CommentedTime marker(pos, i18n("Marker"), KdenliveSettings::default_marker_type()); QPointer d = new MarkerDialog(clip, marker, m_activeDocument->timecode(), i18n("Add Marker"), this); if (d->exec() == QDialog::Accepted) - m_activeTimeline->projectView()->slotAddClipMarker(id, d->newMarker().time(), d->newMarker().comment()); + m_activeTimeline->projectView()->slotAddClipMarker(id, QList () << d->newMarker()); delete d; } @@ -2913,20 +2931,20 @@ void MainWindow::slotEditClipMarker() } QString id = clip->getId(); - QString oldcomment = clip->markerComment(pos); - if (oldcomment.isEmpty()) { + CommentedTime oldMarker = clip->markerAt(pos); + if (oldMarker == CommentedTime()) { m_messageLabel->setMessage(i18n("No marker found at cursor time"), ErrorMessage); return; } - CommentedTime marker(pos, oldcomment); - QPointer d = new MarkerDialog(clip, marker, + QPointer d = new MarkerDialog(clip, oldMarker, m_activeDocument->timecode(), i18n("Edit Marker"), this); if (d->exec() == QDialog::Accepted) { - m_activeTimeline->projectView()->slotAddClipMarker(id, d->newMarker().time(), d->newMarker().comment()); + m_activeTimeline->projectView()->slotAddClipMarker(id, QList () <newMarker()); if (d->newMarker().time() != pos) { // remove old marker - m_activeTimeline->projectView()->slotAddClipMarker(id, pos, QString()); + oldMarker.setMarkerType(-1); + m_activeTimeline->projectView()->slotAddClipMarker(id, QList () <setMessage(i18n("Cannot find clip to add marker"), ErrorMessage); return; } - - m_activeTimeline->projectView()->slotAddClipMarker(clip->getId(), pos, m_activeDocument->timecode().getDisplayTimecode(pos, false)); + //TODO: allow user to set default marker category + CommentedTime marker(pos, m_activeDocument->timecode().getDisplayTimecode(pos, false), KdenliveSettings::default_marker_type()); + m_activeTimeline->projectView()->slotAddClipMarker(clip->getId(), QList () <projectView()->slotAddGuide(false); } @@ -2972,7 +2991,7 @@ void MainWindow::slotRemoveSpace() void MainWindow::slotInsertTrack(int ix) { - m_projectMonitor->slotActivateMonitor(); + m_monitorManager->activateMonitor(Kdenlive::projectMonitor); if (m_activeTimeline) { if (ix == -1) ix = m_activeTimeline->projectView()->selectedTrack(); m_activeTimeline->projectView()->slotInsertTrack(ix); @@ -2983,7 +3002,7 @@ void MainWindow::slotInsertTrack(int ix) void MainWindow::slotDeleteTrack(int ix) { - m_projectMonitor->slotActivateMonitor(); + m_monitorManager->activateMonitor(Kdenlive::projectMonitor); if (m_activeTimeline) { if (ix == -1) ix = m_activeTimeline->projectView()->selectedTrack(); m_activeTimeline->projectView()->slotDeleteTrack(ix); @@ -2994,7 +3013,7 @@ void MainWindow::slotDeleteTrack(int ix) void MainWindow::slotConfigTrack(int ix) { - m_projectMonitor->slotActivateMonitor(); + m_monitorManager->activateMonitor(Kdenlive::projectMonitor); if (m_activeTimeline) m_activeTimeline->projectView()->slotConfigTracks(ix); if (m_activeDocument) @@ -3003,7 +3022,7 @@ void MainWindow::slotConfigTrack(int ix) void MainWindow::slotSelectTrack() { - m_projectMonitor->slotActivateMonitor(); + m_monitorManager->activateMonitor(Kdenlive::projectMonitor); if (m_activeTimeline) { m_activeTimeline->projectView()->slotSelectClipsInTrack(); } @@ -3011,7 +3030,7 @@ void MainWindow::slotSelectTrack() void MainWindow::slotSelectAllTracks() { - m_projectMonitor->slotActivateMonitor(); + m_monitorManager->activateMonitor(Kdenlive::projectMonitor); if (m_activeTimeline) m_activeTimeline->projectView()->slotSelectAllClips(); } @@ -3102,16 +3121,17 @@ void MainWindow::slotEditItemDuration() m_activeTimeline->projectView()->editItemDuration(); } -void MainWindow::slotAddProjectClip(KUrl url, const QString &comment) +void MainWindow::slotAddProjectClip(KUrl url, stringMap data) { - if (m_activeDocument) - m_activeDocument->slotAddClipFile(url, QString(), QString(), comment); + if (m_activeDocument) { + m_activeDocument->slotAddClipFile(url, data); + } } void MainWindow::slotAddProjectClipList(KUrl::List urls) { if (m_activeDocument) - m_activeDocument->slotAddClipList(urls, QString()); + m_activeDocument->slotAddClipList(urls); } void MainWindow::slotAddTransition(QAction *result) @@ -3308,7 +3328,13 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip) // any type of clip but a title ClipProperties *dia = new ClipProperties(clip, m_activeDocument->timecode(), m_activeDocument->fps(), this); - connect(dia, SIGNAL(addMarker(const QString &, GenTime, QString)), m_activeTimeline->projectView(), SLOT(slotAddClipMarker(const QString &, GenTime, QString))); + connect(dia, SIGNAL(addMarkers(const QString &, QList )), m_activeTimeline->projectView(), SLOT(slotAddClipMarker(const QString &, QList ))); + connect(dia, SIGNAL(deleteAnalysis(QString,QString)), m_activeTimeline->projectView(), SLOT(slotAddClipExtraData(QString,QString))); + connect(m_activeTimeline->projectView(), SIGNAL(updateClipMarkers(DocClipBase *)), dia, SLOT(slotFillMarkersList(DocClipBase *))); + connect(m_activeTimeline->projectView(), SIGNAL(updateClipExtraData(DocClipBase *)), dia, SLOT(slotUpdateAnalysisData(DocClipBase *))); + connect(m_projectList, SIGNAL(updateAnalysisData(DocClipBase *)), dia, SLOT(slotUpdateAnalysisData(DocClipBase *))); + connect(dia, SIGNAL(loadMarkers(const QString &)), m_activeTimeline->projectView(), SLOT(slotLoadClipMarkers(const QString &))); + connect(dia, SIGNAL(saveMarkers(const QString &)), m_activeTimeline->projectView(), SLOT(slotSaveClipMarkers(const QString &))); connect(dia, SIGNAL(deleteProxy(const QString)), m_projectList, SLOT(slotDeleteProxy(const QString))); connect(dia, SIGNAL(applyNewClipProperties(const QString, QMap , QMap , bool, bool)), this, SLOT(slotApplyNewClipProperties(const QString, QMap , QMap , bool, bool))); dia->show(); @@ -3363,6 +3389,11 @@ void MainWindow::customEvent(QEvent* e) void MainWindow::slotTimelineClipSelected(ClipItem* item, bool raise) { + if (item != m_mainClip) { + if (m_mainClip) m_mainClip->setMainSelectedClip(false); + if (item) item->setMainSelectedClip(true); + m_mainClip = item; + } m_effectStack->slotClipItemSelected(item); m_projectMonitor->slotSetSelectedClip(item); if (raise) @@ -3876,25 +3907,35 @@ void MainWindow::slotMaximizeCurrent(bool) kDebug() << "CURRENT WIDGET: " << par->objectName(); } -void MainWindow::loadStabilize() +void MainWindow::loadClipActions() { - QMenu* stabMenu= static_cast(factory()->container("stabilize", this)); - if (stabMenu){ - stabMenu->clear(); + QMenu* actionMenu= static_cast(factory()->container("clip_actions", this)); + if (actionMenu){ + actionMenu->clear(); Mlt::Profile profile; - if (Mlt::Factory::filter(profile,(char*)"videostab")){ - QAction *action=stabMenu->addAction("Videostab (vstab)"); + Mlt::Filter *filter = Mlt::Factory::filter(profile,(char*)"videostab"); + if (filter) { + delete filter; + QAction *action=actionMenu->addAction(i18n("Stabilize (vstab)")); action->setData("videostab"); - connect(action,SIGNAL(triggered()), this, SLOT(slotStabilize())); + connect(action,SIGNAL(triggered()), this, SLOT(slotStartClipAction())); } - if (Mlt::Factory::filter(profile,(char*)"videostab2")){ - QAction *action=stabMenu->addAction("Videostab (transcode)"); + filter = Mlt::Factory::filter(profile,(char*)"videostab2"); + if (filter) { + delete filter; + QAction *action=actionMenu->addAction(i18n("Stabilize (transcode)")); action->setData("videostab2"); - connect(action,SIGNAL(triggered()), this, SLOT(slotStabilize())); + connect(action,SIGNAL(triggered()), this, SLOT(slotStartClipAction())); + } + filter = Mlt::Factory::filter(profile,(char*)"motion_est"); + if (filter) { + delete filter; + QAction *action=actionMenu->addAction(i18n("Automatic scene split")); + action->setData("motion_est"); + connect(action,SIGNAL(triggered()), this, SLOT(slotStartClipAction())); } } - } void MainWindow::loadTranscoders() @@ -3927,7 +3968,7 @@ void MainWindow::loadTranscoders() } } -void MainWindow::slotStabilize() +void MainWindow::slotStartClipAction() { QString condition,filtername; QStringList ids; @@ -4496,7 +4537,7 @@ void MainWindow::slotDownloadResources() if (m_activeDocument) currentFolder = m_activeDocument->projectFolder().path(); else currentFolder = KdenliveSettings::defaultprojectfolder(); ResourceWidget *d = new ResourceWidget(currentFolder); - connect(d, SIGNAL(addClip(KUrl, const QString &)), this, SLOT(slotAddProjectClip(KUrl, const QString &))); + connect(d, SIGNAL(addClip(KUrl,stringMap)), this, SLOT(slotAddProjectClip(KUrl,stringMap))); d->show(); } @@ -4529,6 +4570,25 @@ void MainWindow::slotSaveTimelineClip() } } +void MainWindow::slotProcessImportKeyframes(GRAPHICSRECTITEM type, const QString& data) +{ + if (type == AVWIDGET) { + // This data should be sent to the effect stack + } + else if (type == TRANSITIONWIDGET) { + // This data should be sent to the transition stack + m_transitionConfig->setKeyframes(data); + } + else { + // Error + } +} + +void MainWindow::slotAlignPlayheadToMousePos() +{ + m_monitorManager->activateMonitor(Kdenlive::projectMonitor); + m_activeTimeline->projectView()->slotAlignPlayheadToMousePos(); +} #include "mainwindow.moc"