void KstVectorDialogI::edit_I() { int index; KstFilePtr file; KstRVectorPtr vector; index = Select->currentItem(); KstRVectorList vectorList = kstObjectSubList<KstVector,KstRVector>(KST::vectorList); if (index < 0) { KMessageBox::sorry(0L, i18n("You need to select an active vector to edit.")); return; } if (unsigned(index) >= vectorList.count()) { new_I(); } else { /* verify that the vector name is unique */ if (Select->currentText() != vectorList[index]->tagName()) { if (KST::dataTagNameNotUnique(Select->currentText())) return; } /* if there is not an active KstFile, create one */ KstFileList::Iterator it = KST::fileList.findFileName(FileName->url()); if (it == KST::fileList.end()) { file = new KstFile(FileName->url()); if (file->numFrames() < 1) { // No data in file KMessageBox::sorry(0L, i18n("The requested file does not contain data.")); return; } KST::fileList.append(file); } else { file = *it; } if (!file->isValidField(Field->currentText())) { KMessageBox::sorry(0L, i18n("The requested field is not defined for the requested file\n")); return; } vector = vectorList[index]; /* change the vector */ vector->change(file, Field->currentText(), Select->currentText(), (CountFromEnd->isChecked() ? -1 : F0->value()), (ReadToEnd->isChecked() ? -1 : N->value()), Skip->value(), DoSkip->isChecked(), DoFilter->isChecked()); /** purge unused files */ //doc->fileList.Purge(); vector = 0L; vectorList.clear(); emit modified(); } }
bool KstVectorDialogI::editSingleObjectRV(KstVectorPtr vcPtr) { KstRVectorPtr rvp = kst_cast<KstRVector>(vcPtr); KstDataSourcePtr file; if (_fileNameDirty) { // if there is not an active KstFile, create one KST::dataSourceList.lock().writeLock(); KstDataSourceList::Iterator it = KST::dataSourceList.findReusableFileName(_w->FileName->url()); if (it == KST::dataSourceList.end()) { file = KstDataSource::loadSource(_w->FileName->url()); if (!file || !file->isValid()) { KST::dataSourceList.lock().unlock(); KMessageBox::sorry(this, i18n("The file could not be opened.")); return false; } if (file->isEmpty()) { KST::dataSourceList.lock().unlock(); KMessageBox::sorry(this, i18n("The file does not contain data.")); return false; } KST::dataSourceList.append(file); } else { file = *it; } KST::dataSourceList.lock().unlock(); } else { KstRVectorList vcList = kstObjectSubList<KstVector,KstRVector>(KST::vectorList); for (uint i = 0; i < _editMultipleWidget->_objectList->count(); i++) { if (_editMultipleWidget->_objectList->isSelected(i)) { // get the pointer to the object KstRVectorList::Iterator vcIter = vcList.findTag(_editMultipleWidget->_objectList->text(i)); if (vcIter == vcList.end()) { return false; } KstRVectorPtr rvp = *vcIter; rvp->readLock(); file = rvp->dataSource(); rvp->unlock(); } } } file->writeLock(); if (rvp) { QString pField; if (_fileNameDirty) { pField = _w->Field->currentText(); if (!file->isValidField(pField)) { KMessageBox::sorry(this, i18n("The requested field is not defined for the requested file.")); file->unlock(); return false; } } else { pField = rvp->field(); } int f0 = 0, n = 0; if (_f0Dirty) { if (_w->_kstDataRange->isStartRelativeTime()) { f0 = file->sampleForTime(_w->_kstDataRange->f0Value()); } else if (_w->_kstDataRange->isStartAbsoluteTime()) { bool ok = false; f0 = file->sampleForTime(_w->_kstDataRange->f0DateTimeValue(), &ok); if (!ok) { file->unlock(); KMessageBox::sorry(this, i18n("The requested field or file could not use the specified date.")); return false; } } else { f0 = int(_w->_kstDataRange->f0Value()); } } if (_nDirty) { if (_w->_kstDataRange->isRangeRelativeTime()) { double nValStored = _w->_kstDataRange->nValue(); if (_w->_kstDataRange->CountFromEnd->isChecked()) { int frameCount = file->frameCount(_w->Field->currentText()); double msCount = file->relativeTimeForSample(frameCount - 1); n = frameCount - 1 - file->sampleForTime(msCount - nValStored); } else { double fTime = file->relativeTimeForSample(f0); n = file->sampleForTime(fTime + nValStored) - file->sampleForTime(fTime); } } else { n = int(_w->_kstDataRange->nValue()); } } // use existing requested start and number of frames if not dirty rvp->readLock(); if (!_f0Dirty) { f0 = rvp->reqStartFrame(); } if (!_nDirty) { n = rvp->reqNumFrames(); } // other parameters for multiple edit bool pCountFromEnd, pReadToEnd, pDoSkip, pDoFilter; int pSkip; if (_countFromEndDirty) { pCountFromEnd = _w->_kstDataRange->CountFromEnd->isChecked(); } else { pCountFromEnd = rvp->countFromEOF(); } if (_readToEndDirty) { pReadToEnd = _w->_kstDataRange->ReadToEnd->isChecked(); } else { pReadToEnd = rvp->readToEOF(); } if (_skipDirty) { pSkip = _w->_kstDataRange->Skip->value(); } else { pSkip = rvp->skip(); } if (_doSkipDirty) { pDoSkip = _w->_kstDataRange->DoSkip->isChecked(); } else { pDoSkip = rvp->doSkip(); } if (_doFilterDirty) { pDoFilter = _w->_kstDataRange->DoFilter->isChecked(); } else { pDoFilter = rvp->doAve(); } rvp->unlock(); // change the vector rvp->writeLock(); rvp->change(file, pField, rvp->tag(), pCountFromEnd ? -1 : f0, pReadToEnd ? -1 : n, pSkip, pDoSkip, pDoFilter); rvp->unlock(); } else { KstSVectorPtr svp = kst_cast<KstSVector>(_dp); if (!svp) { file->unlock(); return true; // shouldn't be needed } double x0 = _w->_xMin->text().toDouble(); double x1 = _w->_xMax->text().toDouble(); int n = _w->_N->value(); svp->writeLock(); svp->changeRange(x0, x1, n); svp->setTagName(KstObjectTag(_tagName->text(), svp->tag().context())); // FIXME: doesn't verify uniqueness, doesn't allow changing tag context svp->unlock(); } file->unlock(); return true; }