Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp

    rd7cad1 rce4126  
    6060#include "Bond/bond.hpp"
    6161#include "Descriptors/AtomIdDescriptor.hpp"
    62 #include "Descriptors/MoleculeIdDescriptor.hpp"
    6362#include "Helpers/helpers.hpp"
    6463#include "Shapes/ShapeRegistry.hpp"
     
    7069using namespace MoleCuilder;
    7170
     71std::ostream &operator<<(std::ostream &ost, const GLWorldScene::BondIds &t)
     72{
     73  ost << t.first << "," << t.second;
     74  return ost;
     75}
     76
    7277GLWorldScene::GLWorldScene(QObject *parent)
    73    : QObject(parent)
     78   : QObject(parent),
     79     hoverAtom(NULL)
    7480{
    7581  int sphereDetails[] = {5, 3, 2, 0};
     
    7783  for (int i=0;i<GLMoleculeObject::DETAILTYPES_MAX;i++){
    7884    QGLBuilder emptyBuilder;
    79     GLMoleculeObject::meshEmpty[i] = emptyBuilder.finalizedSceneNode();
     85    meshEmpty[i] = emptyBuilder.finalizedSceneNode();
    8086    QGLBuilder sphereBuilder;
    8187    sphereBuilder << QGLSphere(2.0, sphereDetails[i]);
    82     GLMoleculeObject::meshSphere[i] = sphereBuilder.finalizedSceneNode();
    83     GLMoleculeObject::meshSphere[i]->setOption(QGLSceneNode::CullBoundingBox, true);
     88    meshSphere[i] = sphereBuilder.finalizedSceneNode();
     89    meshSphere[i]->setOption(QGLSceneNode::CullBoundingBox, true);
    8490    QGLBuilder cylinderBuilder;
    8591    cylinderBuilder << QGLCylinder(.25,.25,1.0,cylinderDetails[i]);
    86     GLMoleculeObject::meshCylinder[i] = cylinderBuilder.finalizedSceneNode();
    87     GLMoleculeObject::meshCylinder[i]->setOption(QGLSceneNode::CullBoundingBox, true);
     92    meshCylinder[i] = cylinderBuilder.finalizedSceneNode();
     93    meshCylinder[i]->setOption(QGLSceneNode::CullBoundingBox, true);
    8894  }
    8995
    9096  connect(this, SIGNAL(updated()), this, SLOT(update()));
    91 
    9297
    9398  setSelectionMode(SelectAtom);
     
    107112void GLWorldScene::init()
    108113{
    109   const std::vector<molecule *> &molecules = World::getInstance().getAllMolecules();
    110 
    111   for (std::vector<molecule*>::const_iterator moliter = molecules.begin();
    112       moliter != molecules.end();
    113       moliter++) {
    114     // create molecule objects in scene
    115     moleculeInserted(*moliter);
     114  const std::vector<atom*> &atoms = World::getInstance().getAllAtoms();
     115
     116  if (atoms.size() > 0) {
     117    for (std::vector<atom*>::const_iterator atomiter = atoms.begin();
     118        atomiter != atoms.end();
     119        atomiter++) {
     120      // create atom objects in scene
     121      atomInserted((*atomiter)->getId());
     122
     123      // create bond objects in scene
     124      const BondList &bondlist = (*atomiter)->getListOfBonds();
     125      for (BondList::const_iterator bonditer = bondlist.begin();
     126          bonditer != bondlist.end();
     127          ++bonditer) {
     128        const bond::ptr _bond = *bonditer;
     129        const GLMoleculeObject_bond::SideOfBond side = (_bond->leftatom == *atomiter) ?
     130            GLMoleculeObject_bond::left : GLMoleculeObject_bond::right;
     131        bondInserted(_bond, side);
     132      }
     133    }
    116134  }
    117135}
     
    125143void GLWorldScene::update()
    126144{
    127   const std::vector<molecule *> &molecules = World::getInstance().getAllMolecules();
    128 
    129   for (std::vector<molecule*>::const_iterator moliter = molecules.begin();
    130       moliter != molecules.end();
    131       moliter++) {
    132     // check whether molecule already exists
    133     const moleculeId_t molid = (*moliter)->getId();
    134     const bool mol_present = MoleculesinSceneMap.count(molid);
    135     if (!mol_present)
    136       moleculeInserted(*moliter);
    137   }
     145  const std::vector<atom*> &atoms = World::getInstance().getAllAtoms();
     146
     147  if (atoms.size() > 0) {
     148    for (std::vector<atom*>::const_iterator atomiter = atoms.begin();
     149        atomiter != atoms.end();
     150        atomiter++) {
     151      // check whether atom already exists
     152      const atomId_t atomid = (*atomiter)->getId();
     153      const bool atom_present = AtomsinSceneMap.count(atomid);
     154      if (!atom_present)
     155        atomInserted((*atomiter)->getId());
     156      else
     157        AtomsinSceneMap[atomid]->resetPosition();
     158
     159
     160      // create bond objects in scene
     161      const BondList &bondlist = (*atomiter)->getListOfBonds();
     162      for (BondList::const_iterator bonditer = bondlist.begin();
     163          bonditer != bondlist.end();
     164          ++bonditer) {
     165        const bond::ptr _bond = *bonditer;
     166        const GLMoleculeObject_bond::SideOfBond side = (_bond->leftatom == *atomiter) ?
     167            GLMoleculeObject_bond::left : GLMoleculeObject_bond::right;
     168        bool bond_present = false;
     169        const BondIds ids = getBondIds(_bond,side);
     170        if (atom_present) {
     171          // check whether bond is not present already
     172          bond_present = BondsinSceneMap.count(ids);
     173        }
     174        if (!bond_present)
     175          bondInserted(_bond, side);
     176        else {
     177          BondsinSceneMap[ids]->resetPosition();
     178          BondsinSceneMap[ids]->resetWidth();
     179        }
     180      }
     181    }
     182  }
     183}
     184
     185/** Adds an atom to the scene.
     186 *
     187 * @param _atom atom to add
     188 */
     189void GLWorldScene::atomInserted(const atomicNumber_t _id)
     190{
     191  LOG(3, "INFO: GLWorldScene: Received signal atomInserted for atom "+toString(_id)+".");
     192  GLMoleculeObject_atom *atomObject = new GLMoleculeObject_atom(meshSphere, this, _id);
     193  AtomNodeMap::iterator iter = AtomsinSceneMap.find(_id);
     194  ASSERT(iter == AtomsinSceneMap.end(),
     195      "GLWorldScene::atomAdded() - same atom with id "+toString(_id)+" added again.");
     196  AtomsinSceneMap.insert( make_pair(_id, atomObject) );
     197
     198  qRegisterMetaType<atomId_t>("atomId_t");
     199  qRegisterMetaType<bond::ptr>("bond::ptr");
     200  qRegisterMetaType<GLMoleculeObject_bond::SideOfBond>("GLMoleculeObject_bond::SideOfBond");
     201  connect (atomObject, SIGNAL(clicked(atomId_t)), this, SLOT(atomClicked(atomId_t)));
     202  connect (atomObject, SIGNAL(changed()), this, SIGNAL(changed()));
     203  connect (atomObject, SIGNAL(hoverChanged(GLMoleculeObject *)), this, SIGNAL(changed()));
     204  connect (atomObject, SIGNAL(hoverChanged(GLMoleculeObject *)), this, SLOT(hoverChangedSignalled(GLMoleculeObject *)));
     205  connect (atomObject, SIGNAL(selectionChanged()), this, SIGNAL(changed()));
     206  connect (atomObject, SIGNAL(BondsInserted(const bond::ptr , const GLMoleculeObject_bond::SideOfBond)), this, SLOT(bondInserted(const bond::ptr , const GLMoleculeObject_bond::SideOfBond)));
     207  connect (atomObject, SIGNAL(indexChanged(GLMoleculeObject_atom*, int, int)), this, SLOT(changeAtomId(GLMoleculeObject_atom*, int, int)));
     208  //bondsChanged(_atom);
     209  emit changeOccured();
     210}
     211
     212/** Removes an atom from the scene.
     213 *
     214 * We just the id as the atom might have already been destroyed.
     215 *
     216 * @param _id id of atom to remove
     217 */
     218void GLWorldScene::atomRemoved(const atomicNumber_t _id)
     219{
     220  LOG(3, "INFO: GLWorldScene: Received signal atomRemoved for atom "+toString(_id)+".");
     221  // bonds are removed by signal coming from ~bond
     222  // remove atoms
     223  AtomNodeMap::iterator iter = AtomsinSceneMap.find(_id);
     224  ASSERT(iter != AtomsinSceneMap.end(),
     225      "GLWorldScene::atomRemoved() - atom "+toString(_id)+" not on display.");
     226  GLMoleculeObject_atom *atomObject = iter->second;
     227  atomObject->disconnect();
     228  AtomsinSceneMap.erase(iter);
     229  delete atomObject;
     230  emit changeOccured();
     231}
     232
     233/** ....
     234 *
     235 */
     236void GLWorldScene::worldSelectionChanged()
     237{
     238  LOG(3, "INFO: GLWorldScene: Received signal selectionChanged.");
     239
     240  const std::vector<molecule*> &molecules = World::getInstance().getAllMolecules();
     241
     242  if (molecules.size() > 0) {
     243    for (std::vector<molecule*>::const_iterator Runner = molecules.begin();
     244        Runner != molecules.end();
     245        Runner++) {
     246
     247      MoleculeNodeMap::iterator iter = MoleculesinSceneMap.find((*Runner)->getId());
     248      bool isSelected = World::getInstance().isSelected(*Runner);
     249
     250      // molecule selected but not in scene?
     251      if (isSelected && (iter == MoleculesinSceneMap.end())){
     252        // -> create new mesh
     253        GLMoleculeObject_molecule *molObject = new GLMoleculeObject_molecule(meshEmpty, this, *Runner);
     254        MoleculesinSceneMap.insert( make_pair((*Runner)->getId(), molObject) );
     255        connect (molObject, SIGNAL(changed()), this, SIGNAL(changed()));
     256        connect (molObject, SIGNAL(selectionChanged()), this, SIGNAL(changed()));
     257        connect (molObject, SIGNAL(selectionChanged()), this, SIGNAL(changed()));
     258        emit changed();
     259        emit changeOccured();
     260      }
     261
     262      // molecule not selected but in scene?
     263      if (!isSelected && (iter != MoleculesinSceneMap.end())){
     264        // -> remove from scene
     265        moleculeRemoved(*Runner);
     266      }
     267
     268    }
     269  }
     270}
     271
     272/** Removes a molecule from the scene.
     273 *
     274 * @param _molecule molecule to remove
     275 */
     276void GLWorldScene::moleculeRemoved(const molecule *_molecule)
     277{
     278  LOG(3, "INFO: GLWorldScene: Received signal moleculeRemoved for molecule "+toString(_molecule->getId())+".");
     279  MoleculeNodeMap::iterator iter = MoleculesinSceneMap.find(_molecule->getId());
     280
     281  // only remove if the molecule is in the scene
     282  //  (= is selected)
     283  if (iter != MoleculesinSceneMap.end()){
     284    GLMoleculeObject_molecule *molObject = iter->second;
     285    molObject->disconnect();
     286    MoleculesinSceneMap.erase(iter);
     287    delete molObject;
     288    emit changed();
     289    emit changeOccured();
     290  }
     291}
     292
     293/** Helper function to get bond ids in the correct order for BondNodeMap.
     294 *
     295 * \return pair of ids in correct order.
     296 */
     297GLWorldScene::BondIds GLWorldScene::getBondIds(
     298    const bond::ptr _bond,
     299    const enum GLMoleculeObject_bond::SideOfBond _side) const
     300{
     301  BondIds ids;
     302  switch (_side) {
     303    case GLMoleculeObject_bond::left:
     304      ids = std::make_pair(_bond->leftatom->getId(), _bond->rightatom->getId());
     305      break;
     306    case GLMoleculeObject_bond::right:
     307      ids = std::make_pair(_bond->rightatom->getId(), _bond->leftatom->getId());
     308      break;
     309  }
     310  return ids;
     311}
     312
     313/** Adds a bond to the scene.
     314 *
     315 * @param _bond bond to add
     316 * @param side which side of the bond (left or right)
     317 */
     318void GLWorldScene::bondInserted(const bond::ptr _bond, const enum GLMoleculeObject_bond::SideOfBond _side)
     319{
     320  LOG(3, "INFO: GLWorldScene::bondInserted() - Adding bond "+toString(*_bond)+".");
     321  //LOG(4, "INFO: Currently present bonds " << BondsinSceneMap << ".");
     322
     323  const BondIds ids = getBondIds(_bond, _side);
     324  BondNodeMap::iterator iter = BondsinSceneMap.find(ids);
     325  if (iter == BondsinSceneMap.end()) {
     326    GLMoleculeObject_bond * bondObject =
     327        new GLMoleculeObject_bond(meshCylinder, this, _bond, _side);
     328    connect (
     329        bondObject, SIGNAL(BondRemoved(const atomId_t, const atomId_t)),
     330        this, SLOT(bondRemoved(const atomId_t, const atomId_t)));
     331    connect (bondObject, SIGNAL(changed()), this, SIGNAL(changed()));
     332    BondsinSceneMap.insert( make_pair(ids, bondObject) );
     333  //    BondIdsinSceneMap.insert( Leftids );
     334  } else {
     335    iter->second->resetPosition();
     336    iter->second->resetWidth();
     337  }
     338  emit changeOccured();
     339}
     340
     341/** Removes a bond from the scene.
     342 *
     343 * @param _bond bond to remove
     344 */
     345void GLWorldScene::bondRemoved(const atomId_t leftnr, const atomId_t rightnr)
     346{
     347  LOG(3, "INFO: GLWorldScene::bondRemoved() - Removing bond between "+toString(leftnr)+" and "+toString(rightnr)+".");
     348  {
     349    // left bond
     350    const BondIds Leftids( make_pair(leftnr, rightnr) );
     351    BondNodeMap::iterator leftiter = BondsinSceneMap.find( Leftids );
     352    ASSERT(leftiter != BondsinSceneMap.end(),
     353        "GLWorldScene::bondRemoved() - bond "+toString(leftnr)+"-"
     354        +toString(rightnr)+" not on display.");
     355    GLMoleculeObject_bond *bondObject = leftiter->second;
     356    BondsinSceneMap.erase(leftiter);
     357    delete bondObject; // is done by signal from bond itself
     358    //LOG(4, "INFO: Still present bonds " << BondsinSceneMap << ".");
     359  }
     360
     361  emit changeOccured();
     362}
     363
     364/** Adds a shape to the scene.
     365 *
     366 * uses ShapeRegistry::lastChanged()
     367 *
     368 */
     369void GLWorldScene::addShape()
     370{
     371  Shape &shape = *ShapeRegistry::getInstance().lastChanged();
     372  GLMoleculeObject_shape *shapeObject = new GLMoleculeObject_shape(shape, this);
     373  ShapeNodeMap::iterator iter = ShapesinSceneMap.find(shape.getName());
     374  ASSERT(iter == ShapesinSceneMap.end(),
     375      "GLWorldScene::addShape() - same shape "+shape.getName()+" added again.");
     376  ShapesinSceneMap.insert( make_pair(shape.getName(), shapeObject) );
     377}
     378
     379void GLWorldScene::removeShape()
     380{
     381  Shape &shape = *ShapeRegistry::getInstance().lastChanged();
     382  ShapeNodeMap::iterator iter = ShapesinSceneMap.find(shape.getName());
     383  ASSERT(iter != ShapesinSceneMap.end(),
     384      "GLWorldScene::removeShape() - shape "+shape.getName()+" not in scene.");
     385  ShapesinSceneMap.erase(iter);
     386  delete(iter->second);
     387}
     388
     389void GLWorldScene::updateSelectedShapes()
     390{
     391  foreach (QObject *obj, children()) {
     392    GLMoleculeObject_shape *shapeobj = qobject_cast<GLMoleculeObject_shape *>(obj);
     393      if (shapeobj){
     394        shapeobj->enable(ShapeRegistry::getInstance().isSelected(shapeobj->getShape()));
     395      }
     396  }
     397}
     398
     399void GLWorldScene::initialize(QGLView *view, QGLPainter *painter) const
     400{
     401  // Initialize all of the mesh objects that we have as children.
     402   foreach (QObject *obj, children()) {
     403     GLMoleculeObject *meshobj = qobject_cast<GLMoleculeObject *>(obj);
     404       if (meshobj)
     405         meshobj->initialize(view, painter);
     406   }
     407}
     408
     409void GLWorldScene::draw(QGLPainter *painter, const QVector4D &cameraPlane) const
     410{
     411   // Draw all of the mesh objects that we have as children.
     412   foreach (QObject *obj, children()) {
     413     GLMoleculeObject *meshobj = qobject_cast<GLMoleculeObject *>(obj);
     414       if (meshobj)
     415         meshobj->draw(painter, cameraPlane);
     416   }
    138417}
    139418
    140419void GLWorldScene::atomClicked(atomId_t no)
    141420{
    142    LOG(3, "INFO: GLMoleculeObject_molecule - atom " << no << " has been clicked.");
     421   LOG(3, "INFO: GLWorldScene - atom " << no << " has been clicked.");
    143422   const atom *Walker = World::getInstance().getAtom(AtomById(no));
    144423   if (selectionMode == SelectAtom){
     
    150429     const molecule *mol = Walker->getMolecule();
    151430     ASSERT(mol, "Atom without molecule has been clicked.");
    152      molids_t ids(1, mol->getId());
    153431     if (!World::getInstance().isSelected(mol))
    154        SelectionMoleculeById(ids);
     432       SelectionMoleculeById(mol->getId());
    155433     else
    156        SelectionNotMoleculeById(ids);
     434       SelectionNotMoleculeById(mol->getId());
    157435   }
    158436   emit clicked(no);
    159437}
    160438
    161 void GLWorldScene::moleculeClicked(moleculeId_t no)
    162 {
    163    LOG(3, "INFO: GLMoleculeObject_molecule - mol " << no << " has been clicked.");
    164    const molecule *mol= World::getInstance().getMolecule(MoleculeById(no));
    165    ASSERT(mol, "Atom without molecule has been clicked.");
    166    molids_t ids(1, mol->getId());
    167    if (!World::getInstance().isSelected(mol))
    168      SelectionMoleculeById(ids);
    169    else
    170      SelectionNotMoleculeById(ids);
    171    emit clicked(no);
    172 }
    173 
    174 
    175 /** Adds an atom to the scene.
    176  *
    177  * @param _atom atom to add
    178  */
    179 void GLWorldScene::atomInserted(const atomId_t _id)
    180 {
    181   LOG(3, "INFO: GLWorldScene: Received signal atomInserted for atom "+toString(_id)+".");
    182   // find associated molecule
    183   const moleculeId_t molid = World::getInstance().getAtom(AtomById(_id))->getMolecule()->getId();
    184   MoleculeNodeMap::const_iterator moliter = MoleculesinSceneMap.find(molid );
    185   ASSERT(moliter != MoleculesinSceneMap.end(),
    186       "GLWorldScene::atomAdded() - molecule with id of "+toString(molid)
    187       +" atom with id "+toString(_id)+" is unknown.");
    188   GLMoleculeObject_molecule *molObject = moliter->second;
    189 
    190   // add atom to internal list
    191 #ifndef NDEBUG
    192   AtomMoleculeMap::const_iterator atomiter = AtomsinSceneMap.find(_id);
    193     ASSERT(atomiter == AtomsinSceneMap.end(),
    194         "GLWorldScene::atomRemoved() - atom "+toString(_id)+" already known.");
    195 #endif
    196   AtomsinSceneMap.insert( std::make_pair( _id, molObject ));
    197 
    198   // inform its GlMoleculeObject_molecule.
    199   molObject->atomInserted(_id);
    200 
    201   // emit change
    202   emit changeOccured();
    203 }
    204 
    205 /** Removes an atom from the scene.
    206  *
    207  * We just the id as the atom might have already been destroyed.
    208  *
    209  * @param _id id of atom to remove
    210  */
    211 void GLWorldScene::atomRemoved(const atomId_t _id)
    212 {
    213   LOG(3, "INFO: GLWorldScene: Received signal atomRemoved for atom "+toString(_id)+".");
    214   // find associated molecule
    215   AtomMoleculeMap::iterator iter = AtomsinSceneMap.find(_id);
    216   ASSERT(iter != AtomsinSceneMap.end(),
    217       "GLWorldScene::atomRemoved() - atom "+toString(_id)+" not on display.");
    218   GLMoleculeObject_molecule *molObject = iter->second;
    219 
    220   // remove from internal list
    221   AtomsinSceneMap.erase(iter);
    222 
    223   // inform its GlMoleculeObject_molecule.
    224   molObject->atomRemoved(_id);
    225 
    226   // emit change
    227   emit changeOccured();
    228 }
    229 
    230 /** ....
    231  *
    232  */
    233 void GLWorldScene::worldSelectionChanged()
    234 {
    235   LOG(3, "INFO: GLWorldScene: Received signal selectionChanged.");
    236 
    237   const std::vector<molecule*> &molecules = World::getInstance().getAllMolecules();
    238 
    239   if (molecules.size() > 0) {
    240     for (std::vector<molecule*>::const_iterator Runner = molecules.begin();
    241         Runner != molecules.end();
    242         Runner++) {
    243 
    244       // molecule selected but not in scene?
    245       const bool isSelected = World::getInstance().isSelected(*Runner);
    246       if (isSelected){
    247         MoleculeNodeMap::iterator iter = MoleculesinSceneMap.find((*Runner)->getId());
    248         ASSERT( iter != MoleculesinSceneMap.end(),
    249             "GLWorldScene::worldSelectionChanged() - selected molecule is unknown.");
    250         GLMoleculeObject_molecule *molObject = iter->second;
    251         // inform molecule object
    252         molObject->selected(isSelected);
    253       }
    254     }
    255   }
    256 }
    257 
    258 /** Inserts a molecule into the scene.
    259  *
    260  * @param _mol molecule to insert
    261  */
    262 void GLWorldScene::moleculeInserted(const molecule * _mol)
    263 {
    264   LOG(3, "INFO: GLWorldScene: Received signal moleculeRemoved for molecule "+toString(_mol->getId())+".");
    265   MoleculeNodeMap::const_iterator iter = MoleculesinSceneMap.find(_mol->getId());
    266   ASSERT( iter == MoleculesinSceneMap.end(),
    267       "GLWorldScene::moleculeInserted() - molecule's id "+toString(_mol->getId())+" already present.");
    268 
    269   // add new object
    270   GLMoleculeObject_molecule *molObject = new GLMoleculeObject_molecule(GLMoleculeObject::meshEmpty, this, _mol);
    271   MoleculesinSceneMap.insert( make_pair(_mol->getId(), molObject) );
    272   connect (molObject, SIGNAL(changed()), this, SIGNAL(changed()));
    273   connect (molObject, SIGNAL(changeOccured()), this, SIGNAL(changeOccured()));
    274   connect (molObject, SIGNAL(atomClicked(atomId_t)), this, SLOT(atomClicked(atomId_t)));
    275   connect (molObject, SIGNAL(moleculeClicked(moleculeId_t)), this, SLOT(moleculeClicked(moleculeId_t)));
    276   connect (molObject, SIGNAL(changeAtomId(GLMoleculeObject_atom *, int, int)), this, SLOT(changeAtomId(GLMoleculeObject_atom *, int, int)));
    277   connect (molObject, SIGNAL(selectionChanged()), this, SIGNAL(changed()));
    278   connect (molObject, SIGNAL(selectionChanged()), this, SIGNAL(changed()));
    279   connect (molObject, SIGNAL(hoverChanged(const atom &)), this, SIGNAL(hoverChanged(const atom &)));
    280   connect (molObject, SIGNAL(hoverChanged(const molecule &, int)), this, SIGNAL(hoverChanged(const molecule &, int)));
    281   emit changed();
    282   emit changeOccured();
    283 }
    284 
    285 /** Removes a molecule from the scene.
    286  *
    287  * @param _id id of molecule to remove
    288  */
    289 void GLWorldScene::moleculeRemoved(const moleculeId_t _id)
    290 {
    291   LOG(3, "INFO: GLWorldScene: Received signal moleculeRemoved for molecule "+toString(_id)+".");
    292   MoleculeNodeMap::iterator iter = MoleculesinSceneMap.find(_id);
    293   ASSERT( iter != MoleculesinSceneMap.end(),
    294       "GLWorldScene::moleculeInserted() - molecule's id "+toString(_id)+" is unknown.");
    295 
    296   GLMoleculeObject_molecule *molObject = iter->second;
    297   molObject->disconnect();
    298   MoleculesinSceneMap.erase(iter);
    299   delete molObject;
    300   emit changed();
    301   emit changeOccured();
    302 }
    303 
    304 void GLWorldScene::moleculesVisibilityChanged(const moleculeId_t _id, bool _visible)
    305 {
    306   MoleculeNodeMap::iterator iter = MoleculesinSceneMap.find(_id);
    307   ASSERT( iter != MoleculesinSceneMap.end(),
    308       "GLWorldScene::moleculeInserted() - molecule's id "+toString(_id)+" is unknown.");
    309 
    310   GLMoleculeObject_molecule *molObject = iter->second;
    311   molObject->setVisible(_visible);
    312 
    313   emit changed();
    314   emit changeOccured();
    315 }
    316 
    317 /** Adds a bond to the scene.
    318  *
    319  * @param _bond bond to add
    320  * @param side which side of the bond (left or right)
    321  */
    322 void GLWorldScene::bondInserted(const bond::ptr _bond, const enum GLMoleculeObject_bond::SideOfBond _side)
    323 {
    324   LOG(3, "INFO: GLWorldScene::bondInserted() - Adding bond "+toString(*_bond)+".");
    325   //LOG(4, "INFO: Currently present bonds " << BondsinSceneMap << ".");
    326   // bond partners must both belong to same atom
    327   ASSERT( _bond->leftatom->getMolecule() == _bond->rightatom->getMolecule(),
    328       "GLWorldScene::bondInserted() - bond partners do not belong to same molecule.");
    329 
    330   // find associated molecule object
    331   const moleculeId_t molid = _bond->leftatom->getMolecule()->getId();
    332   MoleculeNodeMap::const_iterator moliter = MoleculesinSceneMap.find(molid );
    333   ASSERT(moliter != MoleculesinSceneMap.end(),
    334       "GLWorldScene::bondInserted() - molecule with id of "+toString(molid)
    335       +" atom with id "+toString(_bond->leftatom->getId())+" is unknown.");
    336   GLMoleculeObject_molecule *molObject = moliter->second;
    337 
    338   // add to internal list
    339   const GLMoleculeObject_molecule::BondIds ids =
    340       GLMoleculeObject_molecule::getBondIds(_bond, _side);
    341   BondMoleculeMap::const_iterator iter = BondsinSceneMap.find(ids);
    342   ASSERT(iter == BondsinSceneMap.end(),
    343       "GLWorldScene::bondInserted() - bond with ids "+toString(ids.first)
    344       +","+toString(ids.second)+" already present.");
    345   BondsinSceneMap.insert( std::make_pair( ids, molObject ));
    346 
    347   // inform its GlMoleculeObject_molecule.
    348   molObject->bondInserted(_bond, _side);
    349 
    350   // emit change
    351   emit changeOccured();
    352 }
    353 
    354 /** Removes a bond from the scene.
    355  *
    356  * @param _bond bond to remove
    357  */
    358 void GLWorldScene::bondRemoved(const atomId_t leftnr, const atomId_t rightnr)
    359 {
    360   LOG(3, "INFO: GLWorldScene::bondRemoved() - Removing bond between "+toString(leftnr)+" and "+toString(rightnr)+".");
    361   {
    362     // left bond
    363     const GLMoleculeObject_molecule::BondIds Leftids( make_pair(leftnr, rightnr) );
    364     BondMoleculeMap::iterator leftiter = BondsinSceneMap.find( Leftids );
    365     ASSERT(leftiter != BondsinSceneMap.end(),
    366         "GLWorldScene::bondRemoved() - bond "+toString(leftnr)+"-"
    367         +toString(rightnr)+" not on display.");
    368     GLMoleculeObject_molecule *molObject = leftiter->second;
    369 
    370     // remove from internal list
    371     BondsinSceneMap.erase(leftiter);
    372 
    373     // inform its GlMoleculeObject_molecule.
    374     molObject->bondRemoved( leftnr, rightnr );
    375   }
    376 
    377   // emit change
    378   emit changeOccured();
    379 }
    380 
    381 /** Adds a shape to the scene.
    382  *
    383  * uses ShapeRegistry::lastChanged()
    384  *
    385  */
    386 void GLWorldScene::addShape()
    387 {
    388   Shape &shape = *ShapeRegistry::getInstance().lastChanged();
    389   GLMoleculeObject_shape *shapeObject = new GLMoleculeObject_shape(shape, this);
    390   ShapeNodeMap::iterator iter = ShapesinSceneMap.find(shape.getName());
    391   ASSERT(iter == ShapesinSceneMap.end(),
    392       "GLWorldScene::addShape() - same shape "+shape.getName()+" added again.");
    393   ShapesinSceneMap.insert( make_pair(shape.getName(), shapeObject) );
    394 }
    395 
    396 void GLWorldScene::removeShape()
    397 {
    398   Shape &shape = *ShapeRegistry::getInstance().lastChanged();
    399   ShapeNodeMap::iterator iter = ShapesinSceneMap.find(shape.getName());
    400   ASSERT(iter != ShapesinSceneMap.end(),
    401       "GLWorldScene::removeShape() - shape "+shape.getName()+" not in scene.");
    402   ShapesinSceneMap.erase(iter);
    403   delete(iter->second);
    404 }
    405 
    406 void GLWorldScene::updateSelectedShapes()
    407 {
    408   foreach (QObject *obj, children()) {
    409     GLMoleculeObject_shape *shapeobj = qobject_cast<GLMoleculeObject_shape *>(obj);
    410       if (shapeobj){
    411         shapeobj->enable(ShapeRegistry::getInstance().isSelected(shapeobj->getShape()));
    412       }
    413   }
    414 }
    415 
    416 void GLWorldScene::initialize(QGLView *view, QGLPainter *painter) const
    417 {
    418   // Initialize all of the mesh objects that we have as children.
    419    foreach (QObject *obj, children()) {
    420      GLMoleculeObject *meshobj = qobject_cast<GLMoleculeObject *>(obj);
    421        if (meshobj)
    422          meshobj->initialize(view, painter);
    423    }
    424 }
    425 
    426 void GLWorldScene::draw(QGLPainter *painter, const QVector4D &cameraPlane) const
    427 {
    428    // Draw all of the mesh objects that we have as children.
    429    foreach (QObject *obj, children()) {
    430      GLMoleculeObject *meshobj = qobject_cast<GLMoleculeObject *>(obj);
    431        if (meshobj)
    432          meshobj->draw(painter, cameraPlane);
    433    }
    434 }
    435 
    436439void GLWorldScene::setSelectionMode(SelectionModeType mode)
    437440{
     
    450453}
    451454
     455void GLWorldScene::hoverChangedSignalled(GLMoleculeObject *ob)
     456{
     457  // Find the atom, ob corresponds to.
     458  hoverAtom = NULL;
     459  GLMoleculeObject_atom *atomObject = dynamic_cast<GLMoleculeObject_atom *>(ob);
     460  if (atomObject){
     461    for (AtomNodeMap::iterator iter = AtomsinSceneMap.begin();iter != AtomsinSceneMap.end(); ++ iter){
     462      if (iter->second == atomObject)
     463        hoverAtom = World::getInstance().getAtom(AtomById(iter->first));
     464    }
     465  }
     466
     467  // Propagate signal.
     468  emit hoverChanged(hoverAtom);
     469}
     470
    452471void GLWorldScene::changeAtomId(GLMoleculeObject_atom *ob, int oldId, int newId)
    453472{
    454473  LOG(3, "INFO: GLWorldScene - change atom id " << oldId << " to " << newId << ".");
    455474  // Remove from map.
    456   AtomMoleculeMap::iterator iter = AtomsinSceneMap.find(oldId);
     475  AtomNodeMap::iterator iter = AtomsinSceneMap.find(oldId);
    457476  ASSERT(iter != AtomsinSceneMap.end(),
    458         "GLWorldScene::changeAtomId() - atom with old id "+toString(oldId)+" not on display.");
    459   GLMoleculeObject_molecule *molObject = iter->second;
    460 
    461   // erase by signalling removal
    462   molObject->atomRemoved(oldId);
    463 
    464   // remove from internal list
     477        "GLWorldScene::objectIdChangedSignalled() - atom with id "+toString(oldId)+" not on display.");
     478  GLMoleculeObject_atom *atomObject = iter->second;
    465479  AtomsinSceneMap.erase(iter);
    466480
    467481  // Reinsert with new id.
    468   {
    469     AtomMoleculeMap::iterator iter = AtomsinSceneMap.find(newId);
    470     ASSERT(iter == AtomsinSceneMap.end(),
    471           "GLWorldScene::changeAtomId() - atom with new id "+toString(newId)+" already known.");
    472   }
    473   AtomsinSceneMap.insert( make_pair(newId, molObject) );
    474 
    475   // inform molecule object
    476   molObject->atomInserted(oldId);
    477 }
     482  AtomsinSceneMap.insert( make_pair(newId, atomObject) );
     483}
     484
Note: See TracChangeset for help on using the changeset viewer.