void TrackView::editBiasValue(float amount) { SyncDocument *doc = getDocument(); if (0 == getTrackCount()) { QApplication::beep(); return; } QRect selection = getSelection(); doc->beginMacro("bias"); for (int track = selection.left(); track <= selection.right(); ++track) { Q_ASSERT(track < getTrackCount()); SyncTrack *t = getTrack(track); for (int row = selection.top(); row <= selection.bottom(); ++row) { if (t->isKeyFrame(row)) { SyncTrack::TrackKey k = t->getKeyFrame(row); // copy old key k.value += amount; // modify value // add sub-command doc->setKeyFrame(t, k); } } } doc->endMacro(); dirtyCurrentValue(); }
void TrackView::editEnterValue() { SyncDocument *doc = getDocument(); if (!lineEdit->isVisible()) return; if (lineEdit->text().length() > 0 && editTrack < getTrackCount()) { SyncTrack *t = getTrack(editTrack); SyncTrack::TrackKey newKey; newKey.type = SyncTrack::TrackKey::STEP; newKey.row = editRow; if (t->isKeyFrame(editRow)) newKey = t->getKeyFrame(editRow); // copy old key QString text = lineEdit->text(); text.remove(lineEdit->validator()->locale().groupSeparator()); // workaround QTBUG-40456 newKey.value = lineEdit->validator()->locale().toFloat(text); // modify value doc->setKeyFrame(t, newKey); dirtyCurrentValue(); } else QApplication::beep(); lineEdit->hide(); setFocus(); }
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(); }
SyncDocument *SyncDocument::load(const QString &fileName) { SyncDocument *ret = new SyncDocument; ret->fileName = fileName; QFile file(fileName); if (!file.open(QIODevice::ReadOnly)) { QMessageBox::critical(NULL, "Error", file.errorString()); return NULL; } QDomDocument doc; QString err; if (!doc.setContent(&file, &err)) { file.close(); QMessageBox::critical(NULL, "Error", err); return NULL; } file.close(); QDomNamedNodeMap attribs = doc.documentElement().attributes(); QDomNode rowsParam = attribs.namedItem("rows"); if (!rowsParam.isNull()) { QString rowsString = rowsParam.nodeValue(); ret->setRows(rowsString.toInt()); } QDomNodeList trackNodes = doc.documentElement().elementsByTagName("track"); for (int i = 0; i < int(trackNodes.length()); ++i) { QDomNode trackNode = trackNodes.item(i); QDomNamedNodeMap attribs = trackNode.attributes(); QString name = attribs.namedItem("name").nodeValue(); // look up track-name, create it if it doesn't exist SyncTrack *t = ret->findTrack(name.toUtf8()); if (!t) t = ret->createTrack(name.toUtf8().constData()); QDomNodeList rowNodes = trackNode.childNodes(); for (int i = 0; i < int(rowNodes.length()); ++i) { QDomNode keyNode = rowNodes.item(i); QString baseName = keyNode.nodeName(); if (baseName == "key") { QDomNamedNodeMap rowAttribs = keyNode.attributes(); QString rowString = rowAttribs.namedItem("row").nodeValue(); QString valueString = rowAttribs.namedItem("value").nodeValue(); QString interpolationString = rowAttribs.namedItem("interpolation").nodeValue(); SyncTrack::TrackKey k; k.row = rowString.toInt(); k.value = valueString.toFloat(); k.type = SyncTrack::TrackKey::KeyType(interpolationString.toInt()); Q_ASSERT(!t->isKeyFrame(k.row)); t->setKey(k); } } } // YUCK: gathers from entire document QDomNodeList bookmarkNodes = doc.documentElement().elementsByTagName("bookmark"); for (int i = 0; i < int(bookmarkNodes.length()); ++i) { QDomNode bookmarkNode = bookmarkNodes.item(i); QDomNamedNodeMap bookmarkAttribs = bookmarkNode.attributes(); QString str = bookmarkAttribs.namedItem("row").nodeValue(); int row = str.toInt(); ret->toggleRowBookmark(row); } return ret; }