Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/UIElements/Views/Qt4/QtWorldView.cpp

    r0aa122 ra39006  
    2828#include "molecule.hpp"
    2929#include "MoleculeListClass.hpp"
     30#include "Actions/SelectionAction/Molecules/MoleculeByIdAction.hpp"
     31#include "Actions/SelectionAction/Molecules/NotMoleculeByIdAction.hpp"
    3032
    3133using namespace std;
     
    3638// these attributes are skiped so far
    3739const int QtWorldView::COLUMNCOUNT = COLUMNTYPES_MAX;
    38 const char *QtWorldView::COLUMNNAMES[QtWorldView::COLUMNCOUNT]={"Name","Atoms","Formula"/*,"Size"*/};
     40const char *QtWorldView::COLUMNNAMES[QtWorldView::COLUMNCOUNT]={"Name","Atoms","Formula","Occurrence"/*,"Size"*/};
    3941
    4042QtWorldView::QtWorldView(QWidget * _parent) :
    41   QTableWidget (_parent),
     43  QTreeWidget (_parent),
    4244  Observer("QtWorldView")
    4345{
    44   setRowCount(0);
    4546  setColumnCount(COLUMNCOUNT);
     47  setSelectionMode(QAbstractItemView::MultiSelection);
    4648
    47   for(int i=0; i<COLUMNCOUNT;++i) {
    48     QTableWidgetItem *heading = new QTableWidgetItem();
    49     std::cout << "Creating heading item " << heading << "." << std::endl;
    50     heading->setText(QString(COLUMNNAMES[i]));
    51     setHorizontalHeaderItem(i,heading);
    52   }
     49  QStringList header;
     50  for(int i=0; i<COLUMNCOUNT;++i)
     51    header << COLUMNNAMES[i];
     52  setHeaderLabels(header);
    5353
    5454  molecules = World::getInstance().getMolecules();
    5555  molecules->signOn(this);
    56   update(molecules);
    5756
    58   connect(this,SIGNAL(cellChanged(int,int)),this,SLOT(moleculeChanged(int,int)));
    59   connect(this,SIGNAL(cellClicked(int,int)),this,SLOT(cellSelected(int,int)));
     57  dirty = true;
     58  refill();
     59
     60  //connect(this,SIGNAL(cellChanged(int,int)),this,SLOT(moleculeChanged(int,int)));
     61  connect(this,SIGNAL(itemSelectionChanged()),this,SLOT(rowSelected()));
    6062
    6163}
     
    6769
    6870void QtWorldView::update(Observable *publisher) {
     71
     72  dirty = true;
     73
     74  // force an update from Qt...
     75  clear();
     76}
     77
     78void QtWorldView::refill() {
    6979  int numMolecules = molecules->ListOfMolecules.size();
    70   setRowCount(numMolecules);
     80  clear();
    7181  molSelection.resize(numMolecules);
     82
     83  // list of (unique) formulas in the world
     84  std::vector<Formula> formula;
     85
    7286  int i;
    7387  MoleculeList::iterator iter;
     
    7690      ++i,++iter) {
    7791
     92    // find group if already in list
     93    QTreeWidgetItem *groupItem = NULL;
     94    for (unsigned int j=0;j<formula.size();j++)
     95      if ((*iter)->getFormula() == formula[j]){
     96        groupItem = topLevelItem(j);
     97        break;
     98      }
     99
     100    // new molecule type -> create new group
     101    if (!groupItem){
     102      formula.push_back((*iter)->getFormula());
     103      groupItem = new QTreeWidgetItem(this);
     104      groupItem->setText(0, QString((*iter)->getName().c_str()));
     105      groupItem->setText(1, QString::number((*iter)->getAtomCount()));
     106      groupItem->setText(2, QString((*iter)->getFormula().toString().c_str()));
     107      groupItem->setText(3, "0");
     108    }
     109
     110    // add molecule
     111    QTreeWidgetItem *molItem = new QTreeWidgetItem(groupItem);
     112    molItem->setText(0, QString((*iter)->getName().c_str()));
     113    molItem->setText(1, QString::number((*iter)->getAtomCount()));
     114    molItem->setText(2, QString((*iter)->getFormula().toString().c_str()));
    78115    const int index = (*iter)->IndexNr;
    79     QTableWidgetItem *indexWidget = new QTableWidgetItem();
    80     //std::cout << "Creating index item " << indexWidget << "." << std::endl;
    81     indexWidget->setText(QString::number(index));
    82     indexWidget->setData(Qt::UserRole,QVariant(index));
    83     setVerticalHeaderItem(i,indexWidget);
     116    molItem->setData(0, Qt::UserRole, QVariant(index));
     117    molItem->setSelected(World::getInstance().isSelected(*iter));
    84118
    85     const string name = (*iter)->getName();
    86     QTableWidgetItem *nameWidget = new QTableWidgetItem();
    87     //std::cout << "Creating name item " << nameWidget << " at " << i << "," << NAME << "." << std::endl;
    88     nameWidget->setText(QString(name.c_str()));
    89     setItem(i,NAME,nameWidget);
    90119
    91     const int atomCount = (*iter)->getAtomCount();
    92     QTableWidgetItem *countWidget= new QTableWidgetItem();
    93     //std::cout << "Creating count item " << countWidget << " at " << i << "," << ATOMCOUNT << "." << std::endl;
    94     countWidget->setText(QString::number(atomCount));
    95     countWidget->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
    96     setItem(i,ATOMCOUNT,countWidget);
     120    // increase group occurrence
     121    int count = groupItem->text(3).toInt() + 1;
     122    groupItem->setText(3, QString::number(count));
    97123
    98     const Formula formula = (*iter)->getFormula();
    99     QTableWidgetItem *formulaWidget= new QTableWidgetItem();
    100     //std::cout << "Creating formula item " << formulaWidget << " at " << i << "," << FORMULA << "." << std::endl;
    101     formulaWidget->setText(QString(formula.toString().c_str()));
    102     formulaWidget->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
    103     setItem(i,FORMULA,formulaWidget);
     124    //molSelection[i]=nameWidget->isSelected();
     125  }
     126  dirty = false;
     127}
    104128
    105     molSelection[i]=nameWidget->isSelected();
    106   }
     129void QtWorldView::paintEvent(QPaintEvent * event)
     130{
     131  if (dirty)
     132    refill();
     133  QTreeWidget::paintEvent(event);
    107134}
    108135
     
    110137}
    111138
    112 void QtWorldView::moleculeChanged(int row, int column) {
    113   int idx = verticalHeaderItem(row)->data(Qt::UserRole).toInt();
     139void QtWorldView::moleculeChanged() {
     140  /*int idx = verticalHeaderItem(row)->data(Qt::UserRole).toInt();
    114141  molecule *mol = molecules->ReturnIndex(idx);
    115142  string cellValue = item(row,NAME)->text().toStdString();
     
    119146  else if(cellValue==""){
    120147    item(row,NAME)->setText(QString(mol->getName().c_str()));
    121   }
     148  }*/
    122149}
    123150
    124151
    125 void QtWorldView::cellSelected(int row, int column){
    126   //std::cout << "Selection in (" << row << "," << column << "): " << item(row,column) << std::endl;
    127   bool state = item(row,column)->isSelected();
    128   for(int i = 0; i<COLUMNCOUNT; i++){
    129     //std::cout << "Setting " << i << "-th item " << item(row,i) << " in row " << row << " to state selected." << std::endl;
    130     item(row,i)->setSelected(state);
    131   }
    132   // figure out which rows have changed
    133   for(int i=0; i<rowCount();++i){
    134     state = item(i,0)->isSelected();
    135     if(molSelection[i]!=state){
    136       int idx = verticalHeaderItem(i)->data(Qt::UserRole).toInt();
    137       molecule *mol = molecules->ReturnIndex(idx);
    138       if(state){
    139         emit moleculeSelected(mol);
     152void QtWorldView::rowSelected(){
     153
     154  // lookup all molecules in the treeWidget
     155  for (int i=0;i<topLevelItemCount();i++){
     156    QTreeWidgetItem *top = topLevelItem(i);
     157    for (int j=0;j<top->childCount();j++){
     158
     159      // molecules are 1 level below the top
     160      QTreeWidgetItem *molItem = top->child(j);
     161
     162      // molecule index stored as user data
     163      int index = molItem->data(0, Qt::UserRole).toInt();
     164      molecule *mol = molecules->ReturnIndex(index);
     165      ASSERT(mol, "QtWorldView::rowSelected()");
     166
     167      // selection changed by user?
     168      bool molSelectedWorld = World::getInstance().isSelected(mol);
     169      bool molSelectedList = molItem->isSelected();
     170      //std::cout << molSelectedWorld << " " << molSelectedList << std::endl;
     171
     172      if (molSelectedWorld != molSelectedList){
     173
     174        // apply new selection state
     175        if (molSelectedList){
     176          //std::cout << "select molecule" << std::endl;
     177          MoleCuilder::SelectionMoleculeById(mol->getId());
     178        }else{
     179          //std::cout << "unselect molecule" << std::endl;
     180          MoleCuilder::SelectionNotMoleculeById(mol->getId());
     181        }
    140182      }
    141       else{
    142         emit moleculeUnSelected(mol);
    143       }
    144       molSelection[i]=state;
    145183    }
    146184  }
Note: See TracChangeset for help on using the changeset viewer.