X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmainwindow.cpp;h=9eadf01bba1eb02cb706e885d0bab17804ccd8dc;hb=71e41ad0c197e2e2eb033dff7800427f64d3428f;hp=b16cafd6d6e4891ba21e71bf38a77abb825b8fb4;hpb=146401c889b3095afda7d4d063ba66eb1429e176;p=kdenlive diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index b16cafd6..9eadf01b 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -140,6 +140,8 @@ EffectsList MainWindow::audioEffects; EffectsList MainWindow::customEffects; EffectsList MainWindow::transitions; +QMap MainWindow::m_lumacache; + MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & clipsToLoad, QWidget *parent) : KXmlGuiWindow(parent), m_activeDocument(NULL), @@ -156,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"); @@ -168,9 +171,11 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & char *separator = localeconv()->decimal_point; if (separator != systemLocale.decimalPoint()) { kDebug()<<"------\n!!! system locale is not similar to Qt's locale... be prepared for bugs!!!\n------"; - // HACK: There is a locale conflict, so set locale to at least have correct decimal point - if (strncmp(separator, ".", 1) == 0) systemLocale = QLocale::c(); - else if (strncmp(separator, ",", 1) == 0) systemLocale = QLocale("fr_FR.UTF-8"); + // HACK: There is a locale conflict, so set locale to C + // Make sure to override exported values or it won't work + setenv("LANG", "C", 1); + setlocale(LC_NUMERIC, "C"); + systemLocale = QLocale::c(); } systemLocale.setNumberOptions(QLocale::OmitGroupSeparator); @@ -207,7 +212,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & // FIXME: the next call returns a newly allocated object, which leaks initEffects::parseEffectFiles(); //initEffects::parseCustomEffectsFile(); - + m_monitorManager = new MonitorManager(); m_shortcutRemoveFocus = new QShortcut(QKeySequence("Esc"), this); @@ -275,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 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"); @@ -395,14 +400,15 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & KActionCategory *layoutActions = new KActionCategory(i18n("Layouts"), actionCollection()); m_loadLayout = new KSelectAction(i18n("Load Layout"), actionCollection()); for (int i = 1; i < 5; i++) { - KAction *load = new KAction(KIcon(), i18n("Layout %1").arg(i), this); - load->setData("_" + QString::number(i)); + KAction *load = new KAction(KIcon(), i18n("Layout %1", i), this); + load->setData('_' + QString::number(i)); layoutActions->addAction("load_layout" + QString::number(i), load); m_loadLayout->addAction(load); - KAction *save = new KAction(KIcon(), i18n("Save As Layout %1").arg(i), this); - save->setData("_" + QString::number(i)); + KAction *save = new KAction(KIcon(), i18n("Save As Layout %1", i), this); + save->setData('_' + QString::number(i)); layoutActions->addAction("save_layout" + QString::number(i), save); } + // Required to enable user to add the load layout action to toolbar layoutActions->addAction("load_layouts", m_loadLayout); connect(m_loadLayout, SIGNAL(triggered(QAction*)), this, SLOT(slotLoadLayout(QAction*))); @@ -426,6 +432,9 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & m_effectList->reloadEffectList(m_effectsMenu, m_effectActions); m_effectsActionCollection->readSettings(); + // Populate View menu with show / hide actions for dock widgets + KActionCategory *guiActions = new KActionCategory(i18n("Interface"), actionCollection()); + setupGUI(); // Find QDockWidget tab bars and show / hide widget title bars on right click @@ -451,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))); @@ -462,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); @@ -522,11 +531,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & connect(m, SIGNAL(triggered(QAction *)), this, SLOT(slotAddVideoEffect(QAction *))); connect(m_effectsMenu, SIGNAL(triggered(QAction *)), this, SLOT(slotAddVideoEffect(QAction *))); - connect(m_transitionsMenu, SIGNAL(triggered(QAction *)), this, SLOT(slotAddTransition(QAction *))); - - QMenu *viewMenu = static_cast(factory()->container("dockwindows", this)); - const QList viewActions = createPopupMenu()->actions(); - viewMenu->insertActions(NULL, viewActions); + connect(m_transitionsMenu, SIGNAL(triggered(QAction *)), this, SLOT(slotAddTransition(QAction *))); m_timelineContextMenu = new QMenu(this); m_timelineContextClipMenu = new QMenu(this); @@ -538,12 +543,13 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & m_timelineContextClipMenu->addAction(actionCollection()->action("clip_in_project_tree")); //m_timelineContextClipMenu->addAction(actionCollection()->action("clip_to_project_tree")); - m_timelineContextClipMenu->addAction(actionCollection()->action("edit_item_duration")); m_timelineContextClipMenu->addAction(actionCollection()->action("delete_item")); m_timelineContextClipMenu->addSeparator(); m_timelineContextClipMenu->addAction(actionCollection()->action("group_clip")); m_timelineContextClipMenu->addAction(actionCollection()->action("ungroup_clip")); m_timelineContextClipMenu->addAction(actionCollection()->action("split_audio")); + m_timelineContextClipMenu->addAction(actionCollection()->action("set_audio_align_ref")); + m_timelineContextClipMenu->addAction(actionCollection()->action("align_audio")); m_timelineContextClipMenu->addSeparator(); m_timelineContextClipMenu->addAction(actionCollection()->action("cut_timeline_clip")); m_timelineContextClipMenu->addAction(actionCollection()->action(KStandardAction::name(KStandardAction::Copy))); @@ -556,7 +562,6 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & m_timelineContextClipMenu->addMenu(m_transitionsMenu); m_timelineContextClipMenu->addMenu(m_effectsMenu); - m_timelineContextTransitionMenu->addAction(actionCollection()->action("edit_item_duration")); m_timelineContextTransitionMenu->addAction(actionCollection()->action("delete_item")); m_timelineContextTransitionMenu->addAction(actionCollection()->action(KStandardAction::name(KStandardAction::Copy))); @@ -585,7 +590,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & if (!clipsToLoad.isEmpty() && m_activeDocument) { QStringList list = clipsToLoad.split(','); QList urls; - foreach(QString path, list) { + foreach(const QString &path, list) { kDebug() << QDir::current().absoluteFilePath(path); urls << QUrl::fromLocalFile(QDir::current().absoluteFilePath(path)); } @@ -600,6 +605,33 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & actionCollection()->addAssociatedWidget(m_clipMonitor->container()); actionCollection()->addAssociatedWidget(m_projectMonitor->container()); + QMap viewActions; + KAction *showTimeline = new KAction(i18n("Timeline"), this); + showTimeline->setCheckable(true); + showTimeline->setChecked(true); + connect(showTimeline, SIGNAL(triggered(bool)), this, SLOT(slotShowTimeline(bool))); + viewActions.insert(showTimeline->text(), showTimeline); + + QList docks = findChildren(); + for (int i = 0; i < docks.count(); i++) { + QDockWidget* dock = docks.at(i); + KAction* dockInformations = new KAction(this); + dockInformations->setText(dock->windowTitle()); + dockInformations->setCheckable(true); + dockInformations->setChecked(!dock->isHidden()); + connect(dockInformations,SIGNAL(toggled(bool)), dock, SLOT(setVisible(bool))); + viewActions.insert(dockInformations->text(), dockInformations); + } + + + KMenu *viewMenu = static_cast(factory()->container("dockwindows", this)); + //const QList viewActions = createPopupMenu()->actions(); + QMap::const_iterator i = viewActions.constBegin(); + while (i != viewActions.constEnd()) { + viewMenu->addAction(guiActions->addAction(i.key(), i.value())); + ++i; + } + // Populate encoding profiles KConfig conf("encodingprofiles.rc", KConfig::FullConfig, "appdata"); if (KdenliveSettings::proxyparams().isEmpty() || KdenliveSettings::proxyextension().isEmpty()) { @@ -694,7 +726,7 @@ bool MainWindow::queryClose() if (m_activeDocument->url().fileName().isEmpty()) message = i18n("Save changes to document?"); else - message = i18n("The project \"%1\" has been changed.\nDo you want to save your changes?").arg(m_activeDocument->url().fileName()); + message = i18n("The project \"%1\" has been changed.\nDo you want to save your changes?", m_activeDocument->url().fileName()); switch (KMessageBox::warningYesNoCancel(this, message)) { case KMessageBox::Yes : // save document here. If saving fails, return false; @@ -781,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); @@ -880,11 +912,14 @@ 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))); 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))); @@ -1367,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"); @@ -1393,6 +1433,10 @@ void MainWindow::setupActions() KAction* editItemDuration = new KAction(KIcon("measure"), i18n("Edit Duration"), this); collection.addAction("edit_item_duration", editItemDuration); connect(editItemDuration, SIGNAL(triggered(bool)), this, SLOT(slotEditItemDuration())); + + KAction* saveTimelineClip = new KAction(KIcon("document-save"), i18n("Save clip"), this); + collection.addAction("save_timeline_clip", saveTimelineClip); + connect(saveTimelineClip, SIGNAL(triggered(bool)), this, SLOT(slotSaveTimelineClip())); KAction* clipInProjectTree = new KAction(KIcon("go-jump-definition"), i18n("Clip in Project Tree"), this); collection.addAction("clip_in_project_tree", clipInProjectTree); @@ -1459,7 +1503,7 @@ void MainWindow::setupActions() collection.addAction("edit_clip_marker", editClipMarker); connect(editClipMarker, SIGNAL(triggered(bool)), this, SLOT(slotEditClipMarker())); - KAction *addMarkerGuideQuickly = new KAction(KIcon("bookmark-new"), i18n("Add Marker/Guide quickly"), this); + KAction* addMarkerGuideQuickly = new KAction(KIcon("bookmark-new"), i18n("Add Marker/Guide quickly"), this); addMarkerGuideQuickly->setShortcut(Qt::Key_Asterisk); collection.addAction("add_marker_guide_quickly", addMarkerGuideQuickly); connect(addMarkerGuideQuickly, SIGNAL(triggered(bool)), this, SLOT(slotAddMarkerGuideQuickly())); @@ -1468,6 +1512,14 @@ void MainWindow::setupActions() collection.addAction("split_audio", splitAudio); connect(splitAudio, SIGNAL(triggered(bool)), this, SLOT(slotSplitAudio())); + KAction* setAudioAlignReference = new KAction(i18n("Set Audio Reference"), this); + collection.addAction("set_audio_align_ref", setAudioAlignReference); + connect(setAudioAlignReference, SIGNAL(triggered()), this, SLOT(slotSetAudioAlignReference())); + + KAction* alignAudio = new KAction(i18n("Align Audio to Reference"), this); + collection.addAction("align_audio", alignAudio); + connect(alignAudio, SIGNAL(triggered()), this, SLOT(slotAlignAudio())); + KAction* audioOnly = new KAction(KIcon("document-new"), i18n("Audio Only"), this); collection.addAction("clip_audio_only", audioOnly); audioOnly->setData("clip_audio_only"); @@ -1542,12 +1594,6 @@ void MainWindow::setupActions() pasteEffects->setData("paste_effects"); connect(pasteEffects , SIGNAL(triggered()), this, SLOT(slotPasteEffects())); - QAction *showTimeline = new KAction(i18n("Show Timeline"), this); - collection.addAction("show_timeline", showTimeline); - showTimeline->setCheckable(true); - showTimeline->setChecked(true); - connect(showTimeline, SIGNAL(triggered(bool)), this, SLOT(slotShowTimeline(bool))); - QAction *showTitleBar = new KAction(i18n("Show Title Bars"), this); collection.addAction("show_titlebars", showTitleBar); showTitleBar->setCheckable(true); @@ -1562,7 +1608,7 @@ void MainWindow::setupActions() KStandardAction::saveAs(this, SLOT(saveFileAs()), collection); KStandardAction::openNew(this, SLOT(newFile()), collection); // TODO: make the following connection to slotEditKeys work - KStandardAction::keyBindings(this, SLOT(slotEditKeys()), collection); + //KStandardAction::keyBindings(this, SLOT(slotEditKeys()), collection); KStandardAction::preferences(this, SLOT(slotPreferences()), collection); KStandardAction::configureNotifications(this, SLOT(configureNotifications()), collection); KStandardAction::copy(this, SLOT(slotCopy()), collection); @@ -1710,17 +1756,17 @@ void MainWindow::loadLayouts() foreach(const QString & key, entries) { if (key.endsWith(QString("_%1").arg(i))) { // Found previously saved layout - QString layoutName = key.section("_", 0, -2); + QString layoutName = key.section('_', 0, -2); for (int j = 0; j < loadActions.count(); j++) { - if (loadActions.at(j)->data().toString().endsWith("_" + QString::number(i))) { + if (loadActions.at(j)->data().toString().endsWith('_' + QString::number(i))) { loadActions[j]->setText(layoutName); loadActions[j]->setData(key); break; } } for (int j = 0; j < saveActions.count(); j++) { - if (saveActions.at(j)->data().toString().endsWith("_" + QString::number(i))) { - saveActions[j]->setText(i18n("Save as %1").arg(layoutName)); + if (saveActions.at(j)->data().toString().endsWith('_' + QString::number(i))) { + saveActions[j]->setText(i18n("Save as %1", layoutName)); saveActions[j]->setData(key); break; } @@ -1753,7 +1799,7 @@ void MainWindow::slotSaveLayout(QAction *action) layouts.deleteEntry(originallayoutName); QByteArray st = saveState(); - layoutName.append("_" + QString::number(layoutId)); + layoutName.append('_' + QString::number(layoutId)); layouts.writeEntry(layoutName, st.toBase64()); loadLayouts(); } @@ -1790,15 +1836,16 @@ void MainWindow::readOptions() } } - + if (KdenliveSettings::ffmpegpath().isEmpty() || KdenliveSettings::ffplaypath().isEmpty()) upgrade = true; if (!initialGroup.exists() || upgrade) { // this is our first run, show Wizard - Wizard *w = new Wizard(upgrade, this); + QPointer w = new Wizard(upgrade, this); if (w->exec() == QDialog::Accepted && w->isOk()) { w->adjustSettings(); initialGroup.writeEntry("version", version); delete w; } else { + delete w; ::exit(1); } } @@ -1810,7 +1857,7 @@ void MainWindow::readOptions() void MainWindow::slotRunWizard() { - Wizard *w = new Wizard(false, this); + QPointer w = new Wizard(false, this); if (w->exec() == QDialog::Accepted && w->isOk()) { w->adjustSettings(); } @@ -1832,12 +1879,16 @@ void MainWindow::newFile(bool showProjectSettings, bool force) if (!closeCurrentDocument()) return; } else { - ProjectSettings *w = new ProjectSettings(NULL, QMap (), QStringList(), projectTracks.x(), projectTracks.y(), KdenliveSettings::defaultprojectfolder(), false, true, this); - if (w->exec() != QDialog::Accepted) + QPointer w = new ProjectSettings(NULL, QMap (), QStringList(), projectTracks.x(), projectTracks.y(), KdenliveSettings::defaultprojectfolder(), false, true, this); + if (w->exec() != QDialog::Accepted) { + delete w; return; + } if (!KdenliveSettings::activatetabs()) - if (!closeCurrentDocument()) + if (!closeCurrentDocument()) { + delete w; return; + } if (KdenliveSettings::videothumbnails() != w->enableVideoThumbs()) slotSwitchVideoThumbs(); if (KdenliveSettings::audiothumbnails() != w->enableAudioThumbs()) @@ -1903,7 +1954,7 @@ bool MainWindow::closeCurrentDocument(bool saveChanges) if (m_activeDocument->url().fileName().isEmpty()) message = i18n("Save changes to document?"); else - message = i18n("The project \"%1\" has been changed.\nDo you want to save your changes?").arg(m_activeDocument->url().fileName()); + message = i18n("The project \"%1\" has been changed.\nDo you want to save your changes?", m_activeDocument->url().fileName()); switch (KMessageBox::warningYesNoCancel(this, message)) { case KMessageBox::Yes : // save document here. If saving fails, return false; @@ -1916,6 +1967,7 @@ bool MainWindow::closeCurrentDocument(bool saveChanges) break; } } + slotTimelineClipSelected(NULL, false); m_clipMonitor->slotSetClipProducer(NULL); m_projectList->slotResetProjectList(); m_timelineArea->removeTab(m_timelineArea->indexOf(w)); @@ -2020,7 +2072,7 @@ void MainWindow::openFile(const KUrl &url) if (mime.data()->is("application/x-compressed-tar")) { // Opening a compressed project file, we need to process it kDebug()<<"Opening archive, processing"; - ArchiveWidget *ar = new ArchiveWidget(url); + QPointer ar = new ArchiveWidget(url); if (ar->exec() == QDialog::Accepted) openFile(KUrl(ar->extractedProjectFile())); delete ar; return; @@ -2178,8 +2230,9 @@ void MainWindow::parseProfiles(const QString &mltPath) if (KdenliveSettings::rendererpath().isEmpty()) { // Cannot find the MLT melt renderer, ask for location - KUrlRequesterDialog *getUrl = new KUrlRequesterDialog(QString(), i18n("Cannot find the melt program required for rendering (part of MLT)"), this); + QPointer getUrl = new KUrlRequesterDialog(QString(), i18n("Cannot find the melt program required for rendering (part of MLT)"), this); if (getUrl->exec() == QDialog::Rejected) { + delete getUrl; ::exit(0); } KUrl rendererPath = getUrl->selectedUrl(); @@ -2201,9 +2254,10 @@ void MainWindow::parseProfiles(const QString &mltPath) } if (profilesList.isEmpty()) { // Cannot find the MLT profiles, ask for location - KUrlRequesterDialog *getUrl = new KUrlRequesterDialog(KdenliveSettings::mltpath(), i18n("Cannot find your MLT profiles, please give the path"), this); + QPointer getUrl = new KUrlRequesterDialog(KdenliveSettings::mltpath(), i18n("Cannot find your MLT profiles, please give the path"), this); getUrl->fileDialog()->setMode(KFile::Directory); if (getUrl->exec() == QDialog::Rejected) { + delete getUrl; ::exit(0); } KUrl mltPath = getUrl->selectedUrl(); @@ -2262,7 +2316,7 @@ void MainWindow::slotDetectAudioDriver() void MainWindow::slotEditProjectSettings() { QPoint p = m_activeDocument->getTracksCount(); - 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); + QPointer 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) { @@ -2475,7 +2529,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, 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))); @@ -2483,17 +2537,20 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha disconnect(m_effectStack, SIGNAL(updateEffect(ClipItem*, int, QDomElement, QDomElement, int,bool)), m_activeTimeline->projectView(), SLOT(slotUpdateClipEffect(ClipItem*, int, QDomElement, QDomElement, int,bool))); disconnect(m_effectStack, SIGNAL(removeEffect(ClipItem*, int, QDomElement)), m_activeTimeline->projectView(), SLOT(slotDeleteEffect(ClipItem*, int, QDomElement))); disconnect(m_effectStack, SIGNAL(addEffect(ClipItem*, QDomElement)), trackView->projectView(), SLOT(slotAddEffect(ClipItem*, QDomElement))); - disconnect(m_effectStack, SIGNAL(changeEffectState(ClipItem*, int, int, bool)), m_activeTimeline->projectView(), SLOT(slotChangeEffectState(ClipItem*, int, int, bool))); - disconnect(m_effectStack, SIGNAL(changeEffectPosition(ClipItem*, int, int, int)), m_activeTimeline->projectView(), SLOT(slotChangeEffectPosition(ClipItem*, int, int, int))); + disconnect(m_effectStack, SIGNAL(changeEffectState(ClipItem*, int, QList , bool)), m_activeTimeline->projectView(), SLOT(slotChangeEffectState(ClipItem*, int, QList , bool))); + disconnect(m_effectStack, SIGNAL(changeEffectPosition(ClipItem*, int, QList, int)), m_activeTimeline->projectView(), SLOT(slotChangeEffectPosition(ClipItem*, int, QList , int))); disconnect(m_effectStack, SIGNAL(refreshEffectStack(ClipItem*)), m_activeTimeline->projectView(), SLOT(slotRefreshEffects(ClipItem*))); disconnect(m_effectStack, SIGNAL(reloadEffects()), this, SLOT(slotReloadEffects())); 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); @@ -2511,11 +2568,13 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha connect(m_projectList, SIGNAL(projectModified()), doc, SLOT(setModified())); connect(m_projectList, SIGNAL(clipNameChanged(const QString, const QString)), trackView->projectView(), SLOT(clipNameChanged(const QString, const QString))); - //connect(trackView, SIGNAL(cursorMoved()), m_projectMonitor, SLOT(activateMonitor())); connect(trackView, SIGNAL(configTrack(int)), this, SLOT(slotConfigTrack(int))); 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())); @@ -2552,20 +2611,28 @@ 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, 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 ))); + // Effect stack signals connect(m_effectStack, SIGNAL(updateEffect(ClipItem*, int, QDomElement, QDomElement, int,bool)), trackView->projectView(), SLOT(slotUpdateClipEffect(ClipItem*, int, QDomElement, QDomElement, int,bool))); connect(m_effectStack, SIGNAL(updateClipRegion(ClipItem*, int, QString)), trackView->projectView(), SLOT(slotUpdateClipRegion(ClipItem*, int, QString))); connect(m_effectStack, SIGNAL(removeEffect(ClipItem*, int, QDomElement)), trackView->projectView(), SLOT(slotDeleteEffect(ClipItem*, int, QDomElement))); connect(m_effectStack, SIGNAL(addEffect(ClipItem*, QDomElement)), trackView->projectView(), SLOT(slotAddEffect(ClipItem*, QDomElement))); - connect(m_effectStack, SIGNAL(changeEffectState(ClipItem*, int, int, bool)), trackView->projectView(), SLOT(slotChangeEffectState(ClipItem*, int, int, bool))); - connect(m_effectStack, SIGNAL(changeEffectPosition(ClipItem*, int, int, int)), trackView->projectView(), SLOT(slotChangeEffectPosition(ClipItem*, int, int, int))); + 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_transitionConfig, SIGNAL(transitionUpdated(Transition *, QDomElement)), trackView->projectView() , SLOT(slotTransitionUpdated(Transition *, QDomElement))); - connect(m_transitionConfig, SIGNAL(seekTimeline(int)), trackView->projectView() , SLOT(setCursorPos(int))); - connect(m_effectStack, SIGNAL(seekTimeline(int)), trackView->projectView() , SLOT(setCursorPos(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())); connect(trackView, SIGNAL(zoneMoved(int, int)), this, SLOT(slotZoneMoved(int, int))); @@ -2685,7 +2752,7 @@ void MainWindow::updateConfiguration() // Update list of transcoding profiles loadTranscoders(); - loadStabilize(); + loadClipActions(); #ifdef USE_JOGSHUTTLE activateShuttleDevice(); #endif @@ -2785,10 +2852,12 @@ void MainWindow::slotAddClipMarker() return; } QString id = clip->getId(); - CommentedTime marker(pos, i18n("Marker")); - MarkerDialog d(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()); + 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, QList () << d->newMarker()); + delete d; } void MainWindow::slotDeleteClipMarker() @@ -2863,21 +2932,23 @@ 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); - MarkerDialog d(clip, marker, m_activeDocument->timecode(), i18n("Edit Marker"), this); - if (d.exec() == QDialog::Accepted) { - m_activeTimeline->projectView()->slotAddClipMarker(id, d.newMarker().time(), d.newMarker().comment()); - if (d.newMarker().time() != pos) { + QPointer d = new MarkerDialog(clip, oldMarker, + m_activeDocument->timecode(), i18n("Edit Marker"), this); + if (d->exec() == QDialog::Accepted) { + 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); } @@ -3050,16 +3122,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) @@ -3082,14 +3155,14 @@ void MainWindow::slotAddVideoEffect(QAction *result) if (info.isEmpty() || info.size() < 3) return; QDomElement effect ; - if (info.at(2) == QString::number((int) EFFECT_VIDEO)) + if (info.last() == QString::number((int) EFFECT_VIDEO)) effect = videoEffects.getEffectByTag(info.at(0), info.at(1)); - else if (info.at(2) == QString::number((int) EFFECT_AUDIO)) + else if (info.last() == QString::number((int) EFFECT_AUDIO)) effect = audioEffects.getEffectByTag(info.at(0), info.at(1)); else effect = customEffects.getEffectByTag(info.at(0), info.at(1)); if (!effect.isNull()) slotAddEffect(effect); - else m_messageLabel->setMessage(i18n("Cannot find effect %1 / %2").arg(info.at(0)).arg(info.at(1)), ErrorMessage); + else m_messageLabel->setMessage(i18n("Cannot find effect %1 / %2", info.at(0), info.at(1)), ErrorMessage); } @@ -3221,7 +3294,7 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip) return; } QString path = clip->getProperty("resource"); - TitleWidget *dia_ui = new TitleWidget(KUrl(), m_activeDocument->timecode(), titlepath, m_projectMonitor->render, this); + QPointer dia_ui = new TitleWidget(KUrl(), m_activeDocument->timecode(), titlepath, m_projectMonitor->render, this); QDomDocument doc; doc.setContent(clip->getProperty("xmldata")); dia_ui->setXml(doc); @@ -3256,7 +3329,20 @@ 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))); + + if (clip->clipType() == AV || clip->clipType() == VIDEO || clip->clipType() == PLAYLIST) { + // 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(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(); @@ -3279,11 +3365,12 @@ void MainWindow::slotApplyNewClipProperties(const QString id, QMap cliplist, QMap commonproperties) { - ClipProperties dia(cliplist, m_activeDocument->timecode(), commonproperties, this); - if (dia.exec() == QDialog::Accepted) { + QPointer dia = new ClipProperties(cliplist, + m_activeDocument->timecode(), commonproperties, this); + if (dia->exec() == QDialog::Accepted) { QUndoCommand *command = new QUndoCommand(); command->setText(i18n("Edit clips")); - QMap newImageProps = dia.properties(); + QMap newImageProps = dia->properties(); // Transparency setting applies only for images QMap newProps = newImageProps; newProps.remove("transparency"); @@ -3297,8 +3384,9 @@ void MainWindow::slotShowClipProperties(QList cliplist, QMapcommandStack()->push(command); for (int i = 0; i < cliplist.count(); i++) - m_activeTimeline->projectView()->slotUpdateClip(cliplist.at(i)->getId(), dia.needsTimelineReload()); + m_activeTimeline->projectView()->slotUpdateClip(cliplist.at(i)->getId(), dia->needsTimelineReload()); } + delete dia; } void MainWindow::customEvent(QEvent* e) @@ -3309,6 +3397,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) @@ -3625,7 +3718,7 @@ void MainWindow::slotSaveZone(Render *render, QPoint zone, DocClipBase *baseClip QString tmppath = m_activeDocument->projectFolder().path(KUrl::AddTrailingSlash); if (baseClip == NULL) tmppath.append("untitled.mlt"); else { - tmppath.append((baseClip->name().isEmpty() ? baseClip->fileURL().fileName() : baseClip->name()) + "-" + QString::number(zone.x()).rightJustified(4, '0') + ".mlt"); + tmppath.append((baseClip->name().isEmpty() ? baseClip->fileURL().fileName() : baseClip->name()) + '-' + QString::number(zone.x()).rightJustified(4, '0') + ".mlt"); } path = KUrl(tmppath); } @@ -3703,13 +3796,14 @@ int MainWindow::getNewStuff(const QString &configFile) { KNS3::Entry::List entries; #if KDE_IS_VERSION(4,3,80) - KNS3::DownloadDialog dialog(configFile); - dialog.exec(); - entries = dialog.changedEntries(); + QPointer dialog = new KNS3::DownloadDialog(configFile); + dialog->exec(); + if (dialog) entries = dialog->changedEntries(); foreach(const KNS3::Entry & entry, entries) { if (entry.status() == KNS3::Entry::Installed) kDebug() << "// Installed files: " << entry.installedFiles(); } + delete dialog; #else KNS::Engine engine(0); if (engine.init(configFile)) @@ -3765,6 +3859,20 @@ void MainWindow::slotSplitAudio() m_activeTimeline->projectView()->splitAudio(); } +void MainWindow::slotSetAudioAlignReference() +{ + if (m_activeTimeline) { + m_activeTimeline->projectView()->setAudioAlignReference(); + } +} + +void MainWindow::slotAlignAudio() +{ + if (m_activeTimeline) { + m_activeTimeline->projectView()->alignAudio(); + } +} + void MainWindow::slotUpdateClipType(QAction *action) { if (m_activeTimeline) { @@ -3779,9 +3887,10 @@ void MainWindow::slotDvdWizard(const QString &url, const QString &profile) // We must stop the monitors since we create a new on in the dvd wizard m_clipMonitor->stop(); m_projectMonitor->stop(); - DvdWizard w(url, profile, this); - w.exec(); + QPointer w = new DvdWizard(url, profile, this); + w->exec(); m_projectMonitor->start(); + delete w; } void MainWindow::slotShowTimeline(bool show) @@ -3806,25 +3915,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() @@ -3842,7 +3961,7 @@ void MainWindow::loadTranscoders() QMapIterator i(profiles); while (i.hasNext()) { i.next(); - QStringList data = i.value().split(";"); + QStringList data = i.value().split(';'); QAction *a; // separate audio transcoding in a separate menu if (data.count() > 2 && data.at(2) == "audio") { @@ -3857,7 +3976,7 @@ void MainWindow::loadTranscoders() } } -void MainWindow::slotStabilize() +void MainWindow::slotStartClipAction() { QString condition,filtername; QStringList ids; @@ -4037,12 +4156,12 @@ void MainWindow::slotPrepareRendering(bool scriptExport, bool zoneOnly, const QS QDomElement e = producers.item(n).toElement(); producerResource = EffectsList::property(e, "resource"); if (producerResource.isEmpty()) continue; - if (!producerResource.startsWith("/")) { - producerResource.prepend(root + "/"); + if (!producerResource.startsWith('/')) { + producerResource.prepend(root + '/'); } if (producerResource.contains('?')) { // slowmotion producer - suffix = "?" + producerResource.section('?', 1); + suffix = '?' + producerResource.section('?', 1); producerResource = producerResource.section('?', 0, 0); } else suffix.clear(); @@ -4075,12 +4194,12 @@ void MainWindow::slotPrepareRendering(bool scriptExport, bool zoneOnly, const QS // Do save scenelist QFile file(playlistPath); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { - m_messageLabel->setMessage(i18n("Cannot write to file %1").arg(playlistPath), ErrorMessage); + m_messageLabel->setMessage(i18n("Cannot write to file %1", playlistPath), ErrorMessage); return; } file.write(playlistContent.toUtf8()); if (file.error() != QFile::NoError) { - m_messageLabel->setMessage(i18n("Cannot write to file %1").arg(playlistPath), ErrorMessage); + m_messageLabel->setMessage(i18n("Cannot write to file %1", playlistPath), ErrorMessage); file.close(); return; } @@ -4401,7 +4520,7 @@ void MainWindow::slotOpenBackupDialog(const KUrl url) projectId = m_activeDocument->getDocumentProperty("documentid"); } - BackupWidget *dia = new BackupWidget(projectFile, projectFolder, projectId, this); + QPointer dia = new BackupWidget(projectFile, projectFolder, projectId, this); if (dia->exec() == QDialog::Accepted) { QString requestedBackup = dia->selectedFile(); m_activeDocument->backupLastSavedVersion(projectFile.path()); @@ -4426,7 +4545,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(); } @@ -4446,6 +4565,37 @@ void MainWindow::slotChangePalette() } } +void MainWindow::slotSaveTimelineClip() +{ + if (m_activeTimeline && m_projectMonitor->render) { + ClipItem *clip = m_activeTimeline->projectView()->getActiveClipUnderCursor(true); + if (!clip) { + m_messageLabel->setMessage(i18n("Select a clip to save"), InformationMessage); + return; + } + KUrl url = KFileDialog::getSaveUrl(m_activeDocument->projectFolder(), "video/mlt-playlist"); + if (!url.isEmpty()) m_projectMonitor->render->saveClip(m_activeDocument->tracksCount() - clip->track(), clip->startPos(), url); + } +} + +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_activeTimeline->projectView()->slotAlignPlayheadToMousePos(); +} #include "mainwindow.moc"