Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: enable atom type and master term remove functionality #1883

Closed
wants to merge 10 commits into from
64 changes: 62 additions & 2 deletions src/classes/coreData.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,11 @@ std::shared_ptr<AtomType> CoreData::addAtomType(Elements::Element Z)
}

// Remove specified AtomType
void CoreData::removeAtomType(const std::shared_ptr<AtomType> &at)
void CoreData::removeAtomType(std::shared_ptr<AtomType> &at)
{
atomTypes_.erase(std::remove(atomTypes_.begin(), atomTypes_.end(), at));
removeReferencesTo(at);
RobBuchananCompPhys marked this conversation as resolved.
Show resolved Hide resolved

atomTypes_.erase(std::remove(atomTypes_.begin(), atomTypes_.end(), at), atomTypes_.end());
}

// Return number of AtomTypes in list
Expand Down Expand Up @@ -156,6 +158,18 @@ MasterBond &CoreData::addMasterBond(std::string_view name)
return *masters_.bonds.emplace_back(std::make_shared<MasterBond>(name));
}

// Remove specified master Bond
void CoreData::removeMasterBond(const std::shared_ptr<MasterBond> &bond)
{
// Copy data into species-local instance
for (auto &species : species_)
{
species->addBond(bond->indexI(), bond->indexJ());
}
RobBuchananCompPhys marked this conversation as resolved.
Show resolved Hide resolved

masters_.bonds.erase(std::remove(masters_.bonds.begin(), masters_.bonds.end(), bond), masters_.bonds.end());
}

// Return number of master Bond parameters in list
int CoreData::nMasterBonds() const { return masters_.bonds.size(); }

Expand Down Expand Up @@ -198,6 +212,18 @@ MasterAngle &CoreData::addMasterAngle(std::string_view name)
return *masters_.angles.emplace_back(std::make_shared<MasterAngle>(name));
}

// Remove specified master Angle
void CoreData::removeMasterAngle(const std::shared_ptr<MasterAngle> &angle)
{
// Copy data into species-local instance
for (auto &species : species_)
{
species->addAngle(angle->indexI(), angle->indexJ(), angle->indexK());
}

masters_.angles.erase(std::remove(masters_.angles.begin(), masters_.angles.end(), angle), masters_.angles.end());
}

// Return number of master Angle parameters in list
int CoreData::nMasterAngles() const { return masters_.angles.size(); }

Expand Down Expand Up @@ -240,6 +266,18 @@ MasterTorsion &CoreData::addMasterTorsion(std::string_view name)
return *masters_.torsions.emplace_back(std::make_shared<MasterTorsion>(name));
}

// Remove specified MasterTorsion
void CoreData::removeMasterTorsion(const std::shared_ptr<MasterTorsion> &torsion)
{
// Copy data into species-local instance
for (auto &species : species_)
{
species->addTorsion(torsion->indexI(), torsion->indexJ(), torsion->indexK(), torsion->indexL());
}

masters_.torsions.erase(std::remove(masters_.torsions.begin(), masters_.torsions.end(), torsion), masters_.torsions.end());
}

// Return number of master Torsion parameters in list
int CoreData::nMasterTorsions() const { return masters_.torsions.size(); }

Expand Down Expand Up @@ -282,6 +320,19 @@ MasterImproper &CoreData::addMasterImproper(std::string_view name)
return *masters_.impropers.emplace_back(std::make_shared<MasterImproper>(name));
}

// Remove specified master Improper
void CoreData::removeMasterImproper(const std::shared_ptr<MasterImproper> &improper)
{
// Copy data into species-local instance
for (auto &species : species_)
{
species->addImproper(improper->indexI(), improper->indexJ(), improper->indexK(), improper->indexL());
}

masters_.impropers.erase(std::remove(masters_.impropers.begin(), masters_.impropers.end(), improper),
masters_.impropers.end());
}

// Return number of master Improper parameters in list
int CoreData::nMasterImpropers() const { return masters_.impropers.size(); }

Expand Down Expand Up @@ -677,6 +728,14 @@ template <class O> void objectNoLongerValid(CoreData *coreData, O *object)
mod->keywords().objectNoLongerValid(object);
}

template <class P> void objectNoLongerValid(CoreData *coreData, std::shared_ptr<P> object)
{
// Loop over all keyword objects and call their local functions
for (auto &layer : coreData->processingLayers())
for (auto &mod : layer->modules())
mod->keywords().objectNoLongerValid(object);
}

// Remove all references to the specified data
void CoreData::removeReferencesTo(Module *data) { objectNoLongerValid(this, data); }
void CoreData::removeReferencesTo(Isotopologue *data) { objectNoLongerValid(this, data); }
Expand All @@ -691,6 +750,7 @@ void CoreData::removeReferencesTo(Species *data)
cfg->empty();
}
void CoreData::removeReferencesTo(SpeciesSite *data) { objectNoLongerValid(this, data); }
void CoreData::removeReferencesTo(std::shared_ptr<AtomType> data) { objectNoLongerValid(this, data); }

/*
* Modules
Expand Down
11 changes: 10 additions & 1 deletion src/classes/coreData.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ class CoreData
// Add new AtomType
std::shared_ptr<AtomType> addAtomType(Elements::Element Z);
// Remove specified AtomType
void removeAtomType(const std::shared_ptr<AtomType> &at);
void removeAtomType(std::shared_ptr<AtomType> &at);
// Return number of AtomTypes in list
int nAtomTypes() const;
// Return core AtomTypes list
Expand Down Expand Up @@ -114,6 +114,8 @@ class CoreData
void deserialiseMaster(const SerialisedValue &node);
// Add new master Bond parameters
MasterBond &addMasterBond(std::string_view name);
// Remove specified master Bond
void removeMasterBond(const std::shared_ptr<MasterBond> &bond);
// Return number of master Bond parameters in list
int nMasterBonds() const;
// Return list of master Bond parameters
Expand All @@ -124,6 +126,8 @@ class CoreData
OptionalReferenceWrapper<const MasterBond> getMasterBond(std::string_view name) const;
// Add new master Angle parameters
MasterAngle &addMasterAngle(std::string_view name);
// Remove specified master Angle
void removeMasterAngle(const std::shared_ptr<MasterAngle> &angle);
// Return number of master Angles parameters in list
int nMasterAngles() const;
// Return list of master Angle parameters
Expand All @@ -134,6 +138,8 @@ class CoreData
OptionalReferenceWrapper<const MasterAngle> getMasterAngle(std::string_view name) const;
// Add new master Torsion parameters
MasterTorsion &addMasterTorsion(std::string_view name);
// Remove specified master Torsion
void removeMasterTorsion(const std::shared_ptr<MasterTorsion> &torsion);
// Return number of master Torsions parameters in list
int nMasterTorsions() const;
// Return list of master Torsion parameters
Expand All @@ -144,6 +150,8 @@ class CoreData
OptionalReferenceWrapper<const MasterTorsion> getMasterTorsion(std::string_view name) const;
// Add new master Improper parameters
MasterImproper &addMasterImproper(std::string_view name);
// Remove specified master Impropers
void removeMasterImproper(const std::shared_ptr<MasterImproper> &improper);
// Return number of master Impropers parameters in list
int nMasterImpropers() const;
// Return list of master Improper parameters
Expand Down Expand Up @@ -274,4 +282,5 @@ class CoreData
void removeReferencesTo(Module *data);
void removeReferencesTo(Species *data);
void removeReferencesTo(SpeciesSite *data);
void removeReferencesTo(std::shared_ptr<AtomType> data);
};
135 changes: 130 additions & 5 deletions src/gui/forcefieldTab.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,15 @@ ForcefieldTab::ForcefieldTab(DissolveWindow *dissolveWindow, Dissolve &dissolve,
SLOT(masterTorsionsDataChanged(const QModelIndex &, const QModelIndex &)));
connect(&masterImpropersTableModel_, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &)), this,
SLOT(masterImpropersDataChanged(const QModelIndex &, const QModelIndex &)));
connect(ui_.MasterBondsTable->selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)),
this, SLOT(masterBondsSelectionChanged(const QItemSelection &, const QItemSelection &)));
connect(ui_.MasterAnglesTable->selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)),
this, SLOT(masterAnglesSelectionChanged(const QItemSelection &, const QItemSelection &)));
connect(ui_.MasterTorsionsTable->selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)),
this, SLOT(masterTorsionsSelectionChanged(const QItemSelection &, const QItemSelection &)));
connect(ui_.MasterImpropersTable->selectionModel(),
SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)), this,
SLOT(masterImpropersSelectionChanged(const QItemSelection &, const QItemSelection &)));

/*
* Atom Types
Expand Down Expand Up @@ -283,10 +292,30 @@ void ForcefieldTab::on_AtomTypeAddButton_clicked(bool checked)
dissolveWindow_->setModified();
}

void ForcefieldTab::on_AtomTypeRemoveButton_clicked(bool checked) { Messenger::error("NOT IMPLEMENTED YET.\n"); }
void ForcefieldTab::on_AtomTypeRemoveButton_clicked(bool checked)
{
RobBuchananCompPhys marked this conversation as resolved.
Show resolved Hide resolved
auto index = ui_.AtomTypesTable->currentIndex();
if (!index.isValid())
return;

// Get selected atomtype
auto at = atomTypesModel_.rawData(index);
if (!at)
return;

dissolve_.coreData().removeAtomType(at);

Locker refreshLocker(refreshLock_);

atomTypesModel_.setData(dissolve_.coreData().atomTypes());
ui_.AtomTypesTable->resizeColumnsToContents();

dissolveWindow_->setModified();
}

void ForcefieldTab::atomTypeSelectionChanged(const QItemSelection &current, const QItemSelection &previous)
{
ui_.AtomTypeRemoveButton->setEnabled(!current.empty());
ui_.AtomTypeDuplicateButton->setEnabled(!current.empty());
}

Expand Down Expand Up @@ -470,6 +499,26 @@ void ForcefieldTab::masterImpropersDataChanged(const QModelIndex &, const QModel
dissolveWindow_->setModified();
}

void ForcefieldTab::masterBondsSelectionChanged(const QItemSelection &current, const QItemSelection &previous)
{
ui_.MasterTermRemoveBondButton->setEnabled(!current.empty());
}

void ForcefieldTab::masterAnglesSelectionChanged(const QItemSelection &current, const QItemSelection &previous)
{
ui_.MasterTermRemoveAngleButton->setEnabled(!current.empty());
}

void ForcefieldTab::masterTorsionsSelectionChanged(const QItemSelection &current, const QItemSelection &previous)
{
ui_.MasterTermRemoveTorsionButton->setEnabled(!current.empty());
}

void ForcefieldTab::masterImpropersSelectionChanged(const QItemSelection &current, const QItemSelection &previous)
{
ui_.MasterTermRemoveImproperButton->setEnabled(!current.empty());
}

void ForcefieldTab::on_MasterTermAddBondButton_clicked(bool checked)
{
dissolve_.coreData().addMasterBond(
Expand All @@ -479,7 +528,26 @@ void ForcefieldTab::on_MasterTermAddBondButton_clicked(bool checked)
dissolveWindow_->setModified();
}

void ForcefieldTab::on_MasterTermRemoveBondButton_clicked(bool checked) { Messenger::error("NOT IMPLEMENTED YET.\n"); }
void ForcefieldTab::on_MasterTermRemoveBondButton_clicked(bool checked)
{
auto index = ui_.MasterBondsTable->currentIndex();
if (!index.isValid())
return;

// Get selected master bond
auto bond = masterBondsTableModel_.rawData(index);
if (!bond)
return;

dissolve_.coreData().removeMasterBond(bond);

Locker refreshLocker(refreshLock_);

masterBondsTableModel_.setSourceData(dissolve_.coreData().masterBonds());
ui_.MasterBondsTable->resizeColumnsToContents();

dissolveWindow_->setModified();
}

void ForcefieldTab::on_MasterTermAddAngleButton_clicked(bool checked)
{
Expand All @@ -490,7 +558,26 @@ void ForcefieldTab::on_MasterTermAddAngleButton_clicked(bool checked)
dissolveWindow_->setModified();
}

void ForcefieldTab::on_MasterTermRemoveAngleButton_clicked(bool checked) { Messenger::error("NOT IMPLEMENTED YET.\n"); }
void ForcefieldTab::on_MasterTermRemoveAngleButton_clicked(bool checked)
{
auto index = ui_.MasterAnglesTable->currentIndex();
if (!index.isValid())
return;

// Get selected master angle
auto angle = masterAnglesTableModel_.rawData(index);
if (!angle)
return;

dissolve_.coreData().removeMasterAngle(angle);

Locker refreshLocker(refreshLock_);

masterAnglesTableModel_.setSourceData(dissolve_.coreData().masterAngles());
ui_.MasterAnglesTable->resizeColumnsToContents();

dissolveWindow_->setModified();
}

void ForcefieldTab::on_MasterTermAddTorsionButton_clicked(bool checked)
{
Expand All @@ -501,7 +588,26 @@ void ForcefieldTab::on_MasterTermAddTorsionButton_clicked(bool checked)
dissolveWindow_->setModified();
}

void ForcefieldTab::on_MasterTermRemoveTorsionButton_clicked(bool checked) { Messenger::error("NOT IMPLEMENTED YET.\n"); }
void ForcefieldTab::on_MasterTermRemoveTorsionButton_clicked(bool checked)
{
auto index = ui_.MasterTorsionsTable->currentIndex();
if (!index.isValid())
return;

// Get selected master torsion
auto torsion = masterTorsionsTableModel_.rawData(index);
if (!torsion)
return;

dissolve_.coreData().removeMasterTorsion(torsion);

Locker refreshLocker(refreshLock_);

masterTorsionsTableModel_.setSourceData(dissolve_.coreData().masterTorsions());
ui_.MasterTorsionsTable->resizeColumnsToContents();

dissolveWindow_->setModified();
}

void ForcefieldTab::on_MasterTermAddImproperButton_clicked(bool checked)
{
Expand All @@ -512,4 +618,23 @@ void ForcefieldTab::on_MasterTermAddImproperButton_clicked(bool checked)
dissolveWindow_->setModified();
}

void ForcefieldTab::on_MasterTermRemoveImproperButton_clicked(bool checked) { Messenger::error("NOT IMPLEMENTED YET.\n"); }
void ForcefieldTab::on_MasterTermRemoveImproperButton_clicked(bool checked)
{
auto index = ui_.MasterImpropersTable->currentIndex();
if (!index.isValid())
return;

// Get selected master improper
auto improper = masterImpropersTableModel_.rawData(index);
if (!improper)
return;

dissolve_.coreData().removeMasterImproper(improper);

Locker refreshLocker(refreshLock_);

masterImpropersTableModel_.setSourceData(dissolve_.coreData().masterImpropers());
ui_.MasterImpropersTable->resizeColumnsToContents();

dissolveWindow_->setModified();
}
4 changes: 4 additions & 0 deletions src/gui/forcefieldTab.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,10 @@ class ForcefieldTab : public QWidget, public MainTab
void masterAnglesDataChanged(const QModelIndex &, const QModelIndex &);
void masterTorsionsDataChanged(const QModelIndex &, const QModelIndex &);
void masterImpropersDataChanged(const QModelIndex &, const QModelIndex &);
void masterBondsSelectionChanged(const QItemSelection &, const QItemSelection &);
void masterAnglesSelectionChanged(const QItemSelection &, const QItemSelection &);
void masterTorsionsSelectionChanged(const QItemSelection &, const QItemSelection &);
void masterImpropersSelectionChanged(const QItemSelection &, const QItemSelection &);
void on_MasterTermAddBondButton_clicked(bool checked);
void on_MasterTermRemoveBondButton_clicked(bool checked);
void on_MasterTermAddAngleButton_clicked(bool checked);
Expand Down
6 changes: 6 additions & 0 deletions src/gui/models/masterAngleModel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -94,3 +94,9 @@ bool MasterAngleModel::setTermData(int row, MasterTermModelData::DataType dataTy

return true;
}

const std::shared_ptr<MasterAngle> &MasterAngleModel::rawData(const QModelIndex &index) const
{
assert(sourceData_);
return sourceData_->get()[index.row()];
}
1 change: 1 addition & 0 deletions src/gui/models/masterAngleModel.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ class MasterAngleModel : public MasterTermModel
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant getTermData(int row, MasterTermModelData::DataType dataType) const override;
bool setTermData(int row, MasterTermModelData::DataType dataType, const QVariant &value) override;
const std::shared_ptr<MasterAngle> &rawData(const QModelIndex &index) const;

private:
ModelUpdater modelUpdater;
Expand Down
6 changes: 6 additions & 0 deletions src/gui/models/masterBondModel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -94,3 +94,9 @@ bool MasterBondModel::setTermData(int row, MasterTermModelData::DataType dataTyp

return true;
}

const std::shared_ptr<MasterBond> &MasterBondModel::rawData(const QModelIndex &index) const
{
assert(sourceData_);
return sourceData_->get()[index.row()];
}
1 change: 1 addition & 0 deletions src/gui/models/masterBondModel.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ class MasterBondModel : public MasterTermModel
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant getTermData(int row, MasterTermModelData::DataType dataType) const override;
bool setTermData(int row, MasterTermModelData::DataType dataType, const QVariant &value) override;
const std::shared_ptr<MasterBond> &rawData(const QModelIndex &index) const;

private:
ModelUpdater modelUpdater;
Expand Down