X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmainwindow.cpp;h=bfeab9c585ed333ecbbca7b466146a3b320ccf94;hb=ab65ab29ddec974e04b93679bf10e4046129d97d;hp=89039b27dd7f3ea0b4235754cb7d3f9ea42dee35;hpb=a5b0bcb8bb9674224ac6476d52c19d9b4f1ded92;p=kdenlive diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 89039b27..bfeab9c5 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -40,29 +40,30 @@ #include "renderwidget.h" #include "renderer.h" #include "audiosignal.h" -#ifndef NO_JOGSHUTTLE +#ifdef USE_JOGSHUTTLE #include "jogshuttle.h" #include "jogaction.h" #include "jogshuttleconfig.h" -#endif /* NO_JOGSHUTTLE */ +#endif #include "clipproperties.h" #include "wizard.h" -#include "editclipcommand.h" +#include "commands/editclipcommand.h" #include "titlewidget.h" #include "markerdialog.h" #include "clipitem.h" #include "interfaces.h" -#include "kdenlive-config.h" +#include "config-kdenlive.h" #include "cliptranscode.h" #include "ui_templateclip_ui.h" #include "colorscopes/vectorscope.h" #include "colorscopes/waveform.h" #include "colorscopes/rgbparade.h" #include "colorscopes/histogram.h" -#include "audiospectrum.h" -#include "spectrogram.h" +#include "audioscopes/audiospectrum.h" +#include "audioscopes/spectrogram.h" #include "archivewidget.h" #include "databackup/backupwidget.h" +#include "utils/resourcewidget.h" #include @@ -99,7 +100,7 @@ #include #include #define KNS3 KNS -#endif /* KDE_IS_VERSION(4,3,80) */ +#endif #include #include #include @@ -113,6 +114,7 @@ #include #include +#include // Uncomment for deeper debugging //#define DEBUG_MAINW @@ -143,10 +145,10 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & m_activeTimeline(NULL), m_recMonitor(NULL), m_renderWidget(NULL), -#ifndef NO_JOGSHUTTLE +#ifdef USE_JOGSHUTTLE m_jogProcess(NULL), m_jogShuttle(NULL), -#endif /* NO_JOGSHUTTLE */ +#endif m_findActivated(false), m_stopmotion(NULL) { @@ -156,6 +158,15 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & // Init locale QLocale systemLocale = QLocale(); + setlocale(LC_NUMERIC, NULL); + 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"); + } + systemLocale.setNumberOptions(QLocale::OmitGroupSeparator); QLocale::setDefault(systemLocale); @@ -211,16 +222,17 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & m_clipMonitorDock->setWidget(m_clipMonitor); // Connect the project list - connect(m_projectList, SIGNAL(clipSelected(DocClipBase *, QPoint)), m_clipMonitor, SLOT(slotSetClipProducer(DocClipBase *, QPoint))); + connect(m_projectList, SIGNAL(clipSelected(DocClipBase *, QPoint, bool)), m_clipMonitor, SLOT(slotSetClipProducer(DocClipBase *, QPoint, bool))); connect(m_projectList, SIGNAL(raiseClipMonitor()), m_clipMonitor, SLOT(activateMonitor())); 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(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 &))); - connect(m_projectList, SIGNAL(refreshClip(const QString &, bool)), m_monitorManager, SLOT(slotRefreshCurrentMonitor())); + connect(m_projectList, SIGNAL(refreshClip(const QString &, bool)), m_monitorManager, SLOT(slotRefreshCurrentMonitor(const QString &))); connect(m_projectList, SIGNAL(findInTimeline(const QString&)), this, SLOT(slotClipInTimeline(const QString&))); connect(m_clipMonitor, SIGNAL(zoneUpdated(QPoint)), m_projectList, SLOT(slotUpdateClipCut(QPoint))); + connect(m_clipMonitor, SIGNAL(extractZone(const QString &, QPoint)), m_projectList, SLOT(slotCutClipJob(const QString &, QPoint))); m_projectMonitorDock = new QDockWidget(i18n("Project Monitor"), this); m_projectMonitorDock->setObjectName("project_monitor"); @@ -235,7 +247,8 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & connect(m_recMonitor, SIGNAL(addProjectClip(KUrl)), this, SLOT(slotAddProjectClip(KUrl))); connect(m_recMonitor, SIGNAL(addProjectClipList(KUrl::List)), this, SLOT(slotAddProjectClipList(KUrl::List))); connect(m_recMonitor, SIGNAL(showConfigDialog(int, int)), this, SLOT(slotPreferences(int, int))); -#endif + +#endif /* ! Q_WS_MAC */ m_monitorManager->initMonitors(m_clipMonitor, m_projectMonitor, m_recMonitor); m_notesDock = new QDockWidget(i18n("Project Notes"), this); @@ -256,6 +269,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & m_effectStack = new EffectStackView(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&))); m_transitionConfigDock = new QDockWidget(i18n("Transition"), this); m_transitionConfigDock->setObjectName("transition"); @@ -464,6 +478,9 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & /*ScriptingPart* sp = new ScriptingPart(this, QStringList()); guiFactory()->addClient(sp);*/ + QMenu *trackMenu = (QMenu*)(factory()->container("track_menu", this)); + if (trackMenu) trackMenu->addActions(m_tracksActionCollection->actions()); + QMenu *saveLayout = (QMenu*)(factory()->container("layout_save_as", this)); if (saveLayout) @@ -475,15 +492,20 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & loadPlugins(); loadTranscoders(); + loadStabilize(); 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))); QMenu *clipInTimeline = static_cast(factory()->container("clip_in_timeline", this)); clipInTimeline->setIcon(KIcon("go-jump")); - m_projectList->setupGeneratorMenu(static_cast(factory()->container("generators", this)), - static_cast(factory()->container("transcoders", this)), - 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("stabilizeMenu",static_cast(factory()->container("stabilize", this))); + menus.insert("inTimelineMenu",clipInTimeline); + m_projectList->setupGeneratorMenu(menus); // build themes menus QMenu *themesMenu = static_cast(factory()->container("themes_menu", this)); @@ -615,9 +637,9 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & m_projectList->slotAddClip(urls); } -#ifndef NO_JOGSHUTTLE +#ifdef USE_JOGSHUTTLE activateShuttleDevice(); -#endif /* NO_JOGSHUTTLE */ +#endif m_projectListDock->raise(); actionCollection()->addAssociatedWidget(m_clipMonitor->container()); @@ -829,7 +851,7 @@ void MainWindow::slotReloadEffects() m_effectList->reloadEffectList(m_effectsMenu, m_effectActions); } -#ifndef NO_JOGSHUTTLE +#ifdef USE_JOGSHUTTLE void MainWindow::activateShuttleDevice() { delete m_jogShuttle; @@ -847,7 +869,7 @@ void MainWindow::activateShuttleDevice() connect(m_jogShuttle, SIGNAL(forward(double)), m_monitorManager, SLOT(slotForward(double))); connect(m_jogShuttle, SIGNAL(action(const QString&)), this, SLOT(slotDoAction(const QString&))); } -#endif /* NO_JOGSHUTTLE */ +#endif /* USE_JOGSHUTTLE */ void MainWindow::slotDoAction(const QString& action_name) { @@ -1522,18 +1544,29 @@ void MainWindow::setupActions() collection.addAction("delete_space", removeSpace); connect(removeSpace, SIGNAL(triggered()), this, SLOT(slotRemoveSpace())); - KAction *insertTrack = new KAction(KIcon(), i18n("Insert Track"), this); - collection.addAction("insert_track", insertTrack); + m_tracksActionCollection = new KActionCollection(this, KGlobal::mainComponent()); + m_tracksActionCollection->addAssociatedWidget(m_timelineArea); + + KAction *insertTrack = new KAction(KIcon(), i18n("Insert Track"), m_tracksActionCollection); + m_tracksActionCollection->addAction("insert_track", insertTrack); connect(insertTrack, SIGNAL(triggered()), this, SLOT(slotInsertTrack())); - KAction *deleteTrack = new KAction(KIcon(), i18n("Delete Track"), this); - collection.addAction("delete_track", deleteTrack); + KAction *deleteTrack = new KAction(KIcon(), i18n("Delete Track"), m_tracksActionCollection); + m_tracksActionCollection->addAction("delete_track", deleteTrack); connect(deleteTrack, SIGNAL(triggered()), this, SLOT(slotDeleteTrack())); - KAction *configTracks = new KAction(KIcon("configure"), i18n("Configure Tracks"), this); - collection.addAction("config_tracks", configTracks); + KAction *configTracks = new KAction(KIcon("configure"), i18n("Configure Tracks"), m_tracksActionCollection); + m_tracksActionCollection->addAction("config_tracks", configTracks); connect(configTracks, SIGNAL(triggered()), this, SLOT(slotConfigTrack())); + KAction *selectTrack = new KAction(KIcon(), i18n("Select All in Current Track"), m_tracksActionCollection); + connect(selectTrack, SIGNAL(triggered()), this, SLOT(slotSelectTrack())); + m_tracksActionCollection->addAction("select_track", selectTrack); + + QAction *selectAll = KStandardAction::selectAll(this, SLOT(slotSelectAllTracks()), m_tracksActionCollection); + selectAll->setShortcutContext(Qt::WidgetWithChildrenShortcut); + m_tracksActionCollection->addAction("select_all_tracks", selectAll); + KAction *addGuide = new KAction(KIcon("document-new"), i18n("Add Guide"), this); collection.addAction("add_guide", addGuide); connect(addGuide, SIGNAL(triggered()), this, SLOT(slotAddGuide())); @@ -1619,6 +1652,10 @@ void MainWindow::setupActions() QAction *addFolderButton = new KAction(KIcon("folder-new"), i18n("Create Folder"), this); collection.addAction("add_folder", addFolderButton); connect(addFolderButton , SIGNAL(triggered()), m_projectList, SLOT(slotAddFolder())); + + QAction *downloadResources = new KAction(KIcon("download"), i18n("Online Resources"), this); + collection.addAction("download_resource", downloadResources); + connect(downloadResources , SIGNAL(triggered()), this, SLOT(slotDownloadResources())); QAction *clipProperties = new KAction(KIcon("document-edit"), i18n("Clip Properties"), this); collection.addAction("clip_properties", clipProperties); @@ -1662,6 +1699,7 @@ void MainWindow::setupActions() addClips->addAction(addTitleClip); addClips->addAction(addTitleTemplateClip); addClips->addAction(addFolderButton); + addClips->addAction(downloadResources); addClips->addAction(reloadClip); addClips->addAction(proxyClip); @@ -1822,13 +1860,14 @@ void MainWindow::newFile(bool showProjectSettings, bool force) QString profileName = KdenliveSettings::default_profile(); KUrl projectFolder = KdenliveSettings::defaultprojectfolder(); QMap documentProperties; + QMap documentMetadata; QPoint projectTracks(KdenliveSettings::videotracks(), KdenliveSettings::audiotracks()); if (!showProjectSettings) { if (!KdenliveSettings::activatetabs()) if (!closeCurrentDocument()) return; } else { - ProjectSettings *w = new ProjectSettings(NULL, QStringList(), projectTracks.x(), projectTracks.y(), KdenliveSettings::defaultprojectfolder(), false, true, this); + ProjectSettings *w = new ProjectSettings(NULL, QMap (), QStringList(), projectTracks.x(), projectTracks.y(), KdenliveSettings::defaultprojectfolder(), false, true, this); if (w->exec() != QDialog::Accepted) return; if (!KdenliveSettings::activatetabs()) @@ -1848,15 +1887,16 @@ void MainWindow::newFile(bool showProjectSettings, bool force) documentProperties.insert("proxyextension", w->proxyExtension()); documentProperties.insert("generateimageproxy", QString::number((int) w->generateImageProxy())); documentProperties.insert("proxyimageminsize", QString::number(w->proxyImageMinSize())); + documentMetadata = w->metadata(); delete w; } m_timelineArea->setEnabled(true); m_projectList->setEnabled(true); bool openBackup; - KdenliveDoc *doc = new KdenliveDoc(KUrl(), projectFolder, m_commandStack, profileName, documentProperties, projectTracks, m_projectMonitor->render, m_notesWidget, &openBackup, this); + KdenliveDoc *doc = new KdenliveDoc(KUrl(), projectFolder, m_commandStack, profileName, documentProperties, documentMetadata, projectTracks, m_projectMonitor->render, m_notesWidget, &openBackup, this); doc->m_autosave = new KAutoSaveFile(KUrl(), doc); bool ok; - TrackView *trackView = new TrackView(doc, &ok, this); + TrackView *trackView = new TrackView(doc, m_tracksActionCollection->actions(), &ok, this); m_timelineArea->addTab(trackView, KIcon("kdenlive"), doc->description()); if (!ok) { // MLT is broken @@ -1946,9 +1986,10 @@ bool MainWindow::saveFileAs(const QString &outputFileName) // Save timeline thumbnails m_activeTimeline->projectView()->saveThumbnails(); m_activeDocument->setUrl(KUrl(outputFileName)); + QByteArray hash = QCryptographicHash::hash(KUrl(outputFileName).encodedPath(), QCryptographicHash::Md5).toHex(); if (m_activeDocument->m_autosave == NULL) { - m_activeDocument->m_autosave = new KAutoSaveFile(KUrl(outputFileName), this); - } else m_activeDocument->m_autosave->setManagedFile(KUrl(outputFileName)); + m_activeDocument->m_autosave = new KAutoSaveFile(KUrl(hash), this); + } else m_activeDocument->m_autosave->setManagedFile(KUrl(hash)); setCaption(m_activeDocument->description()); m_timelineArea->setTabText(m_timelineArea->currentIndex(), m_activeDocument->description()); m_timelineArea->setTabToolTip(m_timelineArea->currentIndex(), m_activeDocument->url().path()); @@ -2045,13 +2086,14 @@ void MainWindow::openFile(const KUrl &url) if (!KdenliveSettings::activatetabs()) if (!closeCurrentDocument()) return; // Check for backup file - QList staleFiles = KAutoSaveFile::staleFiles(url); + QByteArray hash = QCryptographicHash::hash(url.encodedPath(), QCryptographicHash::Md5).toHex(); + QList staleFiles = KAutoSaveFile::staleFiles(KUrl(hash)); if (!staleFiles.isEmpty()) { if (KMessageBox::questionYesNo(this, i18n("Auto-saved files exist. Do you want to recover them now?"), i18n("File Recovery"), KGuiItem(i18n("Recover")), KGuiItem(i18n("Don't recover"))) == KMessageBox::Yes) { - recoverFiles(staleFiles); + recoverFiles(staleFiles, url); return; } else { // remove the stale files @@ -2086,7 +2128,7 @@ void MainWindow::doOpenFile(const KUrl &url, KAutoSaveFile *stale) qApp->processEvents(); bool openBackup; - KdenliveDoc *doc = new KdenliveDoc(url, KdenliveSettings::defaultprojectfolder(), m_commandStack, KdenliveSettings::default_profile(), QMap (), QPoint(KdenliveSettings::videotracks(), KdenliveSettings::audiotracks()), m_projectMonitor->render, m_notesWidget, &openBackup, this, &progressDialog); + KdenliveDoc *doc = new KdenliveDoc(stale ? KUrl(stale->fileName()) : url, KdenliveSettings::defaultprojectfolder(), m_commandStack, KdenliveSettings::default_profile(), QMap (), QMap (), QPoint(KdenliveSettings::videotracks(), KdenliveSettings::audiotracks()), m_projectMonitor->render, m_notesWidget, &openBackup, this, &progressDialog); progressDialog.progressBar()->setValue(1); progressDialog.progressBar()->setMaximum(4); @@ -2094,11 +2136,12 @@ void MainWindow::doOpenFile(const KUrl &url, KAutoSaveFile *stale) qApp->processEvents(); if (stale == NULL) { - stale = new KAutoSaveFile(url, doc); + QByteArray hash = QCryptographicHash::hash(url.encodedPath(), QCryptographicHash::Md5).toHex(); + stale = new KAutoSaveFile(KUrl(hash), doc); doc->m_autosave = stale; } else { doc->m_autosave = stale; - doc->setUrl(stale->managedFile()); + doc->setUrl(url);//stale->managedFile()); doc->setModified(true); stale->setParent(doc); } @@ -2108,7 +2151,7 @@ void MainWindow::doOpenFile(const KUrl &url, KAutoSaveFile *stale) qApp->processEvents(); bool ok; - TrackView *trackView = new TrackView(doc, &ok, this); + TrackView *trackView = new TrackView(doc, m_tracksActionCollection->actions(), &ok, this); connectDocument(trackView, doc); progressDialog.progressBar()->setValue(3); qApp->processEvents(); @@ -2134,7 +2177,7 @@ void MainWindow::doOpenFile(const KUrl &url, KAutoSaveFile *stale) if (openBackup) slotOpenBackupDialog(url); } -void MainWindow::recoverFiles(QList staleFiles) +void MainWindow::recoverFiles(QList staleFiles, const KUrl &originUrl) { foreach(KAutoSaveFile * stale, staleFiles) { /*if (!stale->open(QIODevice::QIODevice::ReadOnly)) { @@ -2145,7 +2188,7 @@ void MainWindow::recoverFiles(QList staleFiles) }*/ kDebug() << "// OPENING RECOVERY: " << stale->fileName() << "\nMANAGED: " << stale->managedFile().path(); // the stalefiles also contain ".lock" files so we must ignore them... bug in KAutoSaveFile? - if (!stale->fileName().endsWith(".lock")) doOpenFile(KUrl(stale->fileName()), stale); + if (!stale->fileName().endsWith(".lock")) doOpenFile(originUrl, stale); else KIO::NetAccess::del(KUrl(stale->fileName()), this); } } @@ -2254,13 +2297,13 @@ void MainWindow::slotDetectAudioDriver() void MainWindow::slotEditProjectSettings() { QPoint p = m_activeDocument->getTracksCount(); - ProjectSettings *w = new ProjectSettings(m_projectList, m_activeTimeline->projectView()->extractTransitionsLumas(), p.x(), p.y(), m_activeDocument->projectFolder().path(), true, !m_activeDocument->isModified(), this); + 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); connect(w, SIGNAL(disableProxies()), this, SLOT(slotDisableProxies())); if (w->exec() == QDialog::Accepted) { QString profile = w->selectedProfile(); m_activeDocument->setProjectFolder(w->selectedFolder()); -#ifndef Q_WS_MAC +#ifndef Q_WS_MAC m_recMonitor->slotUpdateCaptureFolder(m_activeDocument->projectFolder().path(KUrl::AddTrailingSlash)); #endif if (m_renderWidget) m_renderWidget->setDocumentPath(m_activeDocument->projectFolder().path(KUrl::AddTrailingSlash)); @@ -2300,6 +2343,7 @@ void MainWindow::slotEditProjectSettings() m_activeDocument->setModified(); slotUpdateProxySettings(); } + m_activeDocument->setMetadata(w->metadata()); } delete w; } @@ -2351,7 +2395,9 @@ void MainWindow::slotRenderProject() { if (!m_renderWidget) { QString projectfolder = m_activeDocument ? m_activeDocument->projectFolder().path(KUrl::AddTrailingSlash) : KdenliveSettings::defaultprojectfolder(); - m_renderWidget = new RenderWidget(projectfolder, m_projectList->useProxy(), this); + MltVideoProfile profile; + if (m_activeDocument) profile = m_activeDocument->mltProfile(); + m_renderWidget = new RenderWidget(projectfolder, m_projectList->useProxy(), profile, this); connect(m_renderWidget, SIGNAL(shutdown()), this, SLOT(slotShutdown())); 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&))); @@ -2466,10 +2512,10 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha disconnect(m_activeTimeline->projectView(), SIGNAL(transitionItemSelected(Transition*, int, QPoint, bool)), m_projectMonitor, SLOT(slotSetSelectedClip(Transition*))); 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, const int)), m_clipMonitor, SLOT(slotSetClipProducer(DocClipBase *, QPoint, const int))); + 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_activeTimeline, SIGNAL(cursorMoved()), m_projectMonitor, SLOT(activateMonitor())); - disconnect(m_activeTimeline, SIGNAL(insertTrack(int)), this, SLOT(slotInsertTrack(int))); - disconnect(m_activeTimeline, SIGNAL(deleteTrack(int)), this, SLOT(slotDeleteTrack(int))); disconnect(m_activeTimeline, SIGNAL(configTrack(int)), this, SLOT(slotConfigTrack(int))); disconnect(m_activeDocument, SIGNAL(docModified(bool)), this, SLOT(slotUpdateDocumentState(bool))); disconnect(m_effectStack, SIGNAL(updateEffect(ClipItem*, int, QDomElement, QDomElement, int)), m_activeTimeline->projectView(), SLOT(slotUpdateClipEffect(ClipItem*, int, QDomElement, QDomElement, int))); @@ -2503,8 +2549,6 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha 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(insertTrack(int)), this, SLOT(slotInsertTrack(int))); - connect(trackView, SIGNAL(deleteTrack(int)), this, SLOT(slotDeleteTrack(int))); 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))); @@ -2542,11 +2586,13 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha connect(trackView, SIGNAL(setZoom(int)), this, SLOT(slotSetZoom(int))); connect(trackView->projectView(), SIGNAL(displayMessage(const QString&, MessageType)), m_messageLabel, SLOT(setMessage(const QString&, MessageType))); - connect(trackView->projectView(), SIGNAL(showClipFrame(DocClipBase *, QPoint, const int)), m_clipMonitor, SLOT(slotSetClipProducer(DocClipBase *, QPoint, const int))); + connect(trackView->projectView(), SIGNAL(showClipFrame(DocClipBase *, QPoint, bool, const int)), m_clipMonitor, SLOT(slotSetClipProducer(DocClipBase *, QPoint, bool, const int))); connect(trackView->projectView(), SIGNAL(playMonitor()), m_projectMonitor, SLOT(slotPlay())); connect(trackView->projectView(), SIGNAL(clipItemSelected(ClipItem*, int, bool)), m_projectMonitor, SLOT(slotSetSelectedClip(ClipItem*))); 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_effectStack, SIGNAL(updateEffect(ClipItem*, int, QDomElement, QDomElement, int)), trackView->projectView(), SLOT(slotUpdateClipEffect(ClipItem*, int, QDomElement, QDomElement, int))); connect(m_effectStack, SIGNAL(updateClipRegion(ClipItem*, int, QString)), trackView->projectView(), SLOT(slotUpdateClipRegion(ClipItem*, int, QString))); @@ -2563,9 +2609,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha connect(trackView->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(activateMonitor())); connect(trackView, SIGNAL(zoneMoved(int, int)), this, SLOT(slotZoneMoved(int, int))); connect(m_projectList, SIGNAL(loadingIsOver()), trackView->projectView(), SLOT(slotUpdateAllThumbs())); - - - trackView->projectView()->setContextMenu(m_timelineContextMenu, m_timelineContextClipMenu, m_timelineContextTransitionMenu, m_clipTypeGroup, (QMenu*)(factory()->container("marker_menu", this))); + trackView->projectView()->setContextMenu(m_timelineContextMenu, m_timelineContextClipMenu, m_timelineContextTransitionMenu, m_clipTypeGroup, static_cast(factory()->container("marker_menu", this))); m_activeTimeline = trackView; if (m_renderWidget) { slotCheckRenderStatus(); @@ -2589,7 +2633,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha m_activeDocument = doc; m_activeTimeline->updateProjectFps(); m_activeDocument->checkProjectClips(); -#ifndef Q_WS_MAC +#ifndef Q_WS_MAC m_recMonitor->slotUpdateCaptureFolder(m_activeDocument->projectFolder().path(KUrl::AddTrailingSlash)); #endif //Update the mouse position display so it will display in DF/NDF format by default based on the project setting. @@ -2616,6 +2660,7 @@ void MainWindow::slotEditKeys() KShortcutsDialog dialog(KShortcutsEditor::AllActions, KShortcutsEditor::LetterShortcutsAllowed, this); dialog.addCollection(actionCollection(), i18nc("general keyboard shortcuts", "General")); dialog.addCollection(m_effectsActionCollection, i18nc("effects and transitions keyboard shortcuts", "Effects & Transitions")); + dialog.addCollection(m_tracksActionCollection, i18nc("timeline track keyboard shortcuts", "Timeline and Tracks")); dialog.configure(); } @@ -2656,7 +2701,7 @@ void MainWindow::slotPreferences(int page, int option) void MainWindow::slotUpdateCaptureFolder() { -#ifndef Q_WS_MAC +#ifndef Q_WS_MAC if (m_activeDocument) m_recMonitor->slotUpdateCaptureFolder(m_activeDocument->projectFolder().path(KUrl::AddTrailingSlash)); else m_recMonitor->slotUpdateCaptureFolder(KdenliveSettings::defaultprojectfolder()); #endif @@ -2679,9 +2724,10 @@ void MainWindow::updateConfiguration() // Update list of transcoding profiles loadTranscoders(); -#ifndef NO_JOGSHUTTLE + loadStabilize(); +#ifdef USE_JOGSHUTTLE activateShuttleDevice(); -#endif /* NO_JOGSHUTTLE */ +#endif } @@ -2914,8 +2960,10 @@ void MainWindow::slotRemoveSpace() void MainWindow::slotInsertTrack(int ix) { m_projectMonitor->activateMonitor(); - if (m_activeTimeline) + if (m_activeTimeline) { + if (ix == -1) ix = m_activeTimeline->projectView()->selectedTrack(); m_activeTimeline->projectView()->slotInsertTrack(ix); + } if (m_activeDocument) m_transitionConfig->updateProjectFormat(m_activeDocument->mltProfile(), m_activeDocument->timecode(), m_activeDocument->tracksList()); } @@ -2923,8 +2971,10 @@ void MainWindow::slotInsertTrack(int ix) void MainWindow::slotDeleteTrack(int ix) { m_projectMonitor->activateMonitor(); - if (m_activeTimeline) + if (m_activeTimeline) { + if (ix == -1) ix = m_activeTimeline->projectView()->selectedTrack(); m_activeTimeline->projectView()->slotDeleteTrack(ix); + } if (m_activeDocument) m_transitionConfig->updateProjectFormat(m_activeDocument->mltProfile(), m_activeDocument->timecode(), m_activeDocument->tracksList()); } @@ -2938,6 +2988,21 @@ void MainWindow::slotConfigTrack(int ix) m_transitionConfig->updateProjectFormat(m_activeDocument->mltProfile(), m_activeDocument->timecode(), m_activeDocument->tracksList()); } +void MainWindow::slotSelectTrack() +{ + m_projectMonitor->activateMonitor(); + if (m_activeTimeline) { + m_activeTimeline->projectView()->slotSelectClipsInTrack(); + } +} + +void MainWindow::slotSelectAllTracks() +{ + m_projectMonitor->activateMonitor(); + if (m_activeTimeline) + m_activeTimeline->projectView()->slotSelectAllClips(); +} + void MainWindow::slotEditGuide() { if (m_activeTimeline) @@ -3024,10 +3089,10 @@ void MainWindow::slotEditItemDuration() m_activeTimeline->projectView()->editItemDuration(); } -void MainWindow::slotAddProjectClip(KUrl url) +void MainWindow::slotAddProjectClip(KUrl url, const QString &comment) { if (m_activeDocument) - m_activeDocument->slotAddClipFile(url, QString()); + m_activeDocument->slotAddClipFile(url, QString(), QString(), comment); } void MainWindow::slotAddProjectClipList(KUrl::List urls) @@ -3187,7 +3252,7 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip) else newprops.insert("templatetext", description); //newprops.insert("xmldata", m_projectList->generateTemplateXml(newtemplate, description).toString()); if (!newprops.isEmpty()) { - EditClipCommand *command = new EditClipCommand(m_projectList, clip->getId(), clip->properties(), newprops, true); + EditClipCommand *command = new EditClipCommand(m_projectList, clip->getId(), clip->currentProperties(newprops), newprops, true); m_activeDocument->commandStack()->push(command); } } @@ -3202,7 +3267,7 @@ 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()) - 1) { + if (dia_ui->outPoint() != clip->duration().frames(m_activeDocument->fps())) { // duration changed, we need to update duration newprops.insert("out", QString::number(dia_ui->outPoint())); int currentLength = QString(clip->producerProperty("length")).toInt(); @@ -3217,7 +3282,7 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip) dia_ui->saveTitle(path); } else newprops.insert("resource", QString()); } - EditClipCommand *command = new EditClipCommand(m_projectList, clip->getId(), clip->properties(), newprops, true); + EditClipCommand *command = new EditClipCommand(m_projectList, clip->getId(), clip->currentProperties(newprops), newprops, true); m_activeDocument->commandStack()->push(command); //m_activeTimeline->projectView()->slotUpdateClip(clip->getId()); m_activeDocument->setModified(true); @@ -3265,9 +3330,9 @@ void MainWindow::slotShowClipProperties(QList cliplist, QMapclipType() == IMAGE) - new EditClipCommand(m_projectList, clip->getId(), clip->properties(), newImageProps, true, command); + new EditClipCommand(m_projectList, clip->getId(), clip->currentProperties(newImageProps), newImageProps, true, command); else - new EditClipCommand(m_projectList, clip->getId(), clip->properties(), newProps, true, command); + new EditClipCommand(m_projectList, clip->getId(), clip->currentProperties(newProps), newProps, true, command); } m_activeDocument->commandStack()->push(command); for (int i = 0; i < cliplist.count(); i++) @@ -3685,7 +3750,7 @@ int MainWindow::getNewStuff(const QString &configFile) if (entry->status() == KNS::Entry::Installed) kDebug() << "// Installed files: " << entry->installedFiles(); } -#endif /* KDE_IS_VERSION(4,3,80) */ +#endif return entries.size(); } @@ -3773,10 +3838,34 @@ void MainWindow::slotMaximizeCurrent(bool) kDebug() << "CURRENT WIDGET: " << par->objectName(); } +void MainWindow::loadStabilize() +{ + QMenu* stabMenu= static_cast(factory()->container("stabilize", this)); + if (stabMenu){ + stabMenu->clear(); + Mlt::Profile profile; + if (Mlt::Factory::filter(profile,(char*)"videostab")){ + QAction *action=stabMenu->addAction("Videostab (vstab)"); + action->setData("videostab"); + connect(action,SIGNAL(triggered()), this, SLOT(slotStabilize())); + } + if (Mlt::Factory::filter(profile,(char*)"videostab2")){ + QAction *action=stabMenu->addAction("Videostab (transcode)"); + action->setData("videostab2"); + connect(action,SIGNAL(triggered()), this, SLOT(slotStabilize())); + } + } + + +} + void MainWindow::loadTranscoders() { QMenu *transMenu = static_cast(factory()->container("transcoders", this)); transMenu->clear(); + + QMenu *extractAudioMenu = static_cast(factory()->container("extract_audio", this)); + extractAudioMenu->clear(); KSharedConfigPtr config = KSharedConfig::openConfig("kdenlivetranscodingrc"); KConfigGroup transConfig(config, "Transcoding"); @@ -3785,15 +3874,50 @@ void MainWindow::loadTranscoders() QMapIterator i(profiles); while (i.hasNext()) { i.next(); - QStringList data = i.value().split(";", QString::SkipEmptyParts); - QAction *a = transMenu->addAction(i.key()); + QStringList data = i.value().split(";"); + QAction *a; + // separate audio transcoding in a separate menu + if (data.count() > 2 && data.at(2) == "audio") { + a = extractAudioMenu->addAction(i.key()); + } + else { + a = transMenu->addAction(i.key()); + } a->setData(data); - if (data.count() > 1) - a->setToolTip(data.at(1)); + if (data.count() > 1) a->setToolTip(data.at(1)); connect(a, SIGNAL(triggered()), this, SLOT(slotTranscode())); } } +void MainWindow::slotStabilize() +{ + QString condition,filtername; + QStringList ids; + + // Stablize selected clips + QAction *action = qobject_cast(sender()); + if (action){ + filtername=action->data().toString(); + } + m_projectList->startClipFilterJob(filtername, condition); + /* + if (ids.isEmpty()) { + m_messageLabel->setMessage(i18n("No clip to transcode"), ErrorMessage); + return; + } + QString destination; + ProjectItem *item = m_projectList->getClipById(ids.at(0)); + if (ids.count() == 1) { + + } + ClipStabilize *d = new ClipStabilize(destination, ids.count(), filtername); + //connect(d, SIGNAL(addClip(KUrl)), this, SLOT(slotAddProjectClip(KUrl))); + if (d->exec() == QDialog::Accepted) { + m_projectList->slotStabilizeClipJob(ids, d->autoAddClip(), d->params(), d->desc()); + } + delete d;*/ +} + void MainWindow::slotTranscode(KUrl::List urls) { QString params; @@ -3804,9 +3928,9 @@ void MainWindow::slotTranscode(KUrl::List urls) QStringList data = action->data().toStringList(); params = data.at(0); if (data.count() > 1) desc = data.at(1); - if (data.count() > 2) condition = data.at(2); - urls << m_projectList->getConditionalUrls(condition); - urls.removeAll(KUrl()); + if (data.count() > 3) condition = data.at(3); + m_projectList->slotTranscodeClipJob(condition, params, desc); + return; } if (urls.isEmpty()) { m_messageLabel->setMessage(i18n("No clip to transcode"), ErrorMessage); @@ -3815,7 +3939,6 @@ void MainWindow::slotTranscode(KUrl::List urls) ClipTranscode *d = new ClipTranscode(urls, params, desc); connect(d, SIGNAL(addClip(KUrl)), this, SLOT(slotAddProjectClip(KUrl))); d->show(); - //QProcess::startDetached("ffmpeg", parameters); } void MainWindow::slotTranscodeClip() @@ -3994,7 +4117,7 @@ void MainWindow::slotPrepareRendering(bool scriptExport, bool zoneOnly, const QS return; } file.close(); - m_renderWidget->slotExport(scriptExport, m_activeTimeline->inPoint(), m_activeTimeline->outPoint(), playlistPath, scriptPath, exportAudio); + m_renderWidget->slotExport(scriptExport, m_activeTimeline->inPoint(), m_activeTimeline->outPoint(), m_activeDocument->metadata(), playlistPath, scriptPath, exportAudio); } void MainWindow::slotUpdateTimecodeFormat(int ix) @@ -4314,7 +4437,6 @@ void MainWindow::slotDoUpdateAudioScopeFrameRequest() void MainWindow::slotUpdateColorScopes() { bool request = false; - kDebug()<<"// UPDATE SCOPES"; for (int i = 0; i < m_gfxScopesList.count(); i++) { // Check if we need the renderer to send a new frame for update if (!m_gfxScopesList.at(i)->widget()->visibleRegion().isEmpty() && !(static_cast(m_gfxScopesList.at(i)->widget())->autoRefreshEnabled())) request = true; @@ -4323,6 +4445,9 @@ void MainWindow::slotUpdateColorScopes() if (request && m_monitorManager->activeRenderer()) { m_monitorManager->activeRenderer()->sendFrameUpdate(); } + if (m_audiosignal->isVisible() && m_recMonitor->abstractRender()) { + connect(m_recMonitor->abstractRender(), SIGNAL(audioSamplesSignal(const QVector&, const int&, const int&, const int&)), m_audiosignal, SLOT(slotReceiveAudio(const QVector&, const int&, const int&, const int&))); + } } void MainWindow::slotClearColorScopes() @@ -4415,6 +4540,17 @@ void MainWindow::slotElapsedTime() kDebug()<<"-----------------------------------------\n"<<"Time elapsed: "<projectFolder().path(); + else currentFolder = KdenliveSettings::defaultprojectfolder(); + ResourceWidget *d = new ResourceWidget(currentFolder); + connect(d, SIGNAL(addClip(KUrl, const QString &)), this, SLOT(slotAddProjectClip(KUrl, const QString &))); + d->show(); +} + #include "mainwindow.moc" #ifdef DEBUG_MAINW