From: Jean-Baptiste Mardelle Date: Sat, 22 Sep 2012 15:17:24 +0000 (+0200) Subject: Load & save markers (audacity compatible): X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=8b4c224d4929ace1515266709c0f24978b19d3b4;p=kdenlive Load & save markers (audacity compatible): http://kdenlive.org/mantis/view.php?id=2742 --- diff --git a/src/clipproperties.cpp b/src/clipproperties.cpp index ed52808b..ad2b0c42 100644 --- a/src/clipproperties.cpp +++ b/src/clipproperties.cpp @@ -466,6 +466,10 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg m_view.marker_edit->setToolTip(i18n("Edit marker")); m_view.marker_delete->setIcon(KIcon("trash-empty")); m_view.marker_delete->setToolTip(i18n("Delete marker")); + m_view.marker_save->setIcon(KIcon("document-save-as")); + m_view.marker_save->setToolTip(i18n("Save markers")); + m_view.marker_load->setIcon(KIcon("document-open")); + m_view.marker_load->setToolTip(i18n("Load markers")); // Check for Nepomuk metadata #ifdef USE_NEPOMUK @@ -492,10 +496,12 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg m_view.clip_license->setHidden(true); #endif - slotFillMarkersList(); + slotFillMarkersList(m_clip); connect(m_view.marker_new, SIGNAL(clicked()), this, SLOT(slotAddMarker())); connect(m_view.marker_edit, SIGNAL(clicked()), this, SLOT(slotEditMarker())); connect(m_view.marker_delete, SIGNAL(clicked()), this, SLOT(slotDeleteMarker())); + connect(m_view.marker_save, SIGNAL(clicked()), this, SLOT(slotSaveMarkers())); + connect(m_view.marker_load, SIGNAL(clicked()), this, SLOT(slotLoadMarkers())); connect(m_view.markers_list, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(slotEditMarker())); connect(this, SIGNAL(accepted()), this, SLOT(slotApplyProperties())); @@ -703,8 +709,9 @@ void ClipProperties::slotEnableLumaFile(int state) m_view.label_softness->setEnabled(enable); } -void ClipProperties::slotFillMarkersList() +void ClipProperties::slotFillMarkersList(DocClipBase *clip) { + if (m_clip != clip) return; m_view.markers_list->clear(); QList < CommentedTime > marks = m_clip->commentedSnapMarkers(); for (int count = 0; count < marks.count(); ++count) { @@ -723,10 +730,19 @@ void ClipProperties::slotAddMarker() if (d->exec() == QDialog::Accepted) { emit addMarker(m_clip->getId(), d->newMarker().time(), d->newMarker().comment()); } - QTimer::singleShot(500, this, SLOT(slotFillMarkersList())); delete d; } +void ClipProperties::slotSaveMarkers() +{ + emit saveMarkers(m_clip->getId()); +} + +void ClipProperties::slotLoadMarkers() +{ + emit loadMarkers(m_clip->getId()); +} + void ClipProperties::slotEditMarker() { QList < CommentedTime > marks = m_clip->commentedSnapMarkers(); @@ -736,7 +752,6 @@ void ClipProperties::slotEditMarker() if (d.exec() == QDialog::Accepted) { emit addMarker(m_clip->getId(), d.newMarker().time(), d.newMarker().comment()); } - QTimer::singleShot(500, this, SLOT(slotFillMarkersList())); } void ClipProperties::slotDeleteMarker() @@ -745,8 +760,6 @@ void ClipProperties::slotDeleteMarker() int pos = m_view.markers_list->currentIndex().row(); if (pos < 0 || pos > marks.count() - 1) return; emit addMarker(m_clip->getId(), marks.at(pos).time(), QString()); - - QTimer::singleShot(500, this, SLOT(slotFillMarkersList())); } const QString &ClipProperties::clipId() const diff --git a/src/clipproperties.h b/src/clipproperties.h index 93cf57eb..17f143ce 100644 --- a/src/clipproperties.h +++ b/src/clipproperties.h @@ -55,13 +55,15 @@ public: bool needsTimelineRefresh() const; bool needsTimelineReload() const; void disableClipId(const QString &id); + +public slots: + void slotFillMarkersList(DocClipBase *clip); private slots: void parseFolder(); void slotAddMarker(); void slotEditMarker(); void slotDeleteMarker(); - void slotFillMarkersList(); void slotCheckMaxLength(); void slotEnableLuma(int state); void slotEnableLumaFile(int state); @@ -70,6 +72,8 @@ private slots: void slotModified(); void slotDeleteProxy(); void slotOpenUrl(const QString &url); + void slotSaveMarkers(); + void slotLoadMarkers(); private: Ui::ClipProperties_UI m_view; @@ -90,6 +94,8 @@ signals: void addMarker(const QString &, GenTime, QString); void deleteProxy(const QString); void applyNewClipProperties(const QString, QMap , QMap , bool, bool); + void saveMarkers(const QString &); + void loadMarkers(const QString &); }; diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index 1edb555b..9ed99e8d 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -73,6 +73,7 @@ #include #include #include +#include #include #include @@ -5195,11 +5196,11 @@ void CustomTrackView::clipEnd() } } -void CustomTrackView::slotAddClipMarker(const QString &id, GenTime t, QString c) +void CustomTrackView::slotAddClipMarker(const QString &id, GenTime t, QString c, QUndoCommand *groupCommand) { QString oldcomment = m_document->clipManager()->getClipById(id)->markerComment(t); - AddMarkerCommand *command = new AddMarkerCommand(this, oldcomment, c, id, t); - m_commandStack->push(command); + AddMarkerCommand *command = new AddMarkerCommand(this, oldcomment, c, id, t, groupCommand); + if (!groupCommand) m_commandStack->push(command); } void CustomTrackView::slotDeleteClipMarker(const QString &comment, const QString &id, const GenTime &position) @@ -5226,6 +5227,85 @@ void CustomTrackView::slotDeleteAllClipMarkers(const QString &id) m_commandStack->push(deleteMarkers); } +void CustomTrackView::slotSaveClipMarkers(const QString &id) +{ + DocClipBase *base = m_document->clipManager()->getClipById(id); + QList < CommentedTime > markers = base->commentedSnapMarkers(); + QString data; + for (int i = 0; i < markers.count(); i++) { + data.append(QString::number(markers.at(i).time().seconds())); + data.append("\t"); + data.append(QString::number(markers.at(i).time().seconds())); + data.append("\t"); + data.append(markers.at(i).comment()); + data.append("\n"); + } + if (!data.isEmpty()) { + QString url = KFileDialog::getSaveFileName(KUrl("kfiledialog:///projectfolder"), "text/plain", this, i18n("Save markers")); + if (url.isEmpty()) return; + QFile file(url); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + emit displayMessage(i18n("Cannot open file %1", url), ErrorMessage); + return; + } + file.write(data.toUtf8()); + file.close(); + } +} + +void CustomTrackView::slotLoadClipMarkers(const QString &id) +{ + KUrl url = KFileDialog::getOpenUrl(KUrl("kfiledialog:///projectfolder"), "text/plain", this, i18n("Load marker file")); + if (url.isEmpty()) return; + QFile file(url.path()); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + emit displayMessage(i18n("Cannot open file %1", url.fileName()), ErrorMessage); + return; + } + QString data = QString::fromUtf8(file.readAll()); + file.close(); + QStringList lines = data.split("\n", QString::SkipEmptyParts); + QStringList values; + bool ok; + QUndoCommand *command = new QUndoCommand(); + command->setText("Load markers"); + QString markerText; + foreach(QString line, lines) { + markerText.clear(); + values = line.split("\t", QString::SkipEmptyParts); + double time1 = values.at(0).toDouble(&ok); + double time2 = -1; + if (!ok) continue; + if (values.count() >1) { + time2 = values.at(1).toDouble(&ok); + if (values.count() == 2) { + // Check if second value is a number or text + if (!ok) { + time2 = -1; + markerText = values.at(1); + } + else markerText = i18n("Marker"); + } + else { + // We assume 3 values per line: in out name + if (!ok) { + // 2nd value is not a number, drop + } + else { + markerText = values.at(2); + } + } + } + if (!markerText.isEmpty()) { + // Marker found, add it + slotAddClipMarker(id, GenTime(time1), markerText, command); + if (time2 > 0 && time2 != time1) slotAddClipMarker(id, GenTime(time2), markerText, command); + } + } + if (command->childCount() > 0) m_commandStack->push(command); + else delete command; +} + void CustomTrackView::addMarker(const QString &id, const GenTime &pos, const QString &comment) { DocClipBase *base = m_document->clipManager()->getClipById(id); diff --git a/src/customtrackview.h b/src/customtrackview.h index c493ceb6..1f322854 100644 --- a/src/customtrackview.h +++ b/src/customtrackview.h @@ -231,7 +231,9 @@ public slots: * @param id Id of the marker's clip * @param t Position of the marker * @param c Comment of the marker */ - void slotAddClipMarker(const QString &id, GenTime t, QString c); + void slotAddClipMarker(const QString &id, GenTime t, QString c, QUndoCommand *groupCommand = 0); + void slotLoadClipMarkers(const QString &id); + void slotSaveClipMarkers(const QString &id); bool addGuide(const GenTime &pos, const QString &comment); /** @brief Shows a dialog for adding a guide. diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index e9e5861c..d7429b83 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -3310,6 +3310,9 @@ void MainWindow::slotShowClipProperties(DocClipBase *clip) // any type of clip but a title 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(m_activeTimeline->projectView(), SIGNAL(updateClipMarkers(DocClipBase *)), dia, SLOT(slotFillMarkersList(DocClipBase *))); + connect(dia, SIGNAL(loadMarkers(const QString &)), m_activeTimeline->projectView(), SLOT(slotLoadClipMarkers(const QString &))); + connect(dia, SIGNAL(saveMarkers(const QString &)), m_activeTimeline->projectView(), SLOT(slotSaveClipMarkers(const QString &))); connect(dia, SIGNAL(deleteProxy(const QString)), m_projectList, SLOT(slotDeleteProxy(const QString))); connect(dia, SIGNAL(applyNewClipProperties(const QString, QMap , QMap , bool, bool)), this, SLOT(slotApplyNewClipProperties(const QString, QMap , QMap , bool, bool))); dia->show(); diff --git a/src/widgets/clipproperties_ui.ui b/src/widgets/clipproperties_ui.ui index 41cb747d..21544e81 100644 --- a/src/widgets/clipproperties_ui.ui +++ b/src/widgets/clipproperties_ui.ui @@ -6,8 +6,8 @@ 0 0 - 298 - 512 + 306 + 539 @@ -413,7 +413,7 @@ Markers - + true @@ -472,7 +472,7 @@ - + Qt::Horizontal @@ -485,6 +485,33 @@ + + + + Qt::Vertical + + + + + + + ... + + + true + + + + + + + ... + + + true + + + @@ -824,6 +851,11 @@ QLineEdit
klineedit.h
+ + KSeparator + QFrame +
kseparator.h
+
KUrlLabel QLabel