void KstCSD::setVector(KstVectorPtr new_v) { KstVectorPtr v = _inputVectors[INVECTOR]; if (v) { if (v == new_v) { return; } v->unlock(); } _inputVectors.erase(INVECTOR); new_v->writeLock(); _inputVectors[INVECTOR] = new_v; setDirty(); }
KstDataObjectPtr KstPlugin::makeDuplicate(KstDataObjectDataObjectMap& duplicatedMap) { KstPluginPtr plugin = new KstPlugin; // use same inputs for (KstVectorMap::ConstIterator iter = _inputVectors.begin(); iter != _inputVectors.end(); ++iter) { plugin->inputVectors().insert(iter.key(), iter.data()); } for (KstScalarMap::ConstIterator iter = _inputScalars.begin(); iter != _inputScalars.end(); ++iter) { plugin->inputScalars().insert(iter.key(), iter.data()); } for (KstStringMap::ConstIterator iter = _inputStrings.begin(); iter != _inputStrings.end(); ++iter) { plugin->inputStrings().insert(iter.key(), iter.data()); } // create new outputs for (KstVectorMap::ConstIterator iter = outputVectors().begin(); iter != outputVectors().end(); ++iter) { KstVectorPtr v = new KstVector; v->writeLock(); plugin->outputVectors().insert(iter.key(), v); v->setTagName(iter.data()->tagName() + "'"); v->setProvider(plugin.data()); KST::addVectorToList(v); v->writeUnlock(); } for (KstScalarMap::ConstIterator iter = outputScalars().begin(); iter != outputScalars().end(); ++iter) { KstScalarPtr s = new KstScalar; s->writeLock(); plugin->outputScalars().insert(iter.key(), s); s->setTagName(iter.data()->tagName() + "'"); s->setProvider(plugin.data()); s->writeUnlock(); } for (KstStringMap::ConstIterator iter = outputStrings().begin(); iter != outputStrings().end(); ++iter) { KstStringPtr s = new KstString; s->writeLock(); plugin->outputStrings().insert(iter.key(), s); s->setTagName(iter.data()->tagName() + "'"); s->setProvider(plugin.data()); s->writeUnlock(); } // set the same plugin plugin->setPlugin(_plugin); plugin->setTagName(tagName() + "'"); duplicatedMap.insert(this, KstDataObjectPtr(plugin)); return KstDataObjectPtr(plugin); }
void KstEquation::setExistingXVector(KstVectorPtr in_xv, bool do_interp) { KstVectorPtr v = _inputVectors[XVECTOR]; if (v) { if (v == in_xv) { return; } v->writeUnlock(); } setDirty(); _inputVectors.erase(XVECTOR); in_xv->writeLock(); _xVector = _inputVectors.insert(XVECTOR, in_xv); _ns = 2; // reset the updating _doInterp = do_interp; }
bool KstPluginDialogI::saveOutputs(KstCPluginPtr plugin, KstSharedPtr<Plugin> p) { const QValueList<Plugin::Data::IOValue>& otable = p->data()._outputs; for (QValueList<Plugin::Data::IOValue>::ConstIterator it = otable.begin(); it != otable.end(); ++it) { QObject *field = _w->_pluginInputOutputFrame->child((*it)._name.latin1(), "QLineEdit"); if (!field) { continue; // Some are unsupported } QLineEdit *li = static_cast<QLineEdit*>(field); if (li->text().isEmpty()) { QString tagName = _tagName->text(); if (tagName==plugin_defaultTag) { tagName = plugin->tagName(); } li->setText(tagName + "-" + (*it)._name); } QString nt = li->text(); if ((*it)._type == Plugin::Data::IOValue::TableType) { if (!KstData::self()->vectorTagNameNotUnique(nt, false)) { // Implicitly creates it if it doesn't exist KstVectorPtr v = plugin->outputVectors()[(*it)._name]; if (!v) { v = new KstVector(nt, 0, plugin.data()); v->writeLock(); plugin->outputVectors().insert((*it)._name, v); KST::addVectorToList(v); } } else if (plugin->outputVectors()[(*it)._name]->tagName() != nt) { while (KstData::self()->vectorTagNameNotUnique(nt, false)) { nt += "'"; } KstVectorPtr v; if (plugin->outputVectors().contains((*it)._name)) { v = plugin->outputVectors()[(*it)._name]; } else { v = new KstVector(nt, 0, plugin.data()); v->writeLock(); plugin->outputVectors().insert((*it)._name, v); KST::addVectorToList(v); } } } else if ((*it)._type == Plugin::Data::IOValue::StringType) { if (!KstData::self()->vectorTagNameNotUnique(nt, false)) { KstStringPtr s; if (plugin->outputStrings().contains((*it)._name)) { s = plugin->outputStrings()[(*it)._name]; } else { s = new KstString(nt, plugin.data()); s->writeLock(); plugin->outputStrings().insert((*it)._name, s); } } else if (plugin->outputStrings()[(*it)._name]->tagName() != nt) { while (KstData::self()->vectorTagNameNotUnique(nt, false)) { nt += "'"; } KstStringPtr s; if (plugin->outputStrings().contains((*it)._name)) { s = plugin->outputStrings()[(*it)._name]; } else { s = new KstString(nt, plugin.data()); s->writeLock(); plugin->outputStrings().insert((*it)._name, s); } } } else if ((*it)._type == Plugin::Data::IOValue::PidType) { // Nothing } else if ((*it)._type == Plugin::Data::IOValue::FloatType) { if (!KstData::self()->vectorTagNameNotUnique(nt, false)) { KstScalarPtr s; if (plugin->outputScalars().contains((*it)._name)) { s = plugin->outputScalars()[(*it)._name]; } else { s = new KstScalar(nt, plugin.data()); s->writeLock(); plugin->outputScalars().insert((*it)._name, s); } } else if (plugin->outputScalars()[(*it)._name]->tagName() != nt) { while (KstData::self()->vectorTagNameNotUnique(nt, false)) { nt += "'"; } KstScalarPtr s; if (plugin->outputScalars().contains((*it)._name)) { s = plugin->outputScalars()[(*it)._name]; } else { s = new KstScalar(nt, plugin.data()); s->writeLock(); plugin->outputScalars().insert((*it)._name, s); } } } } return true; }
bool KstPluginDialogI::saveInputs(KstCPluginPtr plugin, KstSharedPtr<Plugin> p) { bool rc = true; KST::vectorList.lock().readLock(); KST::scalarList.lock().readLock(); KST::stringList.lock().readLock(); const QValueList<Plugin::Data::IOValue>& itable = p->data()._inputs; for (QValueList<Plugin::Data::IOValue>::ConstIterator it = itable.begin(); it != itable.end(); ++it) { if ((*it)._type == Plugin::Data::IOValue::TableType) { QObject *field = _w->_pluginInputOutputFrame->child((*it)._name.latin1(), "VectorSelector"); assert(field); VectorSelector *vs = static_cast<VectorSelector*>(field); KstVectorPtr v = *KST::vectorList.findTag(vs->selectedVector()); if (v) { v->writeLock(); // to match with plugin->writeLock() if (plugin->inputVectors().contains((*it)._name) && plugin->inputVectors()[(*it)._name] != v) { plugin->inputVectors()[(*it)._name]->unlock(); } plugin->inputVectors().insert((*it)._name, v); } else if (plugin->inputVectors().contains((*it)._name)) { plugin->inputVectors().erase((*it)._name); rc = false; } } else if ((*it)._type == Plugin::Data::IOValue::StringType) { QObject *field = _w->_pluginInputOutputFrame->child((*it)._name.latin1(), "StringSelector"); assert(field); StringSelector *ss = static_cast<StringSelector*>(field); KstStringPtr s = *KST::stringList.findTag(ss->selectedString()); if (s == *KST::stringList.end()) { QString val = ss->_string->currentText(); KstStringPtr newString = new KstString(ss->_string->currentText(), 0L, val, true, false); newString->writeLock(); // to match with plugin->writeLock() if (plugin->inputStrings().contains((*it)._name) && plugin->inputStrings()[(*it)._name] != s) { plugin->inputStrings()[(*it)._name]->unlock(); } plugin->inputStrings().insert((*it)._name, newString); } else { s->writeLock(); // to match with plugin->writeLock() if (plugin->inputStrings().contains((*it)._name) && plugin->inputStrings()[(*it)._name] != s) { plugin->inputStrings()[(*it)._name]->unlock(); } plugin->inputStrings().insert((*it)._name, s); } } else if ((*it)._type == Plugin::Data::IOValue::PidType) { // Nothing } else if ((*it)._type == Plugin::Data::IOValue::FloatType) { QObject *field = _w->_pluginInputOutputFrame->child((*it)._name.latin1(), "ScalarSelector"); assert(field); ScalarSelector *ss = static_cast<ScalarSelector*>(field); KstScalarPtr s = *KST::scalarList.findTag(ss->selectedScalar()); if (s == *KST::scalarList.end()) { bool ok; double val = ss->_scalar->currentText().toDouble(&ok); if (ok) { KstScalarPtr newScalar = new KstScalar(ss->_scalar->currentText(), 0L, val, true, false, false); newScalar->writeLock(); // to match with plugin->writeLock() if (plugin->inputScalars().contains((*it)._name) && plugin->inputScalars()[(*it)._name] != s) { plugin->inputScalars()[(*it)._name]->unlock(); } plugin->inputScalars().insert((*it)._name, newScalar); } else { s->writeLock(); // to match with plugin->writeLock() if (plugin->inputScalars().contains((*it)._name) && plugin->inputScalars()[(*it)._name] != s) { plugin->inputScalars()[(*it)._name]->unlock(); } plugin->inputScalars().insert((*it)._name, s); } } else { s->writeLock(); // to match with plugin->writeLock() if (plugin->inputScalars().contains((*it)._name) && plugin->inputScalars()[(*it)._name] != s) { plugin->inputScalars()[(*it)._name]->unlock(); } plugin->inputScalars().insert((*it)._name, s); } } else { } } KST::stringList.lock().unlock(); KST::scalarList.lock().unlock(); KST::vectorList.lock().unlock(); return rc; }
bool KstPlugin::setPlugin(KstSharedPtr<Plugin> plugin) { // Assumes that this is called with a write lock in place on this object if (plugin == _plugin) { return true; } freeParameters(); if (_localData) { if (!_plugin || !_plugin->freeLocalData(&_localData)) { free(_localData); } _localData = 0L; } if (!plugin) { _inputVectors.clear(); _inputScalars.clear(); _inputStrings.clear(); _outputVectors.clear(); _outputScalars.clear(); _outputStrings.clear(); _plugin = 0L; return true; } Plugin::countScalarsVectorsAndStrings(plugin->data()._inputs, _inScalarCnt, _inArrayCnt, _inStringCnt, _inPid); if (_inputVectors.count() != _inArrayCnt || _inputScalars.count() != _inScalarCnt - _inPid || _inputStrings.count() != _inStringCnt) { _plugin = 0L; return false; } _outScalarCnt = 0; _outArrayCnt = 0; _outStringCnt = 0; _outputVectors.clear(); _outputScalars.clear(); _outputStrings.clear(); const QValueList<Plugin::Data::IOValue>& otable = plugin->data()._outputs; for (QValueList<Plugin::Data::IOValue>::ConstIterator it = otable.begin(); it != otable.end(); ++it) { if ((*it)._type == Plugin::Data::IOValue::TableType) { KstVectorPtr v; if ((*it)._subType == Plugin::Data::IOValue::FloatNonVectorSubType) { v = new KstVector(QString::null, 0, true); } else { v = new KstVector; } v->writeLock(); v->setProvider(this); _outputVectors.insert((*it)._name, v); _outArrayCnt++; KST::addVectorToList(v); } else if ((*it)._type == Plugin::Data::IOValue::FloatType) { KstScalarPtr s = new KstScalar; s->writeLock(); s->setProvider(this); _outputScalars.insert((*it)._name, s); _outScalarCnt++; } else if ((*it)._type == Plugin::Data::IOValue::StringType) { KstStringPtr s = new KstString; s->writeLock(); s->setProvider(this); _outputStrings.insert((*it)._name, s); _outStringCnt++; } } allocateParameters(); _plugin = plugin; return true; }