X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmainwindow.cpp;h=e3ece7e5b4ed2c544afe37512bc43551eec8fa06;hb=c8ebcc09c284b5aa5b918e8103db2d812d1e8029;hp=8f2e08292f6d587fc62d1a4f529c38afd3a89c7b;hpb=c2ff32876591d3e015410ac619b4d8e3746571dc;p=kdenlive diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 8f2e0829..e3ece7e5 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -234,9 +234,9 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & // Connect the project list connect(m_projectList, SIGNAL(clipSelected(DocClipBase *, QPoint, bool)), m_clipMonitor, SLOT(slotSetClipProducer(DocClipBase *, QPoint, bool))); - connect(m_projectList, SIGNAL(raiseClipMonitor()), m_clipMonitor, SLOT(slotActivateMonitor())); + connect(m_projectList, SIGNAL(raiseClipMonitor(bool)), m_clipMonitor, SLOT(slotActivateMonitor(bool))); connect(m_projectList, SIGNAL(loadingIsOver()), this, SLOT(slotElapsedTime())); - connect(m_projectList, SIGNAL(displayMessage(const QString&, int)), this, SLOT(slotGotProgressInfo(const QString&, int))); + connect(m_projectList, SIGNAL(displayMessage(const QString&, int, MessageType)), this, SLOT(slotGotProgressInfo(const QString&, int, MessageType))); connect(m_projectList, SIGNAL(updateRenderStatus()), this, SLOT(slotCheckRenderStatus())); connect(m_projectList, SIGNAL(clipNeedsReload(const QString&)),this, SLOT(slotUpdateClip(const QString &))); connect(m_projectList, SIGNAL(updateProfile(const QString &)), this, SLOT(slotUpdateProjectProfile(const QString &))); @@ -280,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 QStringList&)), m_projectList, SLOT(slotStartFilterJob(ItemInfo, const QString&,const QString&,const QString&,const QString&,const QString&,const QString&,const QStringList&))); + connect(m_effectStack, SIGNAL(startFilterJob(ItemInfo, const QString&,const QString&,const QString&,const QString&,const QString&,const QMap &)), m_projectList, SLOT(slotStartFilterJob(ItemInfo, const QString&,const QString&,const QString&,const QString&,const QString&,const QMap &))); m_transitionConfigDock = new QDockWidget(i18n("Transition"), this); m_transitionConfigDock->setObjectName("transition"); @@ -467,12 +467,12 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & QMenu *clipInTimeline = static_cast(factory()->container("clip_in_timeline", this)); 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("clipActionsMenu",static_cast(factory()->container("clip_actions", this))); - menus.insert("inTimelineMenu",clipInTimeline); + 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("clipActionsMenu",static_cast(factory()->container("clip_actions", this))); + menus.insert("inTimelineMenu",clipInTimeline); m_projectList->setupGeneratorMenu(menus); // build themes menus @@ -574,29 +574,6 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & slotConnectMonitors(); - // Open or create a file. Command line argument passed in Url has - // precedence, then "openlastproject", then just a plain empty file. - // If opening Url fails, openlastproject will _not_ be used. - if (!Url.isEmpty()) { - // delay loading so that the window shows up - m_startUrl = Url; - QTimer::singleShot(500, this, SLOT(openFile())); - } else if (KdenliveSettings::openlastproject()) { - QTimer::singleShot(500, this, SLOT(openLastFile())); - } else { //if (m_timelineArea->count() == 0) { - newFile(false); - } - - if (!clipsToLoad.isEmpty() && m_activeDocument) { - QStringList list = clipsToLoad.split(','); - QList urls; - foreach(const QString &path, list) { - kDebug() << QDir::current().absoluteFilePath(path); - urls << QUrl::fromLocalFile(QDir::current().absoluteFilePath(path)); - } - m_projectList->slotAddClip(urls); - } - #ifdef USE_JOGSHUTTLE activateShuttleDevice(); #endif @@ -669,6 +646,30 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & } connect (KGlobalSettings::self(), SIGNAL(kdisplayPaletteChanged()), this, SLOT(slotChangePalette())); + + // Open or create a file. Command line argument passed in Url has + // precedence, then "openlastproject", then just a plain empty file. + // If opening Url fails, openlastproject will _not_ be used. + if (!Url.isEmpty()) { + // delay loading so that the window shows up + m_startUrl = Url; + QTimer::singleShot(500, this, SLOT(openFile())); + } else if (KdenliveSettings::openlastproject()) { + QTimer::singleShot(500, this, SLOT(openLastFile())); + } else { //if (m_timelineArea->count() == 0) { + newFile(false); + } + + if (!clipsToLoad.isEmpty() && m_activeDocument) { + QStringList list = clipsToLoad.split(','); + QList urls; + foreach(const QString &path, list) { + kDebug() << QDir::current().absoluteFilePath(path); + urls << QUrl::fromLocalFile(QDir::current().absoluteFilePath(path)); + } + m_projectList->slotAddClip(urls); + } + } MainWindow::~MainWindow() @@ -676,6 +677,12 @@ MainWindow::~MainWindow() if (m_stopmotion) { delete m_stopmotion; } + +#ifdef USE_JOGSHUTTLE + if (m_jogProcess) + delete m_jogProcess; +#endif + m_effectStack->slotClipItemSelected(NULL); m_transitionConfig->slotTransitionItemSelected(NULL, 0, QPoint(), false); @@ -919,7 +926,6 @@ void MainWindow::slotConnectMonitors() connect(m_projectMonitor->render, SIGNAL(replyGetImage(const QString &, const QString &, int, int)), m_projectList, SLOT(slotReplyGetImage(const QString &, const QString &, int, int))); connect(m_projectMonitor->render, SIGNAL(replyGetImage(const QString &, const QImage &)), m_projectList, SLOT(slotReplyGetImage(const QString &, const QImage &))); - kDebug()<<" - - - - - -\n CONNECTED REPLY"; connect(m_projectMonitor->render, SIGNAL(replyGetFileProperties(const QString &, Mlt::Producer*, const stringMap &, const stringMap &, bool)), m_projectList, SLOT(slotReplyGetFileProperties(const QString &, Mlt::Producer*, const stringMap &, const stringMap &, bool))); connect(m_projectMonitor->render, SIGNAL(removeInvalidClip(const QString &, bool)), m_projectList, SLOT(slotRemoveInvalidClip(const QString &, bool))); @@ -1248,14 +1254,12 @@ void MainWindow::setupActions() connect(projectAdjust, SIGNAL(triggered(bool)), m_projectList, SLOT(adjustProjectProfileToItem())); KAction* monitorPlay = new KAction(KIcon("media-playback-start"), i18n("Play"), this); - KShortcut playShortcut; - playShortcut.setPrimary(Qt::Key_Space); - playShortcut.setAlternate(Qt::Key_K); - monitorPlay->setShortcut(playShortcut); + monitorPlay->setShortcut(Qt::Key_Space); collection.addAction("monitor_play", monitorPlay); connect(monitorPlay, SIGNAL(triggered(bool)), m_monitorManager, SLOT(slotPlay())); KAction* monitorPause = new KAction(KIcon("media-playback-stop"), i18n("Pause"), this); + monitorPause->setShortcut(Qt::Key_K); collection.addAction("monitor_pause", monitorPause); connect(monitorPause, SIGNAL(triggered(bool)), m_monitorManager, SLOT(slotPause())); @@ -1402,6 +1406,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"); @@ -1505,14 +1514,20 @@ void MainWindow::setupActions() KAction* splitAudio = new KAction(KIcon("document-new"), i18n("Split Audio"), this); collection.addAction("split_audio", splitAudio); + // "A+V" as data means this action should only be available for clips with audio AND video + splitAudio->setData("A+V"); connect(splitAudio, SIGNAL(triggered(bool)), this, SLOT(slotSplitAudio())); KAction* setAudioAlignReference = new KAction(i18n("Set Audio Reference"), this); collection.addAction("set_audio_align_ref", setAudioAlignReference); + // "A" as data means this action should only be available for clips with audio + setAudioAlignReference->setData("A"); connect(setAudioAlignReference, SIGNAL(triggered()), this, SLOT(slotSetAudioAlignReference())); KAction* alignAudio = new KAction(i18n("Align Audio to Reference"), this); collection.addAction("align_audio", alignAudio); + // "A" as data means this action should only be available for clips with audio + alignAudio->setData("A"); connect(alignAudio, SIGNAL(triggered()), this, SLOT(slotAlignAudio())); KAction* audioOnly = new KAction(KIcon("document-new"), i18n("Audio Only"), this); @@ -1962,6 +1977,7 @@ bool MainWindow::closeCurrentDocument(bool saveChanges) break; } } + slotTimelineClipSelected(NULL, false); m_clipMonitor->slotSetClipProducer(NULL); m_projectList->slotResetProjectList(); m_timelineArea->removeTab(m_timelineArea->indexOf(w)); @@ -2052,11 +2068,14 @@ void MainWindow::openFile() 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? - if (urls.isEmpty()) newFile(false); - else openFile(urls.last()); + if (m_fileOpenRecent->selectableActionGroup()->actions().isEmpty()) { + // No files in history + newFile(false); + return; + } + QAction *firstUrlAction = m_fileOpenRecent->selectableActionGroup()->actions().last(); + if (firstUrlAction) firstUrlAction->trigger(); + else newFile(false); } void MainWindow::openFile(const KUrl &url) @@ -2178,7 +2197,6 @@ void MainWindow::doOpenFile(const KUrl &url, KAutoSaveFile *stale) } m_timelineArea->setTabToolTip(m_timelineArea->currentIndex(), doc->url().path()); trackView->setDuration(trackView->duration()); - trackView->projectView()->initCursorPos(m_projectMonitor->render->seekPosition().frames(doc->fps())); if (m_timelineArea->count() > 1) m_timelineArea->setTabBarHidden(false); slotGotProgressInfo(QString(), -1); @@ -2415,7 +2433,7 @@ void MainWindow::slotRenderProject() connect(m_renderWidget, SIGNAL(selectedRenderProfile(QMap )), this, SLOT(slotSetDocumentRenderProfile(QMap ))); connect(m_renderWidget, SIGNAL(prepareRenderingData(bool, bool, const QString&)), this, SLOT(slotPrepareRendering(bool, bool, const QString&))); 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 &))); + connect(m_renderWidget, SIGNAL(openDvdWizard(const QString &)), this, SLOT(slotDvdWizard(const QString &))); if (m_activeDocument) { m_renderWidget->setProfile(m_activeDocument->mltProfile()); m_renderWidget->setGuides(m_activeDocument->guidesXml(), m_activeDocument->projectDuration()); @@ -2523,7 +2541,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,QStringList)), m_activeTimeline->projectView(), SLOT(slotGotFilterJobResults(const QString &, int, int, const QString &, stringMap,QStringList))); + disconnect(m_projectList, SIGNAL(gotFilterJobResults(const QString &, int, int, stringMap,stringMap)), m_activeTimeline->projectView(), SLOT(slotGotFilterJobResults(const QString &, int, int, stringMap, stringMap))); disconnect(m_activeTimeline, SIGNAL(cursorMoved()), m_projectMonitor, SLOT(slotActivateMonitor())); disconnect(m_activeTimeline, SIGNAL(configTrack(int)), this, SLOT(slotConfigTrack(int))); @@ -2538,6 +2556,8 @@ 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())); @@ -2564,6 +2584,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&, int)), this, SLOT(slotProcessImportKeyframes(GRAPHICSRECTITEM, const QString&, int))); + 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())); @@ -2600,7 +2623,7 @@ 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,QStringList)), trackView->projectView(), SLOT(slotGotFilterJobResults(const QString &, int, int, const QString &, stringMap,QStringList))); + connect(m_projectList, SIGNAL(gotFilterJobResults(const QString &, int, int, stringMap,stringMap)), trackView->projectView(), SLOT(slotGotFilterJobResults(const QString &, int, int, stringMap,stringMap))); connect(m_projectList, SIGNAL(addMarkers(const QString &, QList )), trackView->projectView(), SLOT(slotAddClipMarker(const QString &, QList ))); @@ -2611,13 +2634,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())); @@ -2978,7 +3004,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); @@ -2989,7 +3015,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); @@ -3000,7 +3026,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) @@ -3009,7 +3035,7 @@ void MainWindow::slotConfigTrack(int ix) void MainWindow::slotSelectTrack() { - m_projectMonitor->slotActivateMonitor(); + m_monitorManager->activateMonitor(Kdenlive::projectMonitor); if (m_activeTimeline) { m_activeTimeline->projectView()->slotSelectClipsInTrack(); } @@ -3017,7 +3043,7 @@ void MainWindow::slotSelectTrack() void MainWindow::slotSelectAllTracks() { - m_projectMonitor->slotActivateMonitor(); + m_monitorManager->activateMonitor(Kdenlive::projectMonitor); if (m_activeTimeline) m_activeTimeline->projectView()->slotSelectAllClips(); } @@ -3203,19 +3229,13 @@ void MainWindow::slotUpdateZoomSliderToolTip(int zoomlevel) m_zoomSlider->setToolTip(i18n("Zoom Level: %1/13", (13 - zoomlevel))); } -void MainWindow::slotGotProgressInfo(const QString &message, int progress) +void MainWindow::slotGotProgressInfo(const QString &message, int progress, MessageType type) { - m_statusProgressBar->setValue(progress); + if (type == DefaultMessage) m_statusProgressBar->setValue(progress); + m_messageLabel->setMessage(message, type); if (progress >= 0) { - if (!message.isEmpty()) - m_messageLabel->setMessage(message, InformationMessage);//statusLabel->setText(message); - m_statusProgressBar->setVisible(true); - } else if (progress == -2) { - if (!message.isEmpty()) - m_messageLabel->setMessage(message, ErrorMessage); - m_statusProgressBar->setVisible(false); + if (type == DefaultMessage) m_statusProgressBar->setVisible(true); } else { - m_messageLabel->setMessage(QString(), DefaultMessage); m_statusProgressBar->setVisible(false); } } @@ -3287,12 +3307,12 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip) if (dia_ui->exec() == QDialog::Accepted) { QMap newprops; newprops.insert("xmldata", dia_ui->xml().toString()); - if (dia_ui->outPoint() != clip->duration().frames(m_activeDocument->fps())) { + if (dia_ui->duration() != clip->duration().frames(m_activeDocument->fps())) { // duration changed, we need to update duration - newprops.insert("out", QString::number(dia_ui->outPoint())); + newprops.insert("out", QString::number(dia_ui->duration() - 1)); int currentLength = QString(clip->producerProperty("length")).toInt(); - if (currentLength <= dia_ui->outPoint()) - newprops.insert("length", QString::number(dia_ui->outPoint() + 1)); + if (currentLength <= dia_ui->duration()) + newprops.insert("length", QString::number(dia_ui->duration())); else newprops.insert("length", clip->producerProperty("length")); } if (!path.isEmpty()) { @@ -3315,8 +3335,15 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip) // any type of clip but a title ClipProperties *dia = new ClipProperties(clip, m_activeDocument->timecode(), m_activeDocument->fps(), this); + + if (clip->clipType() == AV || clip->clipType() == VIDEO || clip->clipType() == PLAYLIST || clip->clipType() == SLIDESHOW) { + // request clip thumbnails + m_activeDocument->clipManager()->requestThumbs(QString('?' + clip->getId()), QList() << clip->getClipThumbFrame()); + connect(m_activeDocument->clipManager(), SIGNAL(gotClipPropertyThumbnail(const QString&,QImage)), dia, SLOT(slotGotThumbnail(const QString&,QImage))); + } + 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(dia, SIGNAL(editAnalysis(QString,QString,QString)), m_activeTimeline->projectView(), SLOT(slotAddClipExtraData(QString,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 *))); @@ -3861,12 +3888,12 @@ void MainWindow::slotUpdateClipType(QAction *action) } } -void MainWindow::slotDvdWizard(const QString &url, const QString &profile) +void MainWindow::slotDvdWizard(const QString &url) { // We must stop the monitors since we create a new on in the dvd wizard m_clipMonitor->stop(); m_projectMonitor->stop(); - QPointer w = new DvdWizard(url, profile, this); + QPointer w = new DvdWizard(url, this); w->exec(); m_projectMonitor->start(); delete w; @@ -3902,24 +3929,39 @@ void MainWindow::loadClipActions() Mlt::Profile profile; 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(slotStartClipAction())); + if (!filter->is_valid()) { + delete filter; + } + else { + delete filter; + QAction *action=actionMenu->addAction(i18n("Stabilize (vstab)")); + action->setData("videostab"); + connect(action,SIGNAL(triggered()), this, SLOT(slotStartClipAction())); + } } 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(slotStartClipAction())); + if (!filter->is_valid()) { + delete filter; + } + else { + delete filter; + QAction *action=actionMenu->addAction(i18n("Stabilize (transcode)")); + action->setData("videostab2"); + 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())); + if (!filter->is_valid()) { + delete filter; + } + else { + delete filter; + QAction *action=actionMenu->addAction(i18n("Automatic scene split")); + action->setData("motion_est"); + connect(action,SIGNAL(triggered()), this, SLOT(slotStartClipAction())); + } } } @@ -3933,7 +3975,7 @@ void MainWindow::loadTranscoders() QMenu *extractAudioMenu = static_cast(factory()->container("extract_audio", this)); extractAudioMenu->clear(); - KSharedConfigPtr config = KSharedConfig::openConfig("kdenlivetranscodingrc"); + KSharedConfigPtr config = KSharedConfig::openConfig("kdenlivetranscodingrc", KConfig::CascadeConfig); KConfigGroup transConfig(config, "Transcoding"); // read the entries QMap< QString, QString > profiles = transConfig.entryMap(); @@ -4002,7 +4044,7 @@ void MainWindow::slotTranscode(KUrl::List urls) m_messageLabel->setMessage(i18n("No clip to transcode"), ErrorMessage); return; } - ClipTranscode *d = new ClipTranscode(urls, params, desc); + ClipTranscode *d = new ClipTranscode(urls, params, QStringList(), desc); connect(d, SIGNAL(addClip(KUrl)), this, SLOT(slotAddProjectClip(KUrl))); d->show(); } @@ -4557,6 +4599,26 @@ void MainWindow::slotSaveTimelineClip() } } +void MainWindow::slotProcessImportKeyframes(GRAPHICSRECTITEM type, const QString& data, int maximum) +{ + if (type == AVWIDGET) { + // This data should be sent to the effect stack + m_effectStack->setKeyframes(data, maximum); + } + else if (type == TRANSITIONWIDGET) { + // This data should be sent to the transition stack + m_transitionConfig->setKeyframes(data, maximum); + } + else { + // Error + } +} + +void MainWindow::slotAlignPlayheadToMousePos() +{ + m_monitorManager->activateMonitor(Kdenlive::projectMonitor); + m_activeTimeline->projectView()->slotAlignPlayheadToMousePos(); +} #include "mainwindow.moc"