#include "dccontainer.h"
#include "utils/dcresources.h"
#include "utils/dcqtitemmodel.h"
+#include "utils/dcutil.h"
#include <QGridLayout>
#include <QLineEdit>
#include <QSizePolicy>
#include <QIcon>
+class ReceptorModel : public DCQtItemModel
+{
+ DCToolWindowCellEditor *d_owner;
+public:
+ ReceptorModel(DCToolWindowCellEditor *owner) : DCQtItemModel(QStringList("name")), d_owner(owner)
+ {
+
+ }
+
+ virtual ~ReceptorModel()
+ {
+ }
+
+ virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)
+ {
+ if (role != Qt::EditRole)
+ return false;
+
+ DCCell *cell = d_owner->getCell();
+ if (!cell)
+ return false;
+
+ DCQtItemModelItem *item = getItem(index);
+ QString oldReceptorName = item->data(index.column()).toString();
+ QString newReceptorName = value.toString().trimmed();
+ if (newReceptorName.length() == 0)
+ {
+ return false;
+ }
+
+ if (oldReceptorName == newReceptorName)
+ {
+ //nothing actually changes
+ return false;
+ }
+
+ if (!d_owner->getIsViewUpdating())
+ {
+ if (cell->getReceptor(newReceptorName))
+ {
+ //already exist
+ QMessageBox::warning(NULL, tr("Rename receptor failed"), tr("The receptor name already exist"));
+ return false;
+ }
+
+ bool result = item->setData(index.column(), newReceptorName);
+
+ if (result)
+ {
+ DCCreator *creator = d_owner->getController();
+ if (creator->doCommandRenameReceptorName(d_owner, cell, oldReceptorName, newReceptorName, true))
+ {
+ emit dataChanged(index, index);
+ }
+ else
+ {
+ item->setData(index.column(), oldReceptorName);
+ }
+ }
+ return result;
+ }
+ else
+ {
+ return item->setData(index.column(), newReceptorName);
+ }
+ }
+
+ virtual Qt::ItemFlags flags(const QModelIndex &index) const
+ {
+ if (!index.isValid())
+ return 0;
+
+ Qt::ItemFlags flags = Qt::ItemIsEnabled;
+
+ if (index.column() == 0 && index.isValid() && index.parent().isValid() && !index.parent().parent().isValid())
+ {
+ flags |= Qt::ItemIsEditable | Qt::ItemIsSelectable;
+ }
+
+ return flags;
+ }
+};
+
+class AxonTerminalModel : public DCQtItemModel
+{
+ DCToolWindowCellEditor *d_owner;
+public:
+ AxonTerminalModel(DCToolWindowCellEditor *owner) : DCQtItemModel(QStringList("name")), d_owner(owner)
+ {
+
+ }
+
+ virtual ~AxonTerminalModel()
+ {
+ }
+
+ virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)
+ {
+ if (role != Qt::EditRole)
+ return false;
+
+ DCCell *cell = d_owner->getCell();
+ if (!cell)
+ return false;
+
+ DCQtItemModelItem *item = getItem(index);
+ QString oldReceptorName = item->data(index.column()).toString();
+ QString newReceptorName = value.toString().trimmed();
+ if (newReceptorName.length() == 0)
+ {
+ return false;
+ }
+
+ if (oldReceptorName == newReceptorName)
+ {
+ //nothing actually changes
+ return false;
+ }
+
+ DCCell *axonTargetCell = NULL;
+ if (!d_owner->getIsViewUpdating())
+ {
+ bool alreadyExist = false;
+ DCAxon *axon = cell->getAxon();
+ int num = axon->getNumberOfTerminals();
+ for (int i = 0; i < num; i++)
+ {
+ DCReceptor *receptor = dynamic_cast<DCReceptor*>(axon->getTerminalAt(i)->getTarget());
+ if (receptor)
+ {
+ DCCell *targetCell = dynamic_cast<DCCell*>(receptor->getOwnerCell());
+ if (targetCell)
+ {
+ QString targetReceptorName = QString::fromStdString(targetCell->getReceptorName(receptor));
+ if (targetReceptorName == newReceptorName)
+ {
+ alreadyExist = true;
+ break;
+ }
+ else if (targetReceptorName == oldReceptorName)
+ {
+ axonTargetCell = targetCell;
+ }
+ }
+ }
+ }
+
+ if (alreadyExist)
+ {
+ QMessageBox::warning(NULL, tr("Rename receptor failed"), tr("The receptor name already exist"));
+ return false;
+ }
+
+ bool result = false;
+
+ if (axonTargetCell)
+ {
+ result = item->setData(index.column(), newReceptorName);
+
+ if (result)
+ {
+ DCCreator *creator = d_owner->getController();
+ if (creator->doCommandRenameReceptorName(d_owner, axonTargetCell, oldReceptorName, newReceptorName, true))
+ {
+ emit dataChanged(index, index);
+ }
+ else
+ {
+ item->setData(index.column(), oldReceptorName);
+ }
+ }
+ }
+ return result;
+ }
+ else
+ {
+ return item->setData(index.column(), newReceptorName);
+ }
+ }
+
+ virtual Qt::ItemFlags flags(const QModelIndex &index) const
+ {
+ if (!index.isValid())
+ return 0;
+
+ Qt::ItemFlags flags = Qt::ItemIsEnabled;
+
+ if (index.column() == 0 && index.isValid() && index.parent().isValid() && index.parent().parent().isValid() && !index.parent().parent().parent().isValid())
+ {
+ flags |= Qt::ItemIsEditable | Qt::ItemIsSelectable;
+ }
+
+ return flags;
+ }
+
+};
+
DCToolWindowCellEditor::DCToolWindowCellEditor(DCCreator *creator) :
- DCToolWindowBase("CELL:", creator), d_cell(NULL)
+ DCToolWindowBase("CELL:", creator), d_cell(NULL), d_isViewUpdating(false)
{
d_layout = new QGridLayout;
d_layout->setSpacing(6);
d_axonTerminals->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
- d_receptorItemModel = new DCQtItemModel(QStringList("name"));
- d_axonTerminalItemModel = new DCQtItemModel(QStringList("name"));
+ d_receptorItemModel = new ReceptorModel(this);
+ d_axonTerminalItemModel = new AxonTerminalModel(this);
d_receptors->setModel(d_receptorItemModel);
d_axonTerminals->setModel(d_axonTerminalItemModel);
void DCToolWindowCellEditor::updateView()
{
+ d_isViewUpdating = true;
d_receptorItemModel->removeAllItems();
d_axonTerminalItemModel->removeAllItems();
d_receptorItemModel->insertString("receptors");
d_receptorItemModel->insertColumns(1,2);
- d_receptorItemModel->setReadOnly(0,false);
d_receptorItemModel->setData(d_receptorItemModel->index(0,1), QVariant::fromValue(DCResources::addItemIcon()));
d_axonTerminalItemModel->insertString("axonTerminals");
d_axonTerminalItemModel->insertColumns(1,2);
- d_axonTerminalItemModel->setReadOnly(0,false);
d_axonTerminalItemModel->setData(d_axonTerminalItemModel->index(0,1), QVariant::fromValue(DCResources::addItemIcon()));
const TKReceptorMap *receptors = d_cell->getReceptors();
while( it != receptors->end())
{
- QString receptorName = QString::fromStdString((*it).first);
+ QString receptorName = QString::fromStdString((*it).first);
d_receptorItemModel->insertString(receptorName,rroot);
d_receptorItemModel->setData(rroot.child(i,2), QVariant::fromValue(DCResources::deleteItemIcon()));
+
+ TKReceptor *receptor = (*it).second;
+ TKAxonTerminal *terminal = receptor->getTarget();
+ if (terminal)
+ {
+ TKCell *targetCell = terminal->getOwner()->getOwner();
+ if (targetCell)
+ {
+ QString targetPath = DCUtil::getFQNPath(targetCell->getLocation(), targetCell->getName());
+ d_receptorItemModel->insertString(targetPath,rroot.child(i,0));
+ }
+ }
+
++it;
++i;
}
+ d_receptors->expand(rroot);
+ for (int i = 0; i < d_receptorItemModel->rowCount(rroot); i++)
+ {
+ QModelIndex index = rroot.child(i,0);
+ d_receptors->collapse(index);
+ if (d_receptorItemModel->rowCount(index) > 0)
+ {
+ d_receptors->collapse(index.child(0,0));
+ }
+ }
+
QModelIndex aroot = d_axonTerminalItemModel->index(0,0);
DCAxon *axon = d_cell->getAxon();
int acnt = axon->getNumberOfTerminals();
targetCell = dynamic_cast<DCCell*>(targetReceptor->getOwnerCell());
}
}
- QString axonTerminalName;
if (targetCell)
{
- QTextStream(&axonTerminalName)
- << QString::fromStdString(targetCell->getLocation())
- << "/"
- << QString::fromStdString(targetCell->getName())
- << "#"
- << QString::fromStdString(targetCell->getReceptorName(targetReceptor));
+ QString targetPath = DCUtil::getFQNPath(targetCell->getLocation(), targetCell->getName());
+ QString targetReceptorName = QString::fromStdString(targetCell->getReceptorName(targetReceptor));
+ d_axonTerminalItemModel->insertString(targetPath,aroot);
+ d_receptorItemModel->setData(aroot.child(i,2), QVariant::fromValue(DCResources::deleteItemIcon()));
+ d_axonTerminalItemModel->insertString(targetReceptorName,aroot.child(i,0));
}
else
{
- axonTerminalName = "-";
+ //TODO
}
+ }
- d_axonTerminalItemModel->insertString(axonTerminalName,aroot);
- d_receptorItemModel->setData(aroot.child(i,2), QVariant::fromValue(DCResources::deleteItemIcon()));
+ d_axonTerminals->expand(aroot);
+ for (int i = 0; i < d_axonTerminalItemModel->rowCount(aroot); i++)
+ {
+ QModelIndex index = aroot.child(i,0);
+ d_axonTerminals->collapse(index);
+ if (d_axonTerminalItemModel->rowCount(index) > 0)
+ {
+ d_axonTerminals->collapse(index.child(0,0));
+ }
}
- d_receptors->expandAll();
- d_axonTerminals->expandAll();
resizeView();
}
+ d_isViewUpdating = false;
}
void DCToolWindowCellEditor::slotReceptorTreeCollapsed(const QModelIndex &index)
{
setCell(NULL);
}
+