123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524 |
- #include "qCTKDCMTKModel.h"
- #include <QSqlQueryModel>
- #include <QStringList>
- struct Node
- {
- Node* Parent;
- int Row;
- int Column;
- };
- class qCTKDCMTKModelPrivate:public qCTKPrivate<qCTKDCMTKModel>
- {
- public:
- qCTKDCMTKModelPrivate();
- ~qCTKDCMTKModelPrivate();
- void init();
- enum IndexType{
- RootType,
- PatientType,
- StudyType,
- SeriesType,
- ImageType
- };
- IndexType indexType(const QModelIndex& index)const;
- void updateRootModel(const QModelIndex& index);
- void updatePatientModel(const QModelIndex& index);
- void updateStudyModel(const QModelIndex& index);
- void updateSeriesModel(const QModelIndex& index);
- QModelIndex indexInRootQuery(const QModelIndex& index)const;
- QModelIndex indexInPatientQuery(const QModelIndex& index)const;
- QModelIndex indexInStudyQuery(const QModelIndex& index)const;
- QModelIndex indexInSeriesQuery(const QModelIndex& index)const;
-
- QSqlDatabase DataBase;
- QSqlQueryModel* RootModel;
- QSqlQueryModel* PatientModel;
- QSqlQueryModel* StudyModel;
- QSqlQueryModel* SeriesModel;
- Node* RootNode;
- Node* PatientNode;
- Node* StudyNode;
- Node* SeriesNode;
- mutable QList<Node*> Nodes;
- };
- qCTKDCMTKModelPrivate::qCTKDCMTKModelPrivate()
- :DataBase(QSqlDatabase::addDatabase("QSQLITE"))
- {
- this->RootModel = 0;
- this->PatientModel = 0;
- this->StudyModel = 0;
- this->SeriesModel = 0;
- this->RootNode = 0;
- this->PatientNode = 0;
- this->StudyNode = 0;
- this->SeriesNode = 0;
- }
- qCTKDCMTKModelPrivate::~qCTKDCMTKModelPrivate()
- {
- foreach(Node* node, this->Nodes)
- {
- delete node;
- }
- this->Nodes.clear();
- }
- void qCTKDCMTKModelPrivate::init()
- {
- QCTK_P(qCTKDCMTKModel);
- this->RootModel = new QSqlQueryModel(p);
- this->PatientModel = new QSqlQueryModel(p);
- this->StudyModel = new QSqlQueryModel(p);
- this->SeriesModel = new QSqlQueryModel(p);
- QObject::connect(this->RootModel, SIGNAL(rowsAboutToBeInserted(const QModelIndex&, int, int)),
- p, SLOT(rootRowsAboutToBeInserted(const QModelIndex&, int, int)));
- QObject::connect(this->PatientModel, SIGNAL(rowsAboutToBeInserted(const QModelIndex&, int, int)),
- p, SLOT(patientRowsAboutToBeInserted(const QModelIndex&, int, int)));
- QObject::connect(this->StudyModel, SIGNAL(rowsAboutToBeInserted(const QModelIndex&, int, int)),
- p, SLOT(studyRowsAboutToBeInserted(const QModelIndex&, int, int)));
- QObject::connect(this->SeriesModel, SIGNAL(rowsAboutToBeInserted(const QModelIndex&, int, int)),
- p, SLOT(seriesRowsAboutToBeInserted(const QModelIndex&, int, int)));
- QObject::connect(this->RootModel, SIGNAL(rowsInserted(const QModelIndex&, int, int)),
- p, SLOT(rootRowsInserted(const QModelIndex&, int, int)));
- QObject::connect(this->PatientModel, SIGNAL(rowsInserted(const QModelIndex&, int, int)),
- p, SLOT(patientRowsInserted(const QModelIndex&, int, int)));
- QObject::connect(this->StudyModel, SIGNAL(rowsInserted(const QModelIndex&, int, int)),
- p, SLOT(studyRowsInserted(const QModelIndex&, int, int)));
- QObject::connect(this->SeriesModel, SIGNAL(rowsInserted(const QModelIndex&, int, int)),
- p, SLOT(seriesRowsInserted(const QModelIndex&, int, int)));
- QObject::connect(this->RootModel, SIGNAL(modelAboutToBeReset()),
- p, SLOT(onModelAboutToBeReset()));
- QObject::connect(this->PatientModel, SIGNAL(modelAboutToBeReset()),
- p, SLOT(onModelAboutToBeReset()));
- QObject::connect(this->StudyModel, SIGNAL(modelAboutToBeReset()),
- p, SLOT(onModelAboutToBeReset()));
- QObject::connect(this->SeriesModel, SIGNAL(modelAboutToBeReset()),
- p, SLOT(onModelAboutToBeReset()));
- QObject::connect(this->RootModel, SIGNAL(modelReset()),
- p, SLOT(onModelReset()));
- QObject::connect(this->PatientModel, SIGNAL(modelReset()),
- p, SLOT(onModelReset()));
- QObject::connect(this->StudyModel, SIGNAL(modelReset()),
- p, SLOT(onModelReset()));
- QObject::connect(this->SeriesModel, SIGNAL(modelReset()),
- p, SLOT(onModelReset()));
- QObject::connect(this->RootModel, SIGNAL(layoutAboutToBeChanged()),
- p, SLOT(onLayoutAboutToBeChanged()));
- QObject::connect(this->PatientModel, SIGNAL(layoutAboutToBeChanged()),
- p, SLOT(onLayoutAboutToBeChanged()));
- QObject::connect(this->StudyModel, SIGNAL(layoutAboutToBeChanged()),
- p, SLOT(onLayoutAboutToBeChanged()));
- QObject::connect(this->SeriesModel, SIGNAL(layoutAboutToBeChanged()),
- p, SLOT(onLayoutAboutToBeChanged()));
- QObject::connect(this->RootModel, SIGNAL(layoutChanged()),
- p, SLOT(onLayoutChanged()));
- QObject::connect(this->PatientModel, SIGNAL(layoutChanged()),
- p, SLOT(onLayoutChanged()));
- QObject::connect(this->StudyModel, SIGNAL(layoutChanged()),
- p, SLOT(onLayoutChanged()));
- QObject::connect(this->SeriesModel, SIGNAL(layoutChanged()),
- p, SLOT(onLayoutChanged()));
- this->RootNode = new Node;
- this->RootNode->Parent = 0;
- this->RootNode->Row = -1;
- this->RootNode->Column = -1;
- this->Nodes.append(this->RootNode);
- }
- qCTKDCMTKModelPrivate::IndexType qCTKDCMTKModelPrivate::indexType(const QModelIndex& index)const
- {
- QCTK_P(const qCTKDCMTKModel);
- if (!index.isValid())
- {
- return RootType;
- }
- QModelIndex indexParent = p->parent(index);
- if (!indexParent.isValid())
- {
- return PatientType;
- }
- indexParent = p->parent(indexParent);
- if (!indexParent.isValid())
- {
- return StudyType;
- }
- indexParent = p->parent(indexParent);
- if (!indexParent.isValid())
- {
- return SeriesType;
- }
- Q_ASSERT(!p->parent(indexParent).isValid());
- return ImageType;
- }
- QModelIndex qCTKDCMTKModelPrivate::indexInRootQuery(const QModelIndex& index) const
- {
- return index;
- }
- QModelIndex qCTKDCMTKModelPrivate::indexInPatientQuery(const QModelIndex& index) const
- {
- return index;
- }
- QModelIndex qCTKDCMTKModelPrivate::indexInStudyQuery(const QModelIndex& index) const
- {
- return index;
- }
- QModelIndex qCTKDCMTKModelPrivate::indexInSeriesQuery(const QModelIndex& index) const
- {
- return index;
- }
- void qCTKDCMTKModelPrivate::updateRootModel(const QModelIndex& index)
- {
- this->RootModel->setQuery( "SELECT * FROM Patients", this->DataBase);
- }
- void qCTKDCMTKModelPrivate::updatePatientModel(const QModelIndex& index)
- {
- QCTK_P(qCTKDCMTKModel);
- this->PatientNode = reinterpret_cast<Node*>(index.internalPointer());
- QString patientId = p->data(index).toString();
- this->PatientModel->setQuery( QString("SELECT * FROM Studies WHERE PatientsUID='%1'").arg(patientId), this->DataBase);
- }
- void qCTKDCMTKModelPrivate::updateStudyModel(const QModelIndex& index)
- {
- QCTK_P(qCTKDCMTKModel);
- this->StudyNode = reinterpret_cast<Node*>(index.internalPointer());
- QString studyId = p->data(index).toString();
- this->StudyModel->setQuery( QString("SELECT * FROM Series WHERE StudyInstanceUID='%1'").arg(studyId), this->DataBase);
- }
- void qCTKDCMTKModelPrivate::updateSeriesModel(const QModelIndex& index)
- {
- QCTK_P(qCTKDCMTKModel);
- this->SeriesNode = reinterpret_cast<Node*>(index.internalPointer());
- QString seriesId = p->data(index).toString();
- this->SeriesModel->setQuery( QString("SELECT * FROM Images WHERE SeriesInstanceUID='%1'").arg(seriesId), this->DataBase);
- }
- qCTKDCMTKModel::qCTKDCMTKModel(QObject* parent)
- {
- }
- qCTKDCMTKModel::~qCTKDCMTKModel()
- {
- }
- bool qCTKDCMTKModel::canFetchMore ( const QModelIndex & parent ) const
- {
- QCTK_D(const qCTKDCMTKModel);
- switch(d->indexType(parent))
- {
- case qCTKDCMTKModelPrivate::RootType:
- const_cast<qCTKDCMTKModelPrivate*>(d)->updateRootModel(parent);
- return d->RootModel->canFetchMore();
- break;
- case qCTKDCMTKModelPrivate::PatientType:
- const_cast<qCTKDCMTKModelPrivate*>(d)->updatePatientModel(parent);
- return d->PatientModel->canFetchMore();
- break;
- case qCTKDCMTKModelPrivate::StudyType:
- const_cast<qCTKDCMTKModelPrivate*>(d)->updateStudyModel(parent);
- return d->StudyModel->canFetchMore();
- break;
- case qCTKDCMTKModelPrivate::SeriesType:
- const_cast<qCTKDCMTKModelPrivate*>(d)->updateSeriesModel(parent);
- return d->SeriesModel->canFetchMore();
- break;
- case qCTKDCMTKModelPrivate::ImageType:
- default:
- break;
- }
- return false;
- }
- int qCTKDCMTKModel::columnCount ( const QModelIndex & _parent ) const
- {
- Q_UNUSED(_parent);
- return 8;
- }
- QVariant qCTKDCMTKModel::data ( const QModelIndex & index, int role ) const
- {
- QCTK_D(const qCTKDCMTKModel);
- QVariant res;
- QModelIndex indexParent = this->parent(index);
- switch(d->indexType(index))
- {
- default:
- case qCTKDCMTKModelPrivate::RootType:
- break;
- case qCTKDCMTKModelPrivate::PatientType:
- const_cast<qCTKDCMTKModelPrivate*>(d)->updateRootModel(indexParent);
- res = d->RootModel->data(d->indexInRootQuery(index), role);
- break;
- case qCTKDCMTKModelPrivate::StudyType:
- const_cast<qCTKDCMTKModelPrivate*>(d)->updatePatientModel(indexParent);
- res = d->PatientModel->data(d->indexInPatientQuery(index), role);
- break;
- case qCTKDCMTKModelPrivate::SeriesType:
- const_cast<qCTKDCMTKModelPrivate*>(d)->updateStudyModel(indexParent);
- res = d->StudyModel->data(d->indexInStudyQuery(index), role);
- break;
- case qCTKDCMTKModelPrivate::ImageType:
- const_cast<qCTKDCMTKModelPrivate*>(d)->updateSeriesModel(indexParent);
- res = d->SeriesModel->data(d->indexInSeriesQuery(index), role);
- break;
- }
- return res;
- }
- void qCTKDCMTKModel::fetchMore ( const QModelIndex & parent )
- {
- QCTK_D(qCTKDCMTKModel);
- switch(d->indexType(parent))
- {
- case qCTKDCMTKModelPrivate::RootType:
- d->updateRootModel(parent);
- d->RootModel->fetchMore(d->indexInRootQuery(parent));
- break;
- case qCTKDCMTKModelPrivate::PatientType:
- d->updatePatientModel(parent);
- d->PatientModel->fetchMore(d->indexInPatientQuery(parent));
- break;
- case qCTKDCMTKModelPrivate::StudyType:
- d->updateStudyModel(parent);
- d->StudyModel->fetchMore(d->indexInStudyQuery(parent));
- break;
- case qCTKDCMTKModelPrivate::SeriesType:
- d->updateSeriesModel(parent);
- d->SeriesModel->fetchMore(d->indexInSeriesQuery(parent));
- break;
- case qCTKDCMTKModelPrivate::ImageType:
- default:
- break;
- }
- }
- Qt::ItemFlags qCTKDCMTKModel::flags ( const QModelIndex & index ) const
- {
- return Qt::ItemIsSelectable | Qt::ItemIsEnabled;
- }
- bool qCTKDCMTKModel::hasChildren ( const QModelIndex & parent ) const
- {
- QCTK_D(const qCTKDCMTKModel);
- switch(d->indexType(parent))
- {
- case qCTKDCMTKModelPrivate::RootType:
- const_cast<qCTKDCMTKModelPrivate*>(d)->updateRootModel(parent);
- return d->RootModel->rowCount(d->indexInRootQuery(parent));
- break;
- case qCTKDCMTKModelPrivate::PatientType:
- const_cast<qCTKDCMTKModelPrivate*>(d)->updatePatientModel(parent);
- return d->PatientModel->rowCount(d->indexInPatientQuery(parent));
- break;
- case qCTKDCMTKModelPrivate::StudyType:
- const_cast<qCTKDCMTKModelPrivate*>(d)->updateStudyModel(parent);
- return d->StudyModel->rowCount(d->indexInStudyQuery(parent));
- break;
- case qCTKDCMTKModelPrivate::SeriesType:
- const_cast<qCTKDCMTKModelPrivate*>(d)->updateSeriesModel(parent);
- return d->SeriesModel->rowCount(d->indexInSeriesQuery(parent));
- break;
- case qCTKDCMTKModelPrivate::ImageType:
- default:
- break;
- }
- return false;
- }
- QModelIndex qCTKDCMTKModel::index ( int row, int column, const QModelIndex & parent ) const
- {
- QCTK_D(const qCTKDCMTKModel);
- QSqlQueryModel* res = 0;
- switch(d->indexType(parent))
- {
- case qCTKDCMTKModelPrivate::RootType:
- res = d->RootModel;
- break;
- case qCTKDCMTKModelPrivate::PatientType:
- res = d->PatientModel;
- break;
- case qCTKDCMTKModelPrivate::StudyType:
- res = d->StudyModel;
- break;
- case qCTKDCMTKModelPrivate::SeriesType:
- res = d->SeriesModel;
- break;
- case qCTKDCMTKModelPrivate::ImageType:
- default:
- Q_ASSERT(d->indexType(parent) != qCTKDCMTKModelPrivate::ImageType);
- break;
- }
- Node* parentNode =
- reinterpret_cast<Node*>(parent.internalPointer());
- Node* node = 0;
- foreach(Node* tmpNode, d->Nodes)
- {
- if (tmpNode->Parent == parentNode &&
- tmpNode->Row == row &&
- tmpNode->Column == column)
- {
- node = tmpNode;
- break;
- }
- }
- if ( node == 0)
- {
- node = new Node;
- node->Parent = parentNode;
- node->Row = row;
- node->Column = column;
- d->Nodes.append(node);
- }
- return this->createIndex(row, column, node);
- }
- QModelIndex qCTKDCMTKModel::parent ( const QModelIndex & index ) const
- {
- Node* node =
- reinterpret_cast<Node*>(index.internalPointer());
- if (node == 0 || node->Parent == 0)
- {
- return this->createIndex(-1, -1, 0);
- }
- return this->createIndex(node->Parent->Row, node->Parent->Column, node->Parent);
- }
- int qCTKDCMTKModel::rowCount ( const QModelIndex & parent ) const
- {
- QCTK_D(const qCTKDCMTKModel);
- int res = 0;
- switch(d->indexType(parent))
- {
- default:
- case qCTKDCMTKModelPrivate::RootType:
- const_cast<qCTKDCMTKModelPrivate*>(d)->updateRootModel(parent);
- res = d->RootModel->rowCount(d->indexInRootQuery(parent));
- break;
- break;
- case qCTKDCMTKModelPrivate::PatientType:
- const_cast<qCTKDCMTKModelPrivate*>(d)->updatePatientModel(parent);
- res = d->PatientModel->rowCount(d->indexInPatientQuery(parent));
- break;
- case qCTKDCMTKModelPrivate::StudyType:
- const_cast<qCTKDCMTKModelPrivate*>(d)->updateStudyModel(parent);
- res = d->StudyModel->rowCount(d->indexInStudyQuery(parent));
- break;
- case qCTKDCMTKModelPrivate::SeriesType:
- const_cast<qCTKDCMTKModelPrivate*>(d)->updateSeriesModel(parent);
- res = d->SeriesModel->rowCount(d->indexInSeriesQuery(parent));
- break;
- }
- return res;
- }
- void qCTKDCMTKModel::setDataBase(const QString &db)
- {
- QCTK_D(qCTKDCMTKModel);
- this->beginResetModel();
- d->DataBase.setDatabaseName(db);
- this->endResetModel();
- if (!d->DataBase.open() || d->DataBase.tables().empty())
- {
- //Q_ASSERT(d->DataBase.isOpen());
- return;
- }
- //this->m_DbPath = db;
- //this->LoadStudies();
- }
- void qCTKDCMTKModel::rootRowsAboutToBeInserted(const QModelIndex& rootParent, int start, int end)
- {
- QCTK_D(qCTKDCMTKModel);
- QModelIndex index = this->createIndex(rootParent.row(), rootParent.column(), d->RootNode);
- this->beginInsertRows(index, start, end);
- }
- void qCTKDCMTKModel::rootRowsInserted(const QModelIndex& rootParent, int start, int end)
- {
- QCTK_D(qCTKDCMTKModel);
- this->endInsertRows();
- }
- void qCTKDCMTKModel::patientRowsAboutToBeInserted(const QModelIndex& patientParent, int start, int end)
- {
- QCTK_D(qCTKDCMTKModel);
- QModelIndex index = this->createIndex(patientParent.row(), patientParent.column(), d->PatientNode);
- this->beginInsertRows(index, start, end);
- }
- void qCTKDCMTKModel::patientRowsInserted(const QModelIndex& patientParent, int start, int end)
- {
- QCTK_D(qCTKDCMTKModel);
- this->endInsertRows();
- }
- void qCTKDCMTKModel::studyRowsAboutToBeInserted(const QModelIndex& studyParent, int start, int end)
- {
- QCTK_D(qCTKDCMTKModel);
- QModelIndex index = this->createIndex(studyParent.row(), studyParent.column(), d->StudyNode);
- this->beginInsertRows(index, start, end);
- }
- void qCTKDCMTKModel::studyRowsInserted(const QModelIndex& studyParent, int start, int end)
- {
- QCTK_D(qCTKDCMTKModel);
- this->endInsertRows();
- }
- void qCTKDCMTKModel::seriesRowsAboutToBeInserted(const QModelIndex& seriesParent, int start, int end)
- {
- QCTK_D(qCTKDCMTKModel);
- QModelIndex index = this->createIndex(seriesParent.row(), seriesParent.column(), d->SeriesNode);
- this->beginInsertRows(index, start, end);
- }
- void qCTKDCMTKModel::seriesRowsInserted(const QModelIndex& seriesParent, int start, int end)
- {
- QCTK_D(qCTKDCMTKModel);
- this->endInsertRows();
- }
- void qCTKDCMTKModel::onModelAboutToBeReset()
- {
- this->beginResetModel();
- }
- void qCTKDCMTKModel::onModelReset()
- {
- this->endResetModel();
- }
- void qCTKDCMTKModel::onLayoutAboutToBeChanged()
- {
- emit layoutAboutToBeChanged();
- }
- void qCTKDCMTKModel::onLayoutChanged()
- {
- emit layoutChanged();
- }
|