X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmainwindow.cpp;h=4e1d59a21a452471d6ee9ca922ad1a63c074d8b0;hb=ef3cf43058edf431c4ef7b235f8fef294d2bb5ee;hp=9927ddcf11f3d82bc6604f3da1c7a1deb1846c05;hpb=00d973b02051abac151f5b06214984e76b8cdbf1;p=kdenlive diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 9927ddcf..4e1d59a2 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -64,6 +64,7 @@ #include "audioscopes/spectrogram.h" #include "archivewidget.h" #include "databackup/backupwidget.h" +#include "utils/resourcewidget.h" #include @@ -114,6 +115,7 @@ #include #include +#include // Uncomment for deeper debugging //#define DEBUG_MAINW @@ -157,6 +159,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); @@ -212,16 +223,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"); @@ -236,6 +248,7 @@ 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 /* ! Q_WS_MAC */ m_monitorManager->initMonitors(m_clipMonitor, m_projectMonitor, m_recMonitor); @@ -257,6 +270,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"); @@ -465,6 +479,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) @@ -485,6 +502,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & clipInTimeline->setIcon(KIcon("go-jump")); QHash menus; menus.insert("addMenu",static_cast(factory()->container("generators", this))); + menus.insert("extractAudioMenu",static_cast(factory()->container("extract_audio", this))); menus.insert("transcodeMenu",static_cast(factory()->container("transcoders", this))); menus.insert("stabilizeMenu",static_cast(factory()->container("stabilize", this))); menus.insert("inTimelineMenu",clipInTimeline); @@ -1527,18 +1545,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(m_tracksActionCollection, 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())); @@ -1624,6 +1653,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); @@ -1667,6 +1700,7 @@ void MainWindow::setupActions() addClips->addAction(addTitleClip); addClips->addAction(addTitleTemplateClip); addClips->addAction(addFolderButton); + addClips->addAction(downloadResources); addClips->addAction(reloadClip); addClips->addAction(proxyClip); @@ -1827,13 +1861,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()) @@ -1853,15 +1888,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 @@ -1951,9 +1987,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()); @@ -2050,13 +2087,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 @@ -2091,7 +2129,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); @@ -2099,11 +2137,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); } @@ -2113,7 +2152,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(); @@ -2139,7 +2178,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)) { @@ -2150,7 +2189,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); } } @@ -2259,7 +2298,7 @@ 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) { @@ -2305,6 +2344,7 @@ void MainWindow::slotEditProjectSettings() m_activeDocument->setModified(); slotUpdateProxySettings(); } + m_activeDocument->setMetadata(w->metadata()); } delete w; } @@ -2473,10 +2513,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))); @@ -2510,8 +2550,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))); @@ -2549,11 +2587,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))); @@ -2570,9 +2610,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(); @@ -2623,6 +2661,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(); } @@ -2686,7 +2725,7 @@ void MainWindow::updateConfiguration() // Update list of transcoding profiles loadTranscoders(); - loadStabilize(); + loadStabilize(); #ifdef USE_JOGSHUTTLE activateShuttleDevice(); #endif @@ -2922,8 +2961,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()); } @@ -2931,8 +2972,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()); } @@ -2946,6 +2989,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) @@ -3032,10 +3090,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) @@ -3195,7 +3253,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); } } @@ -3210,7 +3268,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(); @@ -3225,7 +3283,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); @@ -3273,9 +3331,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++) @@ -3784,17 +3842,19 @@ void MainWindow::slotMaximizeCurrent(bool) void MainWindow::loadStabilize() { QMenu* stabMenu= static_cast(factory()->container("stabilize", this)); - 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())); + 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())); + } } @@ -3804,6 +3864,9 @@ 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"); @@ -3812,25 +3875,31 @@ 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(KUrl::List urls) { - QString condition,filtername; + QString condition,filtername; - if (urls.isEmpty()) { + if (urls.isEmpty()) { QAction *action = qobject_cast(sender()); - if (action){ - filtername=action->data().toString(); - urls = m_projectList->getConditionalUrls(condition); - } + if (action){ + filtername=action->data().toString(); + urls = m_projectList->getConditionalUrls(condition); + } } if (urls.isEmpty()) { m_messageLabel->setMessage(i18n("No clip to transcode"), ErrorMessage); @@ -3854,9 +3923,10 @@ 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); + QStringList ids = m_projectList->getConditionalIds(condition); + m_projectList->slotTranscodeClipJob(ids, params, desc); + return; } if (urls.isEmpty()) { m_messageLabel->setMessage(i18n("No clip to transcode"), ErrorMessage); @@ -3865,7 +3935,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() @@ -4044,7 +4113,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) @@ -4364,7 +4433,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; @@ -4373,6 +4441,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() @@ -4465,6 +4536,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