X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmainwindow.cpp;h=5a76ffb38f6137b627d8aa703e9850fef055b48e;hb=e0a70e0428309070f6ed2716beaeaaba05edd3b5;hp=54ed5506ede8a1c314a74fde015101250268dd28;hpb=8094288cefb96c161d2bdbfc6ace594530ec16bc;p=kdenlive diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 54ed5506..5a76ffb3 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -47,7 +47,7 @@ #endif /* NO_JOGSHUTTLE */ #include "clipproperties.h" #include "wizard.h" -#include "editclipcommand.h" +#include "commands/editclipcommand.h" #include "titlewidget.h" #include "markerdialog.h" #include "clipitem.h" @@ -64,6 +64,7 @@ #include "archivewidget.h" #include "databackup/backupwidget.h" + #include #include #include @@ -87,19 +88,12 @@ #include #include #include -#include #include #include #include #include -#if KDE_IS_VERSION(4,3,80) #include #include -#else -#include -#include -#define KNS3 KNS -#endif /* KDE_IS_VERSION(4,3,80) */ #include #include #include @@ -131,6 +125,7 @@ class Producer; Q_DECLARE_METATYPE(QVector) + EffectsList MainWindow::videoEffects; EffectsList MainWindow::audioEffects; EffectsList MainWindow::customEffects; @@ -148,14 +143,21 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & #endif /* NO_JOGSHUTTLE */ m_findActivated(false), m_stopmotion(NULL) -{ +{ qRegisterMetaType > (); + qRegisterMetaType ("stringMap"); + qRegisterMetaType ("audioByteArray"); + + // Init locale + QLocale systemLocale = QLocale(); + systemLocale.setNumberOptions(QLocale::OmitGroupSeparator); + QLocale::setDefault(systemLocale); + // Create DBus interface new MainWindowAdaptor(this); QDBusConnection dbus = QDBusConnection::sessionBus(); dbus.registerObject("/MainWindow", this); - setlocale(LC_NUMERIC, "POSIX"); if (!KdenliveSettings::colortheme().isEmpty()) slotChangePalette(NULL, KdenliveSettings::colortheme()); setFont(KGlobalSettings::toolBarFont()); parseProfiles(MltPath); @@ -174,7 +176,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & closeTabButton->adjustSize(); closeTabButton->setToolTip(i18n("Close the current tab")); m_timelineArea->setCornerWidget(closeTabButton); - connect(m_timelineArea, SIGNAL(currentChanged(int)), this, SLOT(activateDocument())); + //connect(m_timelineArea, SIGNAL(currentChanged(int)), this, SLOT(activateDocument())); connect(&m_findTimer, SIGNAL(timeout()), this, SLOT(findTimeout())); m_findTimer.setSingleShot(true); @@ -201,7 +203,9 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & m_clipMonitorDock->setObjectName("clip_monitor"); m_clipMonitor = new Monitor("clip", m_monitorManager, QString(), m_timelineArea); m_clipMonitorDock->setWidget(m_clipMonitor); - + connect(m_projectList, SIGNAL(clipSelected(DocClipBase *, QPoint)), m_clipMonitor, SLOT(slotSetClipProducer(DocClipBase *, QPoint))); + connect(m_projectList, SIGNAL(raiseClipMonitor()), m_clipMonitor, SLOT(activateMonitor())); + m_projectMonitorDock = new QDockWidget(i18n("Project Monitor"), this); m_projectMonitorDock->setObjectName("project_monitor"); m_projectMonitor = new Monitor("project", m_monitorManager, QString()); @@ -213,6 +217,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & m_recMonitor = new RecMonitor("record", m_monitorManager); m_recMonitorDock->setWidget(m_recMonitor); 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 m_monitorManager->initMonitors(m_clipMonitor, m_projectMonitor, m_recMonitor); @@ -224,9 +229,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & connect(m_notesWidget, SIGNAL(seekProject(int)), m_projectMonitor->render, SLOT(seekToFrame(int))); m_notesWidget->setTabChangesFocus(true); -#if KDE_IS_VERSION(4,4,0) m_notesWidget->setClickMessage(i18n("Enter your project notes here ...")); -#endif m_notesDock->setWidget(m_notesWidget); addDockWidget(Qt::TopDockWidgetArea, m_notesDock); @@ -358,6 +361,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & setupActions(); + connect(m_commandStack, SIGNAL(cleanChanged(bool)), m_saveAction, SLOT(setDisabled(bool))); // Close non-general docks for the initial layout @@ -564,7 +568,6 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & connect(m_projectMonitorDock, SIGNAL(visibilityChanged(bool)), m_projectMonitor, SLOT(refreshMonitor(bool))); connect(m_clipMonitorDock, SIGNAL(visibilityChanged(bool)), m_clipMonitor, SLOT(refreshMonitor(bool))); //connect(m_monitorManager, SIGNAL(connectMonitors()), this, SLOT(slotConnectMonitors())); - connect(m_monitorManager, SIGNAL(raiseMonitor(AbstractMonitor *)), this, SLOT(slotRaiseMonitor(AbstractMonitor *))); connect(m_monitorManager, SIGNAL(checkColorScopes()), this, SLOT(slotUpdateColorScopes())); connect(m_monitorManager, SIGNAL(clearScopes()), this, SLOT(slotClearColorScopes())); connect(m_effectList, SIGNAL(addEffect(const QDomElement)), this, SLOT(slotAddEffect(const QDomElement))); @@ -602,6 +605,42 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & actionCollection()->addAssociatedWidget(m_clipMonitor->container()); actionCollection()->addAssociatedWidget(m_projectMonitor->container()); + + // Populate encoding profiles + KConfig conf("encodingprofiles.rc", KConfig::FullConfig, "appdata"); + if (KdenliveSettings::proxyparams().isEmpty()) { + KConfigGroup group(&conf, "proxy"); + QMap< QString, QString > values = group.entryMap(); + QMapIterator i(values); + if (i.hasNext()) { + i.next(); + QString data = i.value(); + KdenliveSettings::setProxyparams(data.section(';', 0, 0)); + KdenliveSettings::setProxyextension(data.section(';', 1, 1)); + } + } + if (KdenliveSettings::v4l_parameters().isEmpty()) { + KConfigGroup group(&conf, "video4linux"); + QMap< QString, QString > values = group.entryMap(); + QMapIterator i(values); + if (i.hasNext()) { + i.next(); + QString data = i.value(); + KdenliveSettings::setV4l_parameters(data.section(';', 0, 0)); + KdenliveSettings::setV4l_extension(data.section(';', 1, 1)); + } + } + if (KdenliveSettings::decklink_parameters().isEmpty()) { + KConfigGroup group(&conf, "decklink"); + QMap< QString, QString > values = group.entryMap(); + QMapIterator i(values); + if (i.hasNext()) { + i.next(); + QString data = i.value(); + KdenliveSettings::setDecklink_parameters(data.section(';', 0, 0)); + KdenliveSettings::setDecklink_extension(data.section(';', 1, 1)); + } + } } MainWindow::~MainWindow() @@ -827,30 +866,31 @@ void MainWindow::slotAddEffect(const QDomElement effect) else m_activeTimeline->projectView()->slotAddEffect(effectToAdd, GenTime(), -1); } -void MainWindow::slotRaiseMonitor(AbstractMonitor *monitor) -{ - if (monitor == m_clipMonitor) m_clipMonitorDock->raise(); - else if (monitor == m_projectMonitor) m_projectMonitorDock->raise(); -} - void MainWindow::slotUpdateClip(const QString &id) { if (!m_activeDocument) return; - m_activeTimeline->projectView()->slotUpdateClip(id); + DocClipBase *clip = m_activeDocument->clipManager()->getClipById(id); + if (!clip) return; + if (clip->numReferences() > 0) m_activeTimeline->projectView()->slotUpdateClip(id); + if (m_clipMonitor->activeClip() && m_clipMonitor->activeClip()->getId() == id) { + Mlt::Producer *monitorProducer = clip->getCloneProducer(); + m_clipMonitor->updateClipProducer(monitorProducer); + } + clip->cleanupProducers(); } void MainWindow::slotConnectMonitors() { m_projectList->setRenderer(m_projectMonitor->render); - //connect(m_projectList, SIGNAL(receivedClipDuration(const QString &)), this, SLOT(slotUpdateClip(const QString &))); 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_projectList, SIGNAL(getFileProperties(const QDomElement, const QString &, int, bool, bool)), m_projectMonitor->render, SLOT(getFileProperties(const QDomElement, const QString &, int, bool, bool))); - connect(m_projectMonitor->render, SIGNAL(replyGetImage(const QString &, const QPixmap &)), m_projectList, SLOT(slotReplyGetImage(const QString &, const QPixmap &))); - connect(m_projectMonitor->render, SIGNAL(replyGetFileProperties(const QString &, Mlt::Producer*, const QMap < QString, QString > &, const QMap < QString, QString > &, bool, bool)), m_projectList, SLOT(slotReplyGetFileProperties(const QString &, Mlt::Producer*, const QMap < QString, QString > &, const QMap < QString, QString > &, bool, bool))); + 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 &))); + connect(m_projectMonitor->render, SIGNAL(replyGetFileProperties(const QString &, Mlt::Producer*, const stringMap &, const stringMap &, bool)), m_projectList, SLOT(slotReplyGetFileProperties(const QString &, Mlt::Producer*, const stringMap &, const stringMap &, bool))); connect(m_projectMonitor->render, SIGNAL(removeInvalidClip(const QString &, bool)), m_projectList, SLOT(slotRemoveInvalidClip(const QString &, bool))); + connect(m_projectMonitor->render, SIGNAL(removeInvalidProxy(const QString &, bool)), m_projectList, SLOT(slotRemoveInvalidProxy(const QString &, bool))); connect(m_clipMonitor, SIGNAL(refreshClipThumbnail(const QString &, bool)), m_projectList, SLOT(slotRefreshClipThumbnail(const QString &, bool))); @@ -860,8 +900,8 @@ void MainWindow::slotConnectMonitors() connect(m_projectMonitor, SIGNAL(requestFrameForAnalysis(bool)), this, SLOT(slotMonitorRequestRenderFrame(bool))); - connect(m_clipMonitor, SIGNAL(saveZone(Render *, QPoint)), this, SLOT(slotSaveZone(Render *, QPoint))); - connect(m_projectMonitor, SIGNAL(saveZone(Render *, QPoint)), this, SLOT(slotSaveZone(Render *, QPoint))); + connect(m_clipMonitor, SIGNAL(saveZone(Render *, QPoint, DocClipBase *)), this, SLOT(slotSaveZone(Render *, QPoint, DocClipBase *))); + connect(m_projectMonitor, SIGNAL(saveZone(Render *, QPoint, DocClipBase *)), this, SLOT(slotSaveZone(Render *, QPoint, DocClipBase *))); } void MainWindow::slotAdjustClipMonitor() @@ -1587,6 +1627,13 @@ void MainWindow::setupActions() connect(reloadClip , SIGNAL(triggered()), m_projectList, SLOT(slotReloadClip())); reloadClip->setEnabled(false); + QAction *proxyClip = new KAction(i18n("Proxy Clip"), this); + collection.addAction("proxy_clip", proxyClip); + proxyClip->setData("proxy_clip"); + proxyClip->setCheckable(true); + proxyClip->setChecked(false); + connect(proxyClip, SIGNAL(toggled(bool)), m_projectList, SLOT(slotProxyCurrentItem(bool))); + QAction *stopMotion = new KAction(KIcon("image-x-generic"), i18n("Stop Motion Capture"), this); collection.addAction("stopmotion", stopMotion); connect(stopMotion , SIGNAL(triggered()), this, SLOT(slotOpenStopmotion())); @@ -1600,6 +1647,7 @@ void MainWindow::setupActions() addClips->addAction(addFolderButton); addClips->addAction(reloadClip); + addClips->addAction(proxyClip); addClips->addAction(clipProperties); addClips->addAction(openClip); addClips->addAction(deleteClip); @@ -1759,14 +1807,6 @@ void MainWindow::newFile(bool showProjectSettings, bool force) QMap documentProperties; QPoint projectTracks(KdenliveSettings::videotracks(), KdenliveSettings::audiotracks()); if (!showProjectSettings) { - // set up default properties - documentProperties.insert("enableproxy", QString::number((int) KdenliveSettings::enableproxy())); - documentProperties.insert("generateproxy", QString::number((int) KdenliveSettings::generateproxy())); - documentProperties.insert("proxyminsize", QString::number(KdenliveSettings::proxyminsize())); - documentProperties.insert("proxyparams", KdenliveSettings::proxyparams()); - documentProperties.insert("proxyextension", KdenliveSettings::proxyextension()); - documentProperties.insert("generateimageproxy", QString::number((int) KdenliveSettings::generateimageproxy())); - documentProperties.insert("proxyimageminsize", QString::number(KdenliveSettings::proxyimageminsize())); if (!KdenliveSettings::activatetabs()) if (!closeCurrentDocument()) return; @@ -1854,7 +1894,8 @@ bool MainWindow::closeCurrentDocument(bool saveChanges) break; } } - m_clipMonitor->slotSetXml(NULL); + m_clipMonitor->slotSetClipProducer(NULL); + m_projectList->slotResetProjectList(); m_timelineArea->removeTab(m_timelineArea->indexOf(w)); if (m_timelineArea->count() == 1) { m_timelineArea->setTabBarHidden(true); @@ -1897,6 +1938,7 @@ bool MainWindow::saveFileAs(const QString &outputFileName) m_activeDocument->setModified(false); m_fileOpenRecent->addUrl(KUrl(outputFileName)); m_fileRevert->setEnabled(true); + m_undoView->stack()->setClean(); return true; } @@ -1960,6 +2002,11 @@ void MainWindow::openFile(const KUrl &url) delete ar; return; } + if (!url.fileName().endsWith(".kdenlive")) { + // This is not a Kdenlive project file, abort loading + KMessageBox::sorry(this, i18n("File %1 is not a Kdenlive project file", url.path())); + return; + } // Check if the document is already opened const int ct = m_timelineArea->count(); @@ -2012,7 +2059,8 @@ void MainWindow::doOpenFile(const KUrl &url, KAutoSaveFile *stale) delete m_stopmotion; m_stopmotion = NULL; } - + + m_timer.start(); KProgressDialog progressDialog(this, i18n("Loading project"), i18n("Loading project")); progressDialog.setAllowCancel(false); progressDialog.progressBar()->setMaximum(4); @@ -2044,7 +2092,7 @@ void MainWindow::doOpenFile(const KUrl &url, KAutoSaveFile *stale) bool ok; TrackView *trackView = new TrackView(doc, &ok, this); - + connectDocument(trackView, doc); progressDialog.progressBar()->setValue(3); qApp->processEvents(); @@ -2065,8 +2113,6 @@ void MainWindow::doOpenFile(const KUrl &url, KAutoSaveFile *stale) slotGotProgressInfo(QString(), -1); m_projectMonitor->adjustRulerSize(trackView->duration()); m_projectMonitor->slotZoneMoved(trackView->inPoint(), trackView->outPoint()); - m_clipMonitor->refreshMonitor(true); - progressDialog.progressBar()->setValue(4); if (openBackup) slotOpenBackupDialog(url); } @@ -2192,6 +2238,7 @@ 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); + connect(w, SIGNAL(disableProxies()), this, SLOT(slotDisableProxies())); if (w->exec() == QDialog::Accepted) { QString profile = w->selectedProfile(); @@ -2240,6 +2287,13 @@ void MainWindow::slotEditProjectSettings() delete w; } +void MainWindow::slotDisableProxies() +{ + m_activeDocument->setDocumentProperty("enableproxy", QString::number((int) false)); + m_activeDocument->setModified(); + slotUpdateProxySettings(); +} + void MainWindow::slotUpdateProjectProfile(const QString &profile) { // Recreate the stopmotion widget if profile changes @@ -2251,7 +2305,7 @@ void MainWindow::slotUpdateProjectProfile(const QString &profile) // Deselect current effect / transition m_effectStack->slotClipItemSelected(NULL, 0); m_transitionConfig->slotTransitionItemSelected(NULL, 0, QPoint(), false); - m_clipMonitor->slotSetXml(NULL); + m_clipMonitor->slotSetClipProducer(NULL); bool updateFps = m_activeDocument->setProfilePath(profile); KdenliveSettings::setCurrent_profile(profile); KdenliveSettings::setProject_fps(m_activeDocument->fps()); @@ -2265,6 +2319,8 @@ void MainWindow::slotUpdateProjectProfile(const QString &profile) if (m_renderWidget) m_renderWidget->setProfile(m_activeDocument->mltProfile()); m_timelineArea->setTabText(m_timelineArea->currentIndex(), m_activeDocument->description()); if (updateFps) m_activeTimeline->updateProjectFps(); + m_activeDocument->clipManager()->clearCache(); + m_activeTimeline->updateProfile(); m_activeDocument->setModified(true); m_commandStack->activeStack()->clear(); //Update the mouse position display so it will display in DF/NDF format by default based on the project setting. @@ -2378,7 +2434,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha disconnect(m_projectList, SIGNAL(projectModified()), m_activeDocument, SLOT(setModified())); disconnect(m_projectList, SIGNAL(updateProfile(const QString &)), this, SLOT(slotUpdateProjectProfile(const QString &))); - disconnect(m_projectMonitor->render, SIGNAL(refreshDocumentProducers(bool)), m_activeDocument, SLOT(checkProjectClips(bool))); + disconnect(m_projectMonitor->render, SIGNAL(refreshDocumentProducers(bool, bool)), m_activeDocument, SLOT(checkProjectClips(bool, bool))); disconnect(m_activeDocument, SIGNAL(guidesUpdated()), this, SLOT(slotGuidesUpdated())); disconnect(m_activeDocument, SIGNAL(addProjectClip(DocClipBase *, bool)), m_projectList, SLOT(slotAddClip(DocClipBase *, bool))); @@ -2394,7 +2450,7 @@ 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(slotSetXml(DocClipBase *, QPoint, const int))); + disconnect(m_activeTimeline->projectView(), SIGNAL(showClipFrame(DocClipBase *, QPoint, const int)), m_clipMonitor, SLOT(slotSetClipProducer(DocClipBase *, QPoint, const int))); 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))); @@ -2414,25 +2470,24 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha disconnect(m_projectList, SIGNAL(loadingIsOver()), m_activeTimeline->projectView(), SLOT(slotUpdateAllThumbs())); disconnect(m_projectList, SIGNAL(displayMessage(const QString&, int)), this, SLOT(slotGotProgressInfo(const QString&, int))); disconnect(m_projectList, SIGNAL(updateRenderStatus()), this, SLOT(slotCheckRenderStatus())); - disconnect(m_projectList, SIGNAL(clipNeedsReload(const QString&, bool)), m_activeTimeline->projectView(), SLOT(slotUpdateClip(const QString &, bool))); + disconnect(m_projectList, SIGNAL(clipNeedsReload(const QString&)), this, SLOT(slotUpdateClip(const QString &))); disconnect(m_projectList, SIGNAL(refreshClip(const QString &)), m_activeTimeline->projectView(), SLOT(slotRefreshThumbs(const QString &))); m_effectStack->clear(); } //m_activeDocument->setRenderer(NULL); - disconnect(m_projectList, SIGNAL(clipSelected(DocClipBase *)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *))); disconnect(m_projectList, SIGNAL(refreshClip(const QString &, bool)), m_monitorManager, SLOT(slotRefreshCurrentMonitor())); m_clipMonitor->stop(); } KdenliveSettings::setCurrent_profile(doc->profilePath()); KdenliveSettings::setProject_fps(doc->fps()); m_monitorManager->resetProfiles(doc->timecode()); + m_clipMonitorDock->raise(); m_projectList->setDocument(doc); m_transitionConfig->updateProjectFormat(doc->mltProfile(), doc->timecode(), doc->tracksList()); m_effectStack->updateProjectFormat(doc->mltProfile(), doc->timecode()); - connect(m_projectList, SIGNAL(clipSelected(DocClipBase *, QPoint)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *, QPoint))); connect(m_projectList, SIGNAL(refreshClip(const QString &, bool)), m_monitorManager, SLOT(slotRefreshCurrentMonitor())); connect(m_projectList, SIGNAL(refreshClip(const QString &, bool)), trackView->projectView(), SLOT(slotRefreshThumbs(const QString &, bool))); - connect(m_projectList, SIGNAL(clipNeedsReload(const QString&, bool)), trackView->projectView(), SLOT(slotUpdateClip(const QString &, bool))); + connect(m_projectList, SIGNAL(clipNeedsReload(const QString&)),this, SLOT(slotUpdateClip(const QString &))); connect(m_projectList, SIGNAL(projectModified()), doc, SLOT(setModified())); connect(m_projectList, SIGNAL(updateProfile(const QString &)), this, SLOT(slotUpdateProjectProfile(const QString &))); @@ -2454,7 +2509,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha connect(m_projectMonitor, SIGNAL(zoneUpdated(QPoint)), doc, SLOT(setModified())); connect(m_clipMonitor, SIGNAL(zoneUpdated(QPoint)), doc, SLOT(setModified())); connect(m_projectMonitor, SIGNAL(durationChanged(int)), trackView, SLOT(setDuration(int))); - connect(m_projectMonitor->render, SIGNAL(refreshDocumentProducers(bool)), doc, SLOT(checkProjectClips(bool))); + connect(m_projectMonitor->render, SIGNAL(refreshDocumentProducers(bool, bool)), doc, SLOT(checkProjectClips(bool, bool))); connect(doc, SIGNAL(addProjectClip(DocClipBase *, bool)), m_projectList, SLOT(slotAddClip(DocClipBase *, bool))); connect(doc, SIGNAL(resetProjectList()), m_projectList, SLOT(slotResetProjectList())); @@ -2464,7 +2519,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha connect(doc, SIGNAL(docModified(bool)), this, SLOT(slotUpdateDocumentState(bool))); connect(doc, SIGNAL(guidesUpdated()), this, SLOT(slotGuidesUpdated())); - connect(doc, SIGNAL(saveTimelinePreview(const QString)), trackView->projectView(), SLOT(saveTimelinePreview(const QString))); + connect(doc, SIGNAL(saveTimelinePreview(const QString &)), trackView, SLOT(slotSaveTimelinePreview(const QString))); connect(m_notesWidget, SIGNAL(textChanged()), doc, SLOT(setModified())); @@ -2482,7 +2537,7 @@ 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(slotSetXml(DocClipBase *, QPoint, const int))); + connect(trackView->projectView(), SIGNAL(showClipFrame(DocClipBase *, QPoint, const int)), m_clipMonitor, SLOT(slotSetClipProducer(DocClipBase *, QPoint, const int))); connect(trackView->projectView(), SIGNAL(playMonitor()), m_projectMonitor, SLOT(slotPlay())); connect(trackView->projectView(), SIGNAL(clipItemSelected(ClipItem*, int, bool)), m_projectMonitor, SLOT(slotSetSelectedClip(ClipItem*))); @@ -2503,6 +2558,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())); + 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())); @@ -2536,6 +2592,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha #endif //Update the mouse position display so it will display in DF/NDF format by default based on the project setting. slotUpdateMousePosition(0); + m_monitorManager->activateMonitor("clip"); // set tool to select tool m_buttonSelectTool->setChecked(true); } @@ -2609,7 +2666,7 @@ void MainWindow::updateConfiguration() if (m_activeTimeline) { m_activeTimeline->refresh(); m_activeTimeline->projectView()->checkAutoScroll(); - m_activeTimeline->projectView()->checkTrackHeight(); + m_activeTimeline->checkTrackHeight(); if (m_activeDocument) m_activeDocument->clipManager()->checkAudioThumbs(); } @@ -2971,6 +3028,12 @@ void MainWindow::slotAddProjectClip(KUrl url) m_activeDocument->slotAddClipFile(url, QString()); } +void MainWindow::slotAddProjectClipList(KUrl::List urls) +{ + if (m_activeDocument) + m_activeDocument->slotAddClipList(urls, QString()); +} + void MainWindow::slotAddTransition(QAction *result) { if (!result) return; @@ -3166,6 +3229,7 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip) // any type of clip but a title ClipProperties *dia = new ClipProperties(clip, m_activeDocument->timecode(), m_activeDocument->fps(), this); connect(dia, SIGNAL(addMarker(const QString &, GenTime, QString)), m_activeTimeline->projectView(), SLOT(slotAddClipMarker(const QString &, GenTime, 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(); } @@ -3511,7 +3575,7 @@ bool MainWindow::eventFilter(QObject *obj, QEvent *event) } -void MainWindow::slotSaveZone(Render *render, QPoint zone) +void MainWindow::slotSaveZone(Render *render, QPoint zone, DocClipBase *baseClip, KUrl path) { KDialog *dialog = new KDialog(this); dialog->setCaption("Save clip zone"); @@ -3522,9 +3586,15 @@ void MainWindow::slotSaveZone(Render *render, QPoint zone) QVBoxLayout *vbox = new QVBoxLayout(widget); QLabel *label1 = new QLabel(i18n("Save clip zone as:"), this); - QString path = m_activeDocument->projectFolder().path(KUrl::AddTrailingSlash); - path.append("untitled.mlt"); - KUrlRequester *url = new KUrlRequester(KUrl(path), this); + if (path.isEmpty()) { + 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"); + } + path = KUrl(tmppath); + } + KUrlRequester *url = new KUrlRequester(path, this); url->setFilter("video/mlt-playlist"); QLabel *label2 = new QLabel(i18n("Description:"), this); KLineEdit *edit = new KLineEdit(this); @@ -3532,8 +3602,35 @@ void MainWindow::slotSaveZone(Render *render, QPoint zone) vbox->addWidget(url); vbox->addWidget(label2); vbox->addWidget(edit); - if (dialog->exec() == QDialog::Accepted) - render->saveZone(url->url(), edit->text(), zone); + if (dialog->exec() == QDialog::Accepted) { + if (QFile::exists(url->url().path())) { + if (KMessageBox::questionYesNo(this, i18n("File %1 already exists.\nDo you want to overwrite it?", url->url().path())) == KMessageBox::No) { + slotSaveZone(render, zone, baseClip, url->url()); + return; + } + } + if (baseClip && !baseClip->fileURL().isEmpty()) { + // create zone from clip url, so that we don't have problems with proxy clips + QProcess p; +#if QT_VERSION >= 0x040600 + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); + env.remove("MLT_PROFILE"); + p.setProcessEnvironment(env); +#else + QStringList env = QProcess::systemEnvironment(); + env << "MLT_PROFILE='\0'"; + p.setEnvironment(env); +#endif + p.start(KdenliveSettings::rendererpath(), QStringList() << baseClip->fileURL().path() << "in=" + QString::number(zone.x()) << "out=" + QString::number(zone.y()) << "-consumer" << "xml:" + url->url().path()); + if (!p.waitForStarted(3000)) { + KMessageBox::sorry(this, i18n("Cannot start MLT's renderer:\n%1", KdenliveSettings::rendererpath())); + } + else if (!p.waitForFinished(5000)) { + KMessageBox::sorry(this, i18n("Timeout while creating xml output")); + } + } + else render->saveZone(url->url(), edit->text(), zone); + } } @@ -3570,7 +3667,6 @@ void MainWindow::slotResizeItemEnd() 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(); @@ -3578,15 +3674,6 @@ int MainWindow::getNewStuff(const QString &configFile) if (entry.status() == KNS3::Entry::Installed) kDebug() << "// Installed files: " << entry.installedFiles(); } -#else - KNS::Engine engine(0); - if (engine.init(configFile)) - entries = engine.downloadDialogModal(this); - foreach(KNS::Entry * entry, entries) { - if (entry->status() == KNS::Entry::Installed) - kDebug() << "// Installed files: " << entry->installedFiles(); - } -#endif /* KDE_IS_VERSION(4,3,80) */ return entries.size(); } @@ -3818,11 +3905,23 @@ void MainWindow::slotPrepareRendering(bool scriptExport, bool zoneOnly, const QS if (m_renderWidget->automaticAudioExport()) { exportAudio = m_activeTimeline->checkProjectAudio(); } else exportAudio = m_renderWidget->selectedAudioExport(); + + // Set playlist audio volume to 100% + QDomDocument doc; + doc.setContent(playlistContent); + QDomElement tractor = doc.documentElement().firstChildElement("tractor"); + if (!tractor.isNull()) { + QDomNodeList props = tractor.elementsByTagName("property"); + for (int i = 0; i < props.count(); i++) { + if (props.at(i).toElement().attribute("name") == "meta.volume") { + props.at(i).firstChild().setNodeValue("1"); + break; + } + } + } // Do we want proxy rendering if (m_projectList->useProxy() && !m_renderWidget->proxyRendering()) { - QDomDocument doc; - doc.setContent(playlistContent); QString root = doc.documentElement().attribute("root"); // replace proxy clips with originals @@ -3850,6 +3949,7 @@ void MainWindow::slotPrepareRendering(bool scriptExport, bool zoneOnly, const QS // We need to delete the "aspect_ratio" property because proxy clips // sometimes have different ratio than original clips EffectsList::removeProperty(e, "aspect_ratio"); + EffectsList::removeMetaProperties(e); } } } @@ -3866,8 +3966,8 @@ void MainWindow::slotPrepareRendering(bool scriptExport, bool zoneOnly, const QS playlistContent.replace(key, i.value()); } }*/ - playlistContent = doc.toString(); } + playlistContent = doc.toString(); // Do save scenelist QFile file(playlistPath); @@ -4208,7 +4308,7 @@ void MainWindow::slotUpdateColorScopes() if (!m_gfxScopesList.at(i)->widget()->visibleRegion().isEmpty() && !(static_cast(m_gfxScopesList.at(i)->widget())->autoRefreshEnabled())) request = true; static_cast(m_gfxScopesList.at(i)->widget())->slotActiveMonitorChanged(); } - if (request) { + if (request && m_monitorManager->activeRenderer()) { m_monitorManager->activeRenderer()->sendFrameUpdate(); } } @@ -4224,7 +4324,7 @@ void MainWindow::slotOpenStopmotion() { if (m_stopmotion == NULL) { m_stopmotion = new StopmotionWidget(m_monitorManager, m_activeDocument->projectFolder(), m_stopmotion_actions->actions(), this); - connect(m_stopmotion, SIGNAL(addOrUpdateSequence(const QString)), m_projectList, SLOT(slotAddOrUpdateSequence(const QString))); + connect(m_stopmotion, SIGNAL(addOrUpdateSequence(const QString &)), m_projectList, SLOT(slotAddOrUpdateSequence(const QString))); //for (int i = 0; i < m_gfxScopesList.count(); i++) { // Check if we need the renderer to send a new frame for update /*if (!m_scopesList.at(i)->widget()->visibleRegion().isEmpty() && !(static_cast(m_scopesList.at(i)->widget())->autoRefreshEnabled())) request = true;*/ @@ -4272,6 +4372,7 @@ void MainWindow::slotOpenBackupDialog(const KUrl url) { KUrl projectFile; KUrl projectFolder; + QString projectId; kDebug()<<"// BACKUP URL: "<projectFolder(); projectFile = m_activeDocument->url(); + projectId = m_activeDocument->getDocumentProperty("documentid"); } - BackupWidget *dia = new BackupWidget(projectFile, projectFolder, this); + BackupWidget *dia = new BackupWidget(projectFile, projectFolder, projectId, this); if (dia->exec() == QDialog::Accepted) { QString requestedBackup = dia->selectedFile(); m_activeDocument->backupLastSavedVersion(projectFile.path()); closeCurrentDocument(false); doOpenFile(KUrl(requestedBackup), NULL); m_activeDocument->setUrl(projectFile); + m_activeDocument->setModified(true); setCaption(m_activeDocument->description()); } delete dia; } - - - +void MainWindow::slotElapsedTime() +{ + kDebug()<<"-----------------------------------------\n"<<"Time elapsed: "<