X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fkeyframeedit.cpp;h=ac367215b7b24a7cbb69165db0642431fc45f708;hb=1404e8f1d631c81399e0e92ffce7dfac0195fabb;hp=66604ae98f867e9b6f54f3e1501be76132dff978;hpb=421dd62d67e8bfcaa293f86bfdba1dd30d363873;p=kdenlive diff --git a/src/keyframeedit.cpp b/src/keyframeedit.cpp index 66604ae9..ac367215 100644 --- a/src/keyframeedit.cpp +++ b/src/keyframeedit.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - geomeytrval.cpp - description + keyframedit.cpp - description ------------------- begin : 03 Aug 2008 copyright : (C) 2008 by Marco Gittler @@ -16,6 +16,8 @@ ***************************************************************************/ #include "keyframeedit.h" +#include "doubleparameterwidget.h" +#include "positionedit.h" #include "kdenlivesettings.h" #include @@ -23,151 +25,458 @@ #include +KeyframeEdit::KeyframeEdit(const QDomElement &e, int minFrame, int maxFrame, const Timecode &tc, int activeKeyframe, QWidget* parent) : + QWidget(parent), + m_min(minFrame), + m_max(maxFrame), + m_timecode(tc) +{ + setupUi(this); + if (m_max == -1) { + // special case: keyframe for tracks, do not allow keyframes + widgetTable->setHidden(true); + } + keyframe_list->setFont(KGlobalSettings::generalFont()); + buttonSeek->setChecked(KdenliveSettings::keyframeseek()); + connect(buttonSeek, SIGNAL(toggled(bool)), this, SLOT(slotSetSeeking(bool))); -KeyframeEdit::KeyframeEdit(QDomElement e, int maxFrame, int minVal, int maxVal, Timecode tc, QWidget* parent) : - QWidget(parent), - m_param(e), - m_max(maxFrame), - m_minVal(minVal), - m_maxVal(maxVal), - m_timecode(tc), - m_previousPos(0) -{ - m_ui.setupUi(this); - m_ui.keyframe_list->setFont(KGlobalSettings::generalFont()); - m_ui.keyframe_list->setHeaderLabels(QStringList() << i18n("Position") << i18n("Value")); - //setResizeMode(1, QHeaderView::Interactive); - m_ui.button_add->setIcon(KIcon("document-new")); - m_ui.button_delete->setIcon(KIcon("edit-delete")); - connect(m_ui.keyframe_list, SIGNAL(itemSelectionChanged()/*itemClicked(QTreeWidgetItem *, int)*/), this, SLOT(slotAdjustKeyframeInfo())); - setupParam(); - m_ui.keyframe_list->header()->resizeSections(QHeaderView::ResizeToContents); - connect(m_ui.button_delete, SIGNAL(clicked()), this, SLOT(slotDeleteKeyframe())); - connect(m_ui.button_add, SIGNAL(clicked()), this, SLOT(slotAddKeyframe())); - connect(m_ui.keyframe_list, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(slotGenerateParams(QTreeWidgetItem *, int))); - connect(m_ui.keyframe_list, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this, SLOT(slotSaveCurrentParam(QTreeWidgetItem *, int))); - connect(m_ui.keyframe_pos, SIGNAL(valueChanged(int)), this, SLOT(slotAdjustKeyframeValue(int))); - m_ui.keyframe_pos->setPageStep(1); - m_ui.keyframe_list->setItemDelegate(new KeyItemDelegate(minVal, maxVal)); -} - -void KeyframeEdit::setupParam(QDomElement e) -{ - if (!e.isNull()) m_param = e; - m_ui.keyframe_list->clear(); - QStringList frames = m_param.attribute("keyframes").split(";", QString::SkipEmptyParts); - for (int i = 0; i < frames.count(); i++) { - QString framePos = m_timecode.getTimecodeFromFrames(frames.at(i).section(':', 0, 0).toInt()); - QTreeWidgetItem *item = new QTreeWidgetItem(QStringList() << framePos << frames.at(i).section(':', 1, 1)); - item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled); - m_ui.keyframe_list->addTopLevelItem(item); - } - QTreeWidgetItem *first = m_ui.keyframe_list->topLevelItem(0); - if (first) m_ui.keyframe_list->setCurrentItem(first); - slotAdjustKeyframeInfo(); - m_ui.button_delete->setEnabled(m_ui.keyframe_list->topLevelItemCount() > 2); + buttonKeyframes->setIcon(KIcon("chronometer")); + button_add->setIcon(KIcon("list-add")); + button_add->setToolTip(i18n("Add keyframe")); + button_delete->setIcon(KIcon("list-remove")); + button_delete->setToolTip(i18n("Delete keyframe")); + buttonResetKeyframe->setIcon(KIcon("edit-undo")); + buttonSeek->setIcon(KIcon("insert-link")); + connect(keyframe_list, SIGNAL(itemSelectionChanged()), this, SLOT(slotAdjustKeyframeInfo())); + connect(keyframe_list, SIGNAL(cellChanged(int,int)), this, SLOT(slotGenerateParams(int,int))); + + m_position = new PositionEdit(i18n("Position"), 0, 0, 1, tc, widgetTable); + ((QGridLayout*)widgetTable->layout())->addWidget(m_position, 3, 0, 1, -1); + + m_slidersLayout = new QGridLayout(param_sliders); + //m_slidersLayout->setSpacing(0); + + m_slidersLayout->setContentsMargins(0, 0, 0, 0); + m_slidersLayout->setVerticalSpacing(2); + keyframe_list->setSelectionBehavior(QAbstractItemView::SelectRows); + keyframe_list->setSelectionMode(QAbstractItemView::SingleSelection); + addParameter(e, activeKeyframe); + keyframe_list->resizeRowsToContents(); + + //keyframe_list->horizontalHeader()->resizeSections(QHeaderView::ResizeToContents); + connect(button_delete, SIGNAL(clicked()), this, SLOT(slotDeleteKeyframe())); + connect(button_add, SIGNAL(clicked()), this, SLOT(slotAddKeyframe())); + connect(buttonKeyframes, SIGNAL(clicked()), this, SLOT(slotKeyframeMode())); + connect(buttonResetKeyframe, SIGNAL(clicked()), this, SLOT(slotResetKeyframe())); + connect(m_position, SIGNAL(parameterChanged(int)), this, SLOT(slotAdjustKeyframePos(int))); + + //connect(keyframe_list, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)), this, SLOT(slotSaveCurrentParam(QTreeWidgetItem*,int))); + + if (!keyframe_list->currentItem()) { + keyframe_list->setCurrentCell(0, 0); + keyframe_list->selectRow(0); + } + // ensure the keyframe list shows at least 3 lines + keyframe_list->setMinimumHeight(QFontInfo(keyframe_list->font()).pixelSize() * 9); + + // Do not show keyframe table if only one keyframe exists at the beginning + if (keyframe_list->rowCount() < 2 && getPos(0) == m_min && m_max != -1) + widgetTable->setHidden(true); + else + buttonKeyframes->setHidden(true); } -void KeyframeEdit::slotDeleteKeyframe() +KeyframeEdit::~KeyframeEdit() { - if (m_ui.keyframe_list->topLevelItemCount() < 3) return; - QTreeWidgetItem *item = m_ui.keyframe_list->currentItem(); - if (item) { - delete item; - slotGenerateParams(); + keyframe_list->blockSignals(true); + keyframe_list->clear(); + QLayoutItem *child; + while ((child = m_slidersLayout->takeAt(0)) != 0) { + QWidget *wid = child->widget(); + delete child; + if (wid) + delete wid; } - m_ui.button_delete->setEnabled(m_ui.keyframe_list->topLevelItemCount() > 2); +} + +void KeyframeEdit::addParameter(const QDomElement &e, int activeKeyframe) +{ + keyframe_list->blockSignals(true); + m_params.append(e.cloneNode().toElement()); + + QDomElement na = e.firstChildElement("name"); + QString paramName = i18n(na.text().toUtf8().data()); + QDomElement commentElem = e.firstChildElement("comment"); + QString comment; + if (!commentElem.isNull()) + comment = i18n(commentElem.text().toUtf8().data()); + + int columnId = keyframe_list->columnCount(); + keyframe_list->insertColumn(columnId); + keyframe_list->setHorizontalHeaderItem(columnId, new QTableWidgetItem(paramName)); + + DoubleParameterWidget *doubleparam = new DoubleParameterWidget(paramName, 0, + m_params.at(columnId).attribute("min").toDouble(), m_params.at(columnId).attribute("max").toDouble(), + m_params.at(columnId).attribute("default").toDouble(), comment, columnId, m_params.at(columnId).attribute("suffix"), m_params.at(columnId).attribute("decimals").toInt(), this); + connect(doubleparam, SIGNAL(valueChanged(double)), this, SLOT(slotAdjustKeyframeValue(double))); + connect(this, SIGNAL(showComments(bool)), doubleparam, SLOT(slotShowComment(bool))); + connect(doubleparam, SIGNAL(setInTimeline(int)), this, SLOT(slotUpdateVisibleParameter(int))); + m_slidersLayout->addWidget(doubleparam, columnId, 0); + if (e.attribute("intimeline") == "1") { + doubleparam->setInTimelineProperty(true); + } + + 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 = getPos(j); + 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) { + keyframe_list->insertRow(j); + keyframe_list->setVerticalHeaderItem(j, new QTableWidgetItem(getPosString(frame))); + keyframe_list->setItem(j, columnId, new QTableWidgetItem(frames.at(i).section(':', 1, 1))); + keyframe_list->resizeRowToContents(j); + } + if ((activeKeyframe > -1) && (activeKeyframe == frame)) { + keyframe_list->setCurrentCell(i, columnId); + keyframe_list->selectRow(i); + } + } + keyframe_list->resizeColumnsToContents(); + keyframe_list->blockSignals(false); + slotAdjustKeyframeInfo(false); + button_delete->setEnabled(keyframe_list->rowCount() > 1); +} + +void KeyframeEdit::slotDeleteKeyframe() +{ + if (keyframe_list->rowCount() < 2) + return; + int col = keyframe_list->currentColumn(); + int row = keyframe_list->currentRow(); + keyframe_list->removeRow(keyframe_list->currentRow()); + row = qMin(row, keyframe_list->rowCount() - 1); + keyframe_list->setCurrentCell(row, col); + keyframe_list->selectRow(row); + generateAllParams(); + + bool disable = keyframe_list->rowCount() < 2; + button_delete->setEnabled(!disable); + disable &= getPos(0) == m_min; + widgetTable->setHidden(disable); + buttonKeyframes->setHidden(!disable); } void KeyframeEdit::slotAddKeyframe() { - m_ui.keyframe_list->blockSignals(true); - int pos2; - QTreeWidgetItem *item = m_ui.keyframe_list->currentItem(); - if (item == NULL) return; - int ix = m_ui.keyframe_list->indexOfTopLevelItem(item); - int pos1 = m_timecode.getFrameCount(item->text(0), m_timecode.fps()); - QTreeWidgetItem *below = m_ui.keyframe_list->topLevelItem(ix + 1); - if (below == NULL) below = m_ui.keyframe_list->topLevelItem(ix - 1); - if (below == NULL) { - if (pos1 == 0) pos2 = m_max; - else pos2 = 0; + keyframe_list->blockSignals(true); + QTableWidgetItem *item = keyframe_list->currentItem(); + int row = keyframe_list->currentRow(); + int col = keyframe_list->currentColumn(); + int newrow = row; + int pos1 = getPos(row); + + int result; + if (row < (keyframe_list->rowCount() - 1)) { + result = pos1 + (getPos(row + 1) - pos1) / 2; + newrow++; + } else if (row == 0) { + if (pos1 == m_min) { + result = m_max; + newrow++; + } else { + result = m_min; + } } else { - pos2 = m_timecode.getFrameCount(below->text(0), m_timecode.fps()); + if (pos1 < m_max) { + // last keyframe selected and it is not at end of clip -> add keyframe at the end + result = m_max; + newrow++; + } else { + int pos2 = getPos(row - 1); + result = pos2 + (pos1 - pos2) / 2; + } } - int result = (pos1 + pos2) / 2; - if (result > pos1) ix++; - QTreeWidgetItem *newItem = new QTreeWidgetItem(QStringList() << m_timecode.getTimecodeFromFrames(result) << item->text(1)); - newItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled); - m_ui.keyframe_list->insertTopLevelItem(ix, newItem); - m_ui.keyframe_list->setCurrentItem(newItem); + keyframe_list->insertRow(newrow); + keyframe_list->setVerticalHeaderItem(newrow, new QTableWidgetItem(getPosString(result))); + 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->resizeRowsToContents(); slotAdjustKeyframeInfo(); - m_ui.keyframe_list->blockSignals(false); - m_ui.button_delete->setEnabled(m_ui.keyframe_list->topLevelItemCount() > 2); - slotGenerateParams(); + keyframe_list->blockSignals(false); + generateAllParams(); + button_delete->setEnabled(keyframe_list->rowCount() > 1); + keyframe_list->setCurrentCell(newrow, col); + keyframe_list->selectRow(newrow); + //slotGenerateParams(newrow, 0); } -void KeyframeEdit::slotGenerateParams(QTreeWidgetItem *item, int column) +void KeyframeEdit::slotGenerateParams(int row, int column) { - if (item) { - if (column == 0) { - QString val = item->text(0); - int pos = m_timecode.getFrameCount(val, m_timecode.fps()); - if (pos <= 0) { - pos = 0; - val = m_timecode.getTimecodeFromFrames(pos); - } - if (pos > m_max) { - pos = m_max; - val = m_timecode.getTimecodeFromFrames(pos); - } - QList duplicates = m_ui.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 (column == -1) { + // position of keyframe changed + QTableWidgetItem *item = keyframe_list->item(row, 0); + if (item == NULL) + return; + + int pos = getPos(row); + if (pos <= m_min) + pos = m_min; + if (m_max != -1 && pos > m_max) + pos = m_max; + QString val = getPosString(pos); + if (val != keyframe_list->verticalHeaderItem(row)->text()) + keyframe_list->verticalHeaderItem(row)->setText(val); + + for (int col = 0; col < keyframe_list->horizontalHeader()->count(); col++) { + item = keyframe_list->item(row, col); + if (!item) continue; + int v = item->text().toInt(); + if (v >= m_params.at(col).attribute("max").toInt()) + item->setText(m_params.at(col).attribute("max")); + if (v <= m_params.at(col).attribute("min").toInt()) + item->setText(m_params.at(col).attribute("min")); + QString keyframes; + for (int i = 0; i < keyframe_list->rowCount(); ++i) { + if (keyframe_list->item(i, col)) + keyframes.append(QString::number(getPos(i)) + ':' + keyframe_list->item(i, col)->text() + ';'); } - if (val != item->text(0)) item->setText(0, val); - } - if (column == 1) { - if (item->text(1).toInt() >= m_param.attribute("max").toInt()) item->setText(1, m_param.attribute("max")); - if (item->text(1).toInt() <= m_param.attribute("min").toInt()) item->setText(1, m_param.attribute("min")); + m_params[col].setAttribute("keyframes", keyframes); } + + emit parameterChanged(); + return; + } + QTableWidgetItem *item = keyframe_list->item(row, column); + if (item == NULL) + return; + + int pos = getPos(row); + if (pos <= m_min) + pos = m_min; + if (m_max != -1 && pos > m_max) + pos = m_max; + /*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); + }*/ + QString val = getPosString(pos); + if (val != keyframe_list->verticalHeaderItem(row)->text()) + keyframe_list->verticalHeaderItem(row)->setText(val); + + int v = item->text().toInt(); + if (v >= m_params.at(column).attribute("max").toInt()) + item->setText(m_params.at(column).attribute("max")); + if (v <= m_params.at(column).attribute("min").toInt()) + item->setText(m_params.at(column).attribute("min")); + slotAdjustKeyframeInfo(false); + QString keyframes; - for (int i = 0; i < m_ui.keyframe_list->topLevelItemCount(); i++) { - QTreeWidgetItem *item = m_ui.keyframe_list->topLevelItem(i); - keyframes.append(QString::number(m_timecode.getFrameCount(item->text(0), m_timecode.fps())) + ':' + item->text(1) + ';'); + for (int i = 0; i < keyframe_list->rowCount(); ++i) { + if (keyframe_list->item(i, column)) + keyframes.append(QString::number(getPos(i)) + ':' + 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(getPos(i)) + ':' + keyframe_list->item(i, col)->text() + ';'); + } + m_params[col].setAttribute("keyframes", keyframes); } - m_param.setAttribute("keyframes", keyframes); emit parameterChanged(); } -void KeyframeEdit::slotAdjustKeyframeInfo() +const QString KeyframeEdit::getValue(const QString &name) { - QTreeWidgetItem *item = m_ui.keyframe_list->currentItem(); - if (!item) return; - int min = 0; + for (int col = 0; col < keyframe_list->columnCount(); col++) { + QDomNode na = m_params.at(col).firstChildElement("name"); + QString paramName = i18n(na.toElement().text().toUtf8().data()); + if (paramName == name) + return m_params.at(col).attribute("keyframes"); + } + return QString(); +} + +void KeyframeEdit::slotAdjustKeyframeInfo(bool seek) +{ + QTableWidgetItem *item = keyframe_list->currentItem(); + if (!item) + return; + int min = m_min; int max = m_max; - QTreeWidgetItem *above = m_ui.keyframe_list->itemAbove(item); - QTreeWidgetItem *below = m_ui.keyframe_list->itemBelow(item); - if (above) min = m_timecode.getFrameCount(above->text(0), m_timecode.fps()) + 1; - if (below) max = m_timecode.getFrameCount(below->text(0), m_timecode.fps()) - 1; - m_ui.keyframe_pos->blockSignals(true); - m_ui.keyframe_pos->setRange(min, max); - m_ui.keyframe_pos->setValue(m_timecode.getFrameCount(item->text(0), m_timecode.fps())); - m_ui.keyframe_pos->blockSignals(false); + QTableWidgetItem *above = keyframe_list->item(item->row() - 1, item->column()); + QTableWidgetItem *below = keyframe_list->item(item->row() + 1, item->column()); + if (above) + min = getPos(above->row()) + 1; + if (below) + max = getPos(below->row()) - 1; + + m_position->blockSignals(true); + m_position->setRange(min, max, true); + m_position->setPosition(getPos(item->row())); + m_position->blockSignals(false); + + for (int col = 0; col < keyframe_list->columnCount(); col++) { + DoubleParameterWidget *doubleparam = static_cast (m_slidersLayout->itemAtPosition(col, 0)->widget()); + if (!doubleparam) + continue; + doubleparam->blockSignals(true); + if (keyframe_list->item(item->row(), col)) { + doubleparam->setValue(keyframe_list->item(item->row(), col)->text().toDouble()); + } else { + kDebug() << "Null pointer exception caught: http://www.kdenlive.org/mantis/view.php?id=1771"; + } + doubleparam->blockSignals(false); + } + if (KdenliveSettings::keyframeseek() && seek) + emit seekToPos(m_position->getPosition() - m_min); +} + +void KeyframeEdit::slotAdjustKeyframePos(int value) +{ + QTableWidgetItem *item = keyframe_list->currentItem(); + keyframe_list->verticalHeaderItem(item->row())->setText(getPosString(value)); + slotGenerateParams(item->row(), -1); + if (KdenliveSettings::keyframeseek()) + emit seekToPos(value - m_min); +} + +void KeyframeEdit::slotAdjustKeyframeValue(double value) +{ + Q_UNUSED(value) + + QTableWidgetItem *item = keyframe_list->currentItem(); + for (int col = 0; col < keyframe_list->columnCount(); col++) { + DoubleParameterWidget *doubleparam = static_cast (m_slidersLayout->itemAtPosition(col, 0)->widget()); + if (!doubleparam) + continue; + double val = doubleparam->getValue(); + QTableWidgetItem *nitem = keyframe_list->item(item->row(), col); + if (nitem && nitem->text().toDouble() != val) + nitem->setText(QString::number(val)); + } + //keyframe_list->item(item->row() - 1, item->column()); + +} + +int KeyframeEdit::getPos(int row) +{ + if (!keyframe_list->verticalHeaderItem(row)) + return 0; + if (KdenliveSettings::frametimecode()) + return keyframe_list->verticalHeaderItem(row)->text().toInt(); + else + return m_timecode.getFrameCount(keyframe_list->verticalHeaderItem(row)->text()); +} + +QString KeyframeEdit::getPosString(int pos) +{ + if (KdenliveSettings::frametimecode()) + return QString::number(pos); + else + return m_timecode.getTimecodeFromFrames(pos); +} + +void KeyframeEdit::slotSetSeeking(bool seek) +{ + KdenliveSettings::setKeyframeseek(seek); +} + +void KeyframeEdit::updateTimecodeFormat() +{ + for (int row = 0; row < keyframe_list->rowCount(); ++row) { + QString pos = keyframe_list->verticalHeaderItem(row)->text(); + if (KdenliveSettings::frametimecode()) + keyframe_list->verticalHeaderItem(row)->setText(QString::number(m_timecode.getFrameCount(pos))); + else + keyframe_list->verticalHeaderItem(row)->setText(m_timecode.getTimecodeFromFrames(pos.toInt())); + } + + m_position->updateTimecodeFormat(); +} + +void KeyframeEdit::slotKeyframeMode() +{ + widgetTable->setHidden(false); + buttonKeyframes->setHidden(true); + slotAddKeyframe(); +} + +void KeyframeEdit::slotResetKeyframe() +{ + for (int col = 0; col < keyframe_list->columnCount(); ++col) { + DoubleParameterWidget *doubleparam = static_cast(m_slidersLayout->itemAtPosition(col, 0)->widget()); + if (doubleparam) + doubleparam->slotReset(); + } +} + +void KeyframeEdit::slotUpdateVisibleParameter(int id, bool update) +{ + for (int i = 0; i < m_params.count(); ++i) { + m_params[i].setAttribute("intimeline", (i == id ? "1" : "0")); + } + for (int col = 0; col < keyframe_list->columnCount(); col++) { + DoubleParameterWidget *doubleparam = static_cast (m_slidersLayout->itemAtPosition(col, 0)->widget()); + if (!doubleparam) + continue; + doubleparam->setInTimelineProperty(col == id); + //kDebug()<<"// PARAM: "<currentItem(); - item->setText(0, m_timecode.getTimecodeFromFrames(value)); + for (int col = 0; col < keyframe_list->columnCount(); ++col) { + QDomNode na = m_params.at(col).firstChildElement("name"); + QString paramName = i18n(na.toElement().text().toUtf8().data()); + if (paramName == name) + return m_params.at(col).attribute("intimeline") == "1"; + } + return false; +} + +void KeyframeEdit::checkVisibleParam() +{ + if (m_params.count() == 0) + return; + + foreach(const QDomElement &elem, m_params) { + if (elem.attribute("intimeline") == "1") + return; + } + + slotUpdateVisibleParameter(0); } -void KeyframeEdit::slotSaveCurrentParam(QTreeWidgetItem *item, int column) +void KeyframeEdit::slotUpdateRange(int inPoint, int outPoint) { - if (item && column == 0) m_previousPos = m_timecode.getFrameCount(item->text(0), m_timecode.fps()); + m_min = inPoint; + m_max = outPoint; } +#include "keyframeedit.moc"