X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fkeyframeedit.cpp;h=7e6801e11a70821e1039b3bea9d9858d88376d82;hb=20accf400934e26f5665eb4a50346fb0ea0914af;hp=a93bbfc70bffcc1fe0ae2ef30c329945e847d547;hpb=3446145e27bf689decff9a2b5eeed729029690f4;p=kdenlive diff --git a/src/keyframeedit.cpp b/src/keyframeedit.cpp index a93bbfc7..7e6801e1 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 @@ -17,14 +17,13 @@ #include "keyframeedit.h" #include "doubleparameterwidget.h" +#include "positionedit.h" #include "kdenlivesettings.h" #include #include #include -#include -#include KeyframeEdit::KeyframeEdit(QDomElement e, int minFrame, int maxFrame, Timecode tc, int activeKeyframe, QWidget* parent) : QWidget(parent), @@ -41,7 +40,7 @@ KeyframeEdit::KeyframeEdit(QDomElement e, int minFrame, int maxFrame, Timecode t buttonSeek->setChecked(KdenliveSettings::keyframeseek()); connect(buttonSeek, SIGNAL(toggled(bool)), this, SLOT(slotSetSeeking(bool))); - buttonKeyframes->setIcon(KIcon("list-add")); + buttonKeyframes->setIcon(KIcon("chronometer")); button_add->setIcon(KIcon("list-add")); button_add->setToolTip(i18n("Add keyframe")); button_delete->setIcon(KIcon("list-remove")); @@ -51,8 +50,14 @@ KeyframeEdit::KeyframeEdit(QDomElement e, int minFrame, int maxFrame, Timecode t connect(keyframe_list, SIGNAL(itemSelectionChanged()), this, SLOT(slotAdjustKeyframeInfo())); connect(keyframe_list, SIGNAL(cellChanged(int, int)), this, SLOT(slotGenerateParams(int, int))); - m_showButtons = new QButtonGroup(this); + 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); @@ -63,12 +68,10 @@ KeyframeEdit::KeyframeEdit(QDomElement e, int minFrame, int maxFrame, Timecode t connect(button_add, SIGNAL(clicked()), this, SLOT(slotAddKeyframe())); connect(buttonKeyframes, SIGNAL(clicked()), this, SLOT(slotKeyframeMode())); connect(buttonResetKeyframe, SIGNAL(clicked()), this, SLOT(slotResetKeyframe())); - connect(keyframe_pos, SIGNAL(valueChanged(int)), this, SLOT(slotAdjustKeyframePos(int))); - connect(m_showButtons, SIGNAL(buttonClicked(int)), this, SLOT(slotUpdateVisibleParameter(int))); + connect(m_position, SIGNAL(parameterChanged(int)), this, SLOT(slotAdjustKeyframePos(int))); //connect(keyframe_list, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this, SLOT(slotSaveCurrentParam(QTreeWidgetItem *, int))); - keyframe_pos->setPageStep(1); if (!keyframe_list->currentItem()) { keyframe_list->setCurrentCell(0, 0); keyframe_list->selectRow(0); @@ -101,34 +104,27 @@ void KeyframeEdit::addParameter(QDomElement e, int activeKeyframe) keyframe_list->blockSignals(true); m_params.append(e.cloneNode().toElement()); - QDomNode na = e.firstChildElement("name"); - QString paramName = i18n(na.toElement().text().toUtf8().data()); - QDomNode commentNode = e.firstChildElement("comment"); + QDomElement na = e.firstChildElement("name"); + QString paramName = i18n(na.text().toUtf8().data()); + QDomElement commentElem = e.firstChildElement("comment"); QString comment; - if (!commentNode.isNull()) - comment = i18n(commentNode.toElement().text().toUtf8().data()); - + 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").toInt(), m_params.at(columnId).attribute("max").toInt(), - m_params.at(columnId).attribute("default").toInt(), comment, m_params.at(columnId).attribute("suffix"), this); - connect(doubleparam, SIGNAL(valueChanged(int)), this, SLOT(slotAdjustKeyframeValue(int))); - connect(this, SIGNAL(showComments()), doubleparam, SLOT(slotShowComment())); + 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); - - QRadioButton *radio = new QRadioButton(this); - m_showButtons->addButton(radio, columnId); - if (e.attribute("intimeline") == "1") - radio->setChecked(true); - - // make the radiobutton stay at the top - QVBoxLayout *radioLayout = new QVBoxLayout(this); - radioLayout->addWidget(radio); - radioLayout->addStretch(); - m_slidersLayout->addLayout(radioLayout, columnId, 1); + if (e.attribute("intimeline") == "1") { + doubleparam->setInTimelineProperty(true); + } QStringList frames = e.attribute("keyframes").split(";", QString::SkipEmptyParts); for (int i = 0; i < frames.count(); i++) { @@ -196,14 +192,20 @@ void KeyframeEdit::slotAddKeyframe() newrow++; } else if (row == 0) { if (pos1 == m_min) { - result = m_max - 1; + result = m_max; newrow++; } else { result = m_min; } } else { - int pos2 = getPos(row - 1); - result = pos2 + (pos1 - pos2) / 2; + 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; + } } keyframe_list->insertRow(newrow); @@ -330,24 +332,25 @@ void KeyframeEdit::slotAdjustKeyframeInfo(bool seek) if (below) max = getPos(below->row()) - 1; - keyframe_pos->blockSignals(true); - keyframe_pos->setRange(min, max); - keyframe_pos->setValue(getPos(item->row())); - keyframe_pos->blockSignals(false); + m_position->blockSignals(true); + m_position->setRange(min, max); + 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().toInt()); + 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(keyframe_pos->value() - m_min); + emit seekToPos(m_position->getPosition() - m_min); } void KeyframeEdit::slotAdjustKeyframePos(int value) @@ -359,18 +362,18 @@ void KeyframeEdit::slotAdjustKeyframePos(int value) emit seekToPos(value - m_min); } -void KeyframeEdit::slotAdjustKeyframeValue(int value) +void KeyframeEdit::slotAdjustKeyframeValue(double value) { - Q_UNUSED(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; - int val = doubleparam->getValue(); + double val = doubleparam->getValue(); QTableWidgetItem *nitem = keyframe_list->item(item->row(), col); - if (nitem->text().toInt() != val) + if (nitem && nitem->text().toDouble() != val) nitem->setText(QString::number(val)); } //keyframe_list->item(item->row() - 1, item->column()); @@ -407,6 +410,8 @@ void KeyframeEdit::updateTimecodeFormat() else keyframe_list->verticalHeaderItem(row)->setText(m_timecode.getTimecodeFromFrames(pos.toInt())); } + + m_position->updateTimecodeFormat(); } void KeyframeEdit::slotKeyframeMode() @@ -427,8 +432,17 @@ void KeyframeEdit::slotResetKeyframe() 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 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: "<(m_slidersLayout->itemAtPosition(0, 1)->widget()); - if (radio) - radio->setChecked(true); + slotUpdateVisibleParameter(0); } #include "keyframeedit.moc"