fix keyframe drag (#2000)
This commit is contained in:
parent
b5e76bca01
commit
62f1df91c9
1 changed files with 45 additions and 14 deletions
|
@ -99,6 +99,8 @@ void KeyframeMover::start(TKeyframeSelection *selection, int qualifiers) {
|
||||||
bool KeyframeMover::moveKeyframes(
|
bool KeyframeMover::moveKeyframes(
|
||||||
int dr, std::set<TKeyframeSelection::Position> &newPositions,
|
int dr, std::set<TKeyframeSelection::Position> &newPositions,
|
||||||
TKeyframeSelection *selection) {
|
TKeyframeSelection *selection) {
|
||||||
|
// return if there is no movement
|
||||||
|
if (dr == 0) return false;
|
||||||
TXsheet *xsh = getXsheet();
|
TXsheet *xsh = getXsheet();
|
||||||
std::set<TKeyframeSelection::Position> positions;
|
std::set<TKeyframeSelection::Position> positions;
|
||||||
if (selection)
|
if (selection)
|
||||||
|
@ -115,23 +117,52 @@ bool KeyframeMover::moveKeyframes(
|
||||||
TStageObjectId objId =
|
TStageObjectId objId =
|
||||||
c >= 0 ? TStageObjectId::ColumnId(c) : TStageObjectId::CameraId(0);
|
c >= 0 ? TStageObjectId::ColumnId(c) : TStageObjectId::CameraId(0);
|
||||||
TStageObject *stObj = xsh->getStageObject(objId);
|
TStageObject *stObj = xsh->getStageObject(objId);
|
||||||
if (r + dr < 0) dr = -r;
|
if (r + dr < 0) {
|
||||||
if (stObj->isKeyframe(r + dr)) return false;
|
dr = -r;
|
||||||
|
// dragging backward stops when the selection reaches the first frame
|
||||||
|
if (dr == 0) return false;
|
||||||
|
}
|
||||||
|
if (stObj->isKeyframe(r + dr)) {
|
||||||
|
if (m_qualifiers & eCopyKeyframes) return false;
|
||||||
|
// occupying key may be dragged one which is to be moved out
|
||||||
|
else if (positions.count(TKeyframeSelection::Position(r + dr, c)) == 0)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool firstTime = false;
|
bool firstTime = false;
|
||||||
for (posIt = positions.begin(); posIt != positions.end(); ++posIt) {
|
|
||||||
int c = posIt->second;
|
// move keys from the end of the selection on dragging forward
|
||||||
int r = posIt->first;
|
if (dr > 0) {
|
||||||
TStageObjectId objId =
|
for (std::set<TKeyframeSelection::Position>::reverse_iterator revIt =
|
||||||
c >= 0 ? TStageObjectId::ColumnId(c) : TStageObjectId::CameraId(0);
|
positions.rbegin();
|
||||||
TStageObject *stObj = xsh->getStageObject(objId);
|
revIt != positions.rend(); ++revIt) {
|
||||||
if (m_qualifiers & eCopyKeyframes) {
|
int c = revIt->second;
|
||||||
firstTime = true;
|
int r = revIt->first;
|
||||||
stObj->setKeyframeWithoutUndo(r + dr, stObj->getKeyframe(r));
|
TStageObjectId objId =
|
||||||
} else
|
c >= 0 ? TStageObjectId::ColumnId(c) : TStageObjectId::CameraId(0);
|
||||||
stObj->moveKeyframe(r + dr, r);
|
TStageObject *stObj = xsh->getStageObject(objId);
|
||||||
newPositions.insert(TKeyframeSelection::Position(r + dr, c));
|
if (m_qualifiers & eCopyKeyframes) {
|
||||||
|
firstTime = true;
|
||||||
|
stObj->setKeyframeWithoutUndo(r + dr, stObj->getKeyframe(r));
|
||||||
|
} else
|
||||||
|
stObj->moveKeyframe(r + dr, r);
|
||||||
|
newPositions.insert(TKeyframeSelection::Position(r + dr, c));
|
||||||
|
}
|
||||||
|
} else { // ... and vice versa
|
||||||
|
for (posIt = positions.begin(); posIt != positions.end(); ++posIt) {
|
||||||
|
int c = posIt->second;
|
||||||
|
int r = posIt->first;
|
||||||
|
TStageObjectId objId =
|
||||||
|
c >= 0 ? TStageObjectId::ColumnId(c) : TStageObjectId::CameraId(0);
|
||||||
|
TStageObject *stObj = xsh->getStageObject(objId);
|
||||||
|
if (m_qualifiers & eCopyKeyframes) {
|
||||||
|
firstTime = true;
|
||||||
|
stObj->setKeyframeWithoutUndo(r + dr, stObj->getKeyframe(r));
|
||||||
|
} else
|
||||||
|
stObj->moveKeyframe(r + dr, r);
|
||||||
|
newPositions.insert(TKeyframeSelection::Position(r + dr, c));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (firstTime) {
|
if (firstTime) {
|
||||||
m_qualifiers = 0;
|
m_qualifiers = 0;
|
||||||
|
|
Loading…
Reference in a new issue