X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmainwindow.cpp;h=6da2cacaffb174b85b3a4dc9ccdde1e8409f7977;hb=23b97051124400cc52ec2b3dfc579d1033d73907;hp=fb40138e4404b9f477300526e2abee83fcce5771;hpb=b71c4acd8449993ff2652ae504e86cf410b4e12e;p=kdenlive diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index fb40138e..6da2caca 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -96,6 +96,7 @@ #endif /* KDE_IS_VERSION(4,3,80) */ #include #include +#include #include #include @@ -129,7 +130,8 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & #ifndef NO_JOGSHUTTLE m_jogProcess(NULL), #endif /* NO_JOGSHUTTLE */ - m_findActivated(false) + m_findActivated(false), + m_stopmotion(NULL) { // Create DBus interface @@ -180,7 +182,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & m_clipMonitorDock = new QDockWidget(i18n("Clip Monitor"), this); m_clipMonitorDock->setObjectName("clip_monitor"); - m_clipMonitor = new Monitor("clip", m_monitorManager, QString()); + m_clipMonitor = new Monitor("clip", m_monitorManager, QString(), m_timelineArea); m_clipMonitorDock->setWidget(m_clipMonitor); addDockWidget(Qt::TopDockWidgetArea, m_clipMonitorDock); @@ -274,11 +276,11 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & m_audiosignalDock->setObjectName("audiosignal"); m_audiosignalDock->setWidget(m_audiosignal); addDockWidget(Qt::TopDockWidgetArea, m_audiosignalDock); - if (m_projectMonitor){ - connect(m_projectMonitor->render, SIGNAL(showAudioSignal(const QByteArray&)), m_audiosignal, SLOT(showAudio(const QByteArray&)) ); + if (m_projectMonitor) { + connect(m_projectMonitor->render, SIGNAL(showAudioSignal(const QByteArray&)), m_audiosignal, SLOT(showAudio(const QByteArray&))); } - if (m_clipMonitor){ - connect(m_clipMonitor->render, SIGNAL(showAudioSignal(const QByteArray&)), m_audiosignal, SLOT(showAudio(const QByteArray&)) ); + if (m_clipMonitor) { + connect(m_clipMonitor->render, SIGNAL(showAudioSignal(const QByteArray&)), m_audiosignal, SLOT(showAudio(const QByteArray&))); } //connect(m_histogramDock, SIGNAL(visibilityChanged(bool)), this, SLOT(slotUpdateScopeFrameRequest())); //connect(m_histogram, SIGNAL(requestAutoRefresh(bool)), this, SLOT(slotUpdateScopeFrameRequest())); @@ -531,6 +533,9 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & activateShuttleDevice(); #endif /* NO_JOGSHUTTLE */ m_projectListDock->raise(); + + actionCollection()->addAssociatedWidget(m_clipMonitor->container()); + actionCollection()->addAssociatedWidget(m_projectMonitor->container()); } MainWindow::~MainWindow() @@ -1169,6 +1174,11 @@ void MainWindow::setupActions() switchMon->setShortcut(Qt::Key_T); connect(switchMon, SIGNAL(triggered(bool)), this, SLOT(slotSwitchMonitors())); + 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())); + KAction *insertTree = collection->addAction("insert_project_tree"); insertTree->setText(i18n("Insert zone in project tree")); insertTree->setShortcut(Qt::CTRL + Qt::Key_I); @@ -1355,6 +1365,11 @@ void MainWindow::setupActions() collection->addAction("edit_clip_marker", editClipMarker); connect(editClipMarker, SIGNAL(triggered(bool)), this, SLOT(slotEditClipMarker())); + KAction *addMarkerGuideQuickly = new KAction(KIcon("bookmark-new"), i18n("Add Marker/Guide quickly"), this); + addMarkerGuideQuickly->setShortcut(Qt::Key_Asterisk); + collection->addAction("add_marker_guide_quickly", addMarkerGuideQuickly); + connect(addMarkerGuideQuickly, SIGNAL(triggered(bool)), this, SLOT(slotAddMarkerGuideQuickly())); + KAction* splitAudio = new KAction(KIcon("document-new"), i18n("Split Audio"), this); collection->addAction("split_audio", splitAudio); connect(splitAudio, SIGNAL(triggered(bool)), this, SLOT(slotSplitAudio())); @@ -1520,6 +1535,10 @@ void MainWindow::setupActions() connect(reloadClip , SIGNAL(triggered()), m_projectList, SLOT(slotReloadClip())); reloadClip->setEnabled(false); + QAction *stopMotion = new KAction(KIcon("image-x-generic"), i18n("Stopmotion Animation"), this); + collection->addAction("stopmotion", stopMotion); + connect(stopMotion , SIGNAL(triggered()), this, SLOT(slotOpenStopmotion())); + QMenu *addClips = new QMenu(); addClips->addAction(addClip); addClips->addAction(addColorClip); @@ -1947,7 +1966,21 @@ void MainWindow::doOpenFile(const KUrl &url, KAutoSaveFile *stale) { if (!m_timelineArea->isEnabled()) return; m_fileRevert->setEnabled(true); - KdenliveDoc *doc = new KdenliveDoc(url, KdenliveSettings::defaultprojectfolder(), m_commandStack, KdenliveSettings::default_profile(), QPoint(KdenliveSettings::videotracks(), KdenliveSettings::audiotracks()), m_projectMonitor->render, m_notesWidget, this); + + KProgressDialog progressDialog(this, i18n("Loading project"), i18n("Loading project")); + progressDialog.setAllowCancel(false); + progressDialog.progressBar()->setMaximum(4); + progressDialog.show(); + progressDialog.progressBar()->setValue(0); + qApp->processEvents(); + + KdenliveDoc *doc = new KdenliveDoc(url, KdenliveSettings::defaultprojectfolder(), m_commandStack, KdenliveSettings::default_profile(), QPoint(KdenliveSettings::videotracks(), KdenliveSettings::audiotracks()), m_projectMonitor->render, m_notesWidget, this, &progressDialog); + + progressDialog.progressBar()->setValue(1); + progressDialog.progressBar()->setMaximum(4); + progressDialog.setLabelText(i18n("Loading project")); + qApp->processEvents(); + if (stale == NULL) { stale = new KAutoSaveFile(url, doc); doc->m_autosave = stale; @@ -1958,8 +1991,16 @@ void MainWindow::doOpenFile(const KUrl &url, KAutoSaveFile *stale) stale->setParent(doc); } connectDocumentInfo(doc); + + progressDialog.progressBar()->setValue(2); + qApp->processEvents(); + bool ok; TrackView *trackView = new TrackView(doc, &ok, this); + + progressDialog.progressBar()->setValue(3); + qApp->processEvents(); + m_timelineArea->setCurrentIndex(m_timelineArea->addTab(trackView, KIcon("kdenlive"), doc->description())); if (!ok) { m_timelineArea->setEnabled(false); @@ -1978,6 +2019,8 @@ void MainWindow::doOpenFile(const KUrl &url, KAutoSaveFile *stale) m_projectMonitor->adjustRulerSize(trackView->duration()); m_projectMonitor->slotZoneMoved(trackView->inPoint(), trackView->outPoint()); m_clipMonitor->refreshMonitor(true); + + progressDialog.progressBar()->setValue(4); } void MainWindow::recoverFiles(QList staleFiles) @@ -2257,7 +2300,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha disconnect(m_activeDocument, SIGNAL(guidesUpdated()), this, SLOT(slotGuidesUpdated())); disconnect(m_activeDocument, SIGNAL(addProjectClip(DocClipBase *, bool)), m_projectList, SLOT(slotAddClip(DocClipBase *, bool))); disconnect(m_activeDocument, SIGNAL(resetProjectList()), m_projectList, SLOT(slotResetProjectList())); - disconnect(m_activeDocument, SIGNAL(signalDeleteProjectClip(const QString &)), m_projectList, SLOT(slotDeleteClip(const QString &))); + disconnect(m_activeDocument, SIGNAL(signalDeleteProjectClip(const QString &)), this, SLOT(slotDeleteClip(const QString &))); disconnect(m_activeDocument, SIGNAL(updateClipDisplay(const QString &)), m_projectList, SLOT(slotUpdateClip(const QString &))); disconnect(m_activeDocument, SIGNAL(selectLastAddedClip(const QString &)), m_projectList, SLOT(slotSelectClip(const QString &))); disconnect(m_activeDocument, SIGNAL(deleteTimelineClip(const QString &)), m_activeTimeline, SLOT(slotDeleteClip(const QString &))); @@ -2294,7 +2337,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())); + disconnect(m_projectList, SIGNAL(refreshClip()), m_monitorManager, SLOT(slotRefreshCurrentMonitor())); m_clipMonitor->stop(); } KdenliveSettings::setCurrent_profile(doc->profilePath()); @@ -2304,7 +2347,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha m_transitionConfig->updateProjectFormat(doc->mltProfile(), doc->timecode(), doc->tracksList()); m_effectStack->updateProjectFormat(doc->mltProfile(), doc->timecode()); connect(m_projectList, SIGNAL(clipSelected(DocClipBase *, QPoint)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *, QPoint))); - connect(m_projectList, SIGNAL(refreshClip()), m_clipMonitor, SLOT(refreshMonitor())); + connect(m_projectList, SIGNAL(refreshClip()), m_monitorManager, SLOT(slotRefreshCurrentMonitor())); connect(m_projectList, SIGNAL(clipNeedsReload(const QString&, bool)), trackView->projectView(), SLOT(slotUpdateClip(const QString &, bool))); connect(m_projectList, SIGNAL(projectModified()), doc, SLOT(setModified())); @@ -2331,7 +2374,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) //cha connect(doc, SIGNAL(addProjectClip(DocClipBase *, bool)), m_projectList, SLOT(slotAddClip(DocClipBase *, bool))); connect(doc, SIGNAL(resetProjectList()), m_projectList, SLOT(slotResetProjectList())); - connect(doc, SIGNAL(signalDeleteProjectClip(const QString &)), m_projectList, SLOT(slotDeleteClip(const QString &))); + connect(doc, SIGNAL(signalDeleteProjectClip(const QString &)), this, SLOT(slotDeleteClip(const QString &))); connect(doc, SIGNAL(updateClipDisplay(const QString &)), m_projectList, SLOT(slotUpdateClip(const QString &))); connect(doc, SIGNAL(selectLastAddedClip(const QString &)), m_projectList, SLOT(slotSelectClip(const QString &))); @@ -2689,6 +2732,26 @@ void MainWindow::slotEditClipMarker() } } +void MainWindow::slotAddMarkerGuideQuickly() +{ + if (!m_activeTimeline || !m_activeDocument) + return; + + if (m_clipMonitor->isActive()) { + DocClipBase *clip = m_clipMonitor->activeClip(); + GenTime pos = m_clipMonitor->position(); + + if (!clip) { + m_messageLabel->setMessage(i18n("Cannot find clip to add marker"), ErrorMessage); + return; + } + + m_activeTimeline->projectView()->slotAddClipMarker(clip->getId(), pos, m_activeDocument->timecode().getDisplayTimecode(pos, false)); + } else { + m_activeTimeline->projectView()->slotAddGuide(false); + } +} + void MainWindow::slotAddGuide() { if (m_activeTimeline) @@ -3015,19 +3078,23 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip) } // any type of clip but a title - ClipProperties dia(clip, m_activeDocument->timecode(), m_activeDocument->fps(), this); - connect(&dia, SIGNAL(addMarker(const QString &, GenTime, QString)), m_activeTimeline->projectView(), SLOT(slotAddClipMarker(const QString &, GenTime, QString))); - if (dia.exec() == QDialog::Accepted) { - QMap newprops = dia.properties(); - if (newprops.isEmpty()) return; - EditClipCommand *command = new EditClipCommand(m_projectList, clip->getId(), clip->properties(), newprops, true); - m_activeDocument->commandStack()->push(command); - m_activeDocument->setModified(); + ClipProperties *dia = new ClipProperties(clip, m_activeDocument->timecode(), m_activeDocument->fps(), this); + connect(dia, SIGNAL(addMarker(const QString &, GenTime, QString)), m_activeTimeline->projectView(), SLOT(slotAddClipMarker(const QString &, GenTime, QString))); + connect(dia, SIGNAL(applyNewClipProperties(const QString, QMap , QMap , bool, bool)), this, SLOT(slotApplyNewClipProperties(const QString, QMap , QMap , bool, bool))); + dia->show(); +} - if (dia.needsTimelineRefresh()) { - // update clip occurences in timeline - m_activeTimeline->projectView()->slotUpdateClip(clip->getId(), dia.needsTimelineReload()); - } + +void MainWindow::slotApplyNewClipProperties(const QString id, QMap props, QMap newprops, bool refresh, bool reload) +{ + if (newprops.isEmpty()) return; + EditClipCommand *command = new EditClipCommand(m_projectList, id, props, newprops, true); + m_activeDocument->commandStack()->push(command); + m_activeDocument->setModified(); + + if (refresh) { + // update clip occurences in timeline + m_activeTimeline->projectView()->slotUpdateClip(id, reload); } } @@ -3791,6 +3858,12 @@ void MainWindow::slotSwitchMonitors() 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; @@ -3824,11 +3897,11 @@ void MainWindow::slotShowTitleBars(bool show) { QList docks = findChildren(); for (int i = 0; i < docks.count(); i++) { - QDockWidget* dock=docks.at(i); - if (show){ - dock->setTitleBarWidget(0); - }else{ - if (!dock->isFloating()){ + QDockWidget* dock = docks.at(i); + if (show) { + dock->setTitleBarWidget(0); + } else { + if (!dock->isFloating()) { dock->setTitleBarWidget(new QWidget); } } @@ -3908,5 +3981,24 @@ void MainWindow::slotUpdateColorScopes() } } +void MainWindow::slotOpenStopmotion() +{ + if (m_stopmotion == NULL) { + m_stopmotion = new StopmotionWidget(m_activeDocument->projectFolder(), this); + connect(m_stopmotion, SIGNAL(addOrUpdateSequence(const QString)), m_projectList, SLOT(slotAddOrUpdateSequence(const QString))); + } + m_stopmotion->show(); +} + + +void MainWindow::slotDeleteClip(const QString &id) +{ + QList list = findChildren(); + for (int i = 0; i < list.size(); ++i) { + list.at(i)->disableClipId(id); + } + m_projectList->slotDeleteClip(id); +} + #include "mainwindow.moc"