Overwriting paste. A tad more logical to work with than the old method.

This commit is contained in:
Erik Faye-Lund 2008-10-20 01:12:50 +00:00
parent 634588aeed
commit 0dc304a335

View File

@ -475,28 +475,50 @@ void TrackView::editPaste()
memcpy(&buffer_height, clipbuf + sizeof(int), sizeof(int)); memcpy(&buffer_height, clipbuf + sizeof(int), sizeof(int));
memcpy(&buffer_size, clipbuf + 2 * sizeof(int), sizeof(size_t)); memcpy(&buffer_size, clipbuf + 2 * sizeof(int), sizeof(size_t));
if (buffer_size > 0) SyncDocument::MultiCommand *multiCmd = new SyncDocument::MultiCommand();
for (int t = 0; t < buffer_width; ++t)
{ {
char *src = clipbuf + 2 * sizeof(int) + sizeof(size_t); size_t trackPos = editTrack + t;
if (trackPos >= getTrackCount()) continue;
SyncDocument::MultiCommand *multiCmd = new SyncDocument::MultiCommand(); size_t trackIndex = doc->getTrackIndexFromPos(trackPos);
for (int i = 0; i < buffer_size; ++i) const sync::Track &track = doc->getTrack(trackIndex);
for (int r = 0; r < buffer_height; ++r)
{ {
struct CopyEntry ce; int row = editRow + r;
memcpy(&ce, src, sizeof(CopyEntry)); if (track.isKeyFrame(row))
src += sizeof(CopyEntry);
size_t trackPos = editTrack + ce.track;
if (trackPos < getTrackCount())
{ {
size_t trackIndex = doc->getTrackIndexFromPos(trackPos); multiCmd->addCommand(new SyncDocument::DeleteCommand(int(trackIndex), row));
SyncDocument::Command *cmd = doc->getSetKeyFrameCommand(int(trackIndex), editRow + ce.row, ce.keyFrame);
multiCmd->addCommand(cmd);
} }
} }
doc->exec(multiCmd);
} }
char *src = clipbuf + 2 * sizeof(int) + sizeof(size_t);
for (int i = 0; i < buffer_size; ++i)
{
struct CopyEntry ce;
memcpy(&ce, src, sizeof(CopyEntry));
src += sizeof(CopyEntry);
assert(ce.track >= 0);
assert(ce.track < buffer_width);
assert(ce.row >= 0);
assert(ce.row < buffer_height);
size_t trackPos = editTrack + ce.track;
if (trackPos < getTrackCount())
{
size_t trackIndex = doc->getTrackIndexFromPos(trackPos);
size_t row = editRow + ce.row;
// since we deleted all keyframes in the edit-box already, we can just insert this one.
SyncDocument::Command *cmd = new SyncDocument::InsertCommand(int(trackIndex), int(row), ce.keyFrame);
multiCmd->addCommand(cmd);
}
}
doc->exec(multiCmd);
GlobalUnlock(hmem); GlobalUnlock(hmem);
clipbuf = NULL; clipbuf = NULL;
} }