Exemplo n.º 1
0
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);
}
Exemplo n.º 2
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);
}
Exemplo n.º 3
0
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);
}