QmlDesigner: Avoid deletion and recreation of keyframes if possible

Without this all keyframes are first deleted and then recreated.
This becomes notable slow with a larger number of keyframes, since the
timeline does react to each deletion/creation and rebuilds the scene
for the group.

Instead we can keep all keyframes and simply adjust their frame.

Change-Id: Ic34ffbdea74f57cf8f5bcddfbce8a8c18ffef7b0
Reviewed-by: Knud Dollereder <knud.dollereder@qt.io>
Reviewed-by: Qt CI Patch Build Bot <ci_patchbuild_bot@qt.io>
This commit is contained in:
Thomas Hartmann
2023-12-05 13:58:57 +01:00
parent b5370c435e
commit c3d22dfcd9

View File

@@ -307,10 +307,20 @@ void CurveEditorView::commitKeyframes(TreeItem *item)
auto replaceKeyframes = [&group, pitem, this]() mutable { auto replaceKeyframes = [&group, pitem, this]() mutable {
m_block = true; m_block = true;
for (auto& frame : group.keyframes())
frame.destroy();
AnimationCurve curve = pitem->curve(); AnimationCurve curve = pitem->curve();
unsigned int i = 0;
const size_t numberOfKeyFrames = curve.keyframes().size();
for (auto &frame : group.keyframes()) {
if (i < numberOfKeyFrames) {
QPointF pos = curve.keyframes().at(i).position();
frame.variantProperty("frame").setValue(pos.x());
} else {
frame.destroy();
}
i++;
}
if (curve.valueType() == AnimationCurve::ValueType::Bool) { if (curve.valueType() == AnimationCurve::ValueType::Bool) {
for (const auto& frame : curve.keyframes()) { for (const auto& frame : curve.keyframes()) {
QPointF pos = frame.position(); QPointF pos = frame.position();