EffectsList MainWindow::customEffects;
EffectsList MainWindow::transitions;
-MainWindow::MainWindow(QWidget *parent)
+MainWindow::MainWindow(const QString &MltPath, QWidget *parent)
: KXmlGuiWindow(parent),
m_activeDocument(NULL), m_activeTimeline(NULL), m_renderWidget(NULL), m_jogProcess(NULL), m_findActivated(false), m_initialized(false) {
setlocale(LC_NUMERIC, "POSIX");
setFont(KGlobalSettings::toolBarFont());
- parseProfiles();
+ parseProfiles(MltPath);
m_commandStack = new QUndoGroup;
m_timelineArea = new KTabWidget(this);
m_timelineArea->setTabReorderingEnabled(true);
m_findTimer.setSingleShot(true);
initEffects::parseEffectFiles();
+ //initEffects::parseCustomEffectsFile();
+
m_monitorManager = new MonitorManager();
projectListDock = new QDockWidget(i18n("Project Tree"), this);
setCentralWidget(m_timelineArea);
setupGUI(Default, NULL /*"kdenliveui.rc"*/);
- kDebug() << factory() << " " << factory()->container("video_effects_menu", this);
+ //kDebug() << factory() << " " << factory()->container("video_effects_menu", this);
+
+ m_projectMonitor->setupMenu(static_cast<QMenu*>(factory()->container("monitor_go", this)));
+ m_clipMonitor->setupMenu(static_cast<QMenu*>(factory()->container("monitor_go", this)));
// build effects menus
QAction *action;
QMenu *videoEffectsMenu = static_cast<QMenu*>(factory()->container("video_effects_menu", this));
- QStringList effects = videoEffects.effectNames();
- foreach(const QString &name, effects) {
- action = new QAction(name, this);
- action->setData(name);
+
+ QStringList effectInfo;
+ QMap<QString, QStringList> effectsList;
+ for (int ix = 0; ix < videoEffects.count(); ix++) {
+ effectInfo = videoEffects.effectIdInfo(ix);
+ effectsList.insert(effectInfo.at(0).toLower(), effectInfo);
+ }
+
+ foreach(QStringList value, effectsList) {
+ action = new QAction(value.at(0), this);
+ action->setData(value);
videoEffectsMenu->addAction(action);
}
+
QMenu *audioEffectsMenu = static_cast<QMenu*>(factory()->container("audio_effects_menu", this));
- effects = audioEffects.effectNames();
- foreach(const QString &name, effects) {
- action = new QAction(name, this);
- action->setData(name);
+
+
+ effectsList.clear();
+ for (int ix = 0; ix < audioEffects.count(); ix++) {
+ effectInfo = audioEffects.effectIdInfo(ix);
+ effectsList.insert(effectInfo.at(0).toLower(), effectInfo);
+ }
+
+ foreach(QStringList value, effectsList) {
+ action = new QAction(value.at(0), this);
+ action->setData(value);
audioEffectsMenu->addAction(action);
}
+
m_customEffectsMenu = static_cast<QMenu*>(factory()->container("custom_effects_menu", this));
- effects = customEffects.effectNames();
- foreach(const QString &name, effects) {
- action = new QAction(name, this);
- action->setData(name);
+
+ if (customEffects.isEmpty()) m_customEffectsMenu->setEnabled(false);
+ else m_customEffectsMenu->setEnabled(true);
+
+ effectsList.clear();
+ for (int ix = 0; ix < customEffects.count(); ix++) {
+ effectInfo = customEffects.effectIdInfo(ix);
+ effectsList.insert(effectInfo.at(0).toLower(), effectInfo);
+ }
+
+ foreach(QStringList value, effectsList) {
+ action = new QAction(value.at(0), this);
+ action->setData(value);
m_customEffectsMenu->addAction(action);
}
+ QMenu *newEffect = new QMenu(this);
+ newEffect->addMenu(videoEffectsMenu);
+ newEffect->addMenu(audioEffectsMenu);
+ newEffect->addMenu(m_customEffectsMenu);
+ effectStack->setMenu(newEffect);
+
+
QMenu *viewMenu = static_cast<QMenu*>(factory()->container("dockwindows", this));
const QList<QAction *> viewActions = createPopupMenu()->actions();
viewMenu->insertActions(NULL, viewActions);
QMenu *transitionsMenu = new QMenu(i18n("Add Transition"), this);
- effects = transitions.effectNames();
+ QStringList effects = transitions.effectNames();
foreach(const QString &name, effects) {
action = new QAction(name, this);
action->setData(name);
m_timelineContextClipMenu->addMenu(transitionsMenu);
m_timelineContextClipMenu->addMenu(videoEffectsMenu);
m_timelineContextClipMenu->addMenu(audioEffectsMenu);
+ //TODO: re-enable custom effects menu when it is implemented
m_timelineContextClipMenu->addMenu(m_customEffectsMenu);
m_timelineContextTransitionMenu->addAction(actionCollection()->action("delete_timeline_clip"));
//virtual
bool MainWindow::queryClose() {
saveOptions();
+ if (m_monitorManager) m_monitorManager->stopActiveMonitor();
if (m_activeDocument && m_activeDocument->isModified()) {
switch (KMessageBox::warningYesNoCancel(this, i18n("Save changes to document ?"))) {
case KMessageBox::Yes :
m_customEffectsMenu->clear();
const QStringList effects = customEffects.effectNames();
QAction *action;
+ if (effects.isEmpty()) m_customEffectsMenu->setEnabled(false);
+ else m_customEffectsMenu->setEnabled(true);
+
foreach(const QString &name, effects) {
action = new QAction(name, this);
action->setData(name);
return;
}
TrackView *currentTimeLine = (TrackView *) m_timelineArea->currentWidget();
- currentTimeLine->projectView()->slotAddEffect(effect, pos, track);
+ currentTimeLine->projectView()->slotAddEffect(effect.cloneNode().toElement(), pos, track);
}
void MainWindow::slotRaiseMonitor(bool clipMonitor) {
connect(monitorPlay, SIGNAL(triggered(bool)), m_monitorManager, SLOT(slotPlay()));
KAction *markIn = collection->addAction("mark_in");
- markIn->setText(i18n("Set in point"));
+ markIn->setText(i18n("Set In Point"));
markIn->setShortcut(Qt::Key_I);
connect(markIn, SIGNAL(triggered(bool)), this, SLOT(slotSetInPoint()));
KAction *markOut = collection->addAction("mark_out");
- markOut->setText(i18n("Set in point"));
+ markOut->setText(i18n("Set Out Point"));
markOut->setShortcut(Qt::Key_O);
connect(markOut, SIGNAL(triggered(bool)), this, SLOT(slotSetOutPoint()));
collection->addAction("seek_clip_end", clipEnd);
connect(clipEnd, SIGNAL(triggered(bool)), this, SLOT(slotClipEnd()));
- KAction* projectStart = new KAction(KIcon("media-seek-backward"), i18n("Go to Project Start"), this);
+ KAction* projectStart = new KAction(KIcon("go-first"), i18n("Go to Project Start"), this);
projectStart->setShortcut(Qt::CTRL + Qt::Key_Home);
collection->addAction("seek_start", projectStart);
connect(projectStart, SIGNAL(triggered(bool)), m_monitorManager, SLOT(slotStart()));
- KAction* projectEnd = new KAction(KIcon("media-seek-forward"), i18n("Go to Project End"), this);
+ KAction* projectEnd = new KAction(KIcon("go-last"), i18n("Go to Project End"), this);
projectEnd->setShortcut(Qt::CTRL + Qt::Key_End);
collection->addAction("seek_end", projectEnd);
connect(projectEnd, SIGNAL(triggered(bool)), m_monitorManager, SLOT(slotEnd()));
collection->addAction("delete_timeline_clip", deleteTimelineClip);
connect(deleteTimelineClip, SIGNAL(triggered(bool)), this, SLOT(slotDeleteTimelineClip()));
- KAction* editTimelineClipSpeed = new KAction(KIcon("edit-delete"), i18n("Change Clip Speed"), this);
+ KAction* editTimelineClipSpeed = new KAction(i18n("Change Clip Speed"), this);
collection->addAction("change_clip_speed", editTimelineClipSpeed);
connect(editTimelineClipSpeed, SIGNAL(triggered(bool)), this, SLOT(slotChangeClipSpeed()));
collection->addAction("cut_timeline_clip", cutTimelineClip);
connect(cutTimelineClip, SIGNAL(triggered(bool)), this, SLOT(slotCutTimelineClip()));
- KAction* addClipMarker = new KAction(KIcon("bookmark-new"), i18n("Add Marker to Clip"), this);
+ KAction* addClipMarker = new KAction(KIcon("bookmark-new"), i18n("Add Marker"), this);
collection->addAction("add_clip_marker", addClipMarker);
connect(addClipMarker, SIGNAL(triggered(bool)), this, SLOT(slotAddClipMarker()));
- KAction* deleteClipMarker = new KAction(KIcon("edit-delete"), i18n("Delete Marker from Clip"), this);
+ KAction* deleteClipMarker = new KAction(KIcon("edit-delete"), i18n("Delete Marker"), this);
collection->addAction("delete_clip_marker", deleteClipMarker);
connect(deleteClipMarker, SIGNAL(triggered(bool)), this, SLOT(slotDeleteClipMarker()));
- KAction* deleteAllClipMarkers = new KAction(KIcon("edit-delete"), i18n("Delete All Markers from Clip"), this);
+ KAction* deleteAllClipMarkers = new KAction(KIcon("edit-delete"), i18n("Delete All Markers"), this);
collection->addAction("delete_all_clip_markers", deleteAllClipMarkers);
connect(deleteAllClipMarkers, SIGNAL(triggered(bool)), this, SLOT(slotDeleteAllClipMarkers()));
if (m_timelineArea->count() == 1) m_timelineArea->setTabBarHidden(true);
delete docToClose;
delete w;
- if (m_timelineArea->count() == 0) m_activeDocument = NULL;
+ if (m_timelineArea->count() == 0) {
+ m_activeDocument = NULL;
+ effectStack->clear();
+ transitionConfig->slotTransitionItemSelected(NULL);
+ }
}
void MainWindow::saveFileAs(const QString &outputFileName) {
}
void MainWindow::openFile(const KUrl &url) {
+ // Check if the document is already opened
+ const int ct = m_timelineArea->count();
+ bool isOpened = false;
+ int i;
+ for (i = 0; i < ct; i++) {
+ TrackView *tab = (TrackView *) m_timelineArea->widget(i);
+ KdenliveDoc *doc = tab->document();
+ if (doc->url() == url) {
+ isOpened = true;
+ break;
+ }
+ }
+ if (isOpened) {
+ m_timelineArea->setCurrentIndex(i);
+ return;
+ }
+
// Check for backup file
QList<KAutoSaveFile *> staleFiles = KAutoSaveFile::staleFiles(url);
if (!staleFiles.isEmpty()) {
}
-void MainWindow::parseProfiles() {
+void MainWindow::parseProfiles(const QString &mltPath) {
//kdDebug()<<" + + YOUR MLT INSTALL WAS FOUND IN: "<< MLT_PREFIX <<endl;
//KdenliveSettings::setDefaulttmpfolder();
+ if (!mltPath.isEmpty()) {
+ KdenliveSettings::setMltpath(mltPath + "/share/mlt/profiles/");
+ KdenliveSettings::setRendererpath(mltPath + "/bin/inigo");
+ }
+
if (KdenliveSettings::mltpath().isEmpty()) {
KdenliveSettings::setMltpath(QString(MLT_PREFIX) + QString("/share/mlt/profiles/"));
}
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 inigo program required for rendering (part of Mlt)"));
+ return;
+ }
args << KdenliveSettings::rendererpath() << m_activeDocument->profilePath() << render << videoPlayer << temp.fileName() << dest << avformat_args;
QString renderer = QCoreApplication::applicationDirPath() + QString("/kdenlive_render");
if (!QFile::exists(renderer)) renderer = "kdenlive_render";
m_activeDocument->backupMltPlaylist();
if (m_activeTimeline) {
disconnect(m_projectMonitor, SIGNAL(renderPosition(int)), m_activeTimeline, SLOT(moveCursorPos(int)));
- disconnect(m_projectMonitor, SIGNAL(zoneUpdated(QPoint)), trackView, SLOT(slotSetZone(QPoint)));
+ disconnect(m_projectMonitor, SIGNAL(zoneUpdated(QPoint)), m_activeTimeline, SLOT(slotSetZone(QPoint)));
disconnect(m_projectMonitor, SIGNAL(durationChanged(int)), m_activeTimeline, SLOT(setDuration(int)));
disconnect(m_projectList, SIGNAL(projectModified()), m_activeDocument, SLOT(setModified()));
disconnect(m_activeDocument, SIGNAL(guidesUpdated()), this, SLOT(slotGuidesUpdated()));
disconnect(effectStack, SIGNAL(updateClipEffect(ClipItem*, QDomElement, QDomElement, int)), m_activeTimeline->projectView(), SLOT(slotUpdateClipEffect(ClipItem*, QDomElement, QDomElement, int)));
disconnect(effectStack, SIGNAL(removeEffect(ClipItem*, QDomElement)), m_activeTimeline->projectView(), SLOT(slotDeleteEffect(ClipItem*, QDomElement)));
disconnect(effectStack, SIGNAL(changeEffectState(ClipItem*, int, bool)), m_activeTimeline->projectView(), SLOT(slotChangeEffectState(ClipItem*, int, bool)));
- disconnect(effectStack, SIGNAL(changeEffectPosition(ClipItem*, int, int)), trackView->projectView(), SLOT(slotChangeEffectPosition(ClipItem*, int, int)));
+ disconnect(effectStack, SIGNAL(changeEffectPosition(ClipItem*, int, int)), m_activeTimeline->projectView(), SLOT(slotChangeEffectPosition(ClipItem*, int, int)));
disconnect(effectStack, SIGNAL(refreshEffectStack(ClipItem*)), m_activeTimeline->projectView(), SLOT(slotRefreshEffects(ClipItem*)));
disconnect(effectStack, SIGNAL(reloadEffects()), this, SLOT(slotReloadEffects()));
- disconnect(transitionConfig, SIGNAL(transitionUpdated(Transition *, QDomElement)), trackView->projectView() , SLOT(slotTransitionUpdated(Transition *, QDomElement)));
- disconnect(transitionConfig, SIGNAL(seekTimeline(int)), trackView->projectView() , SLOT(setCursorPos(int)));
+ disconnect(transitionConfig, SIGNAL(transitionUpdated(Transition *, QDomElement)), m_activeTimeline->projectView() , SLOT(slotTransitionUpdated(Transition *, QDomElement)));
+ disconnect(transitionConfig, SIGNAL(seekTimeline(int)), m_activeTimeline->projectView() , SLOT(setCursorPos(int)));
disconnect(m_activeTimeline->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(activateMonitor()));
- disconnect(trackView, SIGNAL(zoneMoved(int, int)), m_projectMonitor, SLOT(slotZoneMoved(int, int)));
+ disconnect(m_activeTimeline, SIGNAL(zoneMoved(int, int)), m_projectMonitor, SLOT(slotZoneMoved(int, int)));
+ disconnect(m_projectList, SIGNAL(loadingIsOver()), m_activeTimeline->projectView(), SLOT(slotUpdateAllThumbs()));
effectStack->clear();
}
m_activeDocument->setRenderer(NULL);
m_monitorManager->resetProfiles(doc->timecode());
m_projectList->setDocument(doc);
transitionConfig->updateProjectFormat(doc->mltProfile());
+ effectStack->updateProjectFormat(doc->mltProfile());
connect(m_projectList, SIGNAL(clipSelected(DocClipBase *)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *)));
connect(m_projectList, SIGNAL(projectModified()), doc, SLOT(setModified()));
connect(trackView, SIGNAL(cursorMoved()), m_projectMonitor, SLOT(activateMonitor()));
connect(trackView->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(activateMonitor()));
connect(trackView, SIGNAL(zoneMoved(int, int)), m_projectMonitor, SLOT(slotZoneMoved(int, int)));
+ connect(m_projectList, SIGNAL(loadingIsOver()), trackView->projectView(), SLOT(slotUpdateAllThumbs()));
trackView->projectView()->setContextMenu(m_timelineContextMenu, m_timelineContextClipMenu, m_timelineContextTransitionMenu);
m_activeTimeline = trackView;
m_commandStack->setActiveStack(doc->commandStack());
KdenliveSettings::setProject_display_ratio(doc->dar());
m_projectList->updateAllClips();
- trackView->projectView()->updateAllThumbs();
-
+ //doc->clipManager()->checkAudioThumbs();
//m_overView->setScene(trackView->projectScene());
//m_overView->scale(m_overView->width() / trackView->duration(), m_overView->height() / (50 * trackView->tracksNumber()));
void MainWindow::slotDeleteTimelineClip() {
- if (m_activeTimeline) {
+ if (QApplication::focusWidget()->parentWidget()->parentWidget() == projectListDock) m_projectList->slotRemoveClip();
+ else if (m_activeTimeline) {
m_activeTimeline->projectView()->deleteSelectedClips();
}
}
void MainWindow::slotAddVideoEffect(QAction *result) {
if (!result) return;
- QDomElement effect = videoEffects.getEffectByName(result->data().toString());
+ QStringList info = result->data().toStringList();
+ if (info.isEmpty()) return;
+ QDomElement effect = videoEffects.getEffectByTag(info.at(1), info.at(2));
slotAddEffect(effect);
}
void MainWindow::slotAddAudioEffect(QAction *result) {
if (!result) return;
- QDomElement effect = audioEffects.getEffectByName(result->data().toString());
+ QStringList info = result->data().toStringList();
+ if (info.isEmpty()) return;
+ QDomElement effect = audioEffects.getEffectByTag(info.at(1), info.at(2));
slotAddEffect(effect);
}
void MainWindow::slotAddCustomEffect(QAction *result) {
if (!result) return;
- QDomElement effect = customEffects.getEffectByName(result->data().toString());
+ QStringList info = result->data().toStringList();
+ if (info.isEmpty()) return;
+ QDomElement effect = customEffects.getEffectByTag(info.at(1), info.at(2));
slotAddEffect(effect);
}