|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "keyframeselection.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// Tnz6 includes
|
|
Toshihiro Shimizu |
890ddd |
#include "keyframedata.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "cellkeyframedata.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tapp.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "menubarcommandids.h"
|
|
manongjohn |
b248d8 |
#include "xsheetviewer.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// TnzQt includes
|
|
Toshihiro Shimizu |
890ddd |
#include "toonzqt/menubarcommand.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// TnzLib includes
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/txsheethandle.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tframehandle.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tcolumnhandle.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tobjecthandle.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tscenehandle.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/stageobjectutil.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/txsheet.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tstageobjecttree.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/txshcolumn.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// TnzCore includes
|
|
Toshihiro Shimizu |
890ddd |
#include "tundo.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// Qt includes
|
|
Toshihiro Shimizu |
890ddd |
#include <qapplication></qapplication>
|
|
Toshihiro Shimizu |
890ddd |
#include <qclipboard></qclipboard>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
namespace {
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
struct PegbarArgument {
|
|
Shinya Kitaoka |
120a6e |
TStageObject *m_stageObject;
|
|
Shinya Kitaoka |
120a6e |
std::set<int> m_frames;</int>
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
manongjohn |
b248d8 |
bool shiftKeyframesWithoutUndo(int r0, int r1, int c0, int c1, bool cut,
|
|
manongjohn |
b248d8 |
bool shiftFollowing) {
|
|
Shinya Kitaoka |
120a6e |
int delta = cut ? -(r1 - r0 + 1) : r1 - r0 + 1;
|
|
Shinya Kitaoka |
120a6e |
if (delta == 0) return false;
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet();
|
|
Shinya Kitaoka |
120a6e |
bool isShifted = false;
|
|
Shinya Kitaoka |
120a6e |
int x;
|
|
Shinya Kitaoka |
120a6e |
for (x = c0; x <= c1; x++) {
|
|
Shinya Kitaoka |
120a6e |
TStageObject *stObj = xsh->getStageObject(
|
|
John Dancel |
c323ac |
x >= 0 ? TStageObjectId::ColumnId(x)
|
|
John Dancel |
c323ac |
: TStageObjectId::CameraId(xsh->getCameraColumnIndex()));
|
|
Shinya Kitaoka |
120a6e |
std::set<int> keyToShift;</int>
|
|
Shinya Kitaoka |
120a6e |
int kr0, kr1;
|
|
Shinya Kitaoka |
120a6e |
stObj->getKeyframeRange(kr0, kr1);
|
|
Shinya Kitaoka |
120a6e |
int i = r0;
|
|
Shinya Kitaoka |
120a6e |
while (i <= kr1) {
|
|
manongjohn |
b248d8 |
if (stObj->isKeyframe(i)) {
|
|
manongjohn |
b248d8 |
keyToShift.insert(i);
|
|
manongjohn |
b248d8 |
if (!shiftFollowing) break;
|
|
manongjohn |
b248d8 |
}
|
|
Shinya Kitaoka |
120a6e |
i++;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
isShifted = stObj->moveKeyframes(keyToShift, delta);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
return isShifted;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void copyKeyframesWithoutUndo(
|
|
Shinya Kitaoka |
120a6e |
std::set<tkeyframeselection::position> *positions) {</tkeyframeselection::position>
|
|
Shinya Kitaoka |
120a6e |
QClipboard *clipboard = QApplication::clipboard();
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet();
|
|
Shinya Kitaoka |
120a6e |
TKeyframeData *data = new TKeyframeData();
|
|
Shinya Kitaoka |
120a6e |
data->setKeyframes(*positions, xsh);
|
|
Shinya Kitaoka |
120a6e |
clipboard->setMimeData(data, QClipboard::Clipboard);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
bool pasteKeyframesWithoutUndo(
|
|
Shinya Kitaoka |
120a6e |
const TKeyframeData *data,
|
|
Shinya Kitaoka |
120a6e |
std::set<tkeyframeselection::position> *positions) {</tkeyframeselection::position>
|
|
Shinya Kitaoka |
120a6e |
if (!data || positions->empty()) return false;
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet();
|
|
Shinya Kitaoka |
120a6e |
if (!data->getKeyframes(*positions, xsh)) return false;
|
|
Shinya Kitaoka |
120a6e |
return true;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
bool deleteKeyframesWithoutUndo(
|
|
Shinya Kitaoka |
120a6e |
std::set<tkeyframeselection::position> *positions) {</tkeyframeselection::position>
|
|
Shinya Kitaoka |
120a6e |
TApp *app = TApp::instance();
|
|
Shinya Kitaoka |
120a6e |
assert(app);
|
|
John Dancel |
c323ac |
TXsheet *xsh = app->getCurrentXsheet()->getXsheet();
|
|
John Dancel |
c323ac |
TStageObjectId cameraId =
|
|
John Dancel |
c323ac |
TStageObjectId::CameraId(xsh->getCameraColumnIndex());
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (positions->empty()) return false;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
std::set<tkeyframeselection::position>::iterator it = positions->begin();</tkeyframeselection::position>
|
|
Shinya Kitaoka |
120a6e |
bool areAllColumnLocked = true;
|
|
Shinya Kitaoka |
120a6e |
for (; it != positions->end(); ++it) {
|
|
Shinya Kitaoka |
120a6e |
int row = it->first;
|
|
Shinya Kitaoka |
120a6e |
int col = it->second;
|
|
Shinya Kitaoka |
120a6e |
TStageObject *pegbar = xsh->getStageObject(
|
|
Shinya Kitaoka |
120a6e |
col >= 0 ? TStageObjectId::ColumnId(col) : cameraId);
|
|
manongjohn |
4334db |
if (xsh->getColumn(col) && xsh->getColumn(col)->isLocked()) continue;
|
|
Shinya Kitaoka |
120a6e |
areAllColumnLocked = false;
|
|
Shinya Kitaoka |
120a6e |
assert(pegbar);
|
|
Shinya Kitaoka |
120a6e |
pegbar->removeKeyframeWithoutUndo(row);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
if (areAllColumnLocked) return false;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
positions->clear();
|
|
Shinya Kitaoka |
120a6e |
return true;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
// PasteKeyframesUndo
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
d1f6c4 |
class PasteKeyframesUndo final : public TUndo {
|
|
Shinya Kitaoka |
120a6e |
TKeyframeSelection *m_selection;
|
|
Shinya Kitaoka |
120a6e |
QMimeData *m_newData;
|
|
Shinya Kitaoka |
120a6e |
QMimeData *m_oldData;
|
|
Shinya Kitaoka |
120a6e |
int m_r0, m_r1, m_c0, m_c1;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
PasteKeyframesUndo(TKeyframeSelection *selection, QMimeData *newData,
|
|
Shinya Kitaoka |
120a6e |
QMimeData *oldData, int r0, int r1, int c0, int c1)
|
|
Shinya Kitaoka |
120a6e |
: m_selection(selection)
|
|
Shinya Kitaoka |
120a6e |
, m_newData(newData)
|
|
Shinya Kitaoka |
120a6e |
, m_oldData(oldData)
|
|
Shinya Kitaoka |
120a6e |
, m_r0(r0)
|
|
Shinya Kitaoka |
120a6e |
, m_r1(r1)
|
|
Shinya Kitaoka |
120a6e |
, m_c0(c0)
|
|
Shinya Kitaoka |
120a6e |
, m_c1(c1) {}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
~PasteKeyframesUndo() {
|
|
Shinya Kitaoka |
120a6e |
delete m_selection;
|
|
Shinya Kitaoka |
120a6e |
delete m_newData;
|
|
Shinya Kitaoka |
120a6e |
delete m_oldData;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
// data->xsh
|
|
Shinya Kitaoka |
120a6e |
void setXshFromData(QMimeData *data) const {
|
|
Shinya Kitaoka |
120a6e |
const TKeyframeData *keyframeData = dynamic_cast<tkeyframedata *="">(data);</tkeyframedata>
|
|
manongjohn |
9c3f7d |
if (keyframeData) {
|
|
manongjohn |
9c3f7d |
TKeyframeSelection *selection =
|
|
manongjohn |
9c3f7d |
new TKeyframeSelection(m_selection->getSelection());
|
|
manongjohn |
9c3f7d |
pasteKeyframesWithoutUndo(keyframeData, &selection->getSelection());
|
|
manongjohn |
9c3f7d |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
473e70 |
void undo() const override {
|
|
Shinya Kitaoka |
120a6e |
// Delete merged data
|
|
manongjohn |
9c3f7d |
TKeyframeSelection *selection =
|
|
manongjohn |
9c3f7d |
new TKeyframeSelection(m_selection->getSelection());
|
|
manongjohn |
9c3f7d |
deleteKeyframesWithoutUndo(&selection->getSelection());
|
|
Shinya Kitaoka |
120a6e |
if (-(m_r1 - m_r0 + 1) != 0)
|
|
manongjohn |
b248d8 |
shiftKeyframesWithoutUndo(m_r0, m_r1, m_c0, m_c1, true, true);
|
|
Shinya Kitaoka |
120a6e |
if (m_oldData) setXshFromData(m_oldData);
|
|
Shinya Kitaoka |
120a6e |
TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
473e70 |
void redo() const override {
|
|
Shinya Kitaoka |
120a6e |
if (m_r1 - m_r0 + 1 != 0)
|
|
manongjohn |
b248d8 |
shiftKeyframesWithoutUndo(m_r0, m_r1, m_c0, m_c1, false, true);
|
|
Shinya Kitaoka |
120a6e |
// Delete merged data
|
|
Shinya Kitaoka |
120a6e |
setXshFromData(m_newData);
|
|
Shinya Kitaoka |
120a6e |
TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
473e70 |
int getSize() const override { return sizeof(*this); }
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
38fd86 |
QString getHistoryString() override {
|
|
Shinya Kitaoka |
38fd86 |
return QObject::tr("Paste Key Frames");
|
|
Shinya Kitaoka |
38fd86 |
}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
// DeleteKeyframesUndo
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
d1f6c4 |
class DeleteKeyframesUndo final : public TUndo {
|
|
Shinya Kitaoka |
120a6e |
TKeyframeSelection *m_selection;
|
|
Shinya Kitaoka |
120a6e |
QMimeData *m_data;
|
|
Shinya Kitaoka |
120a6e |
int m_r0, m_r1, m_c0, m_c1;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
DeleteKeyframesUndo(TKeyframeSelection *selection, QMimeData *data, int r0,
|
|
Shinya Kitaoka |
120a6e |
int r1, int c0, int c1)
|
|
Shinya Kitaoka |
120a6e |
: m_selection(selection)
|
|
Shinya Kitaoka |
120a6e |
, m_data(data)
|
|
Shinya Kitaoka |
120a6e |
, m_r0(r0)
|
|
Shinya Kitaoka |
120a6e |
, m_r1(r1)
|
|
Shinya Kitaoka |
120a6e |
, m_c0(c0)
|
|
Shinya Kitaoka |
120a6e |
, m_c1(c1) {}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
~DeleteKeyframesUndo() {
|
|
Shinya Kitaoka |
120a6e |
delete m_selection;
|
|
Shinya Kitaoka |
120a6e |
delete m_data;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
void undo() const override {
|
|
Shinya Kitaoka |
120a6e |
const TKeyframeData *keyframeData = dynamic_cast<tkeyframedata *="">(m_data);</tkeyframedata>
|
|
Shinya Kitaoka |
120a6e |
if (m_r1 - m_r0 + 1 != 0)
|
|
manongjohn |
b248d8 |
shiftKeyframesWithoutUndo(m_r0, m_r1, m_c0, m_c1, false, true);
|
|
Shinya Kitaoka |
120a6e |
if (keyframeData)
|
|
Shinya Kitaoka |
120a6e |
pasteKeyframesWithoutUndo(keyframeData, &m_selection->getSelection());
|
|
Shinya Kitaoka |
120a6e |
TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
void redo() const override {
|
|
John Dancel |
c323ac |
TKeyframeSelection *tempSelection =
|
|
John Dancel |
c323ac |
new TKeyframeSelection(m_selection->getSelection());
|
|
John Dancel |
c323ac |
deleteKeyframesWithoutUndo(&tempSelection->getSelection());
|
|
Shinya Kitaoka |
120a6e |
if (m_r1 - m_r0 + 1 != 0)
|
|
manongjohn |
b248d8 |
shiftKeyframesWithoutUndo(m_r0, m_r1, m_c0, m_c1, true, true);
|
|
Shinya Kitaoka |
120a6e |
TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
int getSize() const override { return sizeof(*this); }
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
38fd86 |
QString getHistoryString() override {
|
|
Shinya Kitaoka |
38fd86 |
return QObject::tr("Delete Key Frames");
|
|
Shinya Kitaoka |
38fd86 |
}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
manongjohn |
b248d8 |
//=============================================================================
|
|
manongjohn |
b248d8 |
// ShiftKeyframesUndo
|
|
manongjohn |
b248d8 |
//-----------------------------------------------------------------------------
|
|
manongjohn |
b248d8 |
|
|
manongjohn |
b248d8 |
class ShiftKeyframesUndo final : public TUndo {
|
|
manongjohn |
b248d8 |
int m_r0, m_r1, m_c0, m_c1;
|
|
manongjohn |
b248d8 |
bool m_shiftFollowing;
|
|
manongjohn |
b248d8 |
|
|
manongjohn |
b248d8 |
public:
|
|
manongjohn |
b248d8 |
ShiftKeyframesUndo(int r0, int r1, int c0, int c1, bool shiftFollowing)
|
|
manongjohn |
b248d8 |
: m_r0(r0)
|
|
manongjohn |
b248d8 |
, m_r1(r1)
|
|
manongjohn |
b248d8 |
, m_c0(c0)
|
|
manongjohn |
b248d8 |
, m_c1(c1)
|
|
manongjohn |
b248d8 |
, m_shiftFollowing(shiftFollowing) {}
|
|
manongjohn |
b248d8 |
|
|
manongjohn |
b248d8 |
~ShiftKeyframesUndo() {}
|
|
manongjohn |
b248d8 |
void undo() const override {
|
|
manongjohn |
b248d8 |
if (m_r0 != m_r1) {
|
|
manongjohn |
b248d8 |
int r1adj = m_r0 < m_r1 ? m_r1 - 1 : m_r0 + (m_r0 - m_r1) - 1;
|
|
manongjohn |
b248d8 |
int rshift = m_r0 < m_r1 ? 0 : -(r1adj - m_r0 + 1);
|
|
manongjohn |
b248d8 |
bool cut = m_r0 < m_r1 ? true : false;
|
|
manongjohn |
b248d8 |
|
|
manongjohn |
b248d8 |
shiftKeyframesWithoutUndo(m_r0 + rshift, r1adj + rshift, m_c0, m_c1, cut,
|
|
manongjohn |
b248d8 |
m_shiftFollowing);
|
|
manongjohn |
b248d8 |
}
|
|
manongjohn |
b248d8 |
TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
|
|
manongjohn |
b248d8 |
}
|
|
manongjohn |
b248d8 |
void redo() const override {
|
|
manongjohn |
b248d8 |
if (m_r0 != m_r1) {
|
|
manongjohn |
b248d8 |
int r1adj = m_r0 < m_r1 ? m_r1 - 1 : m_r0 + (m_r0 - m_r1) - 1;
|
|
manongjohn |
b248d8 |
bool cut = m_r0 < m_r1 ? false : true;
|
|
manongjohn |
b248d8 |
|
|
manongjohn |
b248d8 |
shiftKeyframesWithoutUndo(m_r0, r1adj, m_c0, m_c1, cut, m_shiftFollowing);
|
|
manongjohn |
b248d8 |
}
|
|
manongjohn |
b248d8 |
TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
|
|
manongjohn |
b248d8 |
}
|
|
manongjohn |
b248d8 |
int getSize() const override { return sizeof(*this); }
|
|
manongjohn |
b248d8 |
|
|
manongjohn |
b248d8 |
QString getHistoryString() override {
|
|
manongjohn |
b248d8 |
if (m_r0 < m_r1) return QObject::tr("Shift Key Frames Down");
|
|
manongjohn |
b248d8 |
return QObject::tr("Shift Key Frames Up");
|
|
manongjohn |
b248d8 |
}
|
|
manongjohn |
b248d8 |
};
|
|
manongjohn |
b248d8 |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
} // namespace
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
// TKeyframeSelection
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TKeyframeSelection::enableCommands() {
|
|
Shinya Kitaoka |
120a6e |
enableCommand(this, MI_Copy, &TKeyframeSelection::copyKeyframes);
|
|
Shinya Kitaoka |
120a6e |
enableCommand(this, MI_Paste, &TKeyframeSelection::pasteKeyframes);
|
|
Shinya Kitaoka |
120a6e |
enableCommand(this, MI_Cut, &TKeyframeSelection::cutKeyframes);
|
|
Shinya Kitaoka |
120a6e |
enableCommand(this, MI_Clear, &TKeyframeSelection::deleteKeyframes);
|
|
manongjohn |
b248d8 |
enableCommand(this, MI_ShiftKeyframesDown,
|
|
manongjohn |
b248d8 |
&TKeyframeSelection::shiftKeyframesDown);
|
|
manongjohn |
b248d8 |
enableCommand(this, MI_ShiftKeyframesUp,
|
|
manongjohn |
b248d8 |
&TKeyframeSelection::shiftKeyframesUp);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
int TKeyframeSelection::getFirstRow() const {
|
|
Shinya Kitaoka |
120a6e |
if (isEmpty()) return 0;
|
|
Shinya Kitaoka |
120a6e |
return m_positions.begin()->first;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TKeyframeSelection::unselectLockedColumn() {
|
|
Shinya Kitaoka |
120a6e |
TApp *app = TApp::instance();
|
|
Shinya Kitaoka |
120a6e |
assert(app);
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsh = app->getCurrentXsheet()->getXsheet();
|
|
Shinya Kitaoka |
120a6e |
std::set<position> positions;</position>
|
|
Shinya Kitaoka |
120a6e |
std::set<position>::iterator it;</position>
|
|
manongjohn |
4334db |
|
|
Shinya Kitaoka |
120a6e |
for (it = m_positions.begin(); it != m_positions.end(); ++it) {
|
|
Shinya Kitaoka |
120a6e |
int col = it->second;
|
|
manongjohn |
4334db |
if (xsh->getColumn(col) && xsh->getColumn(col)->isLocked()) continue;
|
|
Shinya Kitaoka |
120a6e |
positions.insert(*it);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
m_positions.swap(positions);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
bool TKeyframeSelection::select(const TSelection *s) {
|
|
Shinya Kitaoka |
120a6e |
if (const TKeyframeSelection *ss =
|
|
Shinya Kitaoka |
120a6e |
dynamic_cast<const *="" tkeyframeselection="">(s)) {</const>
|
|
Shinya Kitaoka |
120a6e |
std::set<position> pos(ss->m_positions);</position>
|
|
Shinya Kitaoka |
120a6e |
m_positions.swap(pos);
|
|
Shinya Kitaoka |
120a6e |
makeCurrent();
|
|
Shinya Kitaoka |
120a6e |
return true;
|
|
Shinya Kitaoka |
120a6e |
} else
|
|
Shinya Kitaoka |
120a6e |
return false;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TKeyframeSelection::setKeyframes() {
|
|
Shinya Kitaoka |
120a6e |
TApp *app = TApp::instance();
|
|
Shinya Kitaoka |
120a6e |
TXsheetHandle *xsheetHandle = app->getCurrentXsheet();
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsh = xsheetHandle->getXsheet();
|
|
John Dancel |
c323ac |
TStageObjectId cameraId =
|
|
John Dancel |
c323ac |
TStageObjectId::CameraId(xsh->getCameraColumnIndex());
|
|
Shinya Kitaoka |
120a6e |
if (isEmpty()) return;
|
|
Shinya Kitaoka |
120a6e |
Position pos = *m_positions.begin();
|
|
Shinya Kitaoka |
120a6e |
int row = pos.first;
|
|
Shinya Kitaoka |
120a6e |
int col = pos.second;
|
|
Shinya Kitaoka |
120a6e |
TStageObjectId id = col < 0 ? cameraId : TStageObjectId::ColumnId(col);
|
|
Shinya Kitaoka |
120a6e |
TStageObject *pegbar = xsh->getStageObject(id);
|
|
Shinya Kitaoka |
120a6e |
if (!pegbar) return;
|
|
Shinya Kitaoka |
120a6e |
if (pegbar->isKeyframe(row)) {
|
|
Shinya Kitaoka |
120a6e |
TStageObject::Keyframe key = pegbar->getKeyframe(row);
|
|
Shinya Kitaoka |
120a6e |
pegbar->removeKeyframeWithoutUndo(row);
|
|
Shinya Kitaoka |
120a6e |
UndoRemoveKeyFrame *undo =
|
|
Shinya Kitaoka |
120a6e |
new UndoRemoveKeyFrame(id, row, key, xsheetHandle);
|
|
Shinya Kitaoka |
120a6e |
undo->setObjectHandle(app->getCurrentObject());
|
|
Shinya Kitaoka |
120a6e |
TUndoManager::manager()->add(undo);
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
pegbar->setKeyframeWithoutUndo(row);
|
|
Shinya Kitaoka |
120a6e |
UndoSetKeyFrame *undo = new UndoSetKeyFrame(id, row, xsheetHandle);
|
|
Shinya Kitaoka |
120a6e |
undo->setObjectHandle(app->getCurrentObject());
|
|
Shinya Kitaoka |
120a6e |
TUndoManager::manager()->add(undo);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
TApp::instance()->getCurrentScene()->setDirtyFlag(true);
|
|
Shinya Kitaoka |
120a6e |
TApp::instance()->getCurrentObject()->notifyObjectIdChanged(false);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TKeyframeSelection::copyKeyframes() {
|
|
Shinya Kitaoka |
120a6e |
if (isEmpty()) return;
|
|
Shinya Kitaoka |
120a6e |
copyKeyframesWithoutUndo(&m_positions);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TKeyframeSelection::pasteKeyframes() {
|
|
manongjohn |
92bdfa |
pasteKeyframesWithShift(0, 0, 0, -1);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TKeyframeSelection::deleteKeyframes() {
|
|
Shinya Kitaoka |
120a6e |
deleteKeyframesWithShift(0, -1, 0, -1);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TKeyframeSelection::cutKeyframes() {
|
|
Shinya Kitaoka |
120a6e |
copyKeyframes();
|
|
Shinya Kitaoka |
120a6e |
deleteKeyframesWithShift(0, -1, 0, -1);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
manongjohn |
b248d8 |
void TKeyframeSelection::shiftKeyframes(int direction) {
|
|
manongjohn |
b248d8 |
copyKeyframes();
|
|
manongjohn |
b248d8 |
if (isEmpty()) return;
|
|
manongjohn |
b248d8 |
|
|
manongjohn |
b248d8 |
std::set<position> positions = m_positions;</position>
|
|
manongjohn |
b248d8 |
|
|
manongjohn |
b248d8 |
int r0 = positions.begin()->first;
|
|
manongjohn |
b248d8 |
int c0 = positions.begin()->second;
|
|
manongjohn |
b248d8 |
|
|
manongjohn |
b248d8 |
TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet();
|
|
manongjohn |
b248d8 |
TKeyframeData *data = new TKeyframeData();
|
|
manongjohn |
b248d8 |
data->setKeyframes(positions, xsh);
|
|
manongjohn |
b248d8 |
|
|
manongjohn |
b248d8 |
TUndoManager::manager()->beginBlock();
|
|
manongjohn |
b248d8 |
|
|
manongjohn |
b248d8 |
XsheetViewer *viewer = TApp::instance()->getCurrentXsheetViewer();
|
|
manongjohn |
b248d8 |
TKeyframeSelection *selection = viewer->getKeyframeSelection();
|
|
manongjohn |
b248d8 |
selection->selectNone();
|
|
manongjohn |
b248d8 |
|
|
manongjohn |
b248d8 |
std::set<position>::iterator it = positions.begin(), itEnd = positions.end();</position>
|
|
manongjohn |
b248d8 |
for(; it != itEnd; ++it) {
|
|
manongjohn |
b248d8 |
Position position = *it;
|
|
manongjohn |
b248d8 |
int r = position.first;
|
|
manongjohn |
b248d8 |
int c = position.second;
|
|
manongjohn |
b248d8 |
|
|
manongjohn |
b248d8 |
TXshColumn *column = xsh->getColumn(c);
|
|
manongjohn |
b248d8 |
if (!column || column->isLocked()) continue;
|
|
manongjohn |
b248d8 |
|
|
manongjohn |
b248d8 |
shiftKeyframes(r, r + direction, c, c, false);
|
|
manongjohn |
b248d8 |
selection->select(r + direction, c);
|
|
manongjohn |
b248d8 |
}
|
|
manongjohn |
b248d8 |
|
|
manongjohn |
b248d8 |
TUndoManager::manager()->endBlock();
|
|
manongjohn |
b248d8 |
}
|
|
manongjohn |
b248d8 |
|
|
manongjohn |
b248d8 |
//-----------------------------------------------------------------------------
|
|
manongjohn |
b248d8 |
|
|
Shinya Kitaoka |
120a6e |
void TKeyframeSelection::pasteKeyframesWithShift(int r0, int r1, int c0,
|
|
Shinya Kitaoka |
120a6e |
int c1) {
|
|
Shinya Kitaoka |
120a6e |
unselectLockedColumn();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Retrieve keyframes to paste
|
|
Shinya Kitaoka |
120a6e |
QClipboard *clipboard = QApplication::clipboard();
|
|
Shinya Kitaoka |
120a6e |
const TKeyframeData *data =
|
|
Shinya Kitaoka |
120a6e |
dynamic_cast<const *="" tkeyframedata="">(clipboard->mimeData());</const>
|
|
Shinya Kitaoka |
120a6e |
if (!data) {
|
|
Shinya Kitaoka |
120a6e |
const TCellKeyframeData *cellKeyframeData =
|
|
Shinya Kitaoka |
120a6e |
dynamic_cast<const *="" tcellkeyframedata="">(clipboard->mimeData());</const>
|
|
Shinya Kitaoka |
120a6e |
if (cellKeyframeData) data = cellKeyframeData->getKeyframeData();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
if (!data) return;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Retrieve corresponding old keyframes
|
|
Shinya Kitaoka |
120a6e |
std::set<tkeyframeselection::position> positions(m_positions);</tkeyframeselection::position>
|
|
Shinya Kitaoka |
120a6e |
data->getKeyframes(positions);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TKeyframeData *oldData = new TKeyframeData();
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet();
|
|
Shinya Kitaoka |
120a6e |
oldData->setKeyframes(positions, xsh);
|
|
Shinya Kitaoka |
120a6e |
|
|
manongjohn |
b248d8 |
bool isShift = shiftKeyframesWithoutUndo(r0, r1, c0, c1, false, true);
|
|
Shinya Kitaoka |
120a6e |
bool isPaste = pasteKeyframesWithoutUndo(data, &m_positions);
|
|
Shinya Kitaoka |
120a6e |
if (!isPaste && !isShift) {
|
|
Shinya Kitaoka |
120a6e |
delete oldData;
|
|
Shinya Kitaoka |
120a6e |
return;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TKeyframeData *newData = new TKeyframeData();
|
|
Shinya Kitaoka |
120a6e |
newData->setKeyframes(m_positions, xsh);
|
|
Shinya Kitaoka |
120a6e |
TKeyframeSelection *selection = new TKeyframeSelection(m_positions);
|
|
Shinya Kitaoka |
120a6e |
TUndoManager::manager()->add(
|
|
Shinya Kitaoka |
120a6e |
new PasteKeyframesUndo(selection, newData, oldData, r0, r1, c0, c1));
|
|
Shinya Kitaoka |
120a6e |
TApp::instance()->getCurrentScene()->setDirtyFlag(true);
|
|
Shinya Kitaoka |
120a6e |
TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TKeyframeSelection::deleteKeyframesWithShift(int r0, int r1, int c0,
|
|
Shinya Kitaoka |
120a6e |
int c1) {
|
|
Shinya Kitaoka |
120a6e |
unselectLockedColumn();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TKeyframeData *data = new TKeyframeData();
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet();
|
|
Shinya Kitaoka |
120a6e |
data->setKeyframes(m_positions, xsh);
|
|
Shinya Kitaoka |
120a6e |
if (m_positions.empty()) {
|
|
Shinya Kitaoka |
120a6e |
delete data;
|
|
Shinya Kitaoka |
120a6e |
return;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
TKeyframeSelection *selection = new TKeyframeSelection(m_positions);
|
|
Shinya Kitaoka |
120a6e |
bool deleteKeyFrame = deleteKeyframesWithoutUndo(&m_positions);
|
|
manongjohn |
b248d8 |
bool isShift = shiftKeyframesWithoutUndo(r0, r1, c0, c1, true, true);
|
|
Shinya Kitaoka |
120a6e |
if (!deleteKeyFrame && !isShift) {
|
|
Shinya Kitaoka |
120a6e |
delete selection;
|
|
Shinya Kitaoka |
120a6e |
delete data;
|
|
Shinya Kitaoka |
120a6e |
return;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
TUndoManager::manager()->add(
|
|
Shinya Kitaoka |
120a6e |
new DeleteKeyframesUndo(selection, data, r0, r1, c0, c1));
|
|
Shinya Kitaoka |
120a6e |
TApp::instance()->getCurrentScene()->setDirtyFlag(true);
|
|
Shinya Kitaoka |
120a6e |
TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
manongjohn |
b248d8 |
|
|
manongjohn |
b248d8 |
//-----------------------------------------------------------------------------
|
|
manongjohn |
b248d8 |
|
|
manongjohn |
b248d8 |
void TKeyframeSelection::shiftKeyframes(int r0, int r1, int c0, int c1,
|
|
manongjohn |
b248d8 |
bool shiftFollowing) {
|
|
manongjohn |
b248d8 |
unselectLockedColumn();
|
|
manongjohn |
b248d8 |
|
|
manongjohn |
b248d8 |
int r1adj = r0 < r1 ? r1 - 1 : r0 + (r0 - r1) - 1;
|
|
manongjohn |
b248d8 |
bool cut = r0 < r1 ? false : true;
|
|
manongjohn |
b248d8 |
|
|
manongjohn |
b248d8 |
bool isShift =
|
|
manongjohn |
b248d8 |
shiftKeyframesWithoutUndo(r0, r1adj, c0, c1, cut, shiftFollowing);
|
|
manongjohn |
b248d8 |
if (!isShift) return;
|
|
manongjohn |
b248d8 |
|
|
manongjohn |
b248d8 |
TUndoManager::manager()->add(
|
|
manongjohn |
b248d8 |
new ShiftKeyframesUndo(r0, r1, c0, c1, shiftFollowing));
|
|
manongjohn |
b248d8 |
TApp::instance()->getCurrentScene()->setDirtyFlag(true);
|
|
manongjohn |
b248d8 |
TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
|
|
manongjohn |
b248d8 |
}
|