qCTKDCMTKModel.cxx 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524
  1. #include "qCTKDCMTKModel.h"
  2. #include <QSqlQueryModel>
  3. #include <QStringList>
  4. struct Node
  5. {
  6. Node* Parent;
  7. int Row;
  8. int Column;
  9. };
  10. class qCTKDCMTKModelPrivate:public qCTKPrivate<qCTKDCMTKModel>
  11. {
  12. public:
  13. qCTKDCMTKModelPrivate();
  14. ~qCTKDCMTKModelPrivate();
  15. void init();
  16. enum IndexType{
  17. RootType,
  18. PatientType,
  19. StudyType,
  20. SeriesType,
  21. ImageType
  22. };
  23. IndexType indexType(const QModelIndex& index)const;
  24. void updateRootModel(const QModelIndex& index);
  25. void updatePatientModel(const QModelIndex& index);
  26. void updateStudyModel(const QModelIndex& index);
  27. void updateSeriesModel(const QModelIndex& index);
  28. QModelIndex indexInRootQuery(const QModelIndex& index)const;
  29. QModelIndex indexInPatientQuery(const QModelIndex& index)const;
  30. QModelIndex indexInStudyQuery(const QModelIndex& index)const;
  31. QModelIndex indexInSeriesQuery(const QModelIndex& index)const;
  32. QSqlDatabase DataBase;
  33. QSqlQueryModel* RootModel;
  34. QSqlQueryModel* PatientModel;
  35. QSqlQueryModel* StudyModel;
  36. QSqlQueryModel* SeriesModel;
  37. Node* RootNode;
  38. Node* PatientNode;
  39. Node* StudyNode;
  40. Node* SeriesNode;
  41. mutable QList<Node*> Nodes;
  42. };
  43. qCTKDCMTKModelPrivate::qCTKDCMTKModelPrivate()
  44. :DataBase(QSqlDatabase::addDatabase("QSQLITE"))
  45. {
  46. this->RootModel = 0;
  47. this->PatientModel = 0;
  48. this->StudyModel = 0;
  49. this->SeriesModel = 0;
  50. this->RootNode = 0;
  51. this->PatientNode = 0;
  52. this->StudyNode = 0;
  53. this->SeriesNode = 0;
  54. }
  55. qCTKDCMTKModelPrivate::~qCTKDCMTKModelPrivate()
  56. {
  57. foreach(Node* node, this->Nodes)
  58. {
  59. delete node;
  60. }
  61. this->Nodes.clear();
  62. }
  63. void qCTKDCMTKModelPrivate::init()
  64. {
  65. QCTK_P(qCTKDCMTKModel);
  66. this->RootModel = new QSqlQueryModel(p);
  67. this->PatientModel = new QSqlQueryModel(p);
  68. this->StudyModel = new QSqlQueryModel(p);
  69. this->SeriesModel = new QSqlQueryModel(p);
  70. QObject::connect(this->RootModel, SIGNAL(rowsAboutToBeInserted(const QModelIndex&, int, int)),
  71. p, SLOT(rootRowsAboutToBeInserted(const QModelIndex&, int, int)));
  72. QObject::connect(this->PatientModel, SIGNAL(rowsAboutToBeInserted(const QModelIndex&, int, int)),
  73. p, SLOT(patientRowsAboutToBeInserted(const QModelIndex&, int, int)));
  74. QObject::connect(this->StudyModel, SIGNAL(rowsAboutToBeInserted(const QModelIndex&, int, int)),
  75. p, SLOT(studyRowsAboutToBeInserted(const QModelIndex&, int, int)));
  76. QObject::connect(this->SeriesModel, SIGNAL(rowsAboutToBeInserted(const QModelIndex&, int, int)),
  77. p, SLOT(seriesRowsAboutToBeInserted(const QModelIndex&, int, int)));
  78. QObject::connect(this->RootModel, SIGNAL(rowsInserted(const QModelIndex&, int, int)),
  79. p, SLOT(rootRowsInserted(const QModelIndex&, int, int)));
  80. QObject::connect(this->PatientModel, SIGNAL(rowsInserted(const QModelIndex&, int, int)),
  81. p, SLOT(patientRowsInserted(const QModelIndex&, int, int)));
  82. QObject::connect(this->StudyModel, SIGNAL(rowsInserted(const QModelIndex&, int, int)),
  83. p, SLOT(studyRowsInserted(const QModelIndex&, int, int)));
  84. QObject::connect(this->SeriesModel, SIGNAL(rowsInserted(const QModelIndex&, int, int)),
  85. p, SLOT(seriesRowsInserted(const QModelIndex&, int, int)));
  86. QObject::connect(this->RootModel, SIGNAL(modelAboutToBeReset()),
  87. p, SLOT(onModelAboutToBeReset()));
  88. QObject::connect(this->PatientModel, SIGNAL(modelAboutToBeReset()),
  89. p, SLOT(onModelAboutToBeReset()));
  90. QObject::connect(this->StudyModel, SIGNAL(modelAboutToBeReset()),
  91. p, SLOT(onModelAboutToBeReset()));
  92. QObject::connect(this->SeriesModel, SIGNAL(modelAboutToBeReset()),
  93. p, SLOT(onModelAboutToBeReset()));
  94. QObject::connect(this->RootModel, SIGNAL(modelReset()),
  95. p, SLOT(onModelReset()));
  96. QObject::connect(this->PatientModel, SIGNAL(modelReset()),
  97. p, SLOT(onModelReset()));
  98. QObject::connect(this->StudyModel, SIGNAL(modelReset()),
  99. p, SLOT(onModelReset()));
  100. QObject::connect(this->SeriesModel, SIGNAL(modelReset()),
  101. p, SLOT(onModelReset()));
  102. QObject::connect(this->RootModel, SIGNAL(layoutAboutToBeChanged()),
  103. p, SLOT(onLayoutAboutToBeChanged()));
  104. QObject::connect(this->PatientModel, SIGNAL(layoutAboutToBeChanged()),
  105. p, SLOT(onLayoutAboutToBeChanged()));
  106. QObject::connect(this->StudyModel, SIGNAL(layoutAboutToBeChanged()),
  107. p, SLOT(onLayoutAboutToBeChanged()));
  108. QObject::connect(this->SeriesModel, SIGNAL(layoutAboutToBeChanged()),
  109. p, SLOT(onLayoutAboutToBeChanged()));
  110. QObject::connect(this->RootModel, SIGNAL(layoutChanged()),
  111. p, SLOT(onLayoutChanged()));
  112. QObject::connect(this->PatientModel, SIGNAL(layoutChanged()),
  113. p, SLOT(onLayoutChanged()));
  114. QObject::connect(this->StudyModel, SIGNAL(layoutChanged()),
  115. p, SLOT(onLayoutChanged()));
  116. QObject::connect(this->SeriesModel, SIGNAL(layoutChanged()),
  117. p, SLOT(onLayoutChanged()));
  118. this->RootNode = new Node;
  119. this->RootNode->Parent = 0;
  120. this->RootNode->Row = -1;
  121. this->RootNode->Column = -1;
  122. this->Nodes.append(this->RootNode);
  123. }
  124. qCTKDCMTKModelPrivate::IndexType qCTKDCMTKModelPrivate::indexType(const QModelIndex& index)const
  125. {
  126. QCTK_P(const qCTKDCMTKModel);
  127. if (!index.isValid())
  128. {
  129. return RootType;
  130. }
  131. QModelIndex indexParent = p->parent(index);
  132. if (!indexParent.isValid())
  133. {
  134. return PatientType;
  135. }
  136. indexParent = p->parent(indexParent);
  137. if (!indexParent.isValid())
  138. {
  139. return StudyType;
  140. }
  141. indexParent = p->parent(indexParent);
  142. if (!indexParent.isValid())
  143. {
  144. return SeriesType;
  145. }
  146. Q_ASSERT(!p->parent(indexParent).isValid());
  147. return ImageType;
  148. }
  149. QModelIndex qCTKDCMTKModelPrivate::indexInRootQuery(const QModelIndex& index) const
  150. {
  151. return index;
  152. }
  153. QModelIndex qCTKDCMTKModelPrivate::indexInPatientQuery(const QModelIndex& index) const
  154. {
  155. return index;
  156. }
  157. QModelIndex qCTKDCMTKModelPrivate::indexInStudyQuery(const QModelIndex& index) const
  158. {
  159. return index;
  160. }
  161. QModelIndex qCTKDCMTKModelPrivate::indexInSeriesQuery(const QModelIndex& index) const
  162. {
  163. return index;
  164. }
  165. void qCTKDCMTKModelPrivate::updateRootModel(const QModelIndex& index)
  166. {
  167. this->RootModel->setQuery( "SELECT * FROM Patients", this->DataBase);
  168. }
  169. void qCTKDCMTKModelPrivate::updatePatientModel(const QModelIndex& index)
  170. {
  171. QCTK_P(qCTKDCMTKModel);
  172. this->PatientNode = reinterpret_cast<Node*>(index.internalPointer());
  173. QString patientId = p->data(index).toString();
  174. this->PatientModel->setQuery( QString("SELECT * FROM Studies WHERE PatientsUID='%1'").arg(patientId), this->DataBase);
  175. }
  176. void qCTKDCMTKModelPrivate::updateStudyModel(const QModelIndex& index)
  177. {
  178. QCTK_P(qCTKDCMTKModel);
  179. this->StudyNode = reinterpret_cast<Node*>(index.internalPointer());
  180. QString studyId = p->data(index).toString();
  181. this->StudyModel->setQuery( QString("SELECT * FROM Series WHERE StudyInstanceUID='%1'").arg(studyId), this->DataBase);
  182. }
  183. void qCTKDCMTKModelPrivate::updateSeriesModel(const QModelIndex& index)
  184. {
  185. QCTK_P(qCTKDCMTKModel);
  186. this->SeriesNode = reinterpret_cast<Node*>(index.internalPointer());
  187. QString seriesId = p->data(index).toString();
  188. this->SeriesModel->setQuery( QString("SELECT * FROM Images WHERE SeriesInstanceUID='%1'").arg(seriesId), this->DataBase);
  189. }
  190. qCTKDCMTKModel::qCTKDCMTKModel(QObject* parent)
  191. {
  192. }
  193. qCTKDCMTKModel::~qCTKDCMTKModel()
  194. {
  195. }
  196. bool qCTKDCMTKModel::canFetchMore ( const QModelIndex & parent ) const
  197. {
  198. QCTK_D(const qCTKDCMTKModel);
  199. switch(d->indexType(parent))
  200. {
  201. case qCTKDCMTKModelPrivate::RootType:
  202. const_cast<qCTKDCMTKModelPrivate*>(d)->updateRootModel(parent);
  203. return d->RootModel->canFetchMore();
  204. break;
  205. case qCTKDCMTKModelPrivate::PatientType:
  206. const_cast<qCTKDCMTKModelPrivate*>(d)->updatePatientModel(parent);
  207. return d->PatientModel->canFetchMore();
  208. break;
  209. case qCTKDCMTKModelPrivate::StudyType:
  210. const_cast<qCTKDCMTKModelPrivate*>(d)->updateStudyModel(parent);
  211. return d->StudyModel->canFetchMore();
  212. break;
  213. case qCTKDCMTKModelPrivate::SeriesType:
  214. const_cast<qCTKDCMTKModelPrivate*>(d)->updateSeriesModel(parent);
  215. return d->SeriesModel->canFetchMore();
  216. break;
  217. case qCTKDCMTKModelPrivate::ImageType:
  218. default:
  219. break;
  220. }
  221. return false;
  222. }
  223. int qCTKDCMTKModel::columnCount ( const QModelIndex & _parent ) const
  224. {
  225. Q_UNUSED(_parent);
  226. return 8;
  227. }
  228. QVariant qCTKDCMTKModel::data ( const QModelIndex & index, int role ) const
  229. {
  230. QCTK_D(const qCTKDCMTKModel);
  231. QVariant res;
  232. QModelIndex indexParent = this->parent(index);
  233. switch(d->indexType(index))
  234. {
  235. default:
  236. case qCTKDCMTKModelPrivate::RootType:
  237. break;
  238. case qCTKDCMTKModelPrivate::PatientType:
  239. const_cast<qCTKDCMTKModelPrivate*>(d)->updateRootModel(indexParent);
  240. res = d->RootModel->data(d->indexInRootQuery(index), role);
  241. break;
  242. case qCTKDCMTKModelPrivate::StudyType:
  243. const_cast<qCTKDCMTKModelPrivate*>(d)->updatePatientModel(indexParent);
  244. res = d->PatientModel->data(d->indexInPatientQuery(index), role);
  245. break;
  246. case qCTKDCMTKModelPrivate::SeriesType:
  247. const_cast<qCTKDCMTKModelPrivate*>(d)->updateStudyModel(indexParent);
  248. res = d->StudyModel->data(d->indexInStudyQuery(index), role);
  249. break;
  250. case qCTKDCMTKModelPrivate::ImageType:
  251. const_cast<qCTKDCMTKModelPrivate*>(d)->updateSeriesModel(indexParent);
  252. res = d->SeriesModel->data(d->indexInSeriesQuery(index), role);
  253. break;
  254. }
  255. return res;
  256. }
  257. void qCTKDCMTKModel::fetchMore ( const QModelIndex & parent )
  258. {
  259. QCTK_D(qCTKDCMTKModel);
  260. switch(d->indexType(parent))
  261. {
  262. case qCTKDCMTKModelPrivate::RootType:
  263. d->updateRootModel(parent);
  264. d->RootModel->fetchMore(d->indexInRootQuery(parent));
  265. break;
  266. case qCTKDCMTKModelPrivate::PatientType:
  267. d->updatePatientModel(parent);
  268. d->PatientModel->fetchMore(d->indexInPatientQuery(parent));
  269. break;
  270. case qCTKDCMTKModelPrivate::StudyType:
  271. d->updateStudyModel(parent);
  272. d->StudyModel->fetchMore(d->indexInStudyQuery(parent));
  273. break;
  274. case qCTKDCMTKModelPrivate::SeriesType:
  275. d->updateSeriesModel(parent);
  276. d->SeriesModel->fetchMore(d->indexInSeriesQuery(parent));
  277. break;
  278. case qCTKDCMTKModelPrivate::ImageType:
  279. default:
  280. break;
  281. }
  282. }
  283. Qt::ItemFlags qCTKDCMTKModel::flags ( const QModelIndex & index ) const
  284. {
  285. return Qt::ItemIsSelectable | Qt::ItemIsEnabled;
  286. }
  287. bool qCTKDCMTKModel::hasChildren ( const QModelIndex & parent ) const
  288. {
  289. QCTK_D(const qCTKDCMTKModel);
  290. switch(d->indexType(parent))
  291. {
  292. case qCTKDCMTKModelPrivate::RootType:
  293. const_cast<qCTKDCMTKModelPrivate*>(d)->updateRootModel(parent);
  294. return d->RootModel->rowCount(d->indexInRootQuery(parent));
  295. break;
  296. case qCTKDCMTKModelPrivate::PatientType:
  297. const_cast<qCTKDCMTKModelPrivate*>(d)->updatePatientModel(parent);
  298. return d->PatientModel->rowCount(d->indexInPatientQuery(parent));
  299. break;
  300. case qCTKDCMTKModelPrivate::StudyType:
  301. const_cast<qCTKDCMTKModelPrivate*>(d)->updateStudyModel(parent);
  302. return d->StudyModel->rowCount(d->indexInStudyQuery(parent));
  303. break;
  304. case qCTKDCMTKModelPrivate::SeriesType:
  305. const_cast<qCTKDCMTKModelPrivate*>(d)->updateSeriesModel(parent);
  306. return d->SeriesModel->rowCount(d->indexInSeriesQuery(parent));
  307. break;
  308. case qCTKDCMTKModelPrivate::ImageType:
  309. default:
  310. break;
  311. }
  312. return false;
  313. }
  314. QModelIndex qCTKDCMTKModel::index ( int row, int column, const QModelIndex & parent ) const
  315. {
  316. QCTK_D(const qCTKDCMTKModel);
  317. QSqlQueryModel* res = 0;
  318. switch(d->indexType(parent))
  319. {
  320. case qCTKDCMTKModelPrivate::RootType:
  321. res = d->RootModel;
  322. break;
  323. case qCTKDCMTKModelPrivate::PatientType:
  324. res = d->PatientModel;
  325. break;
  326. case qCTKDCMTKModelPrivate::StudyType:
  327. res = d->StudyModel;
  328. break;
  329. case qCTKDCMTKModelPrivate::SeriesType:
  330. res = d->SeriesModel;
  331. break;
  332. case qCTKDCMTKModelPrivate::ImageType:
  333. default:
  334. Q_ASSERT(d->indexType(parent) != qCTKDCMTKModelPrivate::ImageType);
  335. break;
  336. }
  337. Node* parentNode =
  338. reinterpret_cast<Node*>(parent.internalPointer());
  339. Node* node = 0;
  340. foreach(Node* tmpNode, d->Nodes)
  341. {
  342. if (tmpNode->Parent == parentNode &&
  343. tmpNode->Row == row &&
  344. tmpNode->Column == column)
  345. {
  346. node = tmpNode;
  347. break;
  348. }
  349. }
  350. if ( node == 0)
  351. {
  352. node = new Node;
  353. node->Parent = parentNode;
  354. node->Row = row;
  355. node->Column = column;
  356. d->Nodes.append(node);
  357. }
  358. return this->createIndex(row, column, node);
  359. }
  360. QModelIndex qCTKDCMTKModel::parent ( const QModelIndex & index ) const
  361. {
  362. Node* node =
  363. reinterpret_cast<Node*>(index.internalPointer());
  364. if (node == 0 || node->Parent == 0)
  365. {
  366. return this->createIndex(-1, -1, 0);
  367. }
  368. return this->createIndex(node->Parent->Row, node->Parent->Column, node->Parent);
  369. }
  370. int qCTKDCMTKModel::rowCount ( const QModelIndex & parent ) const
  371. {
  372. QCTK_D(const qCTKDCMTKModel);
  373. int res = 0;
  374. switch(d->indexType(parent))
  375. {
  376. default:
  377. case qCTKDCMTKModelPrivate::RootType:
  378. const_cast<qCTKDCMTKModelPrivate*>(d)->updateRootModel(parent);
  379. res = d->RootModel->rowCount(d->indexInRootQuery(parent));
  380. break;
  381. break;
  382. case qCTKDCMTKModelPrivate::PatientType:
  383. const_cast<qCTKDCMTKModelPrivate*>(d)->updatePatientModel(parent);
  384. res = d->PatientModel->rowCount(d->indexInPatientQuery(parent));
  385. break;
  386. case qCTKDCMTKModelPrivate::StudyType:
  387. const_cast<qCTKDCMTKModelPrivate*>(d)->updateStudyModel(parent);
  388. res = d->StudyModel->rowCount(d->indexInStudyQuery(parent));
  389. break;
  390. case qCTKDCMTKModelPrivate::SeriesType:
  391. const_cast<qCTKDCMTKModelPrivate*>(d)->updateSeriesModel(parent);
  392. res = d->SeriesModel->rowCount(d->indexInSeriesQuery(parent));
  393. break;
  394. }
  395. return res;
  396. }
  397. void qCTKDCMTKModel::setDataBase(const QString &db)
  398. {
  399. QCTK_D(qCTKDCMTKModel);
  400. this->beginResetModel();
  401. d->DataBase.setDatabaseName(db);
  402. this->endResetModel();
  403. if (!d->DataBase.open() || d->DataBase.tables().empty())
  404. {
  405. //Q_ASSERT(d->DataBase.isOpen());
  406. return;
  407. }
  408. //this->m_DbPath = db;
  409. //this->LoadStudies();
  410. }
  411. void qCTKDCMTKModel::rootRowsAboutToBeInserted(const QModelIndex& rootParent, int start, int end)
  412. {
  413. QCTK_D(qCTKDCMTKModel);
  414. QModelIndex index = this->createIndex(rootParent.row(), rootParent.column(), d->RootNode);
  415. this->beginInsertRows(index, start, end);
  416. }
  417. void qCTKDCMTKModel::rootRowsInserted(const QModelIndex& rootParent, int start, int end)
  418. {
  419. QCTK_D(qCTKDCMTKModel);
  420. this->endInsertRows();
  421. }
  422. void qCTKDCMTKModel::patientRowsAboutToBeInserted(const QModelIndex& patientParent, int start, int end)
  423. {
  424. QCTK_D(qCTKDCMTKModel);
  425. QModelIndex index = this->createIndex(patientParent.row(), patientParent.column(), d->PatientNode);
  426. this->beginInsertRows(index, start, end);
  427. }
  428. void qCTKDCMTKModel::patientRowsInserted(const QModelIndex& patientParent, int start, int end)
  429. {
  430. QCTK_D(qCTKDCMTKModel);
  431. this->endInsertRows();
  432. }
  433. void qCTKDCMTKModel::studyRowsAboutToBeInserted(const QModelIndex& studyParent, int start, int end)
  434. {
  435. QCTK_D(qCTKDCMTKModel);
  436. QModelIndex index = this->createIndex(studyParent.row(), studyParent.column(), d->StudyNode);
  437. this->beginInsertRows(index, start, end);
  438. }
  439. void qCTKDCMTKModel::studyRowsInserted(const QModelIndex& studyParent, int start, int end)
  440. {
  441. QCTK_D(qCTKDCMTKModel);
  442. this->endInsertRows();
  443. }
  444. void qCTKDCMTKModel::seriesRowsAboutToBeInserted(const QModelIndex& seriesParent, int start, int end)
  445. {
  446. QCTK_D(qCTKDCMTKModel);
  447. QModelIndex index = this->createIndex(seriesParent.row(), seriesParent.column(), d->SeriesNode);
  448. this->beginInsertRows(index, start, end);
  449. }
  450. void qCTKDCMTKModel::seriesRowsInserted(const QModelIndex& seriesParent, int start, int end)
  451. {
  452. QCTK_D(qCTKDCMTKModel);
  453. this->endInsertRows();
  454. }
  455. void qCTKDCMTKModel::onModelAboutToBeReset()
  456. {
  457. this->beginResetModel();
  458. }
  459. void qCTKDCMTKModel::onModelReset()
  460. {
  461. this->endResetModel();
  462. }
  463. void qCTKDCMTKModel::onLayoutAboutToBeChanged()
  464. {
  465. emit layoutAboutToBeChanged();
  466. }
  467. void qCTKDCMTKModel::onLayoutChanged()
  468. {
  469. emit layoutChanged();
  470. }