bool KST::duplicateDependents(KstVectorPtr vectorFor, KstDataObjectDataObjectMap& duplicatedMap, QMap<KstVectorPtr, KstVectorPtr> &duplicatedVectors) { // work with a copy of the data object list KST::dataObjectList.lock().readLock(); KstDataObjectList dol = QDeepCopy<KstDataObjectList>(KST::dataObjectList); KST::dataObjectList.lock().readUnlock(); for (KstDataObjectList::Iterator i = dol.begin(); i != dol.end(); ++i) { if ((*i)->uses(vectorFor)) { if (duplicatedMap.contains(*i)) { (duplicatedMap[*i])->replaceDependency(vectorFor, duplicatedVectors[vectorFor]); } else { KstDataObjectPtr newObject = (*i)->makeDuplicate(duplicatedMap); newObject->replaceDependency(vectorFor, duplicatedVectors[vectorFor]); if (newObject) { KST::dataObjectList.lock().writeLock(); KST::dataObjectList.append(newObject.data()); KST::dataObjectList.lock().writeUnlock(); (*i)->duplicateDependents(duplicatedMap); } } } } return true; }
KstObjectItem::KstObjectItem(QListView *parent, KstDataObjectPtr x, KstDataManagerI *dm) : QObject(), QListViewItem(parent), _rtti(RTTI_OBJ_OBJECT), _name(x->tagName()), _dm(dm) { assert(x); setText(0, x->tagName()); for (KstVectorMap::Iterator i = x->outputVectors().begin(); i != x->outputVectors().end(); ++i) { new KstObjectItem(this, i.data(), _dm); } x = 0L; // keep the counts in sync update(false); }
bool KST::deleteDependents(KstVectorPtr vectorFor) { KST::dataObjectList.lock().readLock(); KstDataObjectList dol = QDeepCopy<KstDataObjectList>(KST::dataObjectList); KST::dataObjectList.lock().readUnlock(); for (KstDataObjectList::Iterator i = dol.begin(); i != dol.end(); ++i) { bool user = (*i)->uses(vectorFor); if (user) { KstDataObjectPtr dop = *i; KST::dataObjectList.lock().writeLock(); KST::dataObjectList.remove(dop); KST::dataObjectList.lock().writeUnlock(); dop->deleteDependents(); } } return true; }
void KstObjectItem::activateHint(int id) { KstDataObjectPtr d = dataObject(); const KstCurveHintList* hints = d->curveHints(); int cnt = 0; for (KstCurveHintList::ConstIterator i = hints->begin(); i != hints->end(); ++i) { if (cnt == id) { KstBaseCurvePtr c = (*i)->makeCurve(KST::suggestCurveName(d->tag(), false), KstColorSequence::next()); if (c) { KST::dataObjectList.lock().writeLock(); KST::dataObjectList.append(c.data()); KST::dataObjectList.lock().unlock(); emit updated(); } else { KMessageBox::sorry(KstApp::inst(), i18n("Unable to create quick curve.")); } break; } ++cnt; } }
void MatrixSelector::editMatrix() { KstDataObjectPtr pro; KstMatrixPtr matrix; KST::matrixList.lock().readLock(); matrix = *KST::matrixList.findTag(_matrix->currentText()); KST::matrixList.lock().unlock(); if (matrix) { pro = kst_cast<KstDataObject>(matrix->provider()); } if (pro) { pro->readLock(); pro->showDialog(false); pro->unlock(); } else { // xxx KstDialogs::self()->showMatrixDialog(_matrix->currentText(), true); } }
bool KstDataObject::deleteDependents() { KstDataObjectList dol; KstDataObjectList::iterator i; KST::dataObjectList.lock().readLock(); dol = KST::dataObjectList; KST::dataObjectList.lock().unlock(); for (i = dol.begin(); i != dol.end(); ++i) { bool user = (*i)->uses(KstObjectPtr(this)); if (!user) { for (KstVectorMap::Iterator j = _outputVectors.begin(); !user && j != _outputVectors.end(); ++j) { user = (*i)->uses(KstObjectPtr((*j).data())); } for (KstScalarMap::Iterator j = _outputScalars.begin(); !user && j != _outputScalars.end(); ++j) { user = (*i)->uses(KstObjectPtr((*j).data())); } for (KstStringMap::Iterator j = _outputStrings.begin(); !user && j != _outputStrings.end(); ++j) { user = (*i)->uses(KstObjectPtr((*j).data())); } } if (user) { KstDataObjectPtr dop = *i; KST::dataObjectList.lock().writeLock(); KST::dataObjectList.erase(i); KST::dataObjectList.lock().unlock(); dop->deleteDependents(); } } return true; }
KstObjectItem::KstObjectItem(QListView *parent, KstDataObjectPtr x, KstDataManagerI *dm, int localUseCount) : QObject(), QListViewItem(parent), _rtti(RTTI_OBJ_OBJECT), _tag(x->tag()), _dm(dm) { assert(x); _inUse = false; setText(0, x->tag().tag()); for (KstVectorMap::Iterator i = x->outputVectors().begin(); i != x->outputVectors().end(); ++i) { KstObjectItem *item = new KstObjectItem(this, i.data(), _dm); connect(item, SIGNAL(updated()), this, SIGNAL(updated())); } for (KstMatrixMap::Iterator i = x->outputMatrices().begin(); i != x->outputMatrices().end(); ++i) { KstObjectItem *item = new KstObjectItem(this, i.data(), _dm); connect(item, SIGNAL(updated()), this, SIGNAL(updated())); } x = 0L; // keep the counts in sync update(false, localUseCount); }
void KstEquation::replaceDependency(KstDataObjectPtr oldObject, KstDataObjectPtr newObject) { QString newExp = _equation; // replace all occurences of outputVectors, outputScalars from oldObject for (KstVectorMap::Iterator j = oldObject->outputVectors().begin(); j != oldObject->outputVectors().end(); ++j) { QString oldTag = j.data()->tagName(); QString newTag = ((newObject->outputVectors())[j.key()])->tagName(); newExp = newExp.replace("[" + oldTag + "]", "[" + newTag + "]"); } for (KstScalarMap::Iterator j = oldObject->outputScalars().begin(); j != oldObject->outputScalars().end(); ++j) { QString oldTag = j.data()->tagName(); QString newTag = ((newObject->outputScalars())[j.key()])->tagName(); newExp = newExp.replace("[" + oldTag + "]", "[" + newTag + "]"); } // and dependencies on matrix stats (there won't be matrices themselves in the expression) for (KstMatrixMap::Iterator j = oldObject->outputMatrices().begin(); j != oldObject->outputMatrices().end(); ++j) { QDictIterator<KstScalar> scalarDictIter(j.data()->scalars()); for (; scalarDictIter.current(); ++scalarDictIter) { QString oldTag = scalarDictIter.current()->tagName(); QString newTag = ((((newObject->outputMatrices())[j.key()])->scalars())[scalarDictIter.currentKey()])->tagName(); newExp = newExp.replace("[" + oldTag + "]", "[" + newTag + "]"); } } // only replace _inputVectors for (KstVectorMap::Iterator j = oldObject->outputVectors().begin(); j != oldObject->outputVectors().end(); ++j) { for (KstVectorMap::Iterator k = _inputVectors.begin(); k != _inputVectors.end(); ++k) { if (j.data().data() == k.data().data()) { // replace input with the output from newObject _inputVectors[k.key()] = (newObject->outputVectors())[j.key()]; } } // and dependencies on vector stats QDictIterator<KstScalar> scalarDictIter(j.data()->scalars()); for (; scalarDictIter.current(); ++scalarDictIter) { QString oldTag = scalarDictIter.current()->tagName(); QString newTag = ((((newObject->outputVectors())[j.key()])->scalars())[scalarDictIter.currentKey()])->tagName(); newExp = newExp.replace("[" + oldTag + "]", "[" + newTag + "]"); } } setEquation(newExp); }
bool UpdateThread::doUpdates(bool force, bool *gotData) { KstObject::UpdateType U = KstObject::NO_CHANGE; _updatedCurves.clear(); // HACK if (gotData) { *gotData = false; } #if UPDATEDEBUG > 0 if (force) { qDebug() << "Forced update!" << endl; } #endif _updateCounter++; if (_updateCounter < 1) { _updateCounter = 1; // check for wrap around } #if UPDATEDEBUG > 2 qDebug() << "UPDATE: counter=" << _updateCounter << endl; #endif { // Must make a copy to avoid deadlock KstBaseCurveList cl; KstDataObjectList dol; kstObjectSplitList<KstDataObject, KstBaseCurve>(KST::dataObjectList, cl, dol); qSort(cl); qSort(dol); // Update all curves for (uint i = 0; i < cl.count(); ++i) { KstBaseCurvePtr bcp = cl[i]; bcp->writeLock(); assert(bcp.data()); #if UPDATEDEBUG > 1 qDebug() << "updating curve: " << (void*)bcp << " - " << bcp->tagName() << endl; #endif KstObject::UpdateType ut = bcp->update(_updateCounter); bcp->unlock(); if (ut == KstObject::UPDATE) { // HACK _updatedCurves.append(bcp); } if (U != KstObject::UPDATE) { U = ut; if (U == KstObject::UPDATE) { #if UPDATEDEBUG > 0 qDebug() << "Curve " << bcp->tagName() << " said UPDATE" << endl; #endif } } if (_done || (_paused && !force)) { #if UPDATEDEBUG > 1 qDebug() << "5 Returning from scan with U=" << (int)U << endl; #endif return U == KstObject::UPDATE; } } // Update all data objects for (uint i = 0; i < dol.count(); ++i) { KstDataObjectPtr dp = dol[i]; dp->writeLock(); assert(dp.data()); #if UPDATEDEBUG > 1 qDebug() << "updating data object: " << (void*)dp << " - " << dp->tagName() << endl; #endif dp->update(_updateCounter); dp->unlock(); if (_done || (_paused && !force)) { #if UPDATEDEBUG > 1 qDebug() << "5 Returning from scan with U=" << (int)U << endl; #endif return U == KstObject::UPDATE; } } } // Update the files if (!_paused) { // don't update even if paused && force KST::dataSourceList.lock().readLock(); unsigned cnt = KST::dataSourceList.count(); for (uint i = 0; i < cnt; ++i) { KstDataSourcePtr dsp = KST::dataSourceList[i]; dsp->writeLock(); dsp->update(_updateCounter); dsp->unlock(); if (_done) { KST::dataSourceList.lock().unlock(); return false; } } KST::dataSourceList.lock().unlock(); } if (KstScalar::scalarsDirty()) { KstScalar::clearScalarsDirty(); // Must do this first and take a risk of // falling slightly behind KST::scalarList.lock().readLock(); KstScalarList sl = Q3DeepCopy<KstScalarList>(KST::scalarList.list()); // avoid deadlock on exit KST::scalarList.lock().unlock(); for (KstScalarList::ConstIterator i = sl.begin(); i != sl.end(); ++i) { KstScalarPtr sp = *i; sp->writeLock(); KstObject::UpdateType ut = sp->update(_updateCounter); sp->unlock(); if (ut == KstObject::UPDATE) { U = KstObject::UPDATE; } if (_done) { return false; } } } if (U == KstObject::UPDATE) { qDebug() << "Update plots" << endl; if (gotData) { // FIXME: do we need to consider all the other exit points? *gotData = true; } } #if UPDATEDEBUG > 1 qDebug() << "6 Returning from scan with U=" << (int)U << endl; #endif return U == KstObject::UPDATE; }
void EventMonitorEntry::replaceDependency(KstDataObjectPtr oldObject, KstDataObjectPtr newObject) { QString newExp = _event; // replace all occurences of outputVectors, outputScalars from oldObject for (KstVectorMap::ConstIterator j = oldObject->outputVectors().begin(); j != oldObject->outputVectors().end(); ++j) { const QString oldTag = j.value()->tagName(); const QString newTag = newObject->outputVectors()[j.key()]->tagName(); newExp = newExp.replace("[" + oldTag + "]", "[" + newTag + "]"); } for (KstScalarMap::ConstIterator j = oldObject->outputScalars().begin(); j != oldObject->outputScalars().end(); ++j) { const QString oldTag = j.value()->tagName(); const QString newTag = newObject->outputScalars()[j.key()]->tagName(); newExp = newExp.replace("[" + oldTag + "]", "[" + newTag + "]"); } // and dependencies on vector stats for (KstVectorMap::ConstIterator j = oldObject->outputVectors().begin(); j != oldObject->outputVectors().end(); ++j) { const QHash<QString, KstScalar*>& scalarMap(newObject->outputVectors()[j.key()]->scalars()); QHashIterator<QString, KstScalar*> scalarDictIter(j.value()->scalars()); while (scalarDictIter.hasNext()) { const QString oldTag = scalarDictIter.next().value()->tagName(); const QString newTag = scalarMap[scalarDictIter.key()]->tagName(); newExp = newExp.replace("[" + oldTag + "]", "[" + newTag + "]"); } } // and dependencies on matrix stats for (KstMatrixMap::ConstIterator j = oldObject->outputMatrices().begin(); j != oldObject->outputMatrices().end(); ++j) { const QHash<QString, KstScalar*>& scalarMap(newObject->outputMatrices()[j.key()]->scalars()); QHashIterator<QString, KstScalar*> scalarDictIter(j.value()->scalars()); while (scalarDictIter.hasNext()) { const QString oldTag = scalarDictIter.next().value()->tagName(); const QString newTag = scalarMap[scalarDictIter.key()]->tagName(); newExp = newExp.replace("[" + oldTag + "]", "[" + newTag + "]"); } } setEvent(newExp); setDirty(); // events have no _inputVectors }
void KstDataManagerI::new_I() { QStringList l; //The original KstDataObjects... l << i18n( "Vector" ); l << i18n( "Curve" ); l << i18n( "Equation" ); l << i18n( "Histogram" ); l << i18n( "Power Spectrum" ); l << i18n( "Event Monitor" ); l << i18n( "Matrix" ); l << i18n( "Image" ); l << i18n( "CSD" ); //The new KstDataObject plugins... const QStringList newPlugins = KstDataObject::pluginList(); l += newPlugins; //The old C style plugins... QStringList oldPlugins; const QMap<QString,QString> readable = PluginCollection::self()->readableNameList(); QMap<QString,QString>::const_iterator it = readable.begin(); for (; it != readable.end(); ++it) { oldPlugins << it.key(); } l += oldPlugins; bool ok = false; QStringList plugin = KInputDialog::getItemList( i18n( "Data Objects" ), i18n( "Create..." ), l, 0, false, &ok, this ); if ( !ok || plugin.isEmpty() ) return; const QString p = plugin.join(""); //Oh, wouldn't it be nice if C++ could switch strings... if ( p == i18n( "Vector" ) ) KstVectorDialogI::globalInstance()->show(); else if ( p == i18n( "Curve" ) ) KstCurveDialogI::globalInstance()->show(); else if ( p == i18n( "Equation" ) ) KstEqDialogI::globalInstance()->show(); else if ( p == i18n( "Histogram" ) ) KstHsDialogI::globalInstance()->show(); else if ( p == i18n( "Power Spectrum" ) ) KstPsdDialogI::globalInstance()->show(); else if ( p == i18n( "Event Monitor" ) ) KstEventMonitorI::globalInstance()->show(); else if ( p == i18n( "Matrix" ) ) KstMatrixDialogI::globalInstance()->show(); else if ( p == i18n( "Image" ) ) KstImageDialogI::globalInstance()->show(); else if ( p == i18n( "CSD" ) ) KstCsdDialogI::globalInstance()->show(); else if ( newPlugins.contains( p ) ) { KstDataObjectPtr ptr = KstDataObject::plugin(p); ptr->showDialog(); } else if ( oldPlugins.contains( p ) ) { KstPluginDialogI::globalInstance()->showNew(readable[p]); } }
void KstObjectItem::update(bool recursive, int localUseCount) { switch (_rtti) { case RTTI_OBJ_DATA_VECTOR: { KST::vectorList.lock().readLock(); KstRVectorPtr x = kst_cast<KstRVector>(*KST::vectorList.findTag(_tag)); KST::vectorList.lock().unlock(); if (x) { x->readLock(); // getUsage: subtract 1 for KstRVectorPtr x bool inUse = (x->getUsage() - 1 - localUseCount) > 0; if (inUse != _inUse) { _inUse = inUse; setPixmap(2, inUse ? _dm->yesPixmap() : QPixmap()); } QString field; if (inUse) { field = QString::number(x->length()); } else { field = "-"; } if (text(3) != field) { setText(3, field); } field = i18n("%3: %4 [%1..%2]").arg(x->reqStartFrame()) .arg(x->reqStartFrame() + x->reqNumFrames()) .arg(x->filename()) .arg(x->field()); if (text(4) != field) { setText(4, field); } _removable = x->getUsage() == 2; x->unlock(); } // Hmmm what happens if this if() fails?? We become inconsistent? break; } case RTTI_OBJ_STATIC_VECTOR: { KST::vectorList.lock().readLock(); KstSVectorPtr x = kst_cast<KstSVector>(*KST::vectorList.findTag(_tag)); KST::vectorList.lock().unlock(); if (x) { x->readLock(); // getUsage: subtract 1 for KstRVectorPtr x bool inUse = (x->getUsage() - 1 - localUseCount) > 0; if (inUse != _inUse) { _inUse = inUse; setPixmap(2, inUse ? _dm->yesPixmap() : QPixmap()); } QString field; if (inUse) { field = QString::number(x->length()); } else { field = "-"; } if (text(3) != field) { setText(3, field); } field = i18n("%1 to %2").arg(x->min()).arg(x->max()); if (text(4) != field) { setText(4, field); } _removable = x->getUsage() == 2; x->unlock(); } // Hmmm what happens if this if() fails?? We become inconsistent? break; } case RTTI_OBJ_VECTOR: { KST::vectorList.lock().readLock(); KstVectorPtr x = *KST::vectorList.findTag(_tag); KST::vectorList.lock().unlock(); if (x) { x->readLock(); // getUsage: // subtract 1 for KstVectorPtr x bool inUse = (x->getUsage() - 1 - localUseCount) > 0; if (inUse != _inUse) { _inUse = inUse; setPixmap(2, inUse ? _dm->yesPixmap() : QPixmap()); } QString field = QString::number(x->length()); if (text(3) != field) { setText(3, field); } field = i18n("[%1..%2]").arg(x->min()).arg(x->max()); if (text(4) != field) { setText(4, field); } x->unlock(); _removable = false; } break; } case RTTI_OBJ_OBJECT: { KST::dataObjectList.lock().readLock(); KstDataObjectPtr x = *KST::dataObjectList.findTag(_tag.tag()); KST::dataObjectList.lock().unlock(); if (x) { x->readLock(); QString field = x->typeString(); if (text(1) != field) { setText(1, field); } // getUsage: // subtract 1 for KstDataObjectPtr x bool inUse = (x->getUsage() - 1 - localUseCount) > 0; if (inUse != _inUse) { _inUse = inUse; setPixmap(2, inUse ? _dm->yesPixmap() : QPixmap()); } if (x->sampleCount() > 0) { field = QString::number(x->sampleCount()); if (text(3) != field) { setText(3, field); } } else { if (text(3) != "-") { setText(3, "-"); } } field = x->propertyString(); if (text(4) != field) { setText(4, field); } if (recursive) { QPtrStack<QListViewItem> trash; KstVectorMap vl = x->outputVectors(); KstVectorMap::Iterator vlEnd = vl.end(); for (QListViewItem *i = firstChild(); i; i = i->nextSibling()) { KstObjectItem *oi = static_cast<KstObjectItem*>(i); if (vl.findTag(oi->tag().tag()) == vlEnd) { trash.push(i); } } trash.setAutoDelete(true); trash.clear(); // get the output vectors for (KstVectorMap::Iterator p = vl.begin(); p != vlEnd; ++p) { bool found = false; QString tn = p.data()->tag().tag(); for (QListViewItem *i = firstChild(); i; i = i->nextSibling()) { KstObjectItem *oi = static_cast<KstObjectItem*>(i); if (oi->tag().tag() == tn) { oi->update(); found = true; break; } } if (!found) { KstObjectItem *item = new KstObjectItem(this, p.data(), _dm); connect(item, SIGNAL(updated()), this, SIGNAL(updated())); } } KstMatrixMap ml = x->outputMatrices(); KstMatrixMap::Iterator mlEnd = ml.end(); // also get the output matrices for (KstMatrixMap::Iterator p = ml.begin(); p != mlEnd; ++p) { bool found = false; QString tn = p.data()->tag().tag(); for (QListViewItem *i = firstChild(); i; i = i->nextSibling()) { KstObjectItem *oi = static_cast<KstObjectItem*>(i); if (oi->tag().tag() == tn) { oi->update(); found = true; break; } } if (!found) { KstObjectItem *item = new KstObjectItem(this, p.data(), _dm); connect(item, SIGNAL(updated()), this, SIGNAL(updated())); } } } _removable = x->getUsage() == 1; x->unlock(); } break; } case RTTI_OBJ_DATA_MATRIX: { KST::matrixList.lock().readLock(); KstRMatrixPtr x = kst_cast<KstRMatrix>(*KST::matrixList.findTag(_tag)); KST::matrixList.lock().unlock(); if (x) { x->readLock(); // getUsage: subtract 1 for KstRMatrixPtr x bool inUse = (x->getUsage() - 1 - localUseCount) > 0; if (inUse != _inUse) { _inUse = inUse; setPixmap(2, inUse ? _dm->yesPixmap() : QPixmap()); } QString field = QString::number(x->sampleCount()); if (text(3) != field) { setText(3, field); } field = i18n("%1: %2 (%3 by %4)").arg(x->filename()).arg(x->field()) .arg(x->xNumSteps()) .arg(x->yNumSteps()); if (text(4) != field) { setText(4, field); } _removable = x->getUsage() == 2; x->unlock(); } break; } case RTTI_OBJ_STATIC_MATRIX: { KST::matrixList.lock().readLock(); KstSMatrixPtr x = kst_cast<KstSMatrix>(*KST::matrixList.findTag(_tag)); KST::matrixList.lock().unlock(); if (x) { x->readLock(); // getUsage: subtract 1 for KstRMatrixPtr x bool inUse = (x->getUsage() - 1 - localUseCount) > 0; if (inUse != _inUse) { _inUse = inUse; setPixmap(2, inUse ? _dm->yesPixmap() : QPixmap()); } QString field = QString::number(x->sampleCount()); if (text(3) != field) { setText(3, field); } field = i18n("%1 to %2").arg(x->gradZMin()).arg(x->gradZMax()); if (text(4) != field) { setText(4, field); } _removable = x->getUsage() == 2; x->unlock(); } break; } case RTTI_OBJ_MATRIX: { KST::matrixList.lock().readLock(); KstMatrixPtr x = *KST::matrixList.findTag(_tag); KST::matrixList.lock().unlock(); if (x) { x->readLock(); // getUsage: // subtract 1 for KstVectorPtr x bool inUse = (x->getUsage() - 1 - localUseCount) > 0; if (inUse != _inUse) { _inUse = inUse; setPixmap(2, inUse ? _dm->yesPixmap() : QPixmap()); } QString field = QString::number(x->sampleCount()); if (text(3) != field) { setText(3, field); } field = i18n("[%1..%2]").arg(x->minValue()).arg(x->maxValue()); if (text(4) != field) { setText(4, field); } x->unlock(); _removable = false; } break; } default: assert(0); } }
void KstDataObject::replaceDependency(KstDataObjectPtr oldObject, KstDataObjectPtr newObject) { // // find all connections from this object to old object // for (KstVectorMap::Iterator j = oldObject->outputVectors().begin(); j != oldObject->outputVectors().end(); ++j) { for (KstVectorMap::Iterator k = _inputVectors.begin(); k != _inputVectors.end(); ++k) { if (*j == *k) { // replace input with the output from newObject _inputVectors[k.key()] = (newObject->outputVectors())[j.key()]; } } // also replace dependencies on vector stats for (KstScalarMap::Iterator k = _inputScalars.begin(); k != _inputScalars.end(); ++k) { for (ScalarCollection::const_iterator l = (*j)->scalars().begin(); l != (*j)->scalars().end(); ++l) { if (*l == *k) { _inputScalars[k.key()] = (((newObject->outputVectors())[j.key()])->scalars())[l.key()]; } } } } for (KstMatrixMap::Iterator j = oldObject->outputMatrices().begin(); j != oldObject->outputMatrices().end(); ++j) { for (KstMatrixMap::Iterator k = _inputMatrices.begin(); k != _inputMatrices.end(); ++k) { if (*j == *k) { // replace input with the output from newObject _inputMatrices[k.key()] = (newObject->outputMatrices())[j.key()]; } } // also replace dependencies on matrix stats for (KstScalarMap::Iterator k = _inputScalars.begin(); k != _inputScalars.end(); ++k) { for (ScalarCollection::const_iterator l=(*j)->scalars().begin(); l != (*j)->scalars().end(); ++l) { if (*l == *k) { _inputScalars[k.key()] = (((newObject->outputMatrices())[j.key()])->scalars())[l.key()]; } } } } for (KstScalarMap::Iterator j = oldObject->outputScalars().begin(); j != oldObject->outputScalars().end(); ++j) { for (KstScalarMap::Iterator k = _inputScalars.begin(); k != _inputScalars.end(); ++k) { if (*j == *k) { // replace input with the output from newObject _inputScalars[k.key()] = (newObject->outputScalars())[j.key()]; } } } for (KstStringMap::Iterator j = oldObject->outputStrings().begin(); j != oldObject->outputStrings().end(); ++j) { for (KstStringMap::Iterator k = _inputStrings.begin(); k != _inputStrings.end(); ++k) { if (*j == *k) { // replace input with the output from newObject _inputStrings[k.key()] = (newObject->outputStrings())[j.key()]; } } } }
void KstObjectItem::update(bool recursive) { switch (_rtti) { case RTTI_OBJ_DATA_VECTOR: { KstVectorPtr px = *KST::vectorList.findTag(_name); assert(px.data()); assert(dynamic_cast<KstRVector*>(px.data())); KstRVectorPtr x = static_cast<KstRVector*>(px.data()); setText(2, QString::number(x->getUsage() - 3)); // caller has a ptr setText(3, QString::number(x->sampleCount())); setText(4, i18n("%3: %4 [%1..%2]").arg(x->reqStartFrame()) .arg(x->reqStartFrame() + x->reqNumFrames()) .arg(x->getFilename()) .arg(x->getField())); _removable = x->getUsage() == 3; break; } case RTTI_OBJ_VECTOR: { KstVectorPtr x = *KST::vectorList.findTag(_name); assert(x.data()); setText(2, QString::number(x->getUsage() - 2)); //caller also points setText(3, QString::number(x->sampleCount())); setText(4, i18n("[%1..%2]").arg(x->min()).arg(x->max())); _removable = false; break; } case RTTI_OBJ_OBJECT: { KstDataObjectPtr x = *KST::dataObjectList.findTag(_name); assert(x.data()); setText(1, x->typeString()); setText(2, QString::number(x->getUsage() - 1)); // our pointer setText(3, QString::number(x->sampleCount())); setText(4, x->propertyString()); if (recursive) { QPtrStack<QListViewItem> trash; for (QListViewItem *i = firstChild(); i; i = i->nextSibling()) { KstObjectItem *oi = static_cast<KstObjectItem*>(i); if (x->outputVectors().findTag(oi->tagName()) == x->outputVectors().end()) { trash.push(i); } } trash.setAutoDelete(true); trash.clear(); for (KstVectorMap::Iterator p = x->outputVectors().begin(); p != x->outputVectors().end(); ++p) { bool found = false; for (QListViewItem *i = firstChild(); i; i = i->nextSibling()) { KstObjectItem *oi = static_cast<KstObjectItem*>(i); if (oi->tagName() == p.data()->tagName()) { oi->update(); found = true; break; } } if (!found) { new KstObjectItem(this, p.data(), _dm); } } } _removable = x->getUsage() == 1; break; } default: assert(0); } }