X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmainwindow.cpp;h=7c1aee5b35bcd8f5cdbf3f4450c3d4abb8cbe9a9;hb=f410faaa27415f0fbe1b41eeacdcac51144a5341;hp=2936b538703ba00cc22e593364ddfd8481e86d51;hpb=76c9abb930245e56533fb0282b919deb33a6d126;p=kdenlive diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 2936b538..7c1aee5b 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -676,6 +676,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 +925,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 +1253,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 +1405,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 +1513,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); @@ -2053,11 +2067,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) @@ -2179,7 +2196,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); @@ -2569,7 +2585,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha 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())); @@ -2987,7 +3003,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); @@ -2998,7 +3014,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); @@ -3009,7 +3025,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) @@ -3018,7 +3034,7 @@ void MainWindow::slotConfigTrack(int ix) void MainWindow::slotSelectTrack() { - m_projectMonitor->slotActivateMonitor(); + m_monitorManager->activateMonitor(Kdenlive::projectMonitor); if (m_activeTimeline) { m_activeTimeline->projectView()->slotSelectClipsInTrack(); } @@ -3026,7 +3042,7 @@ void MainWindow::slotSelectTrack() void MainWindow::slotSelectAllTracks() { - m_projectMonitor->slotActivateMonitor(); + m_monitorManager->activateMonitor(Kdenlive::projectMonitor); if (m_activeTimeline) m_activeTimeline->projectView()->slotSelectAllClips(); } @@ -3319,7 +3335,7 @@ 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) { + 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))); @@ -3912,24 +3928,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())); + } } } @@ -4571,6 +4602,7 @@ void MainWindow::slotProcessImportKeyframes(GRAPHICSRECTITEM type, const QString { 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 @@ -4581,6 +4613,11 @@ void MainWindow::slotProcessImportKeyframes(GRAPHICSRECTITEM type, const QString } } +void MainWindow::slotAlignPlayheadToMousePos() +{ + m_monitorManager->activateMonitor(Kdenlive::projectMonitor); + m_activeTimeline->projectView()->slotAlignPlayheadToMousePos(); +} #include "mainwindow.moc"