actionCollection());
readOptions();
- slotDetectAudioDriver();
+ //slotDetectAudioDriver();
m_clipMonitorDock = new QDockWidget(i18n("Clip Monitor"), this);
m_clipMonitorDock->setObjectName("clip_monitor");
m_timelineContextMenu->addAction(actionCollection()->action(KStandardAction::name(KStandardAction::Paste)));
m_timelineContextClipMenu->addAction(actionCollection()->action("delete_timeline_clip"));
- m_timelineContextClipMenu->addAction(actionCollection()->action("change_clip_speed"));
m_timelineContextClipMenu->addAction(actionCollection()->action("group_clip"));
m_timelineContextClipMenu->addAction(actionCollection()->action("ungroup_clip"));
m_timelineContextClipMenu->addAction(actionCollection()->action("cut_timeline_clip"));
void MainWindow::queryQuit()
{
- kDebug() << "----- SAVING CONFUIG";
if (queryClose()) {
+ delete m_effectStack;
+ delete m_activeTimeline;
+ delete m_projectMonitor;
+ delete m_clipMonitor;
+ delete m_activeDocument;
Mlt::Factory::close();
kapp->quit();
}
}
}
-void MainWindow::saveProperties(KConfig*)
+void MainWindow::saveProperties(KConfigGroup &config)
{
// save properties here,used by session management
saveFile();
+ KMainWindow::saveProperties(config);
}
-void MainWindow::readProperties(KConfig *config)
+void MainWindow::readProperties(const KConfigGroup &config)
{
// read properties here,used by session management
- QString Lastproject = config->group("Recent Files").readPathEntry("File1", QString());
+ KMainWindow::readProperties(config);
+ QString Lastproject = config.group("Recent Files").readPathEntry("File1", QString());
openFile(KUrl(Lastproject));
}
m_timecodeFormat = new KComboBox(this);
m_timecodeFormat->addItem(i18n("hh:mm:ss::ff"));
m_timecodeFormat->addItem(i18n("Frames"));
+ if (KdenliveSettings::frametimecode()) m_timecodeFormat->setCurrentIndex(1);
+ connect(m_timecodeFormat, SIGNAL(activated(int)), this, SLOT(slotUpdateTimecodeFormat(int)));
m_statusProgressBar = new QProgressBar(this);
m_statusProgressBar->setMinimum(0);
statusBar()->insertPermanentFixedItem("00:00:00:00", ID_TIMELINE_POS);
statusBar()->addPermanentWidget(m_timecodeFormat);
statusBar()->setMaximumHeight(statusBar()->font().pointSize() * 4);
- m_messageLabel->hide();
collection->addAction("select_tool", m_buttonSelectTool);
collection->addAction("razor_tool", m_buttonRazorTool);
collection->addAction("delete_timeline_clip", deleteTimelineClip);
connect(deleteTimelineClip, SIGNAL(triggered(bool)), this, SLOT(slotDeleteTimelineClip()));
- KAction* editTimelineClipSpeed = new KAction(i18n("Change Clip Speed"), this);
+ /*KAction* editTimelineClipSpeed = new KAction(i18n("Change Clip Speed"), this);
collection->addAction("change_clip_speed", editTimelineClipSpeed);
editTimelineClipSpeed->setData("change_speed");
- connect(editTimelineClipSpeed, SIGNAL(triggered(bool)), this, SLOT(slotChangeClipSpeed()));
+ connect(editTimelineClipSpeed, SIGNAL(triggered(bool)), this, SLOT(slotChangeClipSpeed()));*/
KAction *stickTransition = collection->addAction("auto_transition");
stickTransition->setData(QString("auto"));
void MainWindow::newFile(bool showProjectSettings)
{
+ if (!m_timelineArea->isEnabled()) return;
QString profileName;
KUrl projectFolder;
QPoint projectTracks(KdenliveSettings::videotracks(), KdenliveSettings::audiotracks());
}
KdenliveDoc *doc = new KdenliveDoc(KUrl(), projectFolder, m_commandStack, profileName, projectTracks, m_projectMonitor->render, this);
doc->m_autosave = new KAutoSaveFile(KUrl(), doc);
- TrackView *trackView = new TrackView(doc, this);
+ bool ok;
+ TrackView *trackView = new TrackView(doc, &ok, this);
m_timelineArea->addTab(trackView, KIcon("kdenlive"), doc->description());
+ if (!ok) {
+ // MLT is broken
+ m_timelineArea->setEnabled(false);
+ m_projectList->setEnabled(false);
+ m_monitorManager->slotBlockMonitors();
+ slotPreferences(6);
+ return;
+ }
if (m_timelineArea->count() == 1) {
connectDocumentInfo(doc);
connectDocument(trackView, doc);
void MainWindow::activateDocument()
{
- if (m_timelineArea->currentWidget() == NULL) return;
+ if (m_timelineArea->currentWidget() == NULL || !m_timelineArea->isEnabled()) return;
TrackView *currentTab = (TrackView *) m_timelineArea->currentWidget();
KdenliveDoc *currentDoc = currentTab->document();
connectDocumentInfo(currentDoc);
void MainWindow::doOpenFile(const KUrl &url, KAutoSaveFile *stale)
{
+ if (!m_timelineArea->isEnabled()) return;
KdenliveDoc *doc = new KdenliveDoc(url, KdenliveSettings::defaultprojectfolder(), m_commandStack, KdenliveSettings::default_profile(), QPoint(KdenliveSettings::videotracks(), KdenliveSettings::audiotracks()), m_projectMonitor->render, this);
if (stale == NULL) {
stale = new KAutoSaveFile(url, doc);
stale->setParent(doc);
}
connectDocumentInfo(doc);
- TrackView *trackView = new TrackView(doc, this);
+ bool ok;
+ TrackView *trackView = new TrackView(doc, &ok, this);
m_timelineArea->setCurrentIndex(m_timelineArea->addTab(trackView, KIcon("kdenlive"), doc->description()));
+ if (!ok) {
+ m_timelineArea->setEnabled(false);
+ m_projectList->setEnabled(false);
+ m_monitorManager->slotBlockMonitors();
+ slotPreferences(6);
+ return;
+ }
m_timelineArea->setTabToolTip(m_timelineArea->currentIndex(), doc->url().path());
trackView->setDuration(trackView->duration());
trackView->projectView()->initCursorPos(m_projectMonitor->render->seekPosition().frames(doc->fps()));
KUrl mltPath = getUrl->selectedUrl();
delete getUrl;
if (mltPath.isEmpty()) ::exit(0);
- KdenliveSettings::setMltpath(mltPath.path());
+ KdenliveSettings::setMltpath(mltPath.path(KUrl::AddTrailingSlash));
QStringList profilesList = QDir(KdenliveSettings::mltpath()).entryList(profilesFilter, QDir::Files);
}
}
void MainWindow::slotDetectAudioDriver()
{
+ /* WARNING: do not use this method because sometimes detects wrong driver (pulse instead of alsa),
+ leading to no audio output, see bug #934 */
+
//decide which audio driver is really best, in some cases SDL is wrong
if (KdenliveSettings::audiodrivername().isEmpty()) {
QString driver;
if (w->exec() == QDialog::Accepted) {
QString profile = w->selectedProfile();
m_activeDocument->setProjectFolder(w->selectedFolder());
- if (m_renderWidget) m_renderWidget->setDocumentPath(w->selectedFolder().path());
+ if (m_renderWidget) m_renderWidget->setDocumentPath(w->selectedFolder().path(KUrl::AddTrailingSlash));
if (m_activeDocument->profilePath() != profile) {
// Profile was changed
double dar = m_activeDocument->dar();
+
+ // Deselect current effect / transition
+ m_effectStack->slotClipItemSelected(NULL, 0);
+ m_transitionConfig->slotTransitionItemSelected(NULL, 0, QPoint(), false);
+
m_activeDocument->setProfilePath(profile);
KdenliveSettings::setCurrent_profile(profile);
KdenliveSettings::setProject_fps(m_activeDocument->fps());
setCaption(m_activeDocument->description(), m_activeDocument->isModified());
m_monitorManager->resetProfiles(m_activeDocument->timecode());
+ m_transitionConfig->updateProjectFormat(m_activeDocument->mltProfile(), m_activeDocument->timecode(), m_activeTimeline->tracksNumber());
+ m_effectStack->updateProjectFormat(m_activeDocument->mltProfile(), m_activeDocument->timecode());
if (m_renderWidget) m_renderWidget->setProfile(m_activeDocument->mltProfile());
m_timelineArea->setTabText(m_timelineArea->currentIndex(), m_activeDocument->description());
m_activeDocument->clipManager()->resetProducersList(m_projectMonitor->render->producersList());
if (dar != m_activeDocument->dar()) m_projectList->reloadClipThumbnails();
+ m_activeTimeline->updateProjectFps();
// We need to desactivate & reactivate monitors to get a refresh
m_monitorManager->switchMonitors();
}
void MainWindow::slotRenderProject()
{
if (!m_renderWidget) {
- QString projectfolder = m_activeDocument ? m_activeDocument->projectFolder().path() : KdenliveSettings::defaultprojectfolder();
+ QString projectfolder = m_activeDocument ? m_activeDocument->projectFolder().path(KUrl::AddTrailingSlash) : KdenliveSettings::defaultprojectfolder();
m_renderWidget = new RenderWidget(projectfolder, this);
- connect(m_renderWidget, SIGNAL(doRender(const QStringList&, const QStringList&)), this, SLOT(slotDoRender(const QStringList&, const QStringList&)));
- connect(m_renderWidget, SIGNAL(selectedRenderProfile(const QString &, const QString &)), this, SLOT(slotSetDocumentRenderProfile(const QString &, const QString &)));
+ connect(m_renderWidget, SIGNAL(selectedRenderProfile(const QString &, const QString &, const QString&)), this, SLOT(slotSetDocumentRenderProfile(const QString &, const QString &, const QString&)));
connect(m_renderWidget, SIGNAL(prepareRenderingData(bool, bool, const QString&)), this, SLOT(slotPrepareRendering(bool, bool, const QString&)));
connect(m_renderWidget, SIGNAL(abortProcess(const QString &)), this, SIGNAL(abortRenderJob(const QString &)));
connect(m_renderWidget, SIGNAL(openDvdWizard(const QString &, const QString &)), this, SLOT(slotDvdWizard(const QString &, const QString &)));
if (m_activeDocument) {
m_renderWidget->setProfile(m_activeDocument->mltProfile());
m_renderWidget->setGuides(m_activeDocument->guidesXml(), m_activeDocument->projectDuration());
- m_renderWidget->setRenderProfile(m_activeDocument->getDocumentProperty("renderdestination"), m_activeDocument->getDocumentProperty("renderprofile"));
+ m_renderWidget->setDocumentPath(m_activeDocument->projectFolder().path(KUrl::AddTrailingSlash));
+ m_renderWidget->setRenderProfile(m_activeDocument->getDocumentProperty("renderdestination"), m_activeDocument->getDocumentProperty("renderprofile"), m_activeDocument->getDocumentProperty("renderurl"));
}
}
/*TrackView *currentTab = (TrackView *) m_timelineArea->currentWidget();
m_renderWidget->showNormal();
}
-void MainWindow::slotDoRender(const QStringList render_args, const QStringList overlay_args)
-{
- //TODO: remove this function if no problem is detected with the new renderwidget rendering
- QString dest = render_args.at(0);
- QString render = render_args.at(1);
- QStringList avformat_args = render_args.at(2).split(' ');
- bool zoneOnly = render_args.at(3).toInt();
- bool playAfter = render_args.at(4).toInt();
- double guideStart = render_args.at(5).toDouble();
- double guideEnd = render_args.at(6).toDouble();
- bool resizeProfile = render_args.at(7).toInt();
- QString scriptExport = render_args.at(8);
- bool createChapterFile = render_args.at(9).toInt();
-
- if (dest.isEmpty()) return;
- int in = 0;
- int out = 0;
-
- if (m_activeTimeline && zoneOnly) {
- in = m_activeTimeline->inPoint();
- out = m_activeTimeline->outPoint();
- }
-
- KTemporaryFile temp;
- temp.setAutoRemove(false);
- temp.setSuffix(".mlt");
- if (!scriptExport.isEmpty() || temp.open()) {
- if (KdenliveSettings::dropbframes()) {
- KdenliveSettings::setDropbframes(false);
- m_activeDocument->clipManager()->updatePreviewSettings();
- if (!scriptExport.isEmpty()) m_projectMonitor->saveSceneList(scriptExport + ".mlt");
- else m_projectMonitor->saveSceneList(temp.fileName());
- KdenliveSettings::setDropbframes(true);
- m_activeDocument->clipManager()->updatePreviewSettings();
- } else {
- if (!scriptExport.isEmpty()) m_projectMonitor->saveSceneList(scriptExport + ".mlt");
- else m_projectMonitor->saveSceneList(temp.fileName());
- }
-
- QStringList args;
- if (scriptExport.isEmpty()) args << "-erase";
- if (KdenliveSettings::usekuiserver()) args << "-kuiserver";
- if (zoneOnly) args << "in=" + QString::number(in) << "out=" + QString::number(out);
- else if (guideStart != -1) {
- args << "in=" + QString::number(GenTime(guideStart).frames(m_activeDocument->fps())) << "out=" + QString::number(GenTime(guideEnd).frames(m_activeDocument->fps()));
- }
- if (!overlay_args.isEmpty()) args << "preargs=" + overlay_args.join(" ");
- QString videoPlayer = "-";
- if (playAfter) {
- videoPlayer = KdenliveSettings::defaultplayerapp();
- if (videoPlayer.isEmpty()) KMessageBox::sorry(this, i18n("Cannot play video after rendering because the default video player application is not set.\nPlease define it in Kdenlive settings dialog."));
- }
- if (!QFile::exists(KdenliveSettings::rendererpath())) {
- KMessageBox::sorry(this, i18n("Cannot find the melt program required for rendering (part of Mlt)"));
- setRenderingProgress(dest, -3);
- return;
- }
- args << KdenliveSettings::rendererpath() << m_activeDocument->profilePath() << render << videoPlayer;
-
- for (int i = 0; i < avformat_args.count(); i++) {
- if (avformat_args.at(i).startsWith("profile=")) {
- if (avformat_args.at(i).section('=', 1) != m_activeDocument->profilePath()) resizeProfile = true;
- break;
- }
- }
-
- if (resizeProfile) {
- // The rendering profile is different from project profile, so use MLT's special producer_consumer
- if (scriptExport.isEmpty()) args << "consumer:" + temp.fileName();
- else args << "consumer:$SOURCE";
- } else {
- if (scriptExport.isEmpty()) args << temp.fileName();
- else args << "$SOURCE";
- }
- if (scriptExport.isEmpty()) args << dest;
- else args << "$TARGET";
- args << avformat_args;
- QString renderer = QCoreApplication::applicationDirPath() + QString("/kdenlive_render");
- if (!QFile::exists(renderer)) renderer = "kdenlive_render";
- if (scriptExport.isEmpty()) {
- QProcess::startDetached(renderer, args);
- KNotification::event("RenderStarted", i18n("Rendering <i>%1</i> started", dest), QPixmap(), this);
- } else {
- // Generate script file
- QFile file(scriptExport);
- if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
- KMessageBox::error(this, i18n("Cannot write to file %1", scriptExport));
- return;
- }
-
- QTextStream outStream(&file);
- outStream << "#! /bin/sh" << "\n" << "\n";
- outStream << "SOURCE=" << "\"" + scriptExport + ".mlt\"" << "\n";
- outStream << "TARGET=" << "\"" + dest + "\"" << "\n";
- outStream << renderer << " " << args.join(" ") << "\n" << "\n";
- if (file.error() != QFile::NoError) {
- KMessageBox::error(this, i18n("Cannot write to file %1", scriptExport));
- file.close();
- return;
- }
- file.close();
- QFile::setPermissions(scriptExport, file.permissions() | QFile::ExeUser);
- }
- }
-}
-
void MainWindow::setRenderingProgress(const QString &url, int progress)
{
if (m_renderWidget) m_renderWidget->setRenderJob(url, progress);
connect(trackView->projectView(), SIGNAL(clipItemSelected(ClipItem*, int)), this, SLOT(slotActivateEffectStackView()));
connect(trackView->projectView(), SIGNAL(transitionItemSelected(Transition*, int, QPoint, bool)), m_transitionConfig, SLOT(slotTransitionItemSelected(Transition*, int, QPoint, bool)));
connect(trackView->projectView(), SIGNAL(transitionItemSelected(Transition*, int, QPoint, bool)), this, SLOT(slotActivateTransitionView(Transition *)));
- m_zoomSlider->setValue(doc->zoom());
+ m_zoomSlider->setValue(doc->zoom().x());
connect(m_zoomSlider, SIGNAL(valueChanged(int)), trackView, SLOT(slotChangeZoom(int)));
connect(trackView->projectView(), SIGNAL(zoomIn()), this, SLOT(slotZoomIn()));
connect(trackView->projectView(), SIGNAL(zoomOut()), this, SLOT(slotZoomOut()));
m_activeTimeline = trackView;
if (m_renderWidget) {
m_renderWidget->setProfile(doc->mltProfile());
- m_renderWidget->setDocumentPath(doc->projectFolder().path());
- m_renderWidget->setRenderProfile(doc->getDocumentProperty("renderdestination"), doc->getDocumentProperty("renderprofile"));
+ m_renderWidget->setGuides(doc->guidesXml(), doc->projectDuration());
+ m_renderWidget->setDocumentPath(doc->projectFolder().path(KUrl::AddTrailingSlash));
+ m_renderWidget->setRenderProfile(doc->getDocumentProperty("renderdestination"), doc->getDocumentProperty("renderprofile"), doc->getDocumentProperty("renderurl"));
}
//doc->setRenderer(m_projectMonitor->render);
m_commandStack->setActiveStack(doc->commandStack());
setCaption(doc->description(), doc->isModified());
m_saveAction->setEnabled(doc->isModified());
m_activeDocument = doc;
+ m_activeTimeline->updateProjectFps();
if (KdenliveSettings::dropbframes()) slotUpdatePreviewSettings();
// set tool to select tool
// create it :
KdenliveSettingsDialog* dialog = new KdenliveSettingsDialog(this);
connect(dialog, SIGNAL(settingsChanged(const QString&)), this, SLOT(updateConfiguration()));
- connect(dialog, SIGNAL(doResetProfile()), this, SLOT(slotDetectAudioDriver()));
+ //connect(dialog, SIGNAL(doResetProfile()), this, SLOT(slotDetectAudioDriver()));
connect(dialog, SIGNAL(doResetProfile()), m_monitorManager, SLOT(slotResetProfiles()));
connect(dialog, SIGNAL(updatePreviewSettings()), this, SLOT(slotUpdatePreviewSettings()));
connect(dialog, SIGNAL(updateCaptureFolder()), m_recMonitor, SLOT(slotUpdateCaptureFolder()));
}
}
-void MainWindow::slotChangeClipSpeed()
-{
- if (m_activeTimeline) {
- m_activeTimeline->projectView()->changeClipSpeed();
- }
-}
-
void MainWindow::slotAddClipMarker()
{
DocClipBase *clip = NULL;
if (m_activeTimeline) {
ClipItem *item = m_activeTimeline->projectView()->getActiveClipUnderCursor();
if (item) {
- pos = m_projectMonitor->position() - item->startPos() + item->cropStart();
+ pos = (m_projectMonitor->position() - item->startPos() + item->cropStart()) / item->speed();
clip = item->baseClip();
}
}
if (m_activeTimeline) {
ClipItem *item = m_activeTimeline->projectView()->getActiveClipUnderCursor();
if (item) {
- pos = m_projectMonitor->position() - item->startPos() + item->cropStart();
+ pos = (m_projectMonitor->position() - item->startPos() + item->cropStart()) / item->speed();
clip = item->baseClip();
}
}
if (m_activeTimeline) {
ClipItem *item = m_activeTimeline->projectView()->getActiveClipUnderCursor();
if (item) {
- pos = m_projectMonitor->position() - item->startPos() + item->cropStart();
+ pos = (m_projectMonitor->position() - item->startPos() + item->cropStart()) / item->speed();
clip = item->baseClip();
}
}
void MainWindow::slotShowClipProperties(DocClipBase *clip)
{
if (clip->clipType() == TEXT) {
- QString titlepath = m_activeDocument->projectFolder().path() + "/titles/";
+ QString titlepath = m_activeDocument->projectFolder().path(KUrl::AddTrailingSlash) + "titles/";
if (!clip->getProperty("xmltemplate").isEmpty()) {
// template text clip
return;
}
QString path = clip->getProperty("resource");
- TitleWidget *dia_ui = new TitleWidget(KUrl(), titlepath, m_projectMonitor->render, this);
+ TitleWidget *dia_ui = new TitleWidget(KUrl(), m_activeDocument->timecode(), titlepath, m_projectMonitor->render, this);
QDomDocument doc;
doc.setContent(clip->getProperty("xmldata"));
dia_ui->setXml(doc);
QRect rect = dia_ui->renderedRect();
QMap <QString, QString> newprops;
newprops.insert("xmldata", dia_ui->xml().toString());
+ newprops.insert("out", QString::number(dia_ui->duration()));
newprops.insert("frame_size", QString::number(rect.width()) + 'x' + QString::number(rect.height()));
EditClipCommand *command = new EditClipCommand(m_projectList, clip->getId(), clip->properties(), newprops, true);
m_activeDocument->commandStack()->push(command);
void MainWindow::customEvent(QEvent* e)
{
if (e->type() == QEvent::User) {
- // The timeline playing position changed...
- kDebug() << "RECEIVED JOG EVEMNT!!!";
+ m_messageLabel->setMessage(static_cast <MltErrorEvent *>(e)->message(), MltError);
}
}
void MainWindow::slotActivateEffectStackView()
}
}
+
void MainWindow::slotSaveZone(Render *render, QPoint zone)
{
KDialog *dialog = new KDialog(this);
slotTranscode(urls);
}
-void MainWindow::slotSetDocumentRenderProfile(const QString &dest, const QString &name)
+void MainWindow::slotSetDocumentRenderProfile(const QString &dest, const QString &name, const QString &file)
{
if (m_activeDocument == NULL) return;
m_activeDocument->setDocumentProperty("renderdestination", dest);
m_activeDocument->setDocumentProperty("renderprofile", name);
+ m_activeDocument->setDocumentProperty("renderurl", file);
m_activeDocument->setModified(true);
}
m_renderWidget->slotExport(scriptExport, m_activeTimeline->inPoint(), m_activeTimeline->outPoint(), playlistPath, scriptPath);
}
+void MainWindow::slotUpdateTimecodeFormat(int ix)
+{
+ KdenliveSettings::setFrametimecode(ix == 1);
+ m_clipMonitor->updateTimecodeFormat();
+ m_projectMonitor->updateTimecodeFormat();
+}
+
+
+
+
#include "mainwindow.moc"