addDockWidget(Qt::TopDockWidgetArea, m_transitionConfigDock);
KdenliveSettings::setCurrent_profile(KdenliveSettings::default_profile());
- m_fileOpenRecent = KStandardAction::openRecent(this, SLOT(openFile(const KUrl &)),
- actionCollection());
+ m_fileOpenRecent = KStandardAction::openRecent(this, SLOT(openFile(const KUrl &)), actionCollection());
readOptions();
+ m_fileRevert = KStandardAction::revert(this, SLOT(slotRevert()), actionCollection());
+ m_fileRevert->setEnabled(false);
//slotDetectAudioDriver();
// precedence, then "openlastproject", then just a plain empty file.
// If opening Url fails, openlastproject will _not_ be used.
if (!Url.isEmpty()) {
- openFile(Url);
- } else {
- if (KdenliveSettings::openlastproject()) {
- openLastFile();
- }
- }
- if (m_timelineArea->count() == 0) {
+ // delay loading so that the window shows up
+ m_startUrl = Url;
+ QTimer::singleShot(500, this, SLOT(openFile()));
+ } else if (KdenliveSettings::openlastproject()) {
+ QTimer::singleShot(500, this, SLOT(openLastFile()));
+ } else { //if (m_timelineArea->count() == 0) {
newFile(false);
}
void MainWindow::newFile(bool showProjectSettings)
{
if (!m_timelineArea->isEnabled()) return;
+ m_fileRevert->setEnabled(false);
QString profileName;
KUrl projectFolder;
QPoint projectTracks(KdenliveSettings::videotracks(), KdenliveSettings::audiotracks());
connectDocument(currentTab, currentDoc);
}
-void MainWindow::closeCurrentDocument()
+void MainWindow::closeCurrentDocument(bool saveChanges)
{
QWidget *w = m_timelineArea->currentWidget();
if (!w) return;
m_timelineArea->setCurrentIndex(ix);
TrackView *tabToClose = (TrackView *) w;
KdenliveDoc *docToClose = tabToClose->document();
- if (docToClose && docToClose->isModified()) {
+ if (docToClose && docToClose->isModified() && saveChanges) {
switch (KMessageBox::warningYesNoCancel(this, i18n("Save changes to document?"))) {
case KMessageBox::Yes :
// save document here. If saving fails, return false;
m_timelineArea->setTabToolTip(m_timelineArea->currentIndex(), m_activeDocument->url().path());
m_activeDocument->setModified(false);
m_fileOpenRecent->addUrl(KUrl(outputFileName));
+ m_fileRevert->setEnabled(true);
return true;
}
void MainWindow::openFile()
{
+ if (!m_startUrl.isEmpty()) {
+ openFile(m_startUrl);
+ m_startUrl = KUrl();
+ return;
+ }
// Check that the Kdenlive mime type is correctly installed
QString mimetype = "application/x-kdenlive";
KMimeType::Ptr mime = KMimeType::mimeType(mimetype);
}
}
if (!KdenliveSettings::activatetabs()) closeCurrentDocument();
+ m_messageLabel->setMessage(i18n("Opening file %1", url.path()), InformationMessage);
+ qApp->processEvents();
doOpenFile(url, NULL);
}
void MainWindow::doOpenFile(const KUrl &url, KAutoSaveFile *stale)
{
if (!m_timelineArea->isEnabled()) return;
+ m_fileRevert->setEnabled(true);
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);
if (!m_renderWidget) {
QString projectfolder = m_activeDocument ? m_activeDocument->projectFolder().path(KUrl::AddTrailingSlash) : KdenliveSettings::defaultprojectfolder();
m_renderWidget = new RenderWidget(projectfolder, this);
+ connect(m_renderWidget, SIGNAL(shutdown()), this, SLOT(slotShutdown()));
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 &)));
disconnect(m_activeTimeline->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(activateMonitor()));
disconnect(m_activeTimeline, SIGNAL(zoneMoved(int, int)), this, SLOT(slotZoneMoved(int, int)));
disconnect(m_projectList, SIGNAL(loadingIsOver()), m_activeTimeline->projectView(), SLOT(slotUpdateAllThumbs()));
- disconnect(m_projectList, SIGNAL(displayMessage(const QString&, MessageType)), m_messageLabel, SLOT(setMessage(const QString&, MessageType)));
+ disconnect(m_projectList, SIGNAL(displayMessage(const QString&, int)), this, SLOT(slotGotProgressInfo(const QString&, int)));
m_effectStack->clear();
}
//m_activeDocument->setRenderer(NULL);
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(displayMessage(const QString&, MessageType)), m_messageLabel, SLOT(setMessage(const QString&, MessageType)));
+ connect(m_projectList, SIGNAL(displayMessage(const QString&, int)), this, SLOT(slotGotProgressInfo(const QString&, int)));
trackView->projectView()->setContextMenu(m_timelineContextMenu, m_timelineContextClipMenu, m_timelineContextTransitionMenu, m_clipTypeGroup);
m_saveAction->setEnabled(doc->isModified());
m_activeDocument = doc;
m_activeTimeline->updateProjectFps();
- m_projectList->updateAllClips();
+ m_activeDocument->checkProjectClips();
if (KdenliveSettings::dropbframes()) slotUpdatePreviewSettings();
// set tool to select tool
if (dia_ui->exec() == QDialog::Accepted) {
QMap <QString, QString> newprops;
newprops.insert("xmldata", dia_ui->xml().toString());
- newprops.insert("out", QString::number(dia_ui->duration()));
+ if (dia_ui->duration() != clip->duration().frames(m_activeDocument->fps()) - 1) {
+ // duration changed, we need to update duration
+ newprops.insert("out", QString::number(dia_ui->duration()));
+ }
EditClipCommand *command = new EditClipCommand(m_projectList, clip->getId(), clip->properties(), newprops, true);
m_activeDocument->commandStack()->push(command);
m_activeTimeline->projectView()->slotUpdateClip(clip->getId());
{
if (m_activeDocument && m_activeTimeline) {
//m_activeDocument->setTool(tool);
+ QString message;
+ switch (tool) {
+ case SPACERTOOL:
+ message = i18n("Ctrl + click to use spacer on current track only");
+ break;
+ case RAZORTOOL:
+ message = i18n("Click on a clip to cut it");
+ break;
+ default:
+ message = i18n("Shift + click to create a selection rectangle, Ctrl + click to add an item to selection");
+ break;
+ }
+ m_messageLabel->setMessage(message, InformationMessage);
m_activeTimeline->projectView()->setTool(tool);
}
}
void MainWindow::slotDvdWizard(const QString &url, const QString &profile)
{
+ // We must stop the monitors since we create a new on in the dvd wizard
+ m_clipMonitor->stop();
+ m_projectMonitor->stop();
DvdWizard w(url, profile, this);
w.exec();
+ m_projectMonitor->start();
}
void MainWindow::slotShowTimeline(bool show)
statusBar()->clearFocus();
}
+void MainWindow::slotRevert()
+{
+ if (KMessageBox::warningContinueCancel(this, i18n("This will delete all changes made since you last saved your project. Are you sure you want to continue?"), i18n("Revert to last saved version")) == KMessageBox::Cancel) return;
+ KUrl url = m_activeDocument->url();
+ closeCurrentDocument(false);
+ doOpenFile(url, NULL);
+}
+void MainWindow::slotShutdown()
+{
+ if (m_activeDocument) m_activeDocument->setModified(false);
+ // Call shutdown
+ QDBusConnectionInterface* interface = QDBusConnection::sessionBus().interface();
+ if (interface && interface->isServiceRegistered("org.kde.ksmserver")) {
+ QDBusInterface smserver("org.kde.ksmserver", "/KSMServer", "org.kde.KSMServerInterface");
+ smserver.call("logout", 1, 2, 2);
+ }
+}
#include "mainwindow.moc"