X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmainwindow.cpp;h=67b669d319bbbe5961e98d8cca545ddecbcafef3;hb=edf2e497b4361db1bce089b0ef58dd566bf1d997;hp=0cdc7e1f2782d1a50078473bb82e208a9dbcdd4b;hpb=1143bc671aaf2ae46521ce374993b8fd7fd2d4c2;p=kdenlive diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 0cdc7e1f..67b669d3 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -51,6 +51,7 @@ #include "interfaces.h" #include "kdenlive-config.h" #include "cliptranscode.h" +#include "ui_templateclip_ui.h" #include #include @@ -70,6 +71,7 @@ #include #include #include +#include #include #include #include @@ -173,6 +175,8 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent actionCollection()); readOptions(); + slotDetectAudioDriver(); + m_clipMonitorDock = new QDockWidget(i18n("Clip Monitor"), this); m_clipMonitorDock->setObjectName("clip_monitor"); m_clipMonitor = new Monitor("clip", m_monitorManager, this); @@ -377,7 +381,10 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent void MainWindow::queryQuit() { kDebug() << "----- SAVING CONFUIG"; - if (queryClose()) kapp->quit(); + if (queryClose()) { + Mlt::Factory::close(); + kapp->quit(); + } } //virtual @@ -1095,6 +1102,10 @@ void MainWindow::setupActions() collection->addAction("add_text_clip", addTitleClip); connect(addTitleClip , SIGNAL(triggered()), m_projectList, SLOT(slotAddTitleClip())); + QAction *addTitleTemplateClip = new KAction(KIcon("kdenlive-add-text-clip"), i18n("Add Template Title"), this); + collection->addAction("add_text_template_clip", addTitleTemplateClip); + connect(addTitleTemplateClip , SIGNAL(triggered()), m_projectList, SLOT(slotAddTitleTemplateClip())); + QAction *addFolderButton = new KAction(KIcon("folder-new"), i18n("Create Folder"), this); collection->addAction("add_folder", addFolderButton); connect(addFolderButton , SIGNAL(triggered()), m_projectList, SLOT(slotAddFolder())); @@ -1128,6 +1139,7 @@ void MainWindow::setupActions() addClips->addAction(addColorClip); addClips->addAction(addSlideClip); addClips->addAction(addTitleClip); + addClips->addAction(addTitleTemplateClip); addClips->addAction(addFolderButton); addClips->addAction(reloadClip); @@ -1210,6 +1222,7 @@ void MainWindow::newFile(bool showProjectSettings) if (!showProjectSettings && m_timelineArea->count() == 0) { if (!KdenliveSettings::activatetabs()) closeCurrentDocument(); profileName = KdenliveSettings::default_profile(); + projectFolder = KdenliveSettings::defaultprojectfolder(); } else { ProjectSettings *w = new ProjectSettings(projectTracks.x(), projectTracks.y(), KdenliveSettings::defaultprojectfolder(), false, this); if (w->exec() != QDialog::Accepted) return; @@ -1275,7 +1288,7 @@ void MainWindow::closeCurrentDocument() delete m_activeDocument; m_activeDocument = NULL; m_effectStack->clear(); - m_transitionConfig->slotTransitionItemSelected(NULL, QPoint(), false); + m_transitionConfig->slotTransitionItemSelected(NULL, 0, QPoint(), false); } else delete docToClose; if (w == m_activeTimeline) { delete m_activeTimeline; @@ -1402,7 +1415,7 @@ void MainWindow::openFile(const KUrl &url) void MainWindow::doOpenFile(const KUrl &url, KAutoSaveFile *stale) { - KdenliveDoc *doc = new KdenliveDoc(url, KUrl(), m_commandStack, QString(), QPoint(3, 2), m_projectMonitor->render, this); + 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); doc->m_autosave = stale; @@ -1520,6 +1533,31 @@ void MainWindow::slotEditProfiles() delete w; } +void MainWindow::slotDetectAudioDriver() +{ + //decide which audio driver is really best, in some cases SDL is wrong + if (KdenliveSettings::audiodrivername().isEmpty()) { + QString driver; + KProcess readProcess; + //PulseAudio needs to be selected if it exists, the ALSA pulse pcm device is not fast enough. + if (!KStandardDirs::findExe("pactl").isEmpty()) { + readProcess.setOutputChannelMode(KProcess::OnlyStdoutChannel); + readProcess.setProgram("pactl", QStringList() << "stat"); + readProcess.execute(2000); // Kill it after 2 seconds + + QString result = QString(readProcess.readAllStandardOutput()); + kDebug() << "// / / / / / READING PACTL: "; + kDebug() << result; + if (!result.isEmpty()) { + driver = "pulse"; + kDebug() << "// / / / / PULSEAUDIO DETECTED"; + } + } + //put others here + KdenliveSettings::setAutoaudiodrivername(driver); + } +} + void MainWindow::slotEditProjectSettings() { QPoint p = m_activeDocument->getTracksCount(); @@ -1786,8 +1824,8 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha disconnect(m_activeDocument, SIGNAL(deleteTimelineClip(const QString &)), m_activeTimeline, SLOT(slotDeleteClip(const QString &))); disconnect(m_activeTimeline->projectView(), SIGNAL(clipItemSelected(ClipItem*, int)), m_effectStack, SLOT(slotClipItemSelected(ClipItem*, int))); disconnect(m_activeTimeline->projectView(), SIGNAL(clipItemSelected(ClipItem*, int)), this, SLOT(slotActivateEffectStackView())); - disconnect(m_activeTimeline, SIGNAL(transitionItemSelected(Transition*, QPoint, bool)), m_transitionConfig, SLOT(slotTransitionItemSelected(Transition*, QPoint, bool))); - disconnect(m_activeTimeline, SIGNAL(transitionItemSelected(Transition*, QPoint, bool)), this, SLOT(slotActivateTransitionView(Transition *))); + disconnect(m_activeTimeline->projectView(), SIGNAL(transitionItemSelected(Transition*, int, QPoint, bool)), m_transitionConfig, SLOT(slotTransitionItemSelected(Transition*, int, QPoint, bool))); + disconnect(m_activeTimeline->projectView(), SIGNAL(transitionItemSelected(Transition*, int, QPoint, bool)), this, SLOT(slotActivateTransitionView(Transition *))); disconnect(m_zoomSlider, SIGNAL(valueChanged(int)), m_activeTimeline, SLOT(slotChangeZoom(int))); disconnect(m_activeTimeline->projectView(), SIGNAL(displayMessage(const QString&, MessageType)), m_messageLabel, SLOT(setMessage(const QString&, MessageType))); disconnect(m_activeTimeline->projectView(), SIGNAL(showClipFrame(DocClipBase *, const int)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *, const int))); @@ -1811,6 +1849,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha } //m_activeDocument->setRenderer(NULL); disconnect(m_projectList, SIGNAL(clipSelected(DocClipBase *)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *))); + disconnect(m_projectList, SIGNAL(refreshClip()), m_clipMonitor, SLOT(refreshMonitor())); m_clipMonitor->stop(); } KdenliveSettings::setCurrent_profile(doc->profilePath()); @@ -1820,6 +1859,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha m_transitionConfig->updateProjectFormat(doc->mltProfile(), doc->timecode(), trackView->tracksNumber()); m_effectStack->updateProjectFormat(doc->mltProfile(), doc->timecode()); connect(m_projectList, SIGNAL(clipSelected(DocClipBase *)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *))); + connect(m_projectList, SIGNAL(refreshClip()), m_clipMonitor, SLOT(refreshMonitor())); connect(m_projectList, SIGNAL(projectModified()), doc, SLOT(setModified())); connect(m_projectList, SIGNAL(clipNameChanged(const QString, const QString)), trackView->projectView(), SLOT(clipNameChanged(const QString, const QString))); @@ -1846,8 +1886,8 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha connect(trackView->projectView(), SIGNAL(clipItemSelected(ClipItem*, int)), m_effectStack, SLOT(slotClipItemSelected(ClipItem*, int))); connect(trackView->projectView(), SIGNAL(clipItemSelected(ClipItem*, int)), this, SLOT(slotActivateEffectStackView())); - connect(trackView, SIGNAL(transitionItemSelected(Transition*, QPoint, bool)), m_transitionConfig, SLOT(slotTransitionItemSelected(Transition*, QPoint, bool))); - connect(trackView, SIGNAL(transitionItemSelected(Transition*, QPoint, bool)), this, SLOT(slotActivateTransitionView(Transition *))); + 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()); connect(m_zoomSlider, SIGNAL(valueChanged(int)), trackView, SLOT(slotChangeZoom(int))); connect(trackView->projectView(), SIGNAL(zoomIn()), this, SLOT(slotZoomIn())); @@ -1921,6 +1961,7 @@ void MainWindow::slotPreferences(int page, int option) // 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()), m_monitorManager, SLOT(slotResetProfiles())); connect(dialog, SIGNAL(updatePreviewSettings()), this, SLOT(slotUpdatePreviewSettings())); connect(dialog, SIGNAL(updateCaptureFolder()), m_recMonitor, SLOT(slotUpdateCaptureFolder())); @@ -2286,22 +2327,74 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip) { if (clip->clipType() == TEXT) { QString titlepath = m_activeDocument->projectFolder().path() + "/titles/"; + if (!clip->getProperty("xmltemplate").isEmpty()) { + // template text clip + + // Get the list of existing templates + QStringList filter; + filter << "*.kdenlivetitle"; + QStringList templateFiles = QDir(titlepath).entryList(filter, QDir::Files); + + QDialog *dia = new QDialog(this); + Ui::TemplateClip_UI dia_ui; + dia_ui.setupUi(dia); + int ix = -1; + const QString templatePath = clip->getProperty("xmltemplate"); + for (int i = 0; i < templateFiles.size(); ++i) { + dia_ui.template_list->comboBox()->addItem(templateFiles.at(i), titlepath + templateFiles.at(i)); + if (templatePath == KUrl(titlepath + templateFiles.at(i)).path()) ix = i; + } + if (ix != -1) dia_ui.template_list->comboBox()->setCurrentIndex(ix); + else dia_ui.template_list->comboBox()->insertItem(0, templatePath); + dia_ui.template_list->fileDialog()->setFilter("*.kdenlivetitle"); + //warning: setting base directory doesn't work?? + KUrl startDir(titlepath); + dia_ui.template_list->fileDialog()->setUrl(startDir); + dia_ui.description->setText(clip->getProperty("description")); + dia_ui.clone_clip->setChecked(true); + if (dia->exec() == QDialog::Accepted) { + QString textTemplate = dia_ui.template_list->comboBox()->itemData(dia_ui.template_list->comboBox()->currentIndex()).toString(); + if (textTemplate.isEmpty()) textTemplate = dia_ui.template_list->comboBox()->currentText(); + + QMap newprops; + + if (KUrl(textTemplate).path() != templatePath) { + // The template was changed + newprops.insert("xmltemplate", textTemplate); + } + + if (dia_ui.description->toPlainText() != clip->getProperty("description")) { + newprops.insert("description", dia_ui.description->toPlainText()); + } + + QString newtemplate = newprops.value("xmltemplate"); + if (newtemplate.isEmpty()) newtemplate = templatePath; + + // template modified we need to update xmldata + QString description = newprops.value("description"); + if (description.isEmpty()) description = clip->getProperty("description"); + newprops.insert("xmldata", m_projectList->generateTemplateXml(newtemplate, description).toString()); + if (dia_ui.normal_clip->isChecked()) { + // Switch clip to normal clip + newprops.insert("xmltemplate", QString()); + } + EditClipCommand *command = new EditClipCommand(m_projectList, clip->getId(), clip->properties(), newprops, true); + m_activeDocument->commandStack()->push(command); + } + return; + } QString path = clip->getProperty("resource"); TitleWidget *dia_ui = new TitleWidget(KUrl(), titlepath, m_projectMonitor->render, this); QDomDocument doc; doc.setContent(clip->getProperty("xmldata")); dia_ui->setXml(doc); if (dia_ui->exec() == QDialog::Accepted) { - QImage pix = dia_ui->renderedPixmap(); - pix.save(path); - //slotAddClipFile(KUrl("/tmp/kdenlivetitle.png"), QString(), -1); - //m_clipManager->slotEditTextClipFile(id, dia_ui->xml().toString()); + QRect rect = dia_ui->renderedRect(); QMap newprops; newprops.insert("xmldata", dia_ui->xml().toString()); - newprops.insert("frame_size", QString::number(pix.width()) + 'x' + QString::number(pix.height())); + 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); - m_clipMonitor->refreshMonitor(true); m_activeDocument->setModified(true); } delete dia_ui; @@ -2563,6 +2656,7 @@ void MainWindow::slotGetNewLumaStuff() } qDeleteAll(entries); initEffects::refreshLumas(); + m_activeTimeline->projectView()->reloadTransitionLumas(); } void MainWindow::slotGetNewRenderStuff()