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
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()));
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) {
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();
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()
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
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);
void slotModified();
void slotDeleteProxy();
void slotOpenUrl(const QString &url);
+ void slotSaveMarkers();
+ void slotLoadMarkers();
private:
Ui::ClipProperties_UI m_view;
void addMarker(const QString &, GenTime, QString);
void deleteProxy(const QString);
void applyNewClipProperties(const QString, QMap <QString, QString> , QMap <QString, QString> , bool, bool);
+ void saveMarkers(const QString &);
+ void loadMarkers(const QString &);
};
#include <KCursor>
#include <KMessageBox>
#include <KIO/NetAccess>
+#include <KFileDialog>
#include <QMouseEvent>
#include <QStylePainter>
}
}
-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)
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);
* @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.
// 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 <QString, QString> , QMap <QString, QString> , bool, bool)), this, SLOT(slotApplyNewClipProperties(const QString, QMap <QString, QString> , QMap <QString, QString> , bool, bool)));
dia->show();
<rect>
<x>0</x>
<y>0</y>
- <width>298</width>
- <height>512</height>
+ <width>306</width>
+ <height>539</height>
</rect>
</property>
<property name="windowTitle">
<string>Markers</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_7">
- <item row="0" column="0" colspan="4">
+ <item row="0" column="0" colspan="7">
<widget class="QTreeWidget" name="markers_list">
<property name="alternatingRowColors">
<bool>true</bool>
</property>
</widget>
</item>
- <item row="1" column="3">
+ <item row="1" column="6">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</spacer>
</item>
+ <item row="1" column="3">
+ <widget class="KSeparator" name="kseparator">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="4">
+ <widget class="QToolButton" name="marker_save">
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="5">
+ <widget class="QToolButton" name="marker_load">
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
<widget class="QWidget" name="tab_5">
<extends>QLineEdit</extends>
<header>klineedit.h</header>
</customwidget>
+ <customwidget>
+ <class>KSeparator</class>
+ <extends>QFrame</extends>
+ <header>kseparator.h</header>
+ </customwidget>
<customwidget>
<class>KUrlLabel</class>
<extends>QLabel</extends>