void KeyframeEdit::slotAddKeyframe() { 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 { 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); 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(); 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::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(int pos) { keyframe_list->blockSignals(true); int row = 0; int col = keyframe_list->currentColumn(); int newrow = row; int result = pos; if (result > 0) { // A position was provided for (; newrow < keyframe_list->rowCount(); newrow++) { int rowPos = getPos(newrow); if (rowPos > result) { break; } } } else { row = keyframe_list->currentRow(); newrow = row; int pos1 = getPos(row); 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 { 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; } } } // Calculate new values QList <double> previousValues; QList <double> nextValues; int rowCount = keyframe_list->rowCount(); // Insert new row keyframe_list->insertRow(newrow); keyframe_list->setVerticalHeaderItem(newrow, new QTableWidgetItem(getPosString(result))); // If keyframe is inserted at start if (newrow == 0) { for (int i = 0; i < keyframe_list->columnCount(); ++i) { int newValue = keyframe_list->item(1, i)->text().toDouble(); keyframe_list->setItem(newrow, i, new QTableWidgetItem(QString::number(newValue))); } } else if (newrow == rowCount){ // Keyframe inserted at end for (int i = 0; i < keyframe_list->columnCount(); ++i) { int newValue = keyframe_list->item(rowCount - 1, i)->text().toDouble(); keyframe_list->setItem(newrow, i, new QTableWidgetItem(QString::number(newValue))); } } else { // Interpolate int previousPos = getPos(newrow - 1); int nextPos = getPos(newrow + 1); if (nextPos > previousPos) { double factor = ((double) result - previousPos) / (nextPos - previousPos); for (int i = 0; i < keyframe_list->columnCount(); ++i) { double previousValues = keyframe_list->item(newrow - 1, i)->text().toDouble(); double nextValues = keyframe_list->item(newrow + 1, i)->text().toDouble(); int newValue = (int) (previousValues + (nextValues- previousValues) * factor); keyframe_list->setItem(newrow, i, new QTableWidgetItem(QString::number(newValue))); } } } keyframe_list->resizeRowsToContents(); keyframe_list->setCurrentCell(newrow, col); slotAdjustKeyframeInfo(); keyframe_list->blockSignals(false); generateAllParams(); if (rowCount == 1) { // there was only one keyframe before, so now enable keyframe mode slotKeyframeMode(); } button_delete->setEnabled(keyframe_list->rowCount() > 1); }