fix keyframe drag (#2000)

This commit is contained in:
shun-iwasawa 2018-05-24 17:12:20 +09:00 committed by masafumi-inoue
parent b5e76bca01
commit 62f1df91c9

View file

@ -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;