X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fkeyframeedit.cpp;h=e4f152accbe0c8e3adf08862f63f507be4f3bb0c;hb=82812d2bbe0841ad5534677c55b7fa84dbd890c0;hp=5ecc4d2aebdec727851286bb8a2224e3db385847;hpb=8a353aa8b1974599ca39110aa44b2e8f72e3179c;p=kdenlive diff --git a/src/keyframeedit.cpp b/src/keyframeedit.cpp index 5ecc4d2a..e4f152ac 100644 --- a/src/keyframeedit.cpp +++ b/src/keyframeedit.cpp @@ -24,8 +24,9 @@ #include -KeyframeEdit::KeyframeEdit(QDomElement e, int maxFrame, int minVal, int maxVal, Timecode tc, const QString paramName, QWidget* parent) : +KeyframeEdit::KeyframeEdit(QDomElement e, int minFrame, int maxFrame, int minVal, int maxVal, Timecode tc, const QString paramName, QWidget* parent) : QWidget(parent), + m_min(minFrame), m_max(maxFrame), m_minVal(minVal), m_maxVal(maxVal), @@ -35,7 +36,7 @@ KeyframeEdit::KeyframeEdit(QDomElement e, int maxFrame, int minVal, int maxVal, setupUi(this); m_params.append(e); keyframe_list->setFont(KGlobalSettings::generalFont()); - + //keyframe_list->setHorizontalHeaderLabels(QStringList() << (paramName.isEmpty() ? i18n("Value") : paramName)); //setResizeMode(1, QHeaderView::Interactive); button_add->setIcon(KIcon("list-add")); @@ -68,7 +69,8 @@ KeyframeEdit::~KeyframeEdit() //delete m_delegate; } -void KeyframeEdit::addParameter(QDomElement e) { +void KeyframeEdit::addParameter(QDomElement e) +{ keyframe_list->blockSignals(true); QDomNode na = e.firstChildElement("name"); QString paramName = i18n(na.toElement().text().toUtf8().data()); @@ -78,27 +80,26 @@ void KeyframeEdit::addParameter(QDomElement e) { m_params.append(e); QStringList frames = e.attribute("keyframes").split(";", QString::SkipEmptyParts); for (int i = 0; i < frames.count(); i++) { - int frame = frames.at(i).section(':', 0, 0).toInt(); - bool found = false; - int j; - for (j = 0; j < keyframe_list->rowCount(); j++) { - int currentPos = m_timecode.getFrameCount(keyframe_list->verticalHeaderItem(j)->text()); - if (frame == currentPos) { - keyframe_list->setItem(j, columnId, new QTableWidgetItem(frames.at(i).section(':', 1, 1))); - found = true; - break; - } - else if (currentPos > frame) { - break; - } - } + int frame = frames.at(i).section(':', 0, 0).toInt(); + bool found = false; + int j; + for (j = 0; j < keyframe_list->rowCount(); j++) { + int currentPos = m_timecode.getFrameCount(keyframe_list->verticalHeaderItem(j)->text()); + if (frame == currentPos) { + keyframe_list->setItem(j, columnId, new QTableWidgetItem(frames.at(i).section(':', 1, 1))); + found = true; + break; + } else if (currentPos > frame) { + break; + } + } if (!found) { - //int newRow = keyframe_list->rowCount(); - keyframe_list->insertRow(j); - keyframe_list->setVerticalHeaderItem(j, new QTableWidgetItem(m_timecode.getTimecodeFromFrames(frame))); - keyframe_list->setItem(j, columnId, new QTableWidgetItem(frames.at(i).section(':', 1, 1))); - keyframe_list->resizeRowToContents(j); - } + //int newRow = keyframe_list->rowCount(); + keyframe_list->insertRow(j); + keyframe_list->setVerticalHeaderItem(j, new QTableWidgetItem(m_timecode.getTimecodeFromFrames(frame))); + keyframe_list->setItem(j, columnId, new QTableWidgetItem(frames.at(i).section(':', 1, 1))); + keyframe_list->resizeRowToContents(j); + } } keyframe_list->blockSignals(false); } @@ -110,15 +111,15 @@ void KeyframeEdit::setupParam() int col = keyframe_list->columnCount(); QDomNode na = m_params.at(0).firstChildElement("name"); QString paramName = i18n(na.toElement().text().toUtf8().data()); - kDebug()<<" INSERT COL: "<insertColumn(col); keyframe_list->setHorizontalHeaderItem(col, new QTableWidgetItem(paramName)); QStringList frames = m_params.at(0).attribute("keyframes").split(";", QString::SkipEmptyParts); for (int i = 0; i < frames.count(); i++) { - keyframe_list->insertRow(i); - QString framePos = m_timecode.getTimecodeFromFrames(frames.at(i).section(':', 0, 0).toInt()); - keyframe_list->setVerticalHeaderItem(i, new QTableWidgetItem(framePos)); - keyframe_list->setItem(i, col, new QTableWidgetItem(frames.at(i).section(':', 1, 1))); + keyframe_list->insertRow(i); + QString framePos = m_timecode.getTimecodeFromFrames(frames.at(i).section(':', 0, 0).toInt()); + keyframe_list->setVerticalHeaderItem(i, new QTableWidgetItem(framePos)); + keyframe_list->setItem(i, col, new QTableWidgetItem(frames.at(i).section(':', 1, 1))); //item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled); } /*QTreeWidgetItem *first = keyframe_list->topLevelItem(0); @@ -137,45 +138,45 @@ void KeyframeEdit::slotDeleteKeyframe() keyframe_list->removeRow(keyframe_list->currentRow()); row = qMin(row, keyframe_list->rowCount() - 1); keyframe_list->setCurrentCell(row, col); - slotGenerateParams(row, col); + generateAllParams(); button_delete->setEnabled(keyframe_list->rowCount() > 1); } void KeyframeEdit::slotAddKeyframe() { keyframe_list->blockSignals(true); - int pos2; QTableWidgetItem *item = keyframe_list->currentItem(); int row = keyframe_list->currentRow(); int col = keyframe_list->currentColumn(); int newrow = row; int pos1 = m_timecode.getFrameCount(keyframe_list->verticalHeaderItem(row)->text()); - kDebug()<<"// ADD KF: "<rowCount()<<", POS: "<rowCount() << ", POS: " << pos1; if (row < (keyframe_list->rowCount() - 1)) { - pos2 = m_timecode.getFrameCount(keyframe_list->verticalHeaderItem(row + 1)->text()); - newrow++; - } - else if (row == 0) { - if (pos1 == 0) { - pos2 = m_max * 2; - newrow++; - } - else { - pos2 = 0; - pos1 = 0; - } + int pos2 = m_timecode.getFrameCount(keyframe_list->verticalHeaderItem(row + 1)->text()); + result = pos1 + (pos2 - pos1) / 2; + newrow++; + } else if (row == 0) { + if (pos1 == m_min) { + result = m_max - 1; + newrow++; + } else { + result = m_min; + } + } else { + int pos2 = m_timecode.getFrameCount(keyframe_list->verticalHeaderItem(row - 1)->text()); + result = pos2 + (pos1 - pos2) / 2; } - else pos2 = m_timecode.getFrameCount(keyframe_list->verticalHeaderItem(row - 1)->text()); - int result = (pos1 + pos2) / 2; - keyframe_list->insertRow(newrow); keyframe_list->setVerticalHeaderItem(newrow, new QTableWidgetItem(m_timecode.getTimecodeFromFrames(result))); - keyframe_list->setItem(newrow, keyframe_list->currentColumn(), new QTableWidgetItem(item->text())); - keyframe_list->resizeRowToContents(newrow); + for (int i = 0; i < keyframe_list->columnCount(); i++) { + keyframe_list->setItem(newrow, i, new QTableWidgetItem(keyframe_list->item(item->row(), i)->text())); + } + //keyframe_list->resizeRowToContents(newrow); slotAdjustKeyframeInfo(); keyframe_list->blockSignals(false); - slotGenerateParams(newrow, keyframe_list->currentColumn()); + generateAllParams(); button_delete->setEnabled(keyframe_list->rowCount() > 1); keyframe_list->setCurrentCell(newrow, col); //slotGenerateParams(newrow, 0); @@ -187,20 +188,20 @@ void KeyframeEdit::slotGenerateParams(int row, int column) if (item == NULL) return; QString val = keyframe_list->verticalHeaderItem(row)->text(); int pos = m_timecode.getFrameCount(val); - if (pos <= 0) { - pos = 0; + if (pos <= m_min) { + pos = m_min; val = m_timecode.getTimecodeFromFrames(pos); } if (pos > m_max) { - pos = m_max; + pos = m_max; val = m_timecode.getTimecodeFromFrames(pos); } - /*QList duplicates = keyframe_list->findItems(val, Qt::MatchExactly, 0); - duplicates.removeAll(item); - if (!duplicates.isEmpty()) { - // Trying to insert a keyframe at existing value, revert it - val = m_timecode.getTimecodeFromFrames(m_previousPos); - }*/ + /*QList duplicates = keyframe_list->findItems(val, Qt::MatchExactly, 0); + duplicates.removeAll(item); + if (!duplicates.isEmpty()) { + // Trying to insert a keyframe at existing value, revert it + val = m_timecode.getTimecodeFromFrames(m_previousPos); + }*/ if (val != keyframe_list->verticalHeaderItem(row)->text()) keyframe_list->verticalHeaderItem(row)->setText(val); int v = item->text().toInt(); @@ -210,17 +211,29 @@ void KeyframeEdit::slotGenerateParams(int row, int column) QString keyframes; for (int i = 0; i < keyframe_list->rowCount(); i++) { - keyframes.append(QString::number(m_timecode.getFrameCount(keyframe_list->verticalHeaderItem(i)->text())) + ':' + keyframe_list->item(i, 0)->text() + ';'); + if (keyframe_list->item(i, column)) keyframes.append(QString::number(m_timecode.getFrameCount(keyframe_list->verticalHeaderItem(i)->text())) + ':' + keyframe_list->item(i, column)->text() + ';'); } m_params[column].setAttribute("keyframes", keyframes); emit parameterChanged(); } +void KeyframeEdit::generateAllParams() +{ + for (int col = 0; col < keyframe_list->columnCount(); col++) { + QString keyframes; + for (int i = 0; i < keyframe_list->rowCount(); i++) { + if (keyframe_list->item(i, col)) keyframes.append(QString::number(m_timecode.getFrameCount(keyframe_list->verticalHeaderItem(i)->text())) + ':' + keyframe_list->item(i, col)->text() + ';'); + } + m_params[col].setAttribute("keyframes", keyframes); + } + emit parameterChanged(); +} + void KeyframeEdit::slotAdjustKeyframeInfo() { QTableWidgetItem *item = keyframe_list->currentItem(); if (!item) return; - int min = 0; + int min = m_min; int max = m_max; QTableWidgetItem *above = keyframe_list->item(item->row() - 1, item->column()); QTableWidgetItem *below = keyframe_list->item(item->row() + 1, item->column());