Fix incorrect keyframe cell pasting and redo (#2398)

* Fix incorrect keyframe pasting

* Fix keyframe redo
This commit is contained in:
manongjohn 2018-12-25 21:02:02 -05:00 committed by shun-iwasawa
parent 09549bc679
commit 9c3f7d50a6
5 changed files with 37 additions and 7 deletions

View file

@ -71,7 +71,9 @@ void TCellKeyframeSelection::copyCellsKeyframes() {
QClipboard *clipboard = QApplication::clipboard();
TXsheet *xsh = m_xsheetHandle->getXsheet();
TKeyframeData *keyframeData = new TKeyframeData();
keyframeData->setKeyframes(m_keyframeSelection->getSelection(), xsh);
TKeyframeData::Position startPos(r0, c0);
keyframeData->setKeyframes(m_keyframeSelection->getSelection(), xsh,
startPos);
data->setKeyframeData(keyframeData);
}
// Set the cliboard

View file

@ -1629,9 +1629,11 @@ void TCellSelection::pasteCells() {
// (r0,c0)
std::set<TKeyframeSelection::Position> positions;
int newC0 = c0;
if (viewer && !viewer->orientation()->isVerticalTimeline())
if (viewer && !viewer->orientation()->isVerticalTimeline() && !cellData)
newC0 = c0 - keyframeData->getColumnSpanCount() + 1;
positions.insert(TKeyframeSelection::Position(r0, newC0));
TKeyframeSelection::Position offset(keyframeData->getKeyframesOffset());
positions.insert(TKeyframeSelection::Position(r0 + offset.first,
newC0 + offset.second));
keyframeData->getKeyframes(positions);
selection.select(positions);

View file

@ -23,7 +23,8 @@ TKeyframeData::TKeyframeData() {}
TKeyframeData::TKeyframeData(const TKeyframeData *src)
: m_keyData(src->m_keyData)
, m_isPegbarsCycleEnabled(src->m_isPegbarsCycleEnabled) {}
, m_isPegbarsCycleEnabled(src->m_isPegbarsCycleEnabled)
, m_offset(src->m_offset) {}
//-----------------------------------------------------------------------------
@ -32,6 +33,12 @@ TKeyframeData::~TKeyframeData() {}
//-----------------------------------------------------------------------------
// data <- xsheet
void TKeyframeData::setKeyframes(std::set<Position> positions, TXsheet *xsh) {
Position startPos(-1, -1);
setKeyframes(positions, xsh, startPos);
}
void TKeyframeData::setKeyframes(std::set<Position> positions, TXsheet *xsh,
Position startPos) {
if (positions.empty()) return;
TStageObjectId cameraId = xsh->getStageObjectTree()->getCurrentCameraId();
@ -51,6 +58,9 @@ void TKeyframeData::setKeyframes(std::set<Position> positions, TXsheet *xsh) {
m_columnSpanCount = c1 - c0 + 1;
m_rowSpanCount = r1 - r0 + 1;
if (startPos.first >= 0 && startPos.second >= 0)
m_offset = std::make_pair(r0 - startPos.first, c0 - startPos.second);
for (it = positions.begin(); it != positions.end(); ++it) {
int row = it->first;
int col = it->second;
@ -126,3 +136,7 @@ void TKeyframeData::getKeyframes(std::set<Position> &positions) const {
TKeyframeSelection::Position(pos.first + r0, pos.second + c0));
}
}
void TKeyframeData::setKeyframesOffset(int row, int col) {
m_offset = std::make_pair(row, col);
}

View file

@ -25,6 +25,8 @@ public:
int m_columnSpanCount;
int m_rowSpanCount;
Position m_offset = std::make_pair(0, 0);
// Numero di colonna della pegbar associato al booleano isCycleEnabled della
// pegbar
std::map<int, bool> m_isPegbarsCycleEnabled;
@ -37,6 +39,8 @@ public:
// data <- xsh
void setKeyframes(std::set<Position> positions, TXsheet *xsh);
void setKeyframes(std::set<Position> positions, TXsheet *xsh,
Position startPos);
// data -> xsh
bool getKeyframes(std::set<Position> &positions, TXsheet *xsh) const;
@ -52,6 +56,9 @@ public:
int getColumnSpanCount() const { return m_columnSpanCount; }
int getRowSpanCount() const { return m_rowSpanCount; }
void setKeyframesOffset(int row, int col);
Position getKeyframesOffset() const { return m_offset; }
};
#endif // KEYFRAMEDATA_INCLUDED

View file

@ -144,12 +144,17 @@ public:
// data->xsh
void setXshFromData(QMimeData *data) const {
const TKeyframeData *keyframeData = dynamic_cast<TKeyframeData *>(data);
if (keyframeData)
pasteKeyframesWithoutUndo(keyframeData, &m_selection->getSelection());
if (keyframeData) {
TKeyframeSelection *selection =
new TKeyframeSelection(m_selection->getSelection());
pasteKeyframesWithoutUndo(keyframeData, &selection->getSelection());
}
}
void undo() const override {
// Delete merged data
deleteKeyframesWithoutUndo(&m_selection->getSelection());
TKeyframeSelection *selection =
new TKeyframeSelection(m_selection->getSelection());
deleteKeyframesWithoutUndo(&selection->getSelection());
if (-(m_r1 - m_r0 + 1) != 0)
shiftKeyframesWithoutUndo(m_r0, m_r1, m_c0, m_c1, true);
if (m_oldData) setXshFromData(m_oldData);