void CQMergingData::slotBtnMerge() { //simple, preliminary const CCopasiObject* p1 = NULL; const CCopasiObject* p2 = NULL; std::map< QTreeWidgetItem *, const CCopasiObject * >::const_iterator it; it = mItemMap1.find(mpTree1->currentItem()); if (it != mItemMap1.end()) p1 = it->second; it = mItemMap2.find(mpTree2->currentItem()); if (it != mItemMap2.end()) p2 = it->second; /* for (it=mItemMap1.begin(); it != mItemMap1.end(); ++it) { if (it->first->checkState(0)==Qt::Checked) { p1=it->second; break; } } for (it=mItemMap2.begin(); it != mItemMap2.end(); ++it) { if (it->first->checkState(0)==Qt::Checked) { p2=it->second; break; } }*/ //check if the replacement matches in type if (!p1 || !p2 || p1->getObjectType() != p2->getObjectType()) return; //TODO it would be better to check this constantly and disable the merge button accordingly CModelExpansion expa(mpModel); CModelExpansion::ElementsMap emap; emap.add(p1, p2); expa.replaceInModel(emap, true); //true means remove replaced items //CModelMerging merging(pModel); //merging.simpleCall(mColumnKey, mObjectKey); load(); //accept(); }
void CQSpeciesDetail::copy() { if (mpMetab == NULL) return; CModel * pModel = NULL; if (mpMetab) pModel = mpDataModel->getModel(); if (pModel == NULL) return; // for getting compartments and initializing cModelExpObj // Create and customize compartment choices dialog CQNameSelectionDialog * pDialog = new CQNameSelectionDialog(this); pDialog->setWindowTitle("Choose a compartment"); pDialog->mpLblName->setText("compartment"); pDialog->mpSelectionBox->clear(); pDialog->mpSelectionBox->setDuplicatesEnabled(false); pDialog->mpSelectionBox->setEditable(false); // at least for now, unless we want to add new compartment creation here. // Use CModelExpansion for duplication CModelExpansion cModelExpObj = CModelExpansion(pModel); CModelExpansion::SetOfModelElements sourceObjects; CModelExpansion::ElementsMap origToCopyMapping; // for comboBox compartment list and setting compartment CCopasiVectorNS< CCompartment > & Compartments = pModel->getCompartments(); CCopasiVectorN< CCompartment >::const_iterator it = Compartments.begin(); CCopasiVectorN< CCompartment >::const_iterator end = Compartments.end(); QStringList SelectionList; // Collect and load list of compartment names in comboBox for (; it != end; ++it) { SelectionList.append(FROM_UTF8((*it)->getObjectName())); } pDialog->setSelectionList(SelectionList); //Set the current compartment as the default mpCurrentCompartment = mpMetab->getCompartment(); // to use here, and for testing if compartment changed after executing the dialog int origCompartmentIndex = pDialog->mpSelectionBox->findText(FROM_UTF8(mpCurrentCompartment->getObjectName())); pDialog->mpSelectionBox->setCurrentIndex(origCompartmentIndex); it = Compartments.begin(); // Reuse Compartments iterator to set compartment choice if (pDialog->exec() != QDialog::Rejected) { // Put species in different compartment (without name modification) by making // duplicateMetab think the other compartment was duplicated from the original if(origCompartmentIndex != pDialog->mpSelectionBox->currentIndex()) { sourceObjects.addCompartment(mpMetab->getCompartment()); origToCopyMapping.add(mpMetab->getCompartment(),*(it + pDialog->mpSelectionBox->currentIndex())); } sourceObjects.addMetab(mpMetab); cModelExpObj.duplicateMetab(mpMetab, "_copy", sourceObjects, origToCopyMapping); protectedNotify(ListViews::COMPARTMENT, ListViews::DELETE, "");//Refresh all protectedNotify(ListViews::METABOLITE, ListViews::DELETE, ""); //Refresh all protectedNotify(ListViews::REACTION, ListViews::DELETE, ""); //Refresh all mpListView->switchToOtherWidget(C_INVALID_INDEX, origToCopyMapping.getDuplicateKey(mKey)); } pdelete(pDialog); }