| [0e6156] | 1 | /*
 | 
|---|
 | 2 |  * Project: MoleCuilder
 | 
|---|
 | 3 |  * Description: creates and alters molecular systems
 | 
|---|
 | 4 |  * Copyright (C)  2010-2012 University of Bonn. All rights reserved.
 | 
|---|
 | 5 |  * Please see the LICENSE file or "Copyright notice" in builder.cpp for details.
 | 
|---|
 | 6 |  */
 | 
|---|
 | 7 | 
 | 
|---|
 | 8 | /*
 | 
|---|
 | 9 |  * QtElementList.cpp
 | 
|---|
 | 10 |  *
 | 
|---|
 | 11 |  *  Created on: Mar 6, 2012
 | 
|---|
 | 12 |  *      Author: ankele
 | 
|---|
 | 13 |  */
 | 
|---|
 | 14 | 
 | 
|---|
 | 15 | // include config.h
 | 
|---|
 | 16 | #ifdef HAVE_CONFIG_H
 | 
|---|
 | 17 | #include <config.h>
 | 
|---|
 | 18 | #endif
 | 
|---|
 | 19 | 
 | 
|---|
 | 20 | #include "Views/Qt4/QtElementList.hpp"
 | 
|---|
 | 21 | 
 | 
|---|
 | 22 | #include <iostream>
 | 
|---|
 | 23 | 
 | 
|---|
 | 24 | #include "CodePatterns/MemDebug.hpp"
 | 
|---|
 | 25 | 
 | 
|---|
 | 26 | #include "Atom/atom.hpp"
 | 
|---|
 | 27 | #include "Formula.hpp"
 | 
|---|
 | 28 | #include "molecule.hpp"
 | 
|---|
 | 29 | #include "MoleculeListClass.hpp"
 | 
|---|
 | 30 | 
 | 
|---|
 | 31 | #include "Element/element.hpp"
 | 
|---|
 | 32 | #include "Element/periodentafel.hpp"
 | 
|---|
| [59a28e] | 33 | #include "Descriptors/AtomTypeDescriptor.hpp"
 | 
|---|
 | 34 | #include <QAbstractItemView>
 | 
|---|
| [1de61e] | 35 | #include "Actions/SelectionAction/Atoms/AtomByElementAction.hpp"
 | 
|---|
 | 36 | #include "Actions/SelectionAction/Atoms/NotAtomByElementAction.hpp"
 | 
|---|
| [0e6156] | 37 | 
 | 
|---|
 | 38 | using namespace std;
 | 
|---|
 | 39 | 
 | 
|---|
 | 40 | const int QtElementList::COLUMNCOUNT = COLUMNTYPES_MAX;
 | 
|---|
| [59a28e] | 41 | const char *QtElementList::COLUMNNAMES[QtElementList::COLUMNCOUNT]={"Number","Name","Symbol","Mass","Occurrence"};
 | 
|---|
| [0e6156] | 42 | 
 | 
|---|
 | 43 | QtElementList::QtElementList(QWidget * _parent) :
 | 
|---|
| [f20fa5] | 44 |     QTreeWidget (_parent),
 | 
|---|
| [0e6156] | 45 |     Observer("QtElementList")
 | 
|---|
 | 46 | {
 | 
|---|
| [f20fa5] | 47 |   setColumnCount(COLUMNCOUNT);
 | 
|---|
| [59a28e] | 48 |   setSelectionMode(QAbstractItemView::MultiSelection);
 | 
|---|
| [0e6156] | 49 | 
 | 
|---|
| [f20fa5] | 50 |   QStringList header;
 | 
|---|
 | 51 |         for(int i=0; i<COLUMNCOUNT;++i)
 | 
|---|
 | 52 |           header << COLUMNNAMES[i];
 | 
|---|
 | 53 |         setHeaderLabels(header);
 | 
|---|
| [0e6156] | 54 | 
 | 
|---|
| [25b3559] | 55 |         dirty = true;
 | 
|---|
 | 56 |         refill();
 | 
|---|
| [818201] | 57 | 
 | 
|---|
| [0e6156] | 58 |         molecules = World::getInstance().getMolecules();
 | 
|---|
 | 59 |         molecules->signOn(this);
 | 
|---|
 | 60 | 
 | 
|---|
| [25b3559] | 61 |   connect(this,SIGNAL(itemSelectionChanged()),this,SLOT(rowSelected()));
 | 
|---|
 | 62 |   connect(this,SIGNAL(changed()),this,SLOT(update()));
 | 
|---|
| [59a28e] | 63 | }
 | 
|---|
 | 64 | 
 | 
|---|
 | 65 | QtElementList::~QtElementList()
 | 
|---|
 | 66 | {
 | 
|---|
 | 67 |         molecules->signOff(this);
 | 
|---|
 | 68 | }
 | 
|---|
 | 69 | 
 | 
|---|
 | 70 | void QtElementList::update(Observable *publisher) {
 | 
|---|
 | 71 | 
 | 
|---|
| [25b3559] | 72 |   dirty = true;
 | 
|---|
 | 73 | 
 | 
|---|
 | 74 |   // force an update from Qt...
 | 
|---|
 | 75 |   clear();
 | 
|---|
 | 76 |   //emit changed(); doesn't work!?!
 | 
|---|
 | 77 | }
 | 
|---|
 | 78 | 
 | 
|---|
 | 79 | void QtElementList::refill() {
 | 
|---|
 | 80 | 
 | 
|---|
| [0e6156] | 81 |   periodentafel *&periode = World::getInstance().getPeriode();
 | 
|---|
| [f20fa5] | 82 | 
 | 
|---|
| [1de61e] | 83 |   elementSelection.clear();
 | 
|---|
 | 84 | 
 | 
|---|
| [f20fa5] | 85 |   int i;
 | 
|---|
| [59a28e] | 86 | 
 | 
|---|
 | 87 |   clear();
 | 
|---|
| [f20fa5] | 88 |   periodentafel::const_iterator iter;
 | 
|---|
 | 89 |   for(iter = periode->begin(),i=0;
 | 
|---|
 | 90 |       iter != periode->end();
 | 
|---|
 | 91 |       ++i,++iter) {
 | 
|---|
 | 92 |     const element *e = iter->second;
 | 
|---|
| [59a28e] | 93 |     int count = 0;
 | 
|---|
 | 94 |     count = World::getInstance().getAllAtoms(AtomByType(e)).size();
 | 
|---|
| [f20fa5] | 95 | 
 | 
|---|
 | 96 |     QTreeWidgetItem *treeItem = new QTreeWidgetItem(this);
 | 
|---|
| [1de61e] | 97 |     treeItem->setText(NUMBER, QString::number(e->getAtomicNumber()));
 | 
|---|
 | 98 |     treeItem->setText(NAME, QString(e->getName().c_str()));
 | 
|---|
 | 99 |     treeItem->setText(SYMBOL, QString(e->getSymbol().c_str()));
 | 
|---|
 | 100 |     treeItem->setText(MASS, QString::number(e->getMass()));
 | 
|---|
| [59a28e] | 101 |     if (count > 0){
 | 
|---|
| [1de61e] | 102 |       treeItem->setText(OCCURRENCE, QString::number(count));
 | 
|---|
| [59a28e] | 103 |     }else{
 | 
|---|
| [1de61e] | 104 |       treeItem->setText(OCCURRENCE, "none");
 | 
|---|
| [59a28e] | 105 |       treeItem->setDisabled(true);
 | 
|---|
 | 106 |     }
 | 
|---|
| [1de61e] | 107 |     elementSelection.push_back(treeItem->isSelected());
 | 
|---|
| [0e6156] | 108 |   }
 | 
|---|
| [25b3559] | 109 |   dirty = false;
 | 
|---|
 | 110 | }
 | 
|---|
 | 111 | 
 | 
|---|
 | 112 | void QtElementList::paintEvent(QPaintEvent * event)
 | 
|---|
 | 113 | {
 | 
|---|
 | 114 |   if (dirty)
 | 
|---|
 | 115 |     refill();
 | 
|---|
 | 116 |   QTreeWidget::paintEvent(event);
 | 
|---|
| [0e6156] | 117 | }
 | 
|---|
 | 118 | 
 | 
|---|
 | 119 | void QtElementList::subjectKilled(Observable *publisher) {
 | 
|---|
 | 120 | }
 | 
|---|
 | 121 | 
 | 
|---|
 | 122 | 
 | 
|---|
| [1de61e] | 123 | void QtElementList::rowSelected()
 | 
|---|
| [0e6156] | 124 | {
 | 
|---|
| [1de61e] | 125 |   //std::cout << "rowSelected\n";
 | 
|---|
 | 126 |   periodentafel *&periode = World::getInstance().getPeriode();
 | 
|---|
 | 127 | 
 | 
|---|
 | 128 |   for (int i=0;i<topLevelItemCount();i++){
 | 
|---|
 | 129 |     QTreeWidgetItem *item = topLevelItem(i);
 | 
|---|
 | 130 |     bool newSelection = item->isSelected();
 | 
|---|
 | 131 |     if (newSelection != elementSelection[i]){
 | 
|---|
 | 132 |       elementSelection[i] = newSelection;
 | 
|---|
 | 133 | 
 | 
|---|
 | 134 |       int atomicNumber = item->text(NUMBER).toInt();
 | 
|---|
 | 135 |       const element *e = periode->FindElement(atomicNumber);
 | 
|---|
 | 136 |       if (newSelection)
 | 
|---|
 | 137 |         MoleCuilder::SelectionAtomByElement(e);
 | 
|---|
 | 138 |       else
 | 
|---|
 | 139 |         MoleCuilder::SelectionNotAtomByElement(e);
 | 
|---|
 | 140 |     }
 | 
|---|
 | 141 |   }
 | 
|---|
| [0e6156] | 142 | }
 | 
|---|
 | 143 | 
 | 
|---|