X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fkeyframeedit.cpp;h=6dde054dafaea67c84e2bf2156120661865c3489;hb=4832646a7da7bd33e3edff6ef0c2d3f585a85378;hp=bf1a426d270c8ba9653caee980d20095e219b5f5;hpb=20c5f6fee688f2f501276fef7f30ea2b06c5375e;p=kdenlive diff --git a/src/keyframeedit.cpp b/src/keyframeedit.cpp index bf1a426d..6dde054d 100644 --- a/src/keyframeedit.cpp +++ b/src/keyframeedit.cpp @@ -23,47 +23,64 @@ #include #include +#include +#include -KeyframeEdit::KeyframeEdit(QDomElement e, int minFrame, int maxFrame, int minVal, int maxVal, Timecode tc, int active_keyframe, QWidget* parent) : +KeyframeEdit::KeyframeEdit(QDomElement e, int minFrame, int maxFrame, Timecode tc, int activeKeyframe, QWidget* parent) : QWidget(parent), m_min(minFrame), m_max(maxFrame), - m_minVal(minVal), - m_maxVal(maxVal), - m_timecode(tc), - m_previousPos(0), - m_active_keyframe(active_keyframe) + m_timecode(tc) { - kDebug() << " / / / /MODIFIED KFR: " << m_active_keyframe; setupUi(this); - m_params.append(e.cloneNode().toElement()); + if (m_max == -1) { + // special case: keyframe for tracks, do not allow keyframes + widgetTable->setHidden(true); + } keyframe_list->setFont(KGlobalSettings::generalFont()); - keyframe_seek->setChecked(KdenliveSettings::keyframeseek()); - connect(keyframe_seek, SIGNAL(stateChanged(int)), this, SLOT(slotSetSeeking(int))); + buttonSeek->setChecked(KdenliveSettings::keyframeseek()); + connect(buttonSeek, SIGNAL(toggled(bool)), this, SLOT(slotSetSeeking(bool))); + buttonKeyframes->setIcon(KIcon("list-add")); 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))); - setupParam(); + m_showButtons = new QButtonGroup(this); + m_slidersLayout = new QGridLayout(param_sliders); + keyframe_list->setSelectionBehavior(QAbstractItemView::SelectRows); + keyframe_list->setSelectionMode(QAbstractItemView::SingleSelection); + addParameter(e, activeKeyframe); keyframe_list->resizeRowsToContents(); - keyframe_list->resizeColumnsToContents(); + //keyframe_list->horizontalHeader()->resizeSections(QHeaderView::ResizeToContents); connect(button_delete, SIGNAL(clicked()), this, SLOT(slotDeleteKeyframe())); connect(button_add, SIGNAL(clicked()), this, SLOT(slotAddKeyframe())); - //connect(keyframe_list, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this, SLOT(slotSaveCurrentParam(QTreeWidgetItem *, int))); + 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(keyframe_val, SIGNAL(valueChanged(int)), this, SLOT(slotAdjustKeyframeValue(int))); + connect(m_showButtons, SIGNAL(buttonClicked(int)), this, SLOT(slotUpdateVisibleParameter(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); } - /*m_delegate = new KeyItemDelegate(minVal, maxVal); - keyframe_list->setItemDelegate(m_delegate);*/ + // 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); } KeyframeEdit::~KeyframeEdit() @@ -77,25 +94,42 @@ KeyframeEdit::~KeyframeEdit() if (wid) delete wid; } - //delete m_delegate; } -void KeyframeEdit::addParameter(QDomElement e) +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()); + + 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").toInt(), m_params.at(columnId).attribute("max").toInt(), - m_params.at(columnId).attribute("default").toInt(), m_params.at(columnId).attribute("suffix"), this); + 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_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); + 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(); @@ -117,49 +151,13 @@ void KeyframeEdit::addParameter(QDomElement e) keyframe_list->setItem(j, columnId, new QTableWidgetItem(frames.at(i).section(':', 1, 1))); keyframe_list->resizeRowToContents(j); } - } - keyframe_list->resizeColumnsToContents(); - keyframe_list->blockSignals(false); - slotAdjustKeyframeInfo(false); -} - -void KeyframeEdit::setupParam() -{ - keyframe_list->blockSignals(true); - keyframe_list->clear(); - int col = keyframe_list->columnCount(); - QDomNode na = m_params.at(0).firstChildElement("name"); - QString paramName = i18n(na.toElement().text().toUtf8().data()); - kDebug() << " INSERT COL: " << col << ", " << paramName; - keyframe_list->insertColumn(col); - keyframe_list->setHorizontalHeaderItem(col, new QTableWidgetItem(paramName)); - m_slidersLayout = new QGridLayout(param_sliders); - - DoubleParameterWidget *doubleparam = new DoubleParameterWidget(paramName, 0, - m_params.at(0).attribute("min").toInt(), m_params.at(0).attribute("max").toInt(), - m_params.at(0).attribute("default").toInt(), m_params.at(0).attribute("suffix"), this); - connect(doubleparam, SIGNAL(valueChanged(int)), this, SLOT(slotAdjustKeyframeValue(int))); - m_slidersLayout->addWidget(doubleparam, 0, 0); - - keyframe_list->setSelectionBehavior(QAbstractItemView::SelectRows); - keyframe_list->setSelectionMode(QAbstractItemView::SingleSelection); - - QStringList frames = m_params.at(0).attribute("keyframes").split(";", QString::SkipEmptyParts); - for (int i = 0; i < frames.count(); i++) { - keyframe_list->insertRow(i); - int currentpos = frames.at(i).section(':', 0, 0).toInt(); - keyframe_list->setVerticalHeaderItem(i, new QTableWidgetItem(getPosString(currentpos))); - keyframe_list->setItem(i, col, new QTableWidgetItem(frames.at(i).section(':', 1, 1))); - if ((m_active_keyframe > -1) && (m_active_keyframe == currentpos)) { - keyframe_list->setCurrentCell(i, 0); + if ((activeKeyframe > -1) && (activeKeyframe == frame)) { + keyframe_list->setCurrentCell(i, columnId); keyframe_list->selectRow(i); } - //item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled); } - /*QTreeWidgetItem *first = keyframe_list->topLevelItem(0); - if (first) keyframe_list->setCurrentItem(first);*/ + keyframe_list->resizeColumnsToContents(); keyframe_list->blockSignals(false); - //keyframe_list->setCurrentCell(0, 0); slotAdjustKeyframeInfo(false); button_delete->setEnabled(keyframe_list->rowCount() > 1); } @@ -175,7 +173,12 @@ void KeyframeEdit::slotDeleteKeyframe() keyframe_list->setCurrentCell(row, col); keyframe_list->selectRow(row); generateAllParams(); - button_delete->setEnabled(keyframe_list->rowCount() > 1); + + bool disable = keyframe_list->rowCount() < 2; + button_delete->setEnabled(!disable); + disable &= getPos(0) == m_min; + widgetTable->setHidden(disable); + buttonKeyframes->setHidden(!disable); } void KeyframeEdit::slotAddKeyframe() @@ -188,7 +191,6 @@ void KeyframeEdit::slotAddKeyframe() int pos1 = getPos(row); int result; - kDebug() << "// ADD KF: " << row << ", MAX: " << keyframe_list->rowCount() << ", POS: " << pos1; if (row < (keyframe_list->rowCount() - 1)) { result = pos1 + (getPos(row + 1) - pos1) / 2; newrow++; @@ -210,7 +212,6 @@ void KeyframeEdit::slotAddKeyframe() keyframe_list->setItem(newrow, i, new QTableWidgetItem(keyframe_list->item(item->row(), i)->text())); keyframe_list->resizeRowsToContents(); - //keyframe_list->resizeRowToContents(newrow); slotAdjustKeyframeInfo(); keyframe_list->blockSignals(false); generateAllParams(); @@ -231,7 +232,7 @@ void KeyframeEdit::slotGenerateParams(int row, int column) int pos = getPos(row); if (pos <= m_min) pos = m_min; - if (pos > m_max) + if (m_max != -1 && pos > m_max) pos = m_max; QString val = getPosString(pos); if (val != keyframe_list->verticalHeaderItem(row)->text()) @@ -263,7 +264,7 @@ void KeyframeEdit::slotGenerateParams(int row, int column) int pos = getPos(row); if (pos <= m_min) pos = m_min; - if (pos > m_max) + if (m_max != -1 && pos > m_max) pos = m_max; /*QList duplicates = keyframe_list->findItems(val, Qt::MatchExactly, 0); duplicates.removeAll(item); @@ -309,7 +310,6 @@ const QString KeyframeEdit::getValue(const QString &name) 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()); - kDebug() << paramName << " == " << name; if (paramName == name) return m_params.at(col).attribute("keyframes"); } @@ -359,8 +359,10 @@ void KeyframeEdit::slotAdjustKeyframePos(int value) emit seekToPos(value - m_min); } -void KeyframeEdit::slotAdjustKeyframeValue(int /*value*/) +void KeyframeEdit::slotAdjustKeyframeValue(int 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()); @@ -391,9 +393,9 @@ QString KeyframeEdit::getPosString(int pos) return m_timecode.getTimecodeFromFrames(pos); } -void KeyframeEdit::slotSetSeeking(int state) +void KeyframeEdit::slotSetSeeking(bool seek) { - KdenliveSettings::setKeyframeseek(state == Qt::Checked); + KdenliveSettings::setKeyframeseek(seek); } void KeyframeEdit::updateTimecodeFormat() @@ -407,8 +409,54 @@ void KeyframeEdit::updateTimecodeFormat() } } -/*void KeyframeEdit::slotSaveCurrentParam(QTreeWidgetItem *item, int column) +void KeyframeEdit::slotKeyframeMode() { - if (item && column == 0) m_previousPos = m_timecode.getFrameCount(item->text(0)); -}*/ + 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")); + if (update) emit parameterChanged(); +} + +bool KeyframeEdit::isVisibleParam(const QString& name) +{ + 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(QDomElement elem, m_params) { + if (elem.attribute("intimeline") == "1") + return; + } + + slotUpdateVisibleParameter(0, false); + QRadioButton *radio = static_cast(m_slidersLayout->itemAtPosition(0, 1)->widget()); + if (radio) + radio->setChecked(true); +} +#include "keyframeedit.moc"