RemoveAllReactionRowsCommand::RemoveAllReactionRowsCommand(CQReactionDM * pReaDM, const QModelIndex&) { mpReactionDM = pReaDM; assert(CCopasiRootContainer::getDatamodelList()->size() > 0); CCopasiDataModel* pDataModel = (*CCopasiRootContainer::getDatamodelList())[0]; assert(pDataModel != NULL); CModel * pModel = pDataModel->getModel(); assert(pModel != NULL); for (int i = 0; i != pReaDM->rowCount() - 1; ++i) { UndoReactionData *data = new UndoReactionData(); CReactionInterface* ri = new CReactionInterface((*CCopasiRootContainer::getDatamodelList())[0]->getModel()); if (pModel->getReactions()[i]) { data->setName(pModel->getReactions()[i]->getObjectName()); ri->initFromReaction(pModel->getReactions()[i]->getKey()); data->setRi(ri); mpReaData.append(data); } } mType = REACTIONREMOVEALL; setEntityType("Reaction"); this->setText(removeAllReactionRowsText()); }
void UndoDependentData::fillDependentObjects(CModel *pModel, QList<UndoReactionData *> *reactionData) { if (pModel == NULL || reactionData == NULL || reactionData->empty()) return; QList <UndoReactionData *>::const_iterator j; for (j = reactionData->begin(); j != reactionData->end(); ++j) { UndoReactionData * rData = *j; //need to make sure reaction doesn't exist in the model already if (pModel->getReactions().getIndex(rData->getName()) != C_INVALID_INDEX) continue; rData->fillObject(pModel); } }
void UndoDependentData::restoreDependentObjects(CModel *pModel, QList<UndoReactionData *> *reactionData) { if (pModel == NULL || reactionData == NULL || reactionData->empty()) return; QList <UndoReactionData *>::const_iterator j; for (j = reactionData->begin(); j != reactionData->end(); ++j) { UndoReactionData * rData = *j; //need to make sure reaction doesn't exist in the model already if (pModel->getReactions().getIndex(rData->getName()) != C_INVALID_INDEX) continue; CReaction *pRea = rData->restoreObjectIn(pModel); rData->restoreDependentObjects(pModel); updateGUI(ListViews::REACTION, ListViews::ADD, pRea->getKey()); } }
void CQCompartment::addCompartment(UndoCompartmentData *pSData) { assert(CCopasiRootContainer::getDatamodelList()->size() > 0); CCopasiDataModel* pDataModel = (*CCopasiRootContainer::getDatamodelList())[0]; assert(pDataModel != NULL); CModel * pModel = pDataModel->getModel(); assert(pModel != NULL); //reinsert all the Compartments CCompartment *pCompartment = pModel->createCompartment(pSData->getName()); pCompartment->setInitialValue(pSData->getInitialValue()); pCompartment->setStatus(pSData->getStatus()); std::string key = pCompartment->getKey(); protectedNotify(ListViews::COMPARTMENT, ListViews::ADD, key); //restore all the dependencies //reinsert all the species QList <UndoSpecieData *> *pSpecieData = pSData->getSpecieDependencyObjects(); QList <UndoSpecieData *>::const_iterator i; for (i = pSpecieData->begin(); i != pSpecieData->end(); ++i) { UndoSpecieData * data = *i; // beginInsertRows(QModelIndex(), 1, 1); CMetab *pSpecie = pModel->createMetabolite(data->getName(), data->getCompartment(), data->getIConc(), data->getStatus()); protectedNotify(ListViews::METABOLITE, ListViews::ADD, pSpecie->getKey()); //endInsertRows(); } //reinsert the dependency reaction QList <UndoReactionData *> *pReactionData = pSData->getReactionDependencyObjects(); QList <UndoReactionData *>::const_iterator j; for (j = pReactionData->begin(); j != pReactionData->end(); ++j) { //UndoReactionData * rData = dynamic_cast<UndoReactionData*>(*j); UndoReactionData * rData = *j; //TODO check if reaction already exist in the model, better idea may be implemented in the future bool exist = false; for (int ii = 0; ii < (int)pModel->getReactions().size(); ++ii) { if (pModel->getReactions()[ii]->getObjectName() == rData->getName()) { exist = true; ii = ii + pModel->getReactions().size() + 1; //jump out of the loop reaction exist already } else { exist = false; } } if (!exist) { protectedNotify(ListViews::METABOLITE, ListViews::ADD, ""); //Refresh all dependency species. CReaction *pRea = pModel->createReaction(rData->getName()); rData->getRi()->writeBackToReaction(pRea); protectedNotify(ListViews::REACTION, ListViews::ADD, pRea->getKey()); } } mpListView->switchToOtherWidget(C_INVALID_INDEX, key); }