123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 |
- // std includes
- #include <iostream>
- #include <dcmimage.h>
- // Qt includes
- #include <QDebug>
- #include <QTreeView>
- #include <QTabBar>
- #include <QSettings>
- #include <QAction>
- #include <QModelIndex>
- #include <QCheckBox>
- // ctkDICOMCore includes
- #include "ctkDICOMDatabase.h"
- #include "ctkDICOMIndexer.h"
- // ctkDICOMWidgets includes
- #include "ctkDICOMImage.h"
- #include "ctkDICOMModel.h"
- #include "ctkDICOMAppWidget.h"
- #include "ctkDICOMQueryResultsTabWidget.h"
- #include "ui_ctkDICOMAppWidget.h"
- #include "ctkDirectoryButton.h"
- #include "ctkFileDialog.h"
- #include "ctkDICOMQueryRetrieveWidget.h"
- #include "ctkDICOMImportWidget.h"
- //logger
- #include <ctkLogger.h>
- static ctkLogger logger("org.commontk.DICOM.Widgets.ctkDICOMAppWidget");
- //----------------------------------------------------------------------------
- class ctkDICOMAppWidgetPrivate: public Ui_ctkDICOMAppWidget
- {
- public:
- ctkDICOMAppWidgetPrivate();
- ctkFileDialog* ImportDialog;
- ctkDICOMQueryRetrieveWidget* QueryRetrieveWidget;
- QSharedPointer<ctkDICOMDatabase> DICOMDatabase;
- ctkDICOMModel DICOMModel;
- QSharedPointer<ctkDICOMIndexer> DICOMIndexer;
- };
- //----------------------------------------------------------------------------
- // ctkDICOMAppWidgetPrivate methods
- ctkDICOMAppWidgetPrivate::ctkDICOMAppWidgetPrivate(){
-
- DICOMDatabase = QSharedPointer<ctkDICOMDatabase> (new ctkDICOMDatabase);
- DICOMIndexer = QSharedPointer<ctkDICOMIndexer> (new ctkDICOMIndexer);
- }
- //----------------------------------------------------------------------------
- // ctkDICOMAppWidget methods
- //----------------------------------------------------------------------------
- ctkDICOMAppWidget::ctkDICOMAppWidget(QWidget* _parent):Superclass(_parent),
- d_ptr(new ctkDICOMAppWidgetPrivate)
- {
- Q_D(ctkDICOMAppWidget);
- d->setupUi(this);
- //Enable sorting in tree view
- d->treeView->setSortingEnabled(true);
- d->treeView->setSelectionBehavior(QAbstractItemView::SelectRows);
- //Set toolbar button style
- d->toolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
- //Initialize Q/R widget
- d->QueryRetrieveWidget = new ctkDICOMQueryRetrieveWidget();
- d->QueryRetrieveWidget->setWindowModality ( Qt::ApplicationModal );
- //initialize directory from settings, then listen for changes
- QSettings settings;
- if ( settings.value("DatabaseDirectory", "") == "" )
- {
- QString directory = QString("./ctkDICOM-Database");
- settings.setValue("DatabaseDirectory", directory);
- settings.sync();
- }
- QString databaseDirectory = settings.value("DatabaseDirectory").toString();
- this->setDatabaseDirectory(databaseDirectory);
- d->directoryButton->setDirectory(databaseDirectory);
- connect(d->directoryButton, SIGNAL(directoryChanged(const QString&)), this, SLOT(setDatabaseDirectory(const QString&)));
- //Initialize import widget
- d->ImportDialog = new ctkFileDialog();
- QCheckBox* importCheckbox = new QCheckBox("Copy on import", d->ImportDialog);
- d->ImportDialog->setBottomWidget(importCheckbox);
- d->ImportDialog->setFileMode(QFileDialog::Directory);
- d->ImportDialog->setLabelText(QFileDialog::Accept,"Import");
- d->ImportDialog->setWindowTitle("Import DICOM files from directory ...");
- d->ImportDialog->setWindowModality(Qt::ApplicationModal);
- //connect signal and slots
- connect(d->treeView, SIGNAL(clicked(const QModelIndex&)), d->thumbnailsWidget, SLOT(onModelSelected(const QModelIndex &)));
- connect(d->treeView, SIGNAL(clicked(const QModelIndex&)), d->imagePreview, SLOT(onModelSelected(const QModelIndex &)));
- connect(d->thumbnailsWidget, SIGNAL(selected(const ctkDICOMThumbnailWidget&)), this, SLOT(onThumbnailSelected(const ctkDICOMThumbnailWidget&)));
- connect(d->ImportDialog, SIGNAL(fileSelected(QString)),this,SLOT(onImportDirectory(QString)));
- connect(d->DICOMDatabase.data(), SIGNAL( databaseChanged() ), &(d->DICOMModel), SLOT( reset() ) );
- connect(d->QueryRetrieveWidget, SIGNAL( canceled() ), d->QueryRetrieveWidget, SLOT( hide() ) );
- }
- //----------------------------------------------------------------------------
- ctkDICOMAppWidget::~ctkDICOMAppWidget()
- {
- Q_D(ctkDICOMAppWidget);
- d->QueryRetrieveWidget->deleteLater();
- d->ImportDialog->deleteLater();
- }
- //----------------------------------------------------------------------------
- void ctkDICOMAppWidget::setDatabaseDirectory(const QString& directory)
- {
- Q_D(ctkDICOMAppWidget);
- QSettings settings;
- settings.setValue("DatabaseDirectory", directory);
- settings.sync();
- //close the active DICOM database
- d->DICOMDatabase->closeDatabase();
-
- //open DICOM database on the directory
- QString databaseFileName = directory + QString("/ctkDICOM.sql");
- try { d->DICOMDatabase->openDatabase( databaseFileName ); }
- catch (std::exception e)
- {
- std::cerr << "Database error: " << qPrintable(d->DICOMDatabase->lastError()) << "\n";
- d->DICOMDatabase->closeDatabase();
- return;
- }
-
- d->DICOMModel.setDatabase(d->DICOMDatabase->database());
- d->treeView->setModel(&d->DICOMModel);
- //pass DICOM database instance to Import widget
- // d->ImportDialog->setDICOMDatabase(d->DICOMDatabase);
- d->QueryRetrieveWidget->setRetrieveDatabase(d->DICOMDatabase);
- // update the button and let any connected slots know about the change
- d->directoryButton->setDirectory(directory);
- d->thumbnailsWidget->setDatabaseDirectory(directory);
- d->imagePreview->setDatabaseDirectory(directory);
- emit databaseDirectoryChanged(directory);
- }
- //----------------------------------------------------------------------------
- QString ctkDICOMAppWidget::databaseDirectory() const
- {
- QSettings settings;
- return settings.value("DatabaseDirectory").toString();
- }
- void ctkDICOMAppWidget::onAddToDatabase()
- {
- //Q_D(ctkDICOMAppWidget);
- //d->
- }
- //----------------------------------------------------------------------------
- void ctkDICOMAppWidget::openImportDialog()
- {
- Q_D(ctkDICOMAppWidget);
-
- d->ImportDialog->show();
- d->ImportDialog->raise();
- }
- //----------------------------------------------------------------------------
- void ctkDICOMAppWidget::openExportDialog()
- {
- }
- //----------------------------------------------------------------------------
- void ctkDICOMAppWidget::openQueryDialog()
- {
- Q_D(ctkDICOMAppWidget);
- d->QueryRetrieveWidget->show();
- d->QueryRetrieveWidget->raise();
- }
- //----------------------------------------------------------------------------
- void ctkDICOMAppWidget::onThumbnailSelected(const ctkDICOMThumbnailWidget& widget)
- {
- //TODO: update previewer
- }
- //----------------------------------------------------------------------------
- void ctkDICOMAppWidget::onImportDirectory(QString directory)
- {
- Q_D(ctkDICOMAppWidget);
- if (QDir(directory).exists())
- {
- QCheckBox* copyOnImport = qobject_cast<QCheckBox*>(d->ImportDialog->bottomWidget());
- QString targetDirectory;
- if (copyOnImport->isEnabled())
- {
- targetDirectory = d->DICOMDatabase->databaseDirectory();
- }
- d->DICOMIndexer->addDirectory(*d->DICOMDatabase,directory,targetDirectory);
- d->DICOMModel.reset();
- }
- }
|