void TrackView::editClear() { SyncDocument *doc = getDocument(); QRect selection = getSelection(); if (0 == getTrackCount()) return; Q_ASSERT(selection.right() < getTrackCount()); doc->beginMacro("clear"); for (int track = selection.left(); track <= selection.right(); ++track) { SyncTrack *t = getTrack(track); for (int row = selection.top(); row <= selection.bottom(); ++row) { if (t->isKeyFrame(row)) doc->deleteKeyFrame(t, row); } } doc->endMacro(); dirtyCurrentValue(); }
void TrackView::editPaste() { SyncDocument *doc = getDocument(); if (0 == getTrackCount()) { QApplication::beep(); return; } const QMimeData *mimeData = QApplication::clipboard()->mimeData(); if (mimeData->hasFormat("application/x-gnu-rocket")) { const QByteArray mimeDataBuffer = mimeData->data("application/x-gnu-rocket"); const char *clipbuf = mimeDataBuffer.data(); // copy data int buffer_width, buffer_height, buffer_size; memcpy(&buffer_width, clipbuf + 0, sizeof(int)); memcpy(&buffer_height, clipbuf + sizeof(int), sizeof(int)); memcpy(&buffer_size, clipbuf + 2 * sizeof(int), sizeof(int)); doc->beginMacro("paste"); for (int i = 0; i < buffer_width; ++i) { int trackPos = editTrack + i; if (trackPos >= getTrackCount()) continue; SyncTrack *t = getTrack(trackPos); for (int j = 0; j < buffer_height; ++j) { int row = editRow + j; if (t->isKeyFrame(row)) doc->deleteKeyFrame(t, row); } } const 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); Q_ASSERT(ce.track >= 0); Q_ASSERT(ce.track < buffer_width); Q_ASSERT(ce.keyFrame.row >= 0); Q_ASSERT(ce.keyFrame.row < buffer_height); int trackPos = editTrack + ce.track; if (trackPos < getTrackCount()) { SyncTrack::TrackKey key = ce.keyFrame; key.row += editRow; // since we deleted all keyframes in the edit-box already, we can just insert this one. doc->setKeyFrame(getTrack(trackPos), key); } } doc->endMacro(); dirtyCurrentValue(); clipbuf = NULL; } else QApplication::beep(); }