#include "customtrackview.h"
#include "effectslistview.h"
#include "effectstackview.h"
+#include "effectstack/effectstackview2.h"
#include "transitionsettings.h"
#include "renderwidget.h"
#include "renderer.h"
-#include "audiosignal.h"
-#ifndef NO_JOGSHUTTLE
+#ifdef USE_JOGSHUTTLE
#include "jogshuttle.h"
#include "jogaction.h"
#include "jogshuttleconfig.h"
-#endif /* NO_JOGSHUTTLE */
+#endif
#include "clipproperties.h"
#include "wizard.h"
-#include "editclipcommand.h"
+#include "commands/editclipcommand.h"
#include "titlewidget.h"
#include "markerdialog.h"
#include "clipitem.h"
#include "interfaces.h"
-#include "kdenlive-config.h"
+#include "config-kdenlive.h"
#include "cliptranscode.h"
#include "ui_templateclip_ui.h"
-#include "colorscopes/vectorscope.h"
-#include "colorscopes/waveform.h"
-#include "colorscopes/rgbparade.h"
-#include "colorscopes/histogram.h"
-#include "audiospectrum.h"
-#include "spectrogram.h"
+#include "scopes/scopemanager.h"
+#include "scopes/colorscopes/vectorscope.h"
+#include "scopes/colorscopes/waveform.h"
+#include "scopes/colorscopes/rgbparade.h"
+#include "scopes/colorscopes/histogram.h"
+#include "scopes/audioscopes/audiosignal.h"
+#include "scopes/audioscopes/audiospectrum.h"
+#include "scopes/audioscopes/spectrogram.h"
#include "archivewidget.h"
#include "databackup/backupwidget.h"
+#include "utils/resourcewidget.h"
+
#include <KApplication>
#include <KAction>
#include <knewstuff2/engine.h>
#include <knewstuff2/ui/knewstuffaction.h>
#define KNS3 KNS
-#endif /* KDE_IS_VERSION(4,3,80) */
+#endif
#include <KToolBar>
#include <KColorScheme>
#include <KProgressDialog>
#include <QBitmap>
#include <stdlib.h>
+#include <locale.h>
// Uncomment for deeper debugging
//#define DEBUG_MAINW
Q_DECLARE_METATYPE(QVector<int16_t>)
+
EffectsList MainWindow::videoEffects;
EffectsList MainWindow::audioEffects;
EffectsList MainWindow::customEffects;
m_activeTimeline(NULL),
m_recMonitor(NULL),
m_renderWidget(NULL),
-#ifndef NO_JOGSHUTTLE
+#ifdef USE_JOGSHUTTLE
m_jogProcess(NULL),
m_jogShuttle(NULL),
-#endif /* NO_JOGSHUTTLE */
+#endif
m_findActivated(false),
m_stopmotion(NULL)
-{
+{
qRegisterMetaType<QVector<int16_t> > ();
qRegisterMetaType<stringMap> ("stringMap");
+ qRegisterMetaType<audioByteArray> ("audioByteArray");
+
// Init locale
QLocale systemLocale = QLocale();
+ setlocale(LC_NUMERIC, NULL);
+ char *separator = localeconv()->decimal_point;
+ if (separator != systemLocale.decimalPoint()) {
+ kDebug()<<"------\n!!! system locale is not similar to Qt's locale... be prepared for bugs!!!\n------";
+ // HACK: There is a locale conflict, so set locale to at least have correct decimal point
+ if (strncmp(separator, ".", 1) == 0) systemLocale = QLocale::c();
+ else if (strncmp(separator, ",", 1) == 0) systemLocale = QLocale("fr_FR.UTF-8");
+ }
+
systemLocale.setNumberOptions(QLocale::OmitGroupSeparator);
QLocale::setDefault(systemLocale);
closeTabButton->adjustSize();
closeTabButton->setToolTip(i18n("Close the current tab"));
m_timelineArea->setCornerWidget(closeTabButton);
- connect(m_timelineArea, SIGNAL(currentChanged(int)), this, SLOT(activateDocument()));
+ //connect(m_timelineArea, SIGNAL(currentChanged(int)), this, SLOT(activateDocument()));
connect(&m_findTimer, SIGNAL(timeout()), this, SLOT(findTimeout()));
m_findTimer.setSingleShot(true);
m_clipMonitorDock = new QDockWidget(i18n("Clip Monitor"), this);
m_clipMonitorDock->setObjectName("clip_monitor");
- m_clipMonitor = new Monitor("clip", m_monitorManager, QString(), m_timelineArea);
+ m_clipMonitor = new Monitor(Kdenlive::clipMonitor, m_monitorManager, QString(), m_timelineArea);
m_clipMonitorDock->setWidget(m_clipMonitor);
- connect(m_projectList, SIGNAL(clipSelected(DocClipBase *, QPoint)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *, QPoint)));
-
+
+ // Connect the project list
+ connect(m_projectList, SIGNAL(clipSelected(DocClipBase *, QPoint, bool)), m_clipMonitor, SLOT(slotSetClipProducer(DocClipBase *, QPoint, bool)));
+ connect(m_projectList, SIGNAL(raiseClipMonitor()), m_clipMonitor, SLOT(slotActivateMonitor()));
+ connect(m_projectList, SIGNAL(loadingIsOver()), this, SLOT(slotElapsedTime()));
+ connect(m_projectList, SIGNAL(displayMessage(const QString&, int)), this, SLOT(slotGotProgressInfo(const QString&, int)));
+ connect(m_projectList, SIGNAL(updateRenderStatus()), this, SLOT(slotCheckRenderStatus()));
+ connect(m_projectList, SIGNAL(clipNeedsReload(const QString&)),this, SLOT(slotUpdateClip(const QString &)));
+ connect(m_projectList, SIGNAL(updateProfile(const QString &)), this, SLOT(slotUpdateProjectProfile(const QString &)));
+ connect(m_projectList, SIGNAL(refreshClip(const QString &, bool)), m_monitorManager, SLOT(slotRefreshCurrentMonitor(const QString &)));
+ connect(m_projectList, SIGNAL(findInTimeline(const QString&)), this, SLOT(slotClipInTimeline(const QString&)));
+ connect(m_clipMonitor, SIGNAL(zoneUpdated(QPoint)), m_projectList, SLOT(slotUpdateClipCut(QPoint)));
+ connect(m_clipMonitor, SIGNAL(extractZone(const QString &, QPoint)), m_projectList, SLOT(slotCutClipJob(const QString &, QPoint)));
+
m_projectMonitorDock = new QDockWidget(i18n("Project Monitor"), this);
m_projectMonitorDock->setObjectName("project_monitor");
- m_projectMonitor = new Monitor("project", m_monitorManager, QString());
+ m_projectMonitor = new Monitor(Kdenlive::projectMonitor, m_monitorManager, QString());
m_projectMonitorDock->setWidget(m_projectMonitor);
#ifndef Q_WS_MAC
m_recMonitorDock = new QDockWidget(i18n("Record Monitor"), this);
m_recMonitorDock->setObjectName("record_monitor");
- m_recMonitor = new RecMonitor("record", m_monitorManager);
+ m_recMonitor = new RecMonitor(Kdenlive::recordMonitor, m_monitorManager);
m_recMonitorDock->setWidget(m_recMonitor);
connect(m_recMonitor, SIGNAL(addProjectClip(KUrl)), this, SLOT(slotAddProjectClip(KUrl)));
connect(m_recMonitor, SIGNAL(addProjectClipList(KUrl::List)), this, SLOT(slotAddProjectClipList(KUrl::List)));
connect(m_recMonitor, SIGNAL(showConfigDialog(int, int)), this, SLOT(slotPreferences(int, int)));
-#endif
+
+#endif /* ! Q_WS_MAC */
m_monitorManager->initMonitors(m_clipMonitor, m_projectMonitor, m_recMonitor);
m_notesDock = new QDockWidget(i18n("Project Notes"), this);
m_notesWidget = new NotesWidget();
connect(m_notesWidget, SIGNAL(insertNotesTimecode()), this, SLOT(slotInsertNotesTimecode()));
connect(m_notesWidget, SIGNAL(seekProject(int)), m_projectMonitor->render, SLOT(seekToFrame(int)));
-
+
m_notesWidget->setTabChangesFocus(true);
#if KDE_IS_VERSION(4,4,0)
m_notesWidget->setClickMessage(i18n("Enter your project notes here ..."));
m_effectStackDock = new QDockWidget(i18n("Effect Stack"), this);
m_effectStackDock->setObjectName("effect_stack");
- m_effectStack = new EffectStackView(m_projectMonitor);
+ m_effectStack = new EffectStackView2(m_projectMonitor);
m_effectStackDock->setWidget(m_effectStack);
addDockWidget(Qt::TopDockWidgetArea, m_effectStackDock);
+ connect(m_effectStack, SIGNAL(startFilterJob(ItemInfo, const QString&,const QString&,const QString&,const QString&,const QString&,const QString&,const QString&)), m_projectList, SLOT(slotStartFilterJob(ItemInfo, const QString&,const QString&,const QString&,const QString&,const QString&,const QString&,const QString&)));
m_transitionConfigDock = new QDockWidget(i18n("Transition"), this);
m_transitionConfigDock->setObjectName("transition");
m_effectListDock->setWidget(m_effectList);
addDockWidget(Qt::TopDockWidgetArea, m_effectListDock);
- m_vectorscope = new Vectorscope(m_monitorManager);
+ m_scopeManager = new ScopeManager(m_monitorManager);
+ m_vectorscope = new Vectorscope();
m_vectorscopeDock = new QDockWidget(i18n("Vectorscope"), this);
m_vectorscopeDock->setObjectName(m_vectorscope->widgetName());
m_vectorscopeDock->setWidget(m_vectorscope);
addDockWidget(Qt::TopDockWidgetArea, m_vectorscopeDock);
- connect(m_vectorscopeDock, SIGNAL(visibilityChanged(bool)), m_vectorscope, SLOT(forceUpdate(bool)));
- connect(m_vectorscopeDock, SIGNAL(visibilityChanged(bool)), this, SLOT(slotUpdateGfxScopeFrameRequest()));
- connect(m_vectorscope, SIGNAL(requestAutoRefresh(bool)), this, SLOT(slotUpdateGfxScopeFrameRequest()));
- m_gfxScopesList.append(m_vectorscopeDock);
+ m_scopeManager->addScope(m_vectorscope, m_vectorscopeDock);
- m_waveform = new Waveform(m_monitorManager);
+ m_waveform = new Waveform();
m_waveformDock = new QDockWidget(i18n("Waveform"), this);
m_waveformDock->setObjectName(m_waveform->widgetName());
m_waveformDock->setWidget(m_waveform);
addDockWidget(Qt::TopDockWidgetArea, m_waveformDock);
- connect(m_waveformDock, SIGNAL(visibilityChanged(bool)), m_waveform, SLOT(forceUpdate(bool)));
- connect(m_waveformDock, SIGNAL(visibilityChanged(bool)), this, SLOT(slotUpdateGfxScopeFrameRequest()));
- connect(m_waveform, SIGNAL(requestAutoRefresh(bool)), this, SLOT(slotUpdateGfxScopeFrameRequest()));
- m_gfxScopesList.append(m_waveformDock);
+ m_scopeManager->addScope(m_waveform, m_waveformDock);
- m_RGBParade = new RGBParade(m_monitorManager);
+ m_RGBParade = new RGBParade();
m_RGBParadeDock = new QDockWidget(i18n("RGB Parade"), this);
m_RGBParadeDock->setObjectName(m_RGBParade->widgetName());
m_RGBParadeDock->setWidget(m_RGBParade);
addDockWidget(Qt::TopDockWidgetArea, m_RGBParadeDock);
- connect(m_RGBParadeDock, SIGNAL(visibilityChanged(bool)), m_RGBParade, SLOT(forceUpdate(bool)));
- connect(m_RGBParadeDock, SIGNAL(visibilityChanged(bool)), this, SLOT(slotUpdateGfxScopeFrameRequest()));
- connect(m_RGBParade, SIGNAL(requestAutoRefresh(bool)), this, SLOT(slotUpdateGfxScopeFrameRequest()));
- m_gfxScopesList.append(m_RGBParadeDock);
+ m_scopeManager->addScope(m_RGBParade, m_RGBParadeDock);
- m_histogram = new Histogram(m_monitorManager);
+ m_histogram = new Histogram();
m_histogramDock = new QDockWidget(i18n("Histogram"), this);
m_histogramDock->setObjectName(m_histogram->widgetName());
m_histogramDock->setWidget(m_histogram);
addDockWidget(Qt::TopDockWidgetArea, m_histogramDock);
- connect(m_histogramDock, SIGNAL(visibilityChanged(bool)), m_histogram, SLOT(forceUpdate(bool)));
- connect(m_histogramDock, SIGNAL(visibilityChanged(bool)), this, SLOT(slotUpdateGfxScopeFrameRequest()));
- connect(m_histogram, SIGNAL(requestAutoRefresh(bool)), this, SLOT(slotUpdateGfxScopeFrameRequest()));
- m_gfxScopesList.append(m_histogramDock);
-
+ m_scopeManager->addScope(m_histogram, m_histogramDock);
m_audiosignal = new AudioSignal;
m_audiosignalDock = new QDockWidget(i18n("Audio Signal"), this);
m_audiosignalDock->setObjectName("audiosignal");
m_audiosignalDock->setWidget(m_audiosignal);
addDockWidget(Qt::TopDockWidgetArea, m_audiosignalDock);
- connect(m_audiosignalDock, SIGNAL(visibilityChanged(bool)), this, SLOT(slotUpdateAudioScopeFrameRequest()));
- connect(m_audiosignal, SIGNAL(updateAudioMonitoring()), this, SLOT(slotUpdateAudioScopeFrameRequest()));
+ m_scopeManager->addScope(m_audiosignal, m_audiosignalDock);
m_audioSpectrum = new AudioSpectrum();
m_audioSpectrumDock = new QDockWidget(i18n("AudioSpectrum"), this);
m_audioSpectrumDock->setObjectName(m_audioSpectrum->widgetName());
m_audioSpectrumDock->setWidget(m_audioSpectrum);
addDockWidget(Qt::TopDockWidgetArea, m_audioSpectrumDock);
- m_audioScopesList.append(m_audioSpectrum);
- connect(m_audioSpectrumDock, SIGNAL(visibilityChanged(bool)), this, SLOT(slotUpdateAudioScopeFrameRequest()));
- connect(m_audioSpectrum, SIGNAL(requestAutoRefresh(bool)), this, SLOT(slotUpdateAudioScopeFrameRequest()));
+ m_scopeManager->addScope(m_audioSpectrum, m_audioSpectrumDock);
m_spectrogram = new Spectrogram();
m_spectrogramDock = new QDockWidget(i18n("Spectrogram"), this);
m_spectrogramDock->setObjectName(m_spectrogram->widgetName());
m_spectrogramDock->setWidget(m_spectrogram);
addDockWidget(Qt::TopDockWidgetArea, m_spectrogramDock);
- m_audioScopesList.append(m_spectrogram);
- connect(m_audioSpectrumDock, SIGNAL(visibilityChanged(bool)), this, SLOT(slotUpdateAudioScopeFrameRequest()));
- connect(m_audioSpectrum, SIGNAL(requestAutoRefresh(bool)), this, SLOT(slotUpdateAudioScopeFrameRequest()));
-
- // Connect the audio signal to the audio scope slots
- bool b = true;
- if (m_projectMonitor) {
- qDebug() << "project monitor connected";
- b &= connect(m_projectMonitor->render, SIGNAL(audioSamplesSignal(QVector<int16_t>, int, int, int)),
- m_audioSpectrum, SLOT(slotReceiveAudio(QVector<int16_t>, int, int, int)));
- b &= connect(m_projectMonitor->render, SIGNAL(audioSamplesSignal(const QVector<int16_t>&, const int&, const int&, const int&)),
- m_audiosignal, SLOT(slotReceiveAudio(const QVector<int16_t>&, const int&, const int&, const int&)));
- b &= connect(m_projectMonitor->render, SIGNAL(audioSamplesSignal(QVector<int16_t>,int,int,int)),
- m_spectrogram, SLOT(slotReceiveAudio(QVector<int16_t>,int,int,int)));
- }
- if (m_clipMonitor) {
- qDebug() << "clip monitor connected";
- b &= connect(m_clipMonitor->render, SIGNAL(audioSamplesSignal(QVector<int16_t>, int, int, int)),
- m_audioSpectrum, SLOT(slotReceiveAudio(QVector<int16_t>, int, int, int)));
- b &= connect(m_clipMonitor->render, SIGNAL(audioSamplesSignal(const QVector<int16_t>&, int, int, int)),
- m_audiosignal, SLOT(slotReceiveAudio(const QVector<int16_t>&, int, int, int)));
- b &= connect(m_clipMonitor->render, SIGNAL(audioSamplesSignal(QVector<int16_t>,int,int,int)),
- m_spectrogram, SLOT(slotReceiveAudio(QVector<int16_t>,int,int,int)));
- }
- // Ensure connections were set up correctly
- Q_ASSERT(b);
-
-
+ m_scopeManager->addScope(m_spectrogram, m_spectrogramDock);
// Add monitors here to keep them at the right of the window
addDockWidget(Qt::TopDockWidgetArea, m_clipMonitorDock);
#ifndef Q_WS_MAC
tabifyDockWidget(m_clipMonitorDock, m_recMonitorDock);
#endif
-
-
-
-
setCentralWidget(m_timelineArea);
-
m_fileOpenRecent = KStandardAction::openRecent(this, SLOT(openFile(const KUrl &)), actionCollection());
readOptions();
m_fileRevert = KStandardAction::revert(this, SLOT(slotRevert()), actionCollection());
m_effectActions = new KActionCategory(i18n("Effects"), actionCollection());
m_effectList->reloadEffectList(m_effectsMenu, m_effectActions);
m_effectsActionCollection->readSettings();
-
+
setupGUI();
// Find QDockWidget tab bars and show / hide widget title bars on right click
/*ScriptingPart* sp = new ScriptingPart(this, QStringList());
guiFactory()->addClient(sp);*/
+ QMenu *trackMenu = (QMenu*)(factory()->container("track_menu", this));
+ if (trackMenu) trackMenu->addActions(m_tracksActionCollection->actions());
+
QMenu *saveLayout = (QMenu*)(factory()->container("layout_save_as", this));
if (saveLayout)
loadPlugins();
loadTranscoders();
+ loadStabilize();
m_projectMonitor->setupMenu(static_cast<QMenu*>(factory()->container("monitor_go", this)), m_playZone, m_loopZone, NULL, m_loopClip);
m_clipMonitor->setupMenu(static_cast<QMenu*>(factory()->container("monitor_go", this)), m_playZone, m_loopZone, static_cast<QMenu*>(factory()->container("marker_menu", this)));
QMenu *clipInTimeline = static_cast<QMenu*>(factory()->container("clip_in_timeline", this));
clipInTimeline->setIcon(KIcon("go-jump"));
- m_projectList->setupGeneratorMenu(static_cast<QMenu*>(factory()->container("generators", this)),
- static_cast<QMenu*>(factory()->container("transcoders", this)),
- clipInTimeline);
+ QHash<QString,QMenu*> menus;
+ menus.insert("addMenu",static_cast<QMenu*>(factory()->container("generators", this)));
+ menus.insert("extractAudioMenu",static_cast<QMenu*>(factory()->container("extract_audio", this)));
+ menus.insert("transcodeMenu",static_cast<QMenu*>(factory()->container("transcoders", this)));
+ menus.insert("stabilizeMenu",static_cast<QMenu*>(factory()->container("stabilize", this)));
+ menus.insert("inTimelineMenu",clipInTimeline);
+ m_projectList->setupGeneratorMenu(menus);
// build themes menus
QMenu *themesMenu = static_cast<QMenu*>(factory()->container("themes_menu", this));
connect(m_effectsMenu, SIGNAL(triggered(QAction *)), this, SLOT(slotAddVideoEffect(QAction *)));
connect(m_transitionsMenu, SIGNAL(triggered(QAction *)), this, SLOT(slotAddTransition(QAction *)));
- m_effectStack->setMenu(m_effectsMenu);
-
QMenu *viewMenu = static_cast<QMenu*>(factory()->container("dockwindows", this));
const QList<QAction *> viewActions = createPopupMenu()->actions();
viewMenu->insertActions(NULL, viewActions);
connect(m_projectMonitorDock, SIGNAL(visibilityChanged(bool)), m_projectMonitor, SLOT(refreshMonitor(bool)));
connect(m_clipMonitorDock, SIGNAL(visibilityChanged(bool)), m_clipMonitor, SLOT(refreshMonitor(bool)));
- //connect(m_monitorManager, SIGNAL(connectMonitors()), this, SLOT(slotConnectMonitors()));
- 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()));
m_projectList->slotAddClip(urls);
}
-#ifndef NO_JOGSHUTTLE
+#ifdef USE_JOGSHUTTLE
activateShuttleDevice();
-#endif /* NO_JOGSHUTTLE */
+#endif
m_projectListDock->raise();
actionCollection()->addAssociatedWidget(m_clipMonitor->container());
actionCollection()->addAssociatedWidget(m_projectMonitor->container());
+
+ // Populate encoding profiles
+ KConfig conf("encodingprofiles.rc", KConfig::FullConfig, "appdata");
+ if (KdenliveSettings::proxyparams().isEmpty() || KdenliveSettings::proxyextension().isEmpty()) {
+ KConfigGroup group(&conf, "proxy");
+ QMap< QString, QString > values = group.entryMap();
+ QMapIterator<QString, QString> i(values);
+ if (i.hasNext()) {
+ i.next();
+ QString data = i.value();
+ KdenliveSettings::setProxyparams(data.section(';', 0, 0));
+ KdenliveSettings::setProxyextension(data.section(';', 1, 1));
+ }
+ }
+ if (KdenliveSettings::v4l_parameters().isEmpty() || KdenliveSettings::v4l_extension().isEmpty()) {
+ KConfigGroup group(&conf, "video4linux");
+ QMap< QString, QString > values = group.entryMap();
+ QMapIterator<QString, QString> i(values);
+ if (i.hasNext()) {
+ i.next();
+ QString data = i.value();
+ KdenliveSettings::setV4l_parameters(data.section(';', 0, 0));
+ KdenliveSettings::setV4l_extension(data.section(';', 1, 1));
+ }
+ }
+ if (KdenliveSettings::decklink_parameters().isEmpty() || KdenliveSettings::decklink_extension().isEmpty()) {
+ KConfigGroup group(&conf, "decklink");
+ QMap< QString, QString > values = group.entryMap();
+ QMapIterator<QString, QString> i(values);
+ if (i.hasNext()) {
+ i.next();
+ QString data = i.value();
+ KdenliveSettings::setDecklink_parameters(data.section(';', 0, 0));
+ KdenliveSettings::setDecklink_extension(data.section(';', 1, 1));
+ }
+ }
}
MainWindow::~MainWindow()
delete m_clipMonitor;
delete m_shortcutRemoveFocus;
delete[] m_transitions;
+ delete m_monitorManager;
+ delete m_scopeManager;
Mlt::Factory::close();
}
m_effectList->reloadEffectList(m_effectsMenu, m_effectActions);
}
-#ifndef NO_JOGSHUTTLE
+#ifdef USE_JOGSHUTTLE
void MainWindow::activateShuttleDevice()
{
delete m_jogShuttle;
delete m_jogProcess;
m_jogProcess = NULL;
if (KdenliveSettings::enableshuttle() == false) return;
-
+
m_jogProcess = new JogShuttle(KdenliveSettings::shuttledevice());
m_jogShuttle = new JogShuttleAction(m_jogProcess, JogShuttleConfig::actionMap(KdenliveSettings::shuttlebuttons()));
-
+
connect(m_jogShuttle, SIGNAL(rewindOneFrame()), m_monitorManager, SLOT(slotRewindOneFrame()));
connect(m_jogShuttle, SIGNAL(forwardOneFrame()), m_monitorManager, SLOT(slotForwardOneFrame()));
connect(m_jogShuttle, SIGNAL(rewind(double)), m_monitorManager, SLOT(slotRewind(double)));
connect(m_jogShuttle, SIGNAL(forward(double)), m_monitorManager, SLOT(slotForward(double)));
connect(m_jogShuttle, SIGNAL(action(const QString&)), this, SLOT(slotDoAction(const QString&)));
}
-#endif /* NO_JOGSHUTTLE */
+#endif /* USE_JOGSHUTTLE */
void MainWindow::slotDoAction(const QString& action_name)
{
void MainWindow::slotUpdateClip(const QString &id)
{
if (!m_activeDocument) return;
- m_activeTimeline->projectView()->slotUpdateClip(id);
+ DocClipBase *clip = m_activeDocument->clipManager()->getClipById(id);
+ if (!clip) return;
+ if (clip->numReferences() > 0) m_activeTimeline->projectView()->slotUpdateClip(id);
+ if (m_clipMonitor->activeClip() && m_clipMonitor->activeClip()->getId() == id) {
+ Mlt::Producer *monitorProducer = clip->getCloneProducer();
+ m_clipMonitor->updateClipProducer(monitorProducer);
+ }
+ clip->cleanupProducers();
}
void MainWindow::slotConnectMonitors()
{
m_projectList->setRenderer(m_projectMonitor->render);
- //connect(m_projectList, SIGNAL(receivedClipDuration(const QString &)), this, SLOT(slotUpdateClip(const QString &)));
connect(m_projectList, SIGNAL(deleteProjectClips(QStringList, QMap<QString, QString>)), this, SLOT(slotDeleteProjectClips(QStringList, QMap<QString, QString>)));
connect(m_projectList, SIGNAL(showClipProperties(DocClipBase *)), this, SLOT(slotShowClipProperties(DocClipBase *)));
connect(m_projectList, SIGNAL(showClipProperties(QList <DocClipBase *>, QMap<QString, QString>)), this, SLOT(slotShowClipProperties(QList <DocClipBase *>, QMap<QString, QString>)));
- connect(m_projectList, SIGNAL(getFileProperties(const QDomElement, const QString &, int, bool)), m_projectMonitor->render, SLOT(getFileProperties(const QDomElement, const QString &, int, bool)));
connect(m_projectMonitor->render, SIGNAL(replyGetImage(const QString &, const QString &, int, int)), m_projectList, SLOT(slotReplyGetImage(const QString &, const QString &, int, int)));
connect(m_projectMonitor->render, SIGNAL(replyGetImage(const QString &, const QImage &)), m_projectList, SLOT(slotReplyGetImage(const QString &, const QImage &)));
- connect(m_projectMonitor->render, SIGNAL(replyGetFileProperties(const QString &, Mlt::Producer*, const stringMap &, const stringMap &, bool, bool)), m_projectList, SLOT(slotReplyGetFileProperties(const QString &, Mlt::Producer*, const stringMap &, const stringMap &, bool, bool)));
+ connect(m_projectMonitor->render, SIGNAL(replyGetFileProperties(const QString &, Mlt::Producer*, const stringMap &, const stringMap &, bool)), m_projectList, SLOT(slotReplyGetFileProperties(const QString &, Mlt::Producer*, const stringMap &, const stringMap &, bool)));
connect(m_projectMonitor->render, SIGNAL(removeInvalidClip(const QString &, bool)), m_projectList, SLOT(slotRemoveInvalidClip(const QString &, bool)));
-
- connect(m_projectMonitor->render, SIGNAL(blockClipMonitor(const QString)), this, SLOT(slotBlockClipMonitor(const QString)));
+
connect(m_projectMonitor->render, SIGNAL(removeInvalidProxy(const QString &, bool)), m_projectList, SLOT(slotRemoveInvalidProxy(const QString &, bool)));
connect(m_clipMonitor, SIGNAL(refreshClipThumbnail(const QString &, bool)), m_projectList, SLOT(slotRefreshClipThumbnail(const QString &, bool)));
KAction *archiveProject = new KAction(KIcon("file-save"), i18n("Archive Project"), this);
collection.addAction("archive_project", archiveProject);
connect(archiveProject, SIGNAL(triggered(bool)), this, SLOT(slotArchiveProject()));
-
+
KAction *markIn = collection.addAction("mark_in");
markIn->setText(i18n("Set Zone In"));
KAction *fullMon = collection.addAction("monitor_fullscreen");
fullMon->setText(i18n("Switch monitor fullscreen"));
fullMon->setIcon(KIcon("view-fullscreen"));
- connect(fullMon, SIGNAL(triggered(bool)), this, SLOT(slotSwitchFullscreen()));
+ connect(fullMon, SIGNAL(triggered(bool)), m_monitorManager, SLOT(slotSwitchFullscreen()));
KAction *insertTree = collection.addAction("insert_project_tree");
insertTree->setText(i18n("Insert zone in project tree"));
collection.addAction("delete_space", removeSpace);
connect(removeSpace, SIGNAL(triggered()), this, SLOT(slotRemoveSpace()));
- KAction *insertTrack = new KAction(KIcon(), i18n("Insert Track"), this);
- collection.addAction("insert_track", insertTrack);
+ m_tracksActionCollection = new KActionCollection(this, KGlobal::mainComponent());
+ m_tracksActionCollection->addAssociatedWidget(m_timelineArea);
+
+ KAction *insertTrack = new KAction(KIcon(), i18n("Insert Track"), m_tracksActionCollection);
+ m_tracksActionCollection->addAction("insert_track", insertTrack);
connect(insertTrack, SIGNAL(triggered()), this, SLOT(slotInsertTrack()));
- KAction *deleteTrack = new KAction(KIcon(), i18n("Delete Track"), this);
- collection.addAction("delete_track", deleteTrack);
+ KAction *deleteTrack = new KAction(KIcon(), i18n("Delete Track"), m_tracksActionCollection);
+ m_tracksActionCollection->addAction("delete_track", deleteTrack);
connect(deleteTrack, SIGNAL(triggered()), this, SLOT(slotDeleteTrack()));
- KAction *configTracks = new KAction(KIcon("configure"), i18n("Configure Tracks"), this);
- collection.addAction("config_tracks", configTracks);
+ KAction *configTracks = new KAction(KIcon("configure"), i18n("Configure Tracks"), m_tracksActionCollection);
+ m_tracksActionCollection->addAction("config_tracks", configTracks);
connect(configTracks, SIGNAL(triggered()), this, SLOT(slotConfigTrack()));
+ KAction *selectTrack = new KAction(KIcon(), i18n("Select All in Current Track"), m_tracksActionCollection);
+ connect(selectTrack, SIGNAL(triggered()), this, SLOT(slotSelectTrack()));
+ m_tracksActionCollection->addAction("select_track", selectTrack);
+
+ QAction *selectAll = KStandardAction::selectAll(this, SLOT(slotSelectAllTracks()), m_tracksActionCollection);
+ selectAll->setShortcutContext(Qt::WidgetWithChildrenShortcut);
+ m_tracksActionCollection->addAction("select_all_tracks", selectAll);
+
KAction *addGuide = new KAction(KIcon("document-new"), i18n("Add Guide"), this);
collection.addAction("add_guide", addGuide);
connect(addGuide, SIGNAL(triggered()), this, SLOT(slotAddGuide()));
collection.addAction("add_folder", addFolderButton);
connect(addFolderButton , SIGNAL(triggered()), m_projectList, SLOT(slotAddFolder()));
+ QAction *downloadResources = new KAction(KIcon("download"), i18n("Online Resources"), this);
+ collection.addAction("download_resource", downloadResources);
+ connect(downloadResources , SIGNAL(triggered()), this, SLOT(slotDownloadResources()));
+
QAction *clipProperties = new KAction(KIcon("document-edit"), i18n("Clip Properties"), this);
collection.addAction("clip_properties", clipProperties);
clipProperties->setData("clip_properties");
proxyClip->setCheckable(true);
proxyClip->setChecked(false);
connect(proxyClip, SIGNAL(toggled(bool)), m_projectList, SLOT(slotProxyCurrentItem(bool)));
-
+
QAction *stopMotion = new KAction(KIcon("image-x-generic"), i18n("Stop Motion Capture"), this);
collection.addAction("stopmotion", stopMotion);
connect(stopMotion , SIGNAL(triggered()), this, SLOT(slotOpenStopmotion()));
addClips->addAction(addTitleClip);
addClips->addAction(addTitleTemplateClip);
addClips->addAction(addFolderButton);
+ addClips->addAction(downloadResources);
addClips->addAction(reloadClip);
addClips->addAction(proxyClip);
QString profileName = KdenliveSettings::default_profile();
KUrl projectFolder = KdenliveSettings::defaultprojectfolder();
QMap <QString, QString> documentProperties;
+ QMap <QString, QString> documentMetadata;
QPoint projectTracks(KdenliveSettings::videotracks(), KdenliveSettings::audiotracks());
if (!showProjectSettings) {
- // set up default properties
- documentProperties.insert("enableproxy", QString::number((int) KdenliveSettings::enableproxy()));
- documentProperties.insert("generateproxy", QString::number((int) KdenliveSettings::generateproxy()));
- documentProperties.insert("proxyminsize", QString::number(KdenliveSettings::proxyminsize()));
- documentProperties.insert("proxyparams", KdenliveSettings::proxyparams());
- documentProperties.insert("proxyextension", KdenliveSettings::proxyextension());
- documentProperties.insert("generateimageproxy", QString::number((int) KdenliveSettings::generateimageproxy()));
- documentProperties.insert("proxyimageminsize", QString::number(KdenliveSettings::proxyimageminsize()));
if (!KdenliveSettings::activatetabs())
if (!closeCurrentDocument())
return;
} else {
- ProjectSettings *w = new ProjectSettings(NULL, QStringList(), projectTracks.x(), projectTracks.y(), KdenliveSettings::defaultprojectfolder(), false, true, this);
+ ProjectSettings *w = new ProjectSettings(NULL, QMap <QString, QString> (), QStringList(), projectTracks.x(), projectTracks.y(), KdenliveSettings::defaultprojectfolder(), false, true, this);
if (w->exec() != QDialog::Accepted)
return;
if (!KdenliveSettings::activatetabs())
documentProperties.insert("proxyextension", w->proxyExtension());
documentProperties.insert("generateimageproxy", QString::number((int) w->generateImageProxy()));
documentProperties.insert("proxyimageminsize", QString::number(w->proxyImageMinSize()));
+ documentMetadata = w->metadata();
delete w;
}
m_timelineArea->setEnabled(true);
m_projectList->setEnabled(true);
bool openBackup;
- KdenliveDoc *doc = new KdenliveDoc(KUrl(), projectFolder, m_commandStack, profileName, documentProperties, projectTracks, m_projectMonitor->render, m_notesWidget, &openBackup, this);
+ KdenliveDoc *doc = new KdenliveDoc(KUrl(), projectFolder, m_commandStack, profileName, documentProperties, documentMetadata, projectTracks, m_projectMonitor->render, m_notesWidget, &openBackup, this);
doc->m_autosave = new KAutoSaveFile(KUrl(), doc);
bool ok;
- TrackView *trackView = new TrackView(doc, &ok, this);
+ TrackView *trackView = new TrackView(doc, m_tracksActionCollection->actions(), &ok, this);
m_timelineArea->addTab(trackView, KIcon("kdenlive"), doc->description());
if (!ok) {
// MLT is broken
connectDocument(trackView, doc);
} else
m_timelineArea->setTabBarHidden(false);
- m_monitorManager->activateMonitor("clip");
+ m_monitorManager->activateMonitor(Kdenlive::clipMonitor);
m_closeAction->setEnabled(m_timelineArea->count() > 1);
}
break;
}
}
- m_clipMonitor->slotSetXml(NULL);
+ m_clipMonitor->slotSetClipProducer(NULL);
+ m_projectList->slotResetProjectList();
m_timelineArea->removeTab(m_timelineArea->indexOf(w));
if (m_timelineArea->count() == 1) {
m_timelineArea->setTabBarHidden(true);
// Save timeline thumbnails
m_activeTimeline->projectView()->saveThumbnails();
m_activeDocument->setUrl(KUrl(outputFileName));
+ QByteArray hash = QCryptographicHash::hash(KUrl(outputFileName).encodedPath(), QCryptographicHash::Md5).toHex();
if (m_activeDocument->m_autosave == NULL) {
- m_activeDocument->m_autosave = new KAutoSaveFile(KUrl(outputFileName), this);
- } else m_activeDocument->m_autosave->setManagedFile(KUrl(outputFileName));
+ m_activeDocument->m_autosave = new KAutoSaveFile(KUrl(hash), this);
+ } else m_activeDocument->m_autosave->setManagedFile(KUrl(hash));
setCaption(m_activeDocument->description());
m_timelineArea->setTabText(m_timelineArea->currentIndex(), m_activeDocument->description());
m_timelineArea->setTabToolTip(m_timelineArea->currentIndex(), m_activeDocument->url().path());
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();
bool isOpened = false;
if (!KdenliveSettings::activatetabs()) if (!closeCurrentDocument()) return;
// Check for backup file
- QList<KAutoSaveFile *> staleFiles = KAutoSaveFile::staleFiles(url);
+ QByteArray hash = QCryptographicHash::hash(url.encodedPath(), QCryptographicHash::Md5).toHex();
+ QList<KAutoSaveFile *> staleFiles = KAutoSaveFile::staleFiles(KUrl(hash));
if (!staleFiles.isEmpty()) {
if (KMessageBox::questionYesNo(this,
i18n("Auto-saved files exist. Do you want to recover them now?"),
i18n("File Recovery"),
KGuiItem(i18n("Recover")), KGuiItem(i18n("Don't recover"))) == KMessageBox::Yes) {
- recoverFiles(staleFiles);
+ recoverFiles(staleFiles, url);
return;
} else {
// remove the stale files
delete m_stopmotion;
m_stopmotion = NULL;
}
-
+
m_timer.start();
KProgressDialog progressDialog(this, i18n("Loading project"), i18n("Loading project"));
progressDialog.setAllowCancel(false);
qApp->processEvents();
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);
+ KdenliveDoc *doc = new KdenliveDoc(stale ? KUrl(stale->fileName()) : url, KdenliveSettings::defaultprojectfolder(), m_commandStack, KdenliveSettings::default_profile(), QMap <QString, QString> (), QMap <QString, QString> (), QPoint(KdenliveSettings::videotracks(), KdenliveSettings::audiotracks()), m_projectMonitor->render, m_notesWidget, &openBackup, this, &progressDialog);
progressDialog.progressBar()->setValue(1);
progressDialog.progressBar()->setMaximum(4);
qApp->processEvents();
if (stale == NULL) {
- stale = new KAutoSaveFile(url, doc);
+ QByteArray hash = QCryptographicHash::hash(url.encodedPath(), QCryptographicHash::Md5).toHex();
+ stale = new KAutoSaveFile(KUrl(hash), doc);
doc->m_autosave = stale;
} else {
doc->m_autosave = stale;
- doc->setUrl(stale->managedFile());
+ doc->setUrl(url);//stale->managedFile());
doc->setModified(true);
stale->setParent(doc);
}
qApp->processEvents();
bool ok;
- TrackView *trackView = new TrackView(doc, &ok, this);
-
+ TrackView *trackView = new TrackView(doc, m_tracksActionCollection->actions(), &ok, this);
+ connectDocument(trackView, doc);
progressDialog.progressBar()->setValue(3);
qApp->processEvents();
slotGotProgressInfo(QString(), -1);
m_projectMonitor->adjustRulerSize(trackView->duration());
m_projectMonitor->slotZoneMoved(trackView->inPoint(), trackView->outPoint());
- m_clipMonitor->refreshMonitor(true);
-
progressDialog.progressBar()->setValue(4);
if (openBackup) slotOpenBackupDialog(url);
}
-void MainWindow::recoverFiles(QList<KAutoSaveFile *> staleFiles)
+void MainWindow::recoverFiles(QList<KAutoSaveFile *> staleFiles, const KUrl &originUrl)
{
foreach(KAutoSaveFile * stale, staleFiles) {
/*if (!stale->open(QIODevice::QIODevice::ReadOnly)) {
}*/
kDebug() << "// OPENING RECOVERY: " << stale->fileName() << "\nMANAGED: " << stale->managedFile().path();
// the stalefiles also contain ".lock" files so we must ignore them... bug in KAutoSaveFile?
- if (!stale->fileName().endsWith(".lock")) doOpenFile(KUrl(stale->fileName()), stale);
+ if (!stale->fileName().endsWith(".lock")) doOpenFile(originUrl, stale);
else KIO::NetAccess::del(KUrl(stale->fileName()), this);
}
}
void MainWindow::slotEditProjectSettings()
{
QPoint p = m_activeDocument->getTracksCount();
- ProjectSettings *w = new ProjectSettings(m_projectList, m_activeTimeline->projectView()->extractTransitionsLumas(), p.x(), p.y(), m_activeDocument->projectFolder().path(), true, !m_activeDocument->isModified(), this);
+ ProjectSettings *w = new ProjectSettings(m_projectList, m_activeDocument->metadata(), m_activeTimeline->projectView()->extractTransitionsLumas(), p.x(), p.y(), m_activeDocument->projectFolder().path(), true, !m_activeDocument->isModified(), this);
connect(w, SIGNAL(disableProxies()), this, SLOT(slotDisableProxies()));
if (w->exec() == QDialog::Accepted) {
QString profile = w->selectedProfile();
m_activeDocument->setProjectFolder(w->selectedFolder());
-#ifndef Q_WS_MAC
+#ifndef Q_WS_MAC
m_recMonitor->slotUpdateCaptureFolder(m_activeDocument->projectFolder().path(KUrl::AddTrailingSlash));
#endif
if (m_renderWidget) m_renderWidget->setDocumentPath(m_activeDocument->projectFolder().path(KUrl::AddTrailingSlash));
m_activeDocument->setModified();
slotUpdateProxySettings();
}
+ m_activeDocument->setMetadata(w->metadata());
}
delete w;
}
// Deselect current effect / transition
m_effectStack->slotClipItemSelected(NULL, 0);
m_transitionConfig->slotTransitionItemSelected(NULL, 0, QPoint(), false);
- m_clipMonitor->slotSetXml(NULL);
+ m_clipMonitor->slotSetClipProducer(NULL);
bool updateFps = m_activeDocument->setProfilePath(profile);
KdenliveSettings::setCurrent_profile(profile);
KdenliveSettings::setProject_fps(m_activeDocument->fps());
{
if (!m_renderWidget) {
QString projectfolder = m_activeDocument ? m_activeDocument->projectFolder().path(KUrl::AddTrailingSlash) : KdenliveSettings::defaultprojectfolder();
- m_renderWidget = new RenderWidget(projectfolder, m_projectList->useProxy(), this);
+ MltVideoProfile profile;
+ if (m_activeDocument) profile = m_activeDocument->mltProfile();
+ m_renderWidget = new RenderWidget(projectfolder, m_projectList->useProxy(), profile, this);
connect(m_renderWidget, SIGNAL(shutdown()), this, SLOT(slotShutdown()));
connect(m_renderWidget, SIGNAL(selectedRenderProfile(QMap <QString, QString>)), this, SLOT(slotSetDocumentRenderProfile(QMap <QString, QString>)));
connect(m_renderWidget, SIGNAL(prepareRenderingData(bool, bool, const QString&)), this, SLOT(slotPrepareRendering(bool, bool, const QString&)));
disconnect(m_notesWidget, SIGNAL(textChanged()), m_activeDocument, SLOT(setModified()));
disconnect(m_clipMonitor, SIGNAL(zoneUpdated(QPoint)), m_activeDocument, SLOT(setModified()));
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(bool, bool)), m_activeDocument, SLOT(checkProjectClips(bool, bool)));
disconnect(m_activeTimeline->projectView(), SIGNAL(transitionItemSelected(Transition*, int, QPoint, bool)), m_projectMonitor, SLOT(slotSetSelectedClip(Transition*)));
disconnect(m_activeTimeline->projectView(), SIGNAL(playMonitor()), m_projectMonitor, SLOT(slotPlay()));
disconnect(m_activeTimeline->projectView(), SIGNAL(displayMessage(const QString&, MessageType)), m_messageLabel, SLOT(setMessage(const QString&, MessageType)));
- disconnect(m_activeTimeline->projectView(), SIGNAL(showClipFrame(DocClipBase *, QPoint, const int)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *, QPoint, const int)));
- disconnect(m_activeTimeline, SIGNAL(cursorMoved()), m_projectMonitor, SLOT(activateMonitor()));
- disconnect(m_activeTimeline, SIGNAL(insertTrack(int)), this, SLOT(slotInsertTrack(int)));
- disconnect(m_activeTimeline, SIGNAL(deleteTrack(int)), this, SLOT(slotDeleteTrack(int)));
+ disconnect(m_activeTimeline->projectView(), SIGNAL(showClipFrame(DocClipBase *, QPoint, bool, const int)), m_clipMonitor, SLOT(slotSetClipProducer(DocClipBase *, QPoint, bool, const int)));
+ disconnect(m_projectList, SIGNAL(gotFilterJobResults(const QString &, int, int, const QString &, stringMap)), m_activeTimeline->projectView(), SLOT(slotGotFilterJobResults(const QString &, int, int, const QString &, stringMap)));
+
+ disconnect(m_activeTimeline, SIGNAL(cursorMoved()), m_projectMonitor, SLOT(slotActivateMonitor()));
disconnect(m_activeTimeline, SIGNAL(configTrack(int)), this, SLOT(slotConfigTrack(int)));
disconnect(m_activeDocument, SIGNAL(docModified(bool)), this, SLOT(slotUpdateDocumentState(bool)));
disconnect(m_effectStack, SIGNAL(updateEffect(ClipItem*, int, QDomElement, QDomElement, int)), m_activeTimeline->projectView(), SLOT(slotUpdateClipEffect(ClipItem*, int, QDomElement, QDomElement, int)));
disconnect(m_effectStack, SIGNAL(removeEffect(ClipItem*, int, QDomElement)), m_activeTimeline->projectView(), SLOT(slotDeleteEffect(ClipItem*, int, QDomElement)));
+ disconnect(m_effectStack, SIGNAL(addEffect(ClipItem*, QDomElement)), trackView->projectView(), SLOT(slotAddEffect(ClipItem*, QDomElement)));
disconnect(m_effectStack, SIGNAL(changeEffectState(ClipItem*, int, int, bool)), m_activeTimeline->projectView(), SLOT(slotChangeEffectState(ClipItem*, int, int, bool)));
disconnect(m_effectStack, SIGNAL(changeEffectPosition(ClipItem*, int, int, int)), m_activeTimeline->projectView(), SLOT(slotChangeEffectPosition(ClipItem*, int, int, int)));
disconnect(m_effectStack, SIGNAL(refreshEffectStack(ClipItem*)), m_activeTimeline->projectView(), SLOT(slotRefreshEffects(ClipItem*)));
disconnect(m_effectStack, SIGNAL(displayMessage(const QString&, int)), this, SLOT(slotGotProgressInfo(const QString&, int)));
disconnect(m_transitionConfig, SIGNAL(transitionUpdated(Transition *, QDomElement)), m_activeTimeline->projectView() , SLOT(slotTransitionUpdated(Transition *, QDomElement)));
disconnect(m_transitionConfig, SIGNAL(seekTimeline(int)), m_activeTimeline->projectView() , SLOT(setCursorPos(int)));
- disconnect(m_activeTimeline->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(activateMonitor()));
+ disconnect(m_activeTimeline->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(slotActivateMonitor()));
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&, int)), this, SLOT(slotGotProgressInfo(const QString&, int)));
- disconnect(m_projectList, SIGNAL(updateRenderStatus()), this, SLOT(slotCheckRenderStatus()));
- disconnect(m_projectList, SIGNAL(clipNeedsReload(const QString&, bool)), m_activeTimeline->projectView(), SLOT(slotUpdateClip(const QString &, bool)));
disconnect(m_projectList, SIGNAL(refreshClip(const QString &)), m_activeTimeline->projectView(), SLOT(slotRefreshThumbs(const QString &)));
m_effectStack->clear();
}
//m_activeDocument->setRenderer(NULL);
- disconnect(m_projectList, SIGNAL(refreshClip(const QString &, bool)), m_monitorManager, SLOT(slotRefreshCurrentMonitor()));
m_clipMonitor->stop();
}
KdenliveSettings::setCurrent_profile(doc->profilePath());
KdenliveSettings::setProject_fps(doc->fps());
m_monitorManager->resetProfiles(doc->timecode());
+ m_clipMonitorDock->raise();
m_projectList->setDocument(doc);
m_transitionConfig->updateProjectFormat(doc->mltProfile(), doc->timecode(), doc->tracksList());
m_effectStack->updateProjectFormat(doc->mltProfile(), doc->timecode());
- connect(m_projectList, SIGNAL(refreshClip(const QString &, bool)), m_monitorManager, SLOT(slotRefreshCurrentMonitor()));
connect(m_projectList, SIGNAL(refreshClip(const QString &, bool)), trackView->projectView(), SLOT(slotRefreshThumbs(const QString &, bool)));
- connect(m_projectList, SIGNAL(clipNeedsReload(const QString&, bool)), trackView->projectView(), SLOT(slotUpdateClip(const QString &, bool)));
connect(m_projectList, SIGNAL(projectModified()), doc, SLOT(setModified()));
- connect(m_projectList, SIGNAL(updateProfile(const QString &)), this, SLOT(slotUpdateProjectProfile(const QString &)));
connect(m_projectList, SIGNAL(clipNameChanged(const QString, const QString)), trackView->projectView(), SLOT(clipNameChanged(const QString, const QString)));
- connect(m_projectList, SIGNAL(findInTimeline(const QString&)), this, SLOT(slotClipInTimeline(const QString&)));
-
-
//connect(trackView, SIGNAL(cursorMoved()), m_projectMonitor, SLOT(activateMonitor()));
- connect(trackView, SIGNAL(insertTrack(int)), this, SLOT(slotInsertTrack(int)));
- connect(trackView, SIGNAL(deleteTrack(int)), this, SLOT(slotDeleteTrack(int)));
connect(trackView, SIGNAL(configTrack(int)), this, SLOT(slotConfigTrack(int)));
connect(trackView, SIGNAL(updateTracksInfo()), this, SLOT(slotUpdateTrackInfo()));
connect(trackView, SIGNAL(mousePosition(int)), this, SLOT(slotUpdateMousePosition(int)));
connect(trackView->projectView(), SIGNAL(forceClipProcessing(const QString &)), m_projectList, SLOT(slotForceProcessing(const QString &)));
connect(m_projectMonitor, SIGNAL(renderPosition(int)), trackView, SLOT(moveCursorPos(int)));
connect(m_projectMonitor, SIGNAL(zoneUpdated(QPoint)), trackView, SLOT(slotSetZone(QPoint)));
- connect(m_clipMonitor, SIGNAL(zoneUpdated(QPoint)), m_projectList, SLOT(slotUpdateClipCut(QPoint)));
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(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)));
connect(trackView, SIGNAL(setZoom(int)), this, SLOT(slotSetZoom(int)));
connect(trackView->projectView(), SIGNAL(displayMessage(const QString&, MessageType)), m_messageLabel, SLOT(setMessage(const QString&, MessageType)));
- connect(trackView->projectView(), SIGNAL(showClipFrame(DocClipBase *, QPoint, const int)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *, QPoint, const int)));
+ connect(trackView->projectView(), SIGNAL(showClipFrame(DocClipBase *, QPoint, bool, const int)), m_clipMonitor, SLOT(slotSetClipProducer(DocClipBase *, QPoint, bool, const int)));
connect(trackView->projectView(), SIGNAL(playMonitor()), m_projectMonitor, SLOT(slotPlay()));
connect(trackView->projectView(), SIGNAL(clipItemSelected(ClipItem*, int, bool)), m_projectMonitor, SLOT(slotSetSelectedClip(ClipItem*)));
connect(trackView->projectView(), SIGNAL(transitionItemSelected(Transition*, int, QPoint, bool)), m_projectMonitor, SLOT(slotSetSelectedClip(Transition*)));
+ connect(m_projectList, SIGNAL(gotFilterJobResults(const QString &, int, int, const QString &, stringMap)), trackView->projectView(), SLOT(slotGotFilterJobResults(const QString &, int, int, const QString &, stringMap)));
+
connect(m_effectStack, SIGNAL(updateEffect(ClipItem*, int, QDomElement, QDomElement, int)), trackView->projectView(), SLOT(slotUpdateClipEffect(ClipItem*, int, QDomElement, QDomElement, int)));
connect(m_effectStack, SIGNAL(updateClipRegion(ClipItem*, int, QString)), trackView->projectView(), SLOT(slotUpdateClipRegion(ClipItem*, int, QString)));
connect(m_effectStack, SIGNAL(removeEffect(ClipItem*, int, QDomElement)), trackView->projectView(), SLOT(slotDeleteEffect(ClipItem*, int, QDomElement)));
+ connect(m_effectStack, SIGNAL(addEffect(ClipItem*, QDomElement)), trackView->projectView(), SLOT(slotAddEffect(ClipItem*, QDomElement)));
connect(m_effectStack, SIGNAL(changeEffectState(ClipItem*, int, int, bool)), trackView->projectView(), SLOT(slotChangeEffectState(ClipItem*, int, int, bool)));
connect(m_effectStack, SIGNAL(changeEffectPosition(ClipItem*, int, int, int)), trackView->projectView(), SLOT(slotChangeEffectPosition(ClipItem*, int, int, int)));
connect(m_effectStack, SIGNAL(refreshEffectStack(ClipItem*)), trackView->projectView(), SLOT(slotRefreshEffects(ClipItem*)));
connect(m_effectStack, SIGNAL(reloadEffects()), this, SLOT(slotReloadEffects()));
connect(m_effectStack, SIGNAL(displayMessage(const QString&, int)), this, SLOT(slotGotProgressInfo(const QString&, int)));
- connect(trackView->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(activateMonitor()));
+ connect(trackView->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(slotActivateMonitor()));
connect(trackView, SIGNAL(zoneMoved(int, int)), this, SLOT(slotZoneMoved(int, int)));
connect(m_projectList, SIGNAL(loadingIsOver()), trackView->projectView(), SLOT(slotUpdateAllThumbs()));
- connect(m_projectList, SIGNAL(loadingIsOver()), this, SLOT(slotElapsedTime()));
- connect(m_projectList, SIGNAL(displayMessage(const QString&, int)), this, SLOT(slotGotProgressInfo(const QString&, int)));
- connect(m_projectList, SIGNAL(updateRenderStatus()), this, SLOT(slotCheckRenderStatus()));
-
-
- trackView->projectView()->setContextMenu(m_timelineContextMenu, m_timelineContextClipMenu, m_timelineContextTransitionMenu, m_clipTypeGroup, (QMenu*)(factory()->container("marker_menu", this)));
+ trackView->projectView()->setContextMenu(m_timelineContextMenu, m_timelineContextClipMenu, m_timelineContextTransitionMenu, m_clipTypeGroup, static_cast<QMenu*>(factory()->container("marker_menu", this)));
m_activeTimeline = trackView;
if (m_renderWidget) {
slotCheckRenderStatus();
m_activeDocument = doc;
m_activeTimeline->updateProjectFps();
m_activeDocument->checkProjectClips();
-#ifndef Q_WS_MAC
+#ifndef Q_WS_MAC
m_recMonitor->slotUpdateCaptureFolder(m_activeDocument->projectFolder().path(KUrl::AddTrailingSlash));
#endif
//Update the mouse position display so it will display in DF/NDF format by default based on the project setting.
slotUpdateMousePosition(0);
+ m_monitorManager->activateMonitor(Kdenlive::clipMonitor);
// set tool to select tool
m_buttonSelectTool->setChecked(true);
}
KShortcutsDialog dialog(KShortcutsEditor::AllActions, KShortcutsEditor::LetterShortcutsAllowed, this);
dialog.addCollection(actionCollection(), i18nc("general keyboard shortcuts", "General"));
dialog.addCollection(m_effectsActionCollection, i18nc("effects and transitions keyboard shortcuts", "Effects & Transitions"));
+ dialog.addCollection(m_tracksActionCollection, i18nc("timeline track keyboard shortcuts", "Timeline and Tracks"));
dialog.configure();
}
// KConfigDialog didn't find an instance of this dialog, so lets
// create it :
-
+
// Get the mappable actions in localized form
QMap<QString, QString> actions;
KActionCollection* collection = actionCollection();
foreach (const QString& action_name, m_action_names) {
actions[collection->action(action_name)->text()] = action_name;
}
-
+
KdenliveSettingsDialog* dialog = new KdenliveSettingsDialog(actions, this);
connect(dialog, SIGNAL(settingsChanged(const QString&)), this, SLOT(updateConfiguration()));
connect(dialog, SIGNAL(doResetProfile()), m_monitorManager, SLOT(slotResetProfiles()));
void MainWindow::slotUpdateCaptureFolder()
{
-#ifndef Q_WS_MAC
+#ifndef Q_WS_MAC
if (m_activeDocument) m_recMonitor->slotUpdateCaptureFolder(m_activeDocument->projectFolder().path(KUrl::AddTrailingSlash));
else m_recMonitor->slotUpdateCaptureFolder(KdenliveSettings::defaultprojectfolder());
#endif
// Update list of transcoding profiles
loadTranscoders();
-#ifndef NO_JOGSHUTTLE
+ loadStabilize();
+#ifdef USE_JOGSHUTTLE
activateShuttleDevice();
-#endif /* NO_JOGSHUTTLE */
+#endif
}
QWidget *widget = QApplication::focusWidget();
while (widget) {
if (widget == m_effectStackDock) {
- m_effectStack->slotItemDel();
+ m_effectStack->deleteCurrentEffect();
return;
}
widget = widget->parentWidget();
void MainWindow::slotInsertTrack(int ix)
{
- m_projectMonitor->activateMonitor();
- if (m_activeTimeline)
+ m_projectMonitor->slotActivateMonitor();
+ if (m_activeTimeline) {
+ if (ix == -1) ix = m_activeTimeline->projectView()->selectedTrack();
m_activeTimeline->projectView()->slotInsertTrack(ix);
+ }
if (m_activeDocument)
m_transitionConfig->updateProjectFormat(m_activeDocument->mltProfile(), m_activeDocument->timecode(), m_activeDocument->tracksList());
}
void MainWindow::slotDeleteTrack(int ix)
{
- m_projectMonitor->activateMonitor();
- if (m_activeTimeline)
+ m_projectMonitor->slotActivateMonitor();
+ if (m_activeTimeline) {
+ if (ix == -1) ix = m_activeTimeline->projectView()->selectedTrack();
m_activeTimeline->projectView()->slotDeleteTrack(ix);
+ }
if (m_activeDocument)
m_transitionConfig->updateProjectFormat(m_activeDocument->mltProfile(), m_activeDocument->timecode(), m_activeDocument->tracksList());
}
void MainWindow::slotConfigTrack(int ix)
{
- m_projectMonitor->activateMonitor();
+ m_projectMonitor->slotActivateMonitor();
if (m_activeTimeline)
m_activeTimeline->projectView()->slotConfigTracks(ix);
if (m_activeDocument)
m_transitionConfig->updateProjectFormat(m_activeDocument->mltProfile(), m_activeDocument->timecode(), m_activeDocument->tracksList());
}
+void MainWindow::slotSelectTrack()
+{
+ m_projectMonitor->slotActivateMonitor();
+ if (m_activeTimeline) {
+ m_activeTimeline->projectView()->slotSelectClipsInTrack();
+ }
+}
+
+void MainWindow::slotSelectAllTracks()
+{
+ m_projectMonitor->slotActivateMonitor();
+ if (m_activeTimeline)
+ m_activeTimeline->projectView()->slotSelectAllClips();
+}
+
void MainWindow::slotEditGuide()
{
if (m_activeTimeline)
m_activeTimeline->projectView()->editItemDuration();
}
-void MainWindow::slotAddProjectClip(KUrl url)
+void MainWindow::slotAddProjectClip(KUrl url, const QString &comment)
{
if (m_activeDocument)
- m_activeDocument->slotAddClipFile(url, QString());
+ m_activeDocument->slotAddClipFile(url, QString(), QString(), comment);
}
void MainWindow::slotAddProjectClipList(KUrl::List urls)
else newprops.insert("templatetext", description);
//newprops.insert("xmldata", m_projectList->generateTemplateXml(newtemplate, description).toString());
if (!newprops.isEmpty()) {
- EditClipCommand *command = new EditClipCommand(m_projectList, clip->getId(), clip->properties(), newprops, true);
+ EditClipCommand *command = new EditClipCommand(m_projectList, clip->getId(), clip->currentProperties(newprops), newprops, true);
m_activeDocument->commandStack()->push(command);
}
}
if (dia_ui->exec() == QDialog::Accepted) {
QMap <QString, QString> newprops;
newprops.insert("xmldata", dia_ui->xml().toString());
- if (dia_ui->outPoint() != clip->duration().frames(m_activeDocument->fps()) - 1) {
+ if (dia_ui->outPoint() != clip->duration().frames(m_activeDocument->fps())) {
// duration changed, we need to update duration
newprops.insert("out", QString::number(dia_ui->outPoint()));
int currentLength = QString(clip->producerProperty("length")).toInt();
dia_ui->saveTitle(path);
} else newprops.insert("resource", QString());
}
- EditClipCommand *command = new EditClipCommand(m_projectList, clip->getId(), clip->properties(), newprops, true);
+ EditClipCommand *command = new EditClipCommand(m_projectList, clip->getId(), clip->currentProperties(newprops), newprops, true);
m_activeDocument->commandStack()->push(command);
//m_activeTimeline->projectView()->slotUpdateClip(clip->getId());
m_activeDocument->setModified(true);
for (int i = 0; i < cliplist.count(); i++) {
DocClipBase *clip = cliplist.at(i);
if (clip->clipType() == IMAGE)
- new EditClipCommand(m_projectList, clip->getId(), clip->properties(), newImageProps, true, command);
- else
- new EditClipCommand(m_projectList, clip->getId(), clip->properties(), newProps, true, command);
+ new EditClipCommand(m_projectList, clip->getId(), clip->currentProperties(newImageProps), newImageProps, true, command);
+ else
+ new EditClipCommand(m_projectList, clip->getId(), clip->currentProperties(newProps), newProps, true, command);
}
m_activeDocument->commandStack()->push(command);
for (int i = 0; i < cliplist.count(); i++)
if (entry->status() == KNS::Entry::Installed)
kDebug() << "// Installed files: " << entry->installedFiles();
}
-#endif /* KDE_IS_VERSION(4,3,80) */
+#endif
return entries.size();
}
kDebug() << "CURRENT WIDGET: " << par->objectName();
}
+void MainWindow::loadStabilize()
+{
+ QMenu* stabMenu= static_cast<QMenu*>(factory()->container("stabilize", this));
+ if (stabMenu){
+ stabMenu->clear();
+ Mlt::Profile profile;
+ if (Mlt::Factory::filter(profile,(char*)"videostab")){
+ QAction *action=stabMenu->addAction("Videostab (vstab)");
+ action->setData("videostab");
+ connect(action,SIGNAL(triggered()), this, SLOT(slotStabilize()));
+ }
+ if (Mlt::Factory::filter(profile,(char*)"videostab2")){
+ QAction *action=stabMenu->addAction("Videostab (transcode)");
+ action->setData("videostab2");
+ connect(action,SIGNAL(triggered()), this, SLOT(slotStabilize()));
+ }
+ }
+
+
+}
+
void MainWindow::loadTranscoders()
{
QMenu *transMenu = static_cast<QMenu*>(factory()->container("transcoders", this));
transMenu->clear();
+ QMenu *extractAudioMenu = static_cast<QMenu*>(factory()->container("extract_audio", this));
+ extractAudioMenu->clear();
+
KSharedConfigPtr config = KSharedConfig::openConfig("kdenlivetranscodingrc");
KConfigGroup transConfig(config, "Transcoding");
// read the entries
QMapIterator<QString, QString> i(profiles);
while (i.hasNext()) {
i.next();
- QStringList data = i.value().split(";", QString::SkipEmptyParts);
- QAction *a = transMenu->addAction(i.key());
+ QStringList data = i.value().split(";");
+ QAction *a;
+ // separate audio transcoding in a separate menu
+ if (data.count() > 2 && data.at(2) == "audio") {
+ a = extractAudioMenu->addAction(i.key());
+ }
+ else {
+ a = transMenu->addAction(i.key());
+ }
a->setData(data);
- if (data.count() > 1)
- a->setToolTip(data.at(1));
+ if (data.count() > 1) a->setToolTip(data.at(1));
connect(a, SIGNAL(triggered()), this, SLOT(slotTranscode()));
}
}
+void MainWindow::slotStabilize()
+{
+ QString condition,filtername;
+ QStringList ids;
+
+ // Stablize selected clips
+ QAction *action = qobject_cast<QAction *>(sender());
+ if (action){
+ filtername=action->data().toString();
+ }
+ m_projectList->startClipFilterJob(filtername, condition);
+ /*
+ if (ids.isEmpty()) {
+ m_messageLabel->setMessage(i18n("No clip to transcode"), ErrorMessage);
+ return;
+ }
+ QString destination;
+ ProjectItem *item = m_projectList->getClipById(ids.at(0));
+ if (ids.count() == 1) {
+
+ }
+ ClipStabilize *d = new ClipStabilize(destination, ids.count(), filtername);
+ //connect(d, SIGNAL(addClip(KUrl)), this, SLOT(slotAddProjectClip(KUrl)));
+ if (d->exec() == QDialog::Accepted) {
+ m_projectList->slotStabilizeClipJob(ids, d->autoAddClip(), d->params(), d->desc());
+ }
+ delete d;*/
+}
+
void MainWindow::slotTranscode(KUrl::List urls)
{
QString params;
QStringList data = action->data().toStringList();
params = data.at(0);
if (data.count() > 1) desc = data.at(1);
- if (data.count() > 2) condition = data.at(2);
- urls << m_projectList->getConditionalUrls(condition);
- urls.removeAll(KUrl());
+ if (data.count() > 3) condition = data.at(3);
+ m_projectList->slotTranscodeClipJob(condition, params, desc);
+ return;
}
if (urls.isEmpty()) {
m_messageLabel->setMessage(i18n("No clip to transcode"), ErrorMessage);
ClipTranscode *d = new ClipTranscode(urls, params, desc);
connect(d, SIGNAL(addClip(KUrl)), this, SLOT(slotAddProjectClip(KUrl)));
d->show();
- //QProcess::startDetached("ffmpeg", parameters);
}
void MainWindow::slotTranscodeClip()
}
}
}
-
+
// Do we want proxy rendering
if (m_projectList->useProxy() && !m_renderWidget->proxyRendering()) {
QString root = doc.documentElement().attribute("root");
// We need to delete the "aspect_ratio" property because proxy clips
// sometimes have different ratio than original clips
EffectsList::removeProperty(e, "aspect_ratio");
+ EffectsList::removeMetaProperties(e);
}
}
}
-
+
/*QMapIterator<QString, QString> i(proxies);
while (i.hasNext()) {
i.next();
}*/
}
playlistContent = doc.toString();
-
+
// Do save scenelist
QFile file(playlistPath);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
return;
}
file.close();
- m_renderWidget->slotExport(scriptExport, m_activeTimeline->inPoint(), m_activeTimeline->outPoint(), playlistPath, scriptPath, exportAudio);
+ m_renderWidget->slotExport(scriptExport, m_activeTimeline->inPoint(), m_activeTimeline->outPoint(), m_activeDocument->metadata(), playlistPath, scriptPath, exportAudio);
}
void MainWindow::slotUpdateTimecodeFormat(int ix)
plt = KGlobalSettings::createNewApplicationPalette(config);
#else
// Since there was a bug in createApplicationPalette in KDE < 4.6.3 we need
- // to do the palette loading stuff ourselves. (https://bugs.kde.org/show_bug.cgi?id=263497)
+ // to do the palette loading stuff ourselves. (https://bugs.kde.org/show_bug.cgi?id=263497)
QPalette::ColorGroup states[3] = { QPalette::Active, QPalette::Inactive,
QPalette::Disabled };
// TT thinks tooltips shouldn't use active, so we use our active colors for all states
KColorScheme schemeTooltip(QPalette::Active, KColorScheme::Tooltip, config);
-
+
for ( int i = 0; i < 3 ; i++ ) {
QPalette::ColorGroup state = states[i];
KColorScheme schemeView(state, KColorScheme::View, config);
KColorScheme schemeWindow(state, KColorScheme::Window, config);
KColorScheme schemeButton(state, KColorScheme::Button, config);
KColorScheme schemeSelection(state, KColorScheme::Selection, config);
-
+
plt.setBrush( state, QPalette::WindowText, schemeWindow.foreground() );
plt.setBrush( state, QPalette::Window, schemeWindow.background() );
plt.setBrush( state, QPalette::Base, schemeView.background() );
plt.setBrush( state, QPalette::HighlightedText, schemeSelection.foreground() );
plt.setBrush( state, QPalette::ToolTipBase, schemeTooltip.background() );
plt.setBrush( state, QPalette::ToolTipText, schemeTooltip.foreground() );
-
+
plt.setColor( state, QPalette::Light, schemeWindow.shade( KColorScheme::LightShade ) );
plt.setColor( state, QPalette::Midlight, schemeWindow.shade( KColorScheme::MidlightShade ) );
plt.setColor( state, QPalette::Mid, schemeWindow.shade( KColorScheme::MidShade ) );
plt.setColor( state, QPalette::Dark, schemeWindow.shade( KColorScheme::DarkShade ) );
plt.setColor( state, QPalette::Shadow, schemeWindow.shade( KColorScheme::ShadowShade ) );
-
+
plt.setBrush( state, QPalette::AlternateBase, schemeView.background( KColorScheme::AlternateBackground) );
plt.setBrush( state, QPalette::Link, schemeView.foreground( KColorScheme::LinkText ) );
plt.setBrush( state, QPalette::LinkVisited, schemeView.foreground( KColorScheme::VisitedText ) );
else m_projectList->focusTree();
}
-void MainWindow::slotSwitchFullscreen()
-{
- if (m_projectMonitor->isActive()) m_projectMonitor->slotSwitchFullScreen();
- else m_clipMonitor->slotSwitchFullScreen();
-}
-
void MainWindow::slotInsertZoneToTree()
{
if (!m_clipMonitor->isActive() || m_clipMonitor->activeClip() == NULL) return;
}
}
-void MainWindow::slotUpdateGfxScopeFrameRequest()
-{
- // We need a delay to make sure widgets are hidden after a close event for example
- QTimer::singleShot(500, this, SLOT(slotDoUpdateGfxScopeFrameRequest()));
-}
-
-void MainWindow::slotDoUpdateGfxScopeFrameRequest()
-{
- // Check scopes
- bool request = false;
- for (int i = 0; i < m_gfxScopesList.count(); i++) {
- if (!m_gfxScopesList.at(i)->widget()->visibleRegion().isEmpty() && static_cast<AbstractGfxScopeWidget *>(m_gfxScopesList.at(i)->widget())->autoRefreshEnabled()) {
- kDebug() << "SCOPE VISIBLE: " << static_cast<AbstractGfxScopeWidget *>(m_gfxScopesList.at(i)->widget())->widgetName();
- request = true;
- break;
- }
- }
- if (!request) {
- if (!m_projectMonitor->effectSceneDisplayed()) {
- m_projectMonitor->render->sendFrameForAnalysis = false;
- }
- m_clipMonitor->render->sendFrameForAnalysis = false;
- if (m_recMonitor)
- m_recMonitor->analyseFrames(false);
- } else {
- m_projectMonitor->render->sendFrameForAnalysis = true;
- m_clipMonitor->render->sendFrameForAnalysis = true;
- if (m_recMonitor)
- m_recMonitor->analyseFrames(true);
- }
-}
-
-void MainWindow::slotUpdateAudioScopeFrameRequest()
-{
- QTimer::singleShot(500, this, SLOT(slotDoUpdateAudioScopeFrameRequest()));
-}
-
-void MainWindow::slotDoUpdateAudioScopeFrameRequest()
-{
- bool request = false;
- for (int i = 0; i < m_audioScopesList.count(); i++) {
- if (!m_audioScopesList.at(i)->visibleRegion().isEmpty() && m_audioScopesList.at(i)->autoRefreshEnabled()) {
- kDebug() << "AUDIO SCOPE VISIBLE: " << m_audioScopesList.at(i)->widgetName();
- request = true;
- break;
- }
- }
- // Handle audio signal separately (no common interface)
- if (!m_audiosignal->visibleRegion().isEmpty() && m_audiosignal->monitoringEnabled()) {
- kDebug() << "AUDIO SCOPE VISIBLE: " << "audiosignal";
- request = true;
- }
-#ifdef DEBUG_MAINW
- qDebug() << "Scopes Requesting Audio data: " << request;
-#endif
- KdenliveSettings::setMonitor_audio(request);
- m_monitorManager->slotUpdateAudioMonitoring();
-}
-
-void MainWindow::slotUpdateColorScopes()
-{
- bool request = false;
- kDebug()<<"// UPDATE SCOPES";
- for (int i = 0; i < m_gfxScopesList.count(); i++) {
- // Check if we need the renderer to send a new frame for update
- 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 && 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()
{
delete dia;
}
-void MainWindow::slotBlockClipMonitor(const QString id)
+void MainWindow::slotElapsedTime()
{
- if (m_clipMonitor->activeClip() && m_clipMonitor->activeClip()->getId() == id) m_clipMonitor->slotSetXml(NULL);
+ kDebug()<<"-----------------------------------------\n"<<"Time elapsed: "<<m_timer.elapsed()<<"\n-------------------------";
}
-void MainWindow::slotElapsedTime()
+void MainWindow::slotDownloadResources()
{
- kDebug()<<"-----------------------------------------\n"<<"Time elapsed: "<<m_timer.elapsed()<<"\n-------------------------";
+ QString currentFolder;
+ if (m_activeDocument) currentFolder = m_activeDocument->projectFolder().path();
+ else currentFolder = KdenliveSettings::defaultprojectfolder();
+ ResourceWidget *d = new ResourceWidget(currentFolder);
+ connect(d, SIGNAL(addClip(KUrl, const QString &)), this, SLOT(slotAddProjectClip(KUrl, const QString &)));
+ d->show();
}
#include "mainwindow.moc"