QMenu *clipInTimeline = static_cast<QMenu*>(factory()->container("clip_in_timeline", this));
clipInTimeline->setIcon(KIcon("go-jump"));
- QHash<QString,QMenu*> menus;
- menus.insert("addMenu",static_cast<QMenu*>(factory()->container("generators", this)));
- menus.insert("extractAudioMenu",static_cast<QMenu*>(factory()->container("extract_audio", this)));
- menus.insert("transcodeMenu",static_cast<QMenu*>(factory()->container("transcoders", this)));
- menus.insert("clipActionsMenu",static_cast<QMenu*>(factory()->container("clip_actions", this)));
- menus.insert("inTimelineMenu",clipInTimeline);
+ QHash<QString,QMenu*> menus;
+ menus.insert("addMenu",static_cast<QMenu*>(factory()->container("generators", this)));
+ menus.insert("extractAudioMenu",static_cast<QMenu*>(factory()->container("extract_audio", this)));
+ menus.insert("transcodeMenu",static_cast<QMenu*>(factory()->container("transcoders", this)));
+ menus.insert("clipActionsMenu",static_cast<QMenu*>(factory()->container("clip_actions", this)));
+ menus.insert("inTimelineMenu",clipInTimeline);
m_projectList->setupGeneratorMenu(menus);
// build themes menus
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 <QUrl> 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
}
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 <QUrl> urls;
+ foreach(const QString &path, list) {
+ kDebug() << QDir::current().absoluteFilePath(path);
+ urls << QUrl::fromLocalFile(QDir::current().absoluteFilePath(path));
+ }
+ m_projectList->slotAddClip(urls);
+ }
+
}
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);
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)));
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()));
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);
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)
}
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);
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()));
if (dia_ui->exec() == QDialog::Accepted) {
QMap <QString, QString> 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()) {
// 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<int>() << clip->getClipThumbFrame());
connect(m_activeDocument->clipManager(), SIGNAL(gotClipPropertyThumbnail(const QString&,QImage)), dia, SLOT(slotGotThumbnail(const QString&,QImage)));
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()));
+ }
}
}
{
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