#include "audiospectrum.h"
#include "spectrogram.h"
#include "archivewidget.h"
+#include "databackup/backupwidget.h"
#include <KApplication>
#include <KAction>
//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)));
connect(m_effectList, SIGNAL(reloadEffects()), this, SLOT(slotReloadEffects()));
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()
collection.addAction("project_settings", projectAction);
connect(projectAction, SIGNAL(triggered(bool)), this, SLOT(slotEditProjectSettings()));
+ KAction* backupAction = new KAction(KIcon("edit-undo"), i18n("Open Backup File"), this);
+ collection.addAction("open_backup", backupAction);
+ connect(backupAction, SIGNAL(triggered(bool)), this, SLOT(slotOpenBackupDialog()));
+
KAction* projectRender = new KAction(KIcon("media-record"), i18n("Render"), this);
collection.addAction("project_render", projectRender);
projectRender->setShortcut(Qt::CTRL + Qt::Key_Return);
showTitleBar->setChecked(KdenliveSettings::showtitlebars());
slotShowTitleBars(KdenliveSettings::showtitlebars());
-
- //const QByteArray state = layoutGroup.readEntry("layout1", QByteArray());
-
- /*QAction *maxCurrent = new KAction(i18n("Maximize Current Widget"), this);
- collection.addAction("maximize_current", maxCurrent);
- maxCurrent->setCheckable(true);
- maxCurrent->setChecked(false);
- connect(maxCurrent, SIGNAL(triggered(bool)), this, SLOT(slotMaximizeCurrent(bool)));*/
-
m_closeAction = KStandardAction::close(this, SLOT(closeCurrentDocument()), collection);
KStandardAction::quit(this, SLOT(close()), collection);
KStandardAction::open(this, SLOT(openFile()), collection);
}
//m_effectsActionCollection->readSettings();
- //connect(collection, SIGNAL( clearStatusText() ),
- //statusBar(), SLOT( clear() ) );
}
void MainWindow::slotDisplayActionMessage(QAction *a)
if (layoutId.isEmpty()) return;
KSharedConfigPtr config = KGlobal::config();
KConfigGroup layouts(config, "Layouts");
- //QByteArray geom = QByteArray::fromBase64(layouts.readEntry(layoutId).toAscii());
QByteArray state = QByteArray::fromBase64(layouts.readEntry(layoutId).toAscii());
- //restoreGeometry(geom);
restoreState(state);
}
}
m_timelineArea->setEnabled(true);
m_projectList->setEnabled(true);
-
- KdenliveDoc *doc = new KdenliveDoc(KUrl(), projectFolder, m_commandStack, profileName, documentProperties, projectTracks, m_projectMonitor->render, m_notesWidget, this);
+ bool openBackup;
+ KdenliveDoc *doc = new KdenliveDoc(KUrl(), projectFolder, m_commandStack, profileName, documentProperties, projectTracks, m_projectMonitor->render, m_notesWidget, &openBackup, this);
doc->m_autosave = new KAutoSaveFile(KUrl(), doc);
bool ok;
TrackView *trackView = new TrackView(doc, &ok, this);
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();
progressDialog.progressBar()->setValue(0);
qApp->processEvents();
- KdenliveDoc *doc = new KdenliveDoc(url, KdenliveSettings::defaultprojectfolder(), m_commandStack, KdenliveSettings::default_profile(), QMap <QString, QString> (), QPoint(KdenliveSettings::videotracks(), KdenliveSettings::audiotracks()), m_projectMonitor->render, m_notesWidget, this, &progressDialog);
+ bool openBackup;
+ KdenliveDoc *doc = new KdenliveDoc(url, KdenliveSettings::defaultprojectfolder(), m_commandStack, KdenliveSettings::default_profile(), QMap <QString, QString> (), QPoint(KdenliveSettings::videotracks(), KdenliveSettings::audiotracks()), m_projectMonitor->render, m_notesWidget, &openBackup, this, &progressDialog);
progressDialog.progressBar()->setValue(1);
progressDialog.progressBar()->setMaximum(4);
m_clipMonitor->refreshMonitor(true);
progressDialog.progressBar()->setValue(4);
+ if (openBackup) slotOpenBackupDialog(url);
}
void MainWindow::recoverFiles(QList<KAutoSaveFile *> staleFiles)
void MainWindow::slotUpdateProjectProfile(const QString &profile)
{
- double dar = m_activeDocument->dar();
-
// Recreate the stopmotion widget if profile changes
if (m_stopmotion) {
delete m_stopmotion;
m_projectList->updateProjectFormat(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();
if (updateFps) m_activeTimeline->updateProjectFps();
m_activeDocument->setModified(true);
m_commandStack->activeStack()->clear();
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()), m_activeDocument, SLOT(checkProjectClips()));
+ 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)));
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()), doc, SLOT(checkProjectClips()));
+ 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()));
connect(doc, SIGNAL(docModified(bool)), this, SLOT(slotUpdateDocumentState(bool)));
connect(doc, SIGNAL(guidesUpdated()), this, SLOT(slotGuidesUpdated()));
+ connect(doc, SIGNAL(saveTimelinePreview(const QString)), trackView, SLOT(slotSaveTimelinePreview(const QString)));
+
connect(m_notesWidget, SIGNAL(textChanged()), doc, SLOT(setModified()));
connect(trackView->projectView(), SIGNAL(clipItemSelected(ClipItem*, int, bool)), m_effectStack, SLOT(slotClipItemSelected(ClipItem*, int)));
}
-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");
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);
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::startDetached(KdenliveSettings::rendererpath(), QStringList() << baseClip->fileURL().path() << "in=" + QString::number(zone.x()) << "out=" + QString::number(zone.y()) << "-consumer" << "xml:" + url->url().path());
+ }
+ else render->saveZone(url->url(), edit->text(), zone);
+ }
}
void MainWindow::slotSetInPoint()
{
- if (m_clipMonitor->isActive())
+ if (m_clipMonitor->isActive()) {
m_clipMonitor->slotSetZoneStart();
- else
+ } else {
m_projectMonitor->slotSetZoneStart();
- //else m_activeTimeline->projectView()->setInPoint();
+ }
}
void MainWindow::slotSetOutPoint()
{
- if (m_clipMonitor->isActive())
+ if (m_clipMonitor->isActive()) {
m_clipMonitor->slotSetZoneEnd();
- else
+ } else {
m_projectMonitor->slotSetZoneEnd();
- // else m_activeTimeline->projectView()->setOutPoint();
+ }
}
void MainWindow::slotResizeItemStart()
}
}
-void MainWindow::slotMaximizeCurrent(bool /*show*/)
+void MainWindow::slotMaximizeCurrent(bool)
{
//TODO: is there a way to maximize current widget?
- //if (show == true)
- {
- m_timelineState = saveState();
- QWidget *par = focusWidget()->parentWidget();
- while (par->parentWidget() && par->parentWidget() != this)
- par = par->parentWidget();
- kDebug() << "CURRENT WIDGET: " << par->objectName();
- }
- /*else {
- //centralWidget()->setHidden(false);
- //restoreState(m_timelineState);
- }*/
+
+ m_timelineState = saveState();
+ QWidget *par = focusWidget()->parentWidget();
+ while (par->parentWidget() && par->parentWidget() != this)
+ par = par->parentWidget();
+ kDebug() << "CURRENT WIDGET: " << par->objectName();
}
void MainWindow::loadTranscoders()
// replace proxy clips with originals
QMap <QString, QString> proxies = m_projectList->getProxies();
-
QDomNodeList producers = doc.elementsByTagName("producer");
QString producerResource;
QString suffix;
for (uint n = 0; n < producers.length(); n++) {
QDomElement e = producers.item(n).toElement();
producerResource = EffectsList::property(e, "resource");
- if (!producerResource.startsWith("/") && !producerResource.isEmpty() ){
- producerResource=root+"/"+producerResource;
+ if (producerResource.isEmpty()) continue;
+ if (!producerResource.startsWith("/")) {
+ producerResource.prepend(root + "/");
}
if (producerResource.contains('?')) {
+ // slowmotion producer
suffix = "?" + producerResource.section('?', 1);
producerResource = producerResource.section('?', 0, 0);
}
// sometimes have different ratio than original clips
EffectsList::removeProperty(e, "aspect_ratio");
}
- else if (!root.isEmpty() && producerResource.startsWith(root) && proxies.contains(producerResource.remove(0, root.count() + 1))) {
- EffectsList::setProperty(e, "resource", proxies.value(producerResource.remove(0, root.count() + 1)) + suffix);
- // We need to delete the "aspect_ratio" property because proxy clips
- // sometimes have different ratio than original clips
- EffectsList::removeProperty(e, "aspect_ratio");
- }
}
}
{
QString mimetype = "application/x-kdenlive";
KMimeType::Ptr mime = KMimeType::mimeType(mimetype);
- if (!mime) mimetype = "*.kdenlive";
- if (open) mimetype.append(" application/x-compressed-tar");
+ if (!mime) {
+ mimetype = "*.kdenlive";
+ if (open) mimetype.append(" *.tar.gz");
+ }
+ else if (open) mimetype.append(" application/x-compressed-tar");
return mimetype;
}
m_projectMonitor->render->sendFrameForAnalysis = false;
}
m_clipMonitor->render->sendFrameForAnalysis = false;
- m_recMonitor->analyseFrames(false);
+ if (m_recMonitor)
+ m_recMonitor->analyseFrames(false);
} else {
m_projectMonitor->render->sendFrameForAnalysis = true;
m_clipMonitor->render->sendFrameForAnalysis = true;
- m_recMonitor->analyseFrames(true);
+ if (m_recMonitor)
+ m_recMonitor->analyseFrames(true);
}
}
if (!m_gfxScopesList.at(i)->widget()->visibleRegion().isEmpty() && !(static_cast<AbstractGfxScopeWidget *>(m_gfxScopesList.at(i)->widget())->autoRefreshEnabled())) request = true;
static_cast<AbstractGfxScopeWidget *>(m_gfxScopesList.at(i)->widget())->slotActiveMonitorChanged();
}
- if (request) {
+ if (request && m_monitorManager->activeRenderer()) {
m_monitorManager->activeRenderer()->sendFrameUpdate();
}
}
+void MainWindow::slotClearColorScopes()
+{
+ for (int i = 0; i < m_gfxScopesList.count(); i++) {
+ static_cast<AbstractGfxScopeWidget *>(m_gfxScopesList.at(i)->widget())->slotClearMonitor();
+ }
+}
+
void MainWindow::slotOpenStopmotion()
{
if (m_stopmotion == NULL) {
}
+void MainWindow::slotOpenBackupDialog(const KUrl url)
+{
+ KUrl projectFile;
+ KUrl projectFolder;
+ QString projectId;
+ kDebug()<<"// BACKUP URL: "<<url.path();
+ if (!url.isEmpty()) {
+ // we could not open the project file, guess where the backups are
+ projectFolder = KUrl(KdenliveSettings::defaultprojectfolder());
+ projectFile = url;
+ }
+ else {
+ projectFolder = m_activeDocument->projectFolder();
+ projectFile = m_activeDocument->url();
+ projectId = m_activeDocument->getDocumentProperty("documentid");
+ }
+
+ 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;
+}
+
+
+
+
+
#include "mainwindow.moc"
#ifdef DEBUG_MAINW